diff --git a/sa/profiles/Hikvision/DSKV8/get_config.py b/sa/profiles/Hikvision/DSKV8/get_config.py index 7e5fde510f748506e2771ace6b76a859039617ea..6bc1b079987962d106b78c8176b3b16eb816ab06 100644 --- a/sa/profiles/Hikvision/DSKV8/get_config.py +++ b/sa/profiles/Hikvision/DSKV8/get_config.py @@ -10,6 +10,7 @@ import xml.etree.ElementTree as ElementTree from copy import copy import six + # NOC modules from noc.core.script.base import BaseScript from noc.sa.interfaces.igetconfig import IGetConfig @@ -36,103 +37,144 @@ class Script(BaseScript): return d def execute(self, **kwargs): - c = "" + c = "DeviceInfo\n" + v = self.http.get("/ISAPI/System/deviceInfo", cached=True, use_basic=True) + v = v.replace("\n", "") + root = ElementTree.fromstring(v) + v = self.xml_2_dict(root) + for key, value in sorted(six.iteritems(v["DeviceInfo"])): + if key == "_text" or isinstance(value, six.string_types): + continue + c += " %s %s\n" % (key, value[0]["_text"] if value[0] else "") v = self.http.get("/ISAPI/Streaming/channels", use_basic=True) v = v.replace("\n", "") root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - channels = v['StreamingChannelList']['StreamingChannel'] - i = 1 + channels = v["StreamingChannelList"]["StreamingChannel"] for o in channels: - c += "StreamingChannel:\n" - c += " id: %s\n" % o['id'][0]['_text'] - c += " channelName: \"%s\"\n" % o['channelName'][0]['_text'] - c += " enabled: %s\n" % o['enabled'][0]['_text'] - video = o['Video'][0] - c += "Video:\n" + c += "StreamingChannel %s\n" % o["id"][0]["_text"].strip("'") + c += " id %s\n" % o["id"][0]["_text"] + c += ' channelName "%s"\n' % o["channelName"][0].get("_text", "") + c += " enabled %s\n" % o["enabled"][0]["_text"] + video = o["Video"][0] + c += " Video\n" for key, value in sorted(six.iteritems(video)): if key == "_text" or isinstance(value, six.string_types): continue - c += " %s: %s\n" % (key, value[0]['_text']) - v = self.http.get("/ISAPI/Image/channels/1/color", use_basic=True) + c += " %s %s\n" % (key, value[0]["_text"]) + if "Audio" in o: + audio = o["Audio"][0] + c += " Audio\n" + for key, value in sorted(six.iteritems(audio)): + if key == "_text" or isinstance(value, six.string_types): + continue + c += " %s %s\n" % (key, value[0]["_text"]) + v = self.http.get("/ISAPI/Image/channels/1", use_basic=True) v = v.replace("\n", "") root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - color = v['Color'] - c += "Color:\n" + o = v["ImageChannel"] + + color = o["Color"][0] + c += "Color\n" for key, value in sorted(six.iteritems(color)): if key == "_text" or isinstance(value, six.string_types): continue - c += " %s: %s\n" % (key, value[0]['_text']) - - try: - v = self.http.get("/ISAPI/Image/channels/1/WDR", use_basic=True) - v = v.replace("\n", "") - root = ElementTree.fromstring(v) - v = self.xml_2_dict(root) - c += "WDR:\n" - c += " mode: %s\n" % v['WDR']['mode'][0]['_text'] - c += " WDRLevel: %s\n" % v['WDR']['WDRLevel'][0]['_text'] - except HTTPError: - pass - + c += " %s %s\n" % (key, value[0]["_text"]) + if "WDR" in o: + wdr = o["WDR"][0] + c += "WDR\n" + for key, value in sorted(six.iteritems(wdr)): + if key == "_text" or isinstance(value, six.string_types): + continue + c += " %s %s\n" % (key, value[0]["_text"]) + blc = o["BLC"][0] + c += "BLC\n" + for key, value in sorted(six.iteritems(blc)): + if key == "_text" or isinstance(value, six.string_types): + continue + try: + c += " %s %s\n" % (key, value[0]["_text"]) + except KeyError: + continue try: - v = self.http.get("/ISAPI/Image/channels/1/BLC", use_basic=True) - v = v.replace("\n", "") + v = self.http.get("/ISAPI/System/Video/inputs/channels", use_basic=True) root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - c += "BLC:\n" - c += " enabled: %s\n" % v['BLC']['enabled'][0]['_text'] - if 'BLCMode' in v['BLC']: - c += " BLCMode: %s\n" % v['BLC']['BLCMode'][0]['_text'] - except HTTPError: - pass - - try: - v = self.http.get("/ISAPI/System/Video/inputs/channels/1/overlays/capabilities", use_basic=True) + for vic in v["VideoInputChannelList"]["VideoInputChannel"]: + # vid = vic["id"][0]["_text"] + # for channelName overlay + vname = vic["name"][0]["_text"] + v = self.http.get("/ISAPI/System/Video/inputs/channels/1/overlays", use_basic=True) v = v.replace("\n", "") root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - overlay = v['VideoOverlay']['TextOverlayList'][0] - if 'TextOverlay' in overlay: - overlay = overlay['TextOverlay'] - if overlay: - c += "Overlays:\n" - i = 1 - for o in overlay: - text = o['displayText'][0] - if text: - c += " TextOverlay%d: \"%s\"\n" % (i, text['_text']) - else: - c += " TextOverlay%d: \"\"\n" % i - i = i + 1 + c += "Overlay\n" + for o in v["VideoOverlay"]: + if o == "version" or o == "_text": + continue + elif o == "TextOverlayList": + overlay = v["VideoOverlay"][o][0] + if overlay: + c += " TextOverlay \n" + i = 1 + if "_text" in overlay: + c += ' TextOverlay %d "%s"\n' % (i, overlay["_text"].strip()) + continue + elif "TextOverlay" in overlay: + overlay = overlay["TextOverlay"] + for oo in overlay: + text = oo["displayText"][0] + if text: + c += ' TextOverlay %d "%s"\n' % (i, text["_text"]) + else: + c += ' TextOverlay %d ""\n' % i + i = i + 1 + else: + c += " %s\n" % o + for key, value in sorted(six.iteritems(v["VideoOverlay"][o][0])): + if key == "_text" or isinstance(value, six.string_types): + continue + c += " %s %s\n" % (key, value[0]["_text"]) + if o == "channelNameOverlay": + c += " %s %s\n" % ("channelName", vname) except HTTPError: pass - try: v = self.http.get("/ISAPI/System/time", use_basic=True) v = v.replace("\n", "") root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - timeMode = v['Time']['timeMode'][0]['_text'] - c += "Time:\n" - c += " timeMode: %s\n" % timeMode + c += "Time\n" + for key, value in sorted(six.iteritems(v["Time"])): + if key == "_text" or isinstance(value, six.string_types) or key == "localTime": + continue + c += " %s %s\n" % (key, value[0]["_text"]) except HTTPError: pass - try: v = self.http.get("/ISAPI/System/time/ntpServers", use_basic=True) v = v.replace("\n", "") root = ElementTree.fromstring(v) v = self.xml_2_dict(root) - ntp_servers = v['NTPServerList']['NTPServer'] - if ntp_servers: - c += "NTP:\n" - i = 1 - for o in ntp_servers: - text = o['ipAddress'][0]['_text'] - c += " NTPServer%d: %s\n" % (i, text) + ntp_servers = v["NTPServerList"]["NTPServer"] + for i, o in enumerate(ntp_servers): + aft = o["addressingFormatType"][0]["_text"] + if aft == "hostname": + text = o["hostName"][0]["_text"] + else: + text = o["ipAddress"][0]["_text"] + c += " NTPServer %d %s\n" % (i, text) except HTTPError: pass - + v = self.http.get("/ISAPI/Security/users", json=False, cached=True, use_basic=True) + root = ElementTree.fromstring(v) + v = self.xml_2_dict(root) + c += "Users\n" + for u in v["UserList"]["User"]: + c += " user %s\n" % u["userName"][0]["_text"] + for key, value in sorted(six.iteritems(u)): + if key == "_text" or isinstance(value, six.string_types): + continue + c += " %s %s\n" % (key, value[0]["_text"]) return c diff --git a/sa/profiles/Hikvision/DSKV8/get_interfaces.py b/sa/profiles/Hikvision/DSKV8/get_interfaces.py index 618bc69fb059103ccbd9e837e91b767e184069f4..1558b12c942e1fdc8a9ba480a2ed72cbf58c96c7 100644 --- a/sa/profiles/Hikvision/DSKV8/get_interfaces.py +++ b/sa/profiles/Hikvision/DSKV8/get_interfaces.py @@ -8,6 +8,7 @@ # Python modules import xml.etree.ElementTree as ElementTree + # NOC modules from noc.core.script.base import BaseScript from noc.sa.interfaces.igetinterfaces import IGetInterfaces @@ -21,34 +22,26 @@ class Script(BaseScript): def execute(self): r = [] - ns = {'isapi': 'http://www.isapi.org/ver20/XMLSchema', - 'std-cgi': 'http://www.std-cgi.com/ver20/XMLSchema', - 'hikvision': 'http://www.hikvision.com/ver20/XMLSchema'} + ns = { + "isapi": "http://www.isapi.org/ver20/XMLSchema", + "std-cgi": "http://www.std-cgi.com/ver20/XMLSchema", + "hikvision": "http://www.hikvision.com/ver20/XMLSchema", + } v = self.http.get("/ISAPI/System/Network/interfaces", use_basic=True) v = v.replace("\n", "") if "std-cgi" in v: - ns['ns'] = ns["std-cgi"] + ns["ns"] = ns["std-cgi"] elif "www.hikvision.com" in v: - ns['ns'] = ns["hikvision"] + ns["ns"] = ns["hikvision"] else: - ns['ns'] = ns["isapi"] + ns["ns"] = ns["isapi"] root = ElementTree.fromstring(v) # mac = self.scripts.get_chassis_id()[0]["first_chassis_mac"] for o in root: o_id = o.find("{%s}id" % ns["ns"]).text name = "eth%s" % o_id - iface = { - "name": name, - "type": "physical", - "admin_status": True, - "oper_status": True - } - sub = { - "name": name, - "admin_status": True, - "oper_status": True, - "enabled_afi": [] - } + iface = {"name": name, "type": "physical", "admin_status": True, "oper_status": True} + sub = {"name": name, "admin_status": True, "oper_status": True, "enabled_afi": []} try: v = self.http.get("/ISAPI/System/Network/interfaces/%s/Link" % o_id, use_basic=True) v = v.replace("\n", "") @@ -67,9 +60,8 @@ class Script(BaseScript): if "IPv4" not in sub["enabled_afi"]: sub["enabled_afi"] += ["IPv4"] ip_address = "%s/%s" % ( - ip.find("{%s}ipAddress" % ns["ns"]).text, IPv4.netmask_to_len( - ip.find("{%s}subnetMask" % ns["ns"]).text - ) + ip.find("{%s}ipAddress" % ns["ns"]).text, + IPv4.netmask_to_len(ip.find("{%s}subnetMask" % ns["ns"]).text), ) if "ipv4_addresses" in sub: sub["ipv4_addresses"] += [ip_address] @@ -79,7 +71,8 @@ class Script(BaseScript): if "IPv6" not in sub["enabled_afi"]: sub["enabled_afi"] += ["IPv6"] ip_address = IPv6( - ip.find("{%s}ipAddress" % ns["ns"]).text, netmask=ip.find("ns:subnetMask", ns).text + ip.find("{%s}ipAddress" % ns["ns"]).text, + netmask=ip.find("ns:subnetMask", ns).text, ).prefix iface["subinterfaces"] = [sub] diff --git a/sa/profiles/Hikvision/DSKV8/get_version.py b/sa/profiles/Hikvision/DSKV8/get_version.py index 1d247ef63de2ba86c1c85f25fe3c3d7a52b4d3cd..4dcec4f3051861d5e5653b6a3ccf7d9b23b588fe 100644 --- a/sa/profiles/Hikvision/DSKV8/get_version.py +++ b/sa/profiles/Hikvision/DSKV8/get_version.py @@ -9,6 +9,7 @@ # Python modules import re import xml.etree.ElementTree as ElementTree + # NOC modules from noc.core.script.base import BaseScript from noc.sa.interfaces.igetversion import IGetVersion @@ -22,21 +23,23 @@ class Script(BaseScript): rx_date = re.compile(r"(?P\d\d)(?P\d\d)(?P
\d\d)") def execute(self): - ns = {'isapi': 'http://www.isapi.org/ver20/XMLSchema', - 'std-cgi': 'http://www.std-cgi.com/ver20/XMLSchema', - 'hikvision': 'http://www.hikvision.com/ver20/XMLSchema'} + ns = { + "isapi": "http://www.isapi.org/ver20/XMLSchema", + "std-cgi": "http://www.std-cgi.com/ver20/XMLSchema", + "hikvision": "http://www.hikvision.com/ver20/XMLSchema", + } v = self.http.get("/ISAPI/System/deviceInfo", cached=True, use_basic=True) v = v.replace("\n", "") if "std-cgi" in v: - ns['ns'] = ns["std-cgi"] + ns["ns"] = ns["std-cgi"] elif "www.hikvision.com" in v: - ns['ns'] = ns["hikvision"] + ns["ns"] = ns["hikvision"] else: - ns['ns'] = ns["isapi"] + ns["ns"] = ns["isapi"] root = ElementTree.fromstring(v) return { - "vendor": 'Hikvision', + "vendor": "Hikvision", "platform": root.find("isapi:model", ns).text, "version": root.find("isapi:firmwareVersion", ns).text, "attributes": { @@ -45,5 +48,5 @@ class Script(BaseScript): "HW version": root.find("isapi:firmwareVersion", ns).text, "Serial Number": root.find("isapi:serialNumber", ns).text # "Firmware Type": - } + }, }