From 44405baaf39af36d1b695d1f8be6836319257816 Mon Sep 17 00:00:00 2001 From: weragrzeda Date: Wed, 16 Aug 2023 14:30:05 +0200 Subject: [PATCH 01/12] nodeconfig ntp servers for smms --- confluent_client/bin/nodeconfig | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/confluent_client/bin/nodeconfig b/confluent_client/bin/nodeconfig index 06d512c7..0ba8d351 100755 --- a/confluent_client/bin/nodeconfig +++ b/confluent_client/bin/nodeconfig @@ -1,4 +1,4 @@ -#!/usr/bin/python2 +#!/usr/libexec/platform-python # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2017 Lenovo @@ -98,8 +98,17 @@ cfgpaths = { 'static_v6_gateway'), 'bmc.hostname': ( 'configuration/management_controller/hostname', 'hostname'), + 'bmc.ntp': ( + 'configuration/management_controller/ntp/enabled', 'state'), + 'bmc.ntpServer1': ( + 'configuration/management_controller/ntp/servers/1', 'server'), + 'bmc.ntpServer2': ( + 'configuration/management_controller/ntp/servers/2', 'server'), + 'bmc.ntpServer3': ( + 'configuration/management_controller/ntp/servers/3', 'server') } + autodeps = { 'bmc.ipv4_address': (('bmc.ipv4_method', 'static'),) } @@ -113,6 +122,7 @@ client.check_globbing(noderange) setmode = None assignment = {} queryparms = {} + printsys = [] printbmc = [] printextbmc = [] @@ -131,7 +141,6 @@ if len(args) == 1 or options.exclude: queryparms[path] = {} queryparms[path][attrib] = candidate - def _assign_value(): if key not in cfgpaths: setsys[key] = value @@ -233,6 +242,7 @@ else: parse_config_line(args[1:]) session = client.Command() rcode = 0 + if options.restoredefault: session.stop_if_noderange_over(noderange, options.maxnodes) if options.restoredefault.lower() in ( @@ -295,8 +305,10 @@ else: for path in queryparms: if options.comparedefault: continue - rcode |= client.print_attrib_path(path, session, list(queryparms[path]), - NullOpt(), queryparms[path]) + + rcode |= client.print_attrib_path(path, session, list(queryparms[path]),NullOpt(), queryparms[path]) + + if printsys == 'all' or printextbmc or printbmc or printallbmc: if printbmc or not printextbmc: rcode |= client.print_attrib_path( From 6d87d11f5e6decd854995d4b5bd7188c049c418a Mon Sep 17 00:00:00 2001 From: weragrzeda Date: Wed, 23 Aug 2023 14:28:33 +0200 Subject: [PATCH 02/12] my changes to Eaton PDU sensors --- .../plugins/hardwaremanagement/eatonpdu.py | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py index 16be5b38..da60b182 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py @@ -158,7 +158,7 @@ def get_sensor_data(element, node, configmanager): sn = _sensors_by_node.get(node, None) for outlet in sn[0]: for sensename in sn[0][outlet]: - myname = 'Outlet {0} {1}'.format(outlet, sensename) + myname = '{0} {1}'.format(outlet, sensename) measurement = sn[0][outlet][sensename] if name == 'all' or simplify_name(myname) == name: readings.append({ @@ -259,6 +259,11 @@ class PDUClient(object): url = '/config/gateway?page={}&sessionId={}&_dc={}'.format(suburl, self.sessid, int(time.time())) return wc.grab_response(url) + def do_request1(self, suburl): + wc = self.wc + url = '/config/gateway?page={}&sessionId={}'.format(suburl, self.sessid) + return wc.grab_response(url) + def logout(self): self.do_request('cgi_logout') @@ -274,29 +279,51 @@ class PDUClient(object): return def get_sensor_data(self): - rsp = self.do_request('cgi_pdu_outlets') + rsp = self.do_request1('cgi_overview') + data = sanitize_json(rsp[0]) data = json.loads(data) + data1 = data['data'][4][0][8] data = data['data'][0] sdata = {} for outdata in data: + outsense = {} - outletname = outdata[0][0] - outsense['Energy'] = { - 'value': float(outdata[11] / 1000), - 'units': 'kwh', - 'type': 'Energy' - } + outletname = outdata[3] outsense['Power'] = { - 'value': float(outdata[4]), - 'units': 'w', + 'value': outdata[5], + 'units': 'kW', 'type': 'Power', } sdata[outletname] = outsense + for outdata in data1: + + outsense = {} + outletname = outdata[0] + if type(outdata[1]) == str : + splitter = outdata[1].split(" ") + + if len(splitter) == 1: + splitter.append('w') + outsense['Power'] = { + 'value': splitter[0], + 'units': splitter[1], + 'type': 'Power', + } + elif type(outdata[1]) == list: + if type(outdata[1][1]) == float: + outletname=outletname.strip('
Since') + + outsense['Energy'] = { + 'value': outdata[1][0] / 1000, + 'units': 'kWh', + 'type': 'Energy', + } + sdata[outletname] = outsense return sdata def set_outlet(self, outlet, state): - rsp = self.do_request('cgi_pdu_outlets') + rsp = self.do_request('cgi_overview') data = sanitize_json(rsp[0]) data = json.loads(data) data = data['data'][0] From f633c93d0f6dc45af805c3830e02c596cefe74a7 Mon Sep 17 00:00:00 2001 From: weragrzeda Date: Fri, 25 Aug 2023 08:27:27 +0200 Subject: [PATCH 03/12] Geit PDU nodeinvntory Please enter the commit message for your changes. Lines starting with '' will be ignored, and an empty message aborts the commit. On branch master Your branch is up to date with 'origin/master'. Changes to be committed: modified: geist.py --- .../plugins/hardwaremanagement/geist.py | 264 +++++++++++------- 1 file changed, 166 insertions(+), 98 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index 3af6fa49..64bf04f3 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -20,23 +20,28 @@ import eventlet.green.time as time import eventlet import eventlet.greenpool as greenpool + + def simplify_name(name): - return name.lower().replace(' ', '_').replace('/', '-').replace( - '_-_', '-') + return name.lower().replace(" ", "_").replace("/", "-").replace("_-_", "-") + pdupool = greenpool.GreenPool(128) + def data_by_type(indata): databytype = {} for keyname in indata: obj = indata[keyname] - objtype = obj.get('type', None) + objtype = obj.get("type", None) if not objtype: continue if objtype in databytype: - raise Exception("Multiple instances of type {} not yet supported".format(objtype)) + raise Exception( + "Multiple instances of type {} not yet supported".format(objtype) + ) databytype[objtype] = obj - obj['keyname'] = keyname + obj["keyname"] = keyname return databytype @@ -58,173 +63,227 @@ class GeistClient(object): def wc(self): if self._wc: return self._wc - targcfg = self.configmanager.get_node_attributes(self.node, - ['hardwaremanagement.manager'], - decrypt=True) + targcfg = self.configmanager.get_node_attributes( + self.node, ["hardwaremanagement.manager"], decrypt=True + ) targcfg = targcfg.get(self.node, {}) - target = targcfg.get( - 'hardwaremanagement.manager', {}).get('value', None) + target = targcfg.get("hardwaremanagement.manager", {}).get("value", None) if not target: target = self.node - target = target.split('/', 1)[0] + target = target.split("/", 1)[0] cv = util.TLSCertVerifier( - self.configmanager, self.node, - 'pubkeys.tls_hardwaremanager').verify_cert + self.configmanager, self.node, "pubkeys.tls_hardwaremanager" + ).verify_cert self._wc = wc.SecureHTTPConnection(target, port=443, verifycallback=cv) return self._wc def login(self, configmanager): - credcfg = configmanager.get_node_attributes(self.node, - ['secret.hardwaremanagementuser', - 'secret.hardwaremanagementpassword'], - decrypt=True) + credcfg = configmanager.get_node_attributes( + self.node, + ["secret.hardwaremanagementuser", "secret.hardwaremanagementpassword"], + decrypt=True, + ) credcfg = credcfg.get(self.node, {}) - username = credcfg.get( - 'secret.hardwaremanagementuser', {}).get('value', None) - passwd = credcfg.get( - 'secret.hardwaremanagementpassword', {}).get('value', None) + username = credcfg.get("secret.hardwaremanagementuser", {}).get("value", None) + passwd = credcfg.get("secret.hardwaremanagementpassword", {}).get("value", None) if not isinstance(username, str): - username = username.decode('utf8') + username = username.decode("utf8") if not isinstance(passwd, str): - passwd = passwd.decode('utf8') + passwd = passwd.decode("utf8") if not username or not passwd: - raise Exception('Missing username or password') + raise Exception("Missing username or password") self.username = username rsp = self.wc.grab_json_response( - '/api/auth/{0}'.format(username), - {'cmd': 'login', 'data': {'password': passwd}}) - token = rsp['data']['token'] + "/api/auth/{0}".format(username), + {"cmd": "login", "data": {"password": passwd}}, + ) + token = rsp["data"]["token"] return token def logout(self): if self._token: - self.wc.grab_json_response('/api/auth/{0}'.format(self.username), - {'cmd': 'logout', 'token': self.token}) + self.wc.grab_json_response( + "/api/auth/{0}".format(self.username), + {"cmd": "logout", "token": self.token}, + ) self._token = None def get_outlet(self, outlet): - rsp = self.wc.grab_json_response('/api/dev') - rsp = rsp['data'] + rsp = self.wc.grab_json_response("/api/dev") + rsp = rsp["data"] dbt = data_by_type(rsp) - if 't3hd' in dbt: - del dbt['t3hd'] + if "t3hd" in dbt: + del dbt["t3hd"] if len(dbt) != 1: - raise Exception('Multiple PDUs not supported per pdu') + raise Exception("Multiple PDUs not supported per pdu") pdutype = list(dbt)[0] - outlet = dbt[pdutype]['outlet'][str(int(outlet) - 1)] - state = outlet['state'].split('2')[-1] + outlet = dbt[pdutype]["outlet"][str(int(outlet) - 1)] + state = outlet["state"].split("2")[-1] return state def set_outlet(self, outlet, state): - rsp = self.wc.grab_json_response('/api/dev') - dbt = data_by_type(rsp['data']) - if 't3hd' in dbt: - del dbt['t3hd'] + rsp = self.wc.grab_json_response("/api/dev") + dbt = data_by_type(rsp["data"]) + if "t3hd" in dbt: + del dbt["t3hd"] if len(dbt) != 1: self.logout() - raise Exception('Multiple PDUs per endpoint not supported') - pdu = dbt[list(dbt)[0]]['keyname'] + raise Exception("Multiple PDUs per endpoint not supported") + pdu = dbt[list(dbt)[0]]["keyname"] outlet = int(outlet) - 1 rsp = self.wc.grab_json_response( - '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), - {'cmd': 'control', 'token': self.token, - 'data': {'action': state, 'delay': False}}) + "/api/dev/{0}/outlet/{1}".format(pdu, outlet), + { + "cmd": "control", + "token": self.token, + "data": {"action": state, "delay": False}, + }, + ) -def process_measurement(keyname, name, enttype, entname, measurement, readings, category): - if measurement['type'] == 'realPower': - if category not in ('all', 'power'): + +def process_measurement( + keyname, name, enttype, entname, measurement, readings, category +): + if measurement["type"] == "realPower": + if category not in ("all", "power"): return - readtype = 'Real Power' - elif measurement['type'] == 'apparentPower': - if category not in ('all', 'power'): + readtype = "Real Power" + elif measurement["type"] == "apparentPower": + if category not in ("all", "power"): return - readtype = 'Apparent Power' - elif measurement['type'] == 'energy': - if category not in ('all', 'energy'): + readtype = "Apparent Power" + elif measurement["type"] == "energy": + if category not in ("all", "energy"): return - readtype = 'Energy' - elif measurement['type'] == 'voltage': - if category not in ('all',): + readtype = "Energy" + elif measurement["type"] == "voltage": + if category not in ("all",): return - readtype = 'Voltage' - elif measurement['type'] == 'temperature': - readtype = 'Temperature' - elif measurement['type'] == 'dewpoint': - readtype = 'Dewpoint' - elif measurement['type'] == 'humidity': - readtype = 'Humidity' + readtype = "Voltage" + elif measurement["type"] == "temperature": + readtype = "Temperature" + elif measurement["type"] == "dewpoint": + readtype = "Dewpoint" + elif measurement["type"] == "humidity": + readtype = "Humidity" else: return - myname = entname + ' ' + readtype - if name != 'all' and simplify_name(myname) != name: + myname = entname + " " + readtype + if name != "all" and simplify_name(myname) != name: return - readings.append({ - 'name': myname, - 'value': float(measurement['value']), - 'units': measurement['units'], - 'type': readtype.split()[-1] - }) - + readings.append( + { + "name": myname, + "value": float(measurement["value"]), + "units": measurement["units"], + "type": readtype.split()[-1], + } + ) + def process_measurements(name, category, measurements, enttype, readings): for measure in util.natural_sort(list(measurements)): - measurement = measurements[measure]['measurement'] - entname = measurements[measure]['name'] + measurement = measurements[measure]["measurement"] + entname = measurements[measure]["name"] for measureid in measurement: - process_measurement(measure, name, enttype, entname, measurement[measureid], readings, category) - + process_measurement( + measure, + name, + enttype, + entname, + measurement[measureid], + readings, + category, + ) + _sensors_by_node = {} + + def read_sensors(element, node, configmanager): category, name = element[-2:] justnames = False if len(element) == 3: # just get names category = name - name = 'all' + name = "all" justnames = True - if category in ('leds, fans', 'temperature'): + if category in ("leds, fans", "temperature"): return sn = _sensors_by_node.get(node, None) if not sn or sn[1] < time.time(): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response('/api/dev') + adev = gc.wc.grab_json_response("/api/dev") _sensors_by_node[node] = (adev, time.time() + 1) sn = _sensors_by_node.get(node, None) - dbt = data_by_type(sn[0]['data']) + dbt = data_by_type(sn[0]["data"]) readings = [] - for datatype in dbt: + for datatype in dbt: datum = dbt[datatype] - process_measurements(name, category, datum['entity'], 'entity', readings) - if 'outlet' in datum: - process_measurements(name, category, datum['outlet'], 'outlet', readings) + process_measurements(name, category, datum["entity"], "entity", readings) + if "outlet" in datum: + process_measurements(name, category, datum["outlet"], "outlet", readings) if justnames: for reading in readings: - yield msg.ChildCollection(simplify_name(reading['name'])) + yield msg.ChildCollection(simplify_name(reading["name"])) else: yield msg.SensorReadings(readings, name=node) + def get_outlet(node, configmanager, element): gc = GeistClient(node, configmanager) state = gc.get_outlet(element[-1]) return msg.PowerState(node=node, state=state) + def read_firmware(node, configmanager): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response('/api/sys') - myversion = adev['data']['version'] - yield msg.Firmware([{'PDU Firmware': {'version': myversion}}], node) + adev = gc.wc.grab_json_response("/api/sys") + myversion = adev["data"]["version"] + yield msg.Firmware([{"PDU Firmware": {"version": myversion}}], node) + + +def read_inventory(element, node, configmanager): + _inventory = {} + inventory = {} + gc = GeistClient(node, configmanager) + adev = gc.wc.grab_json_response("/api/sys") + basedata = adev["data"] + inventory["present"] = True + inventory["name"] = "PDU" + for elem in basedata.items(): + if ( + elem[0] != "component" + and elem[0] != "locale" + and elem[0] != "state" + and elem[0] != "contact" + ): # and elem[0] !='name': + _inventory[elem[0]] = elem[1] + elif elem[0] == "component": + tempname = "" + for component in basedata["component"].items(): + for item in component: + if type(item) == str: + tempname = item + else: + for entry in item.items(): + _inventory[tempname + " " + entry[0]] = entry[1] + + inventory["information"] = _inventory + + yield msg.KeyValueData({"inventory": [inventory]}, node) + def retrieve(nodes, element, configmanager, inputdata): - if 'outlets' in element: + if "outlets" in element: gp = greenpool.GreenPile(pdupool) for node in nodes: - gp.spawn(get_outlet, node, configmanager, element) + gp.spawn(get_outlet, element, node, configmanager) for res in gp: yield res - + return - elif element[0] == 'sensors': + elif element[0] == "sensors": gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_sensors, element, node, configmanager) @@ -232,21 +291,30 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum return - elif '/'.join(element).startswith('inventory/firmware/all'): + elif "/".join(element).startswith("inventory/firmware/all"): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_firmware, node, configmanager) for rsp in gp: for datum in rsp: yield datum + + elif "/".join(element).startswith("inventory/hardware/all"): + gp = greenpool.GreenPile(pdupool) + for node in nodes: + gp.spawn(read_inventory, element, node, configmanager) + for rsp in gp: + for datum in rsp: + yield datum else: for node in nodes: - yield msg.ConfluentResourceUnavailable(node, 'Not implemented') + yield msg.ConfluentResourceUnavailable(node, "Not implemented") return - + + def update(nodes, element, configmanager, inputdata): - if 'outlets' not in element: - yield msg.ConfluentResourceUnavailable(node, 'Not implemented') + if "outlets" not in element: + yield msg.ConfluentResourceUnavailable(node, "Not implemented") return for node in nodes: gc = GeistClient(node, configmanager) From c95052438688cf9481ae9f18612340ed23325393 Mon Sep 17 00:00:00 2001 From: weragrzeda Date: Thu, 7 Sep 2023 13:08:33 +0200 Subject: [PATCH 04/12] geist.py outlet state fix --- .../plugins/hardwaremanagement/geist.py | 264 ++++++++---------- 1 file changed, 119 insertions(+), 145 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index 64bf04f3..620a0576 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -19,29 +19,25 @@ import confluent.exceptions as exc import eventlet.green.time as time import eventlet import eventlet.greenpool as greenpool - - +import json def simplify_name(name): - return name.lower().replace(" ", "_").replace("/", "-").replace("_-_", "-") - + return name.lower().replace(' ', '_').replace('/', '-').replace( + '_-_', '-') pdupool = greenpool.GreenPool(128) - def data_by_type(indata): databytype = {} for keyname in indata: obj = indata[keyname] - objtype = obj.get("type", None) + objtype = obj.get('type', None) if not objtype: continue if objtype in databytype: - raise Exception( - "Multiple instances of type {} not yet supported".format(objtype) - ) + raise Exception("Multiple instances of type {} not yet supported".format(objtype)) databytype[objtype] = obj - obj["keyname"] = keyname + obj['keyname'] = keyname return databytype @@ -63,227 +59,206 @@ class GeistClient(object): def wc(self): if self._wc: return self._wc - targcfg = self.configmanager.get_node_attributes( - self.node, ["hardwaremanagement.manager"], decrypt=True - ) + targcfg = self.configmanager.get_node_attributes(self.node, + ['hardwaremanagement.manager'], + decrypt=True) targcfg = targcfg.get(self.node, {}) - target = targcfg.get("hardwaremanagement.manager", {}).get("value", None) + target = targcfg.get( + 'hardwaremanagement.manager', {}).get('value', None) if not target: target = self.node - target = target.split("/", 1)[0] + target = target.split('/', 1)[0] cv = util.TLSCertVerifier( - self.configmanager, self.node, "pubkeys.tls_hardwaremanager" - ).verify_cert + self.configmanager, self.node, + 'pubkeys.tls_hardwaremanager').verify_cert self._wc = wc.SecureHTTPConnection(target, port=443, verifycallback=cv) return self._wc def login(self, configmanager): - credcfg = configmanager.get_node_attributes( - self.node, - ["secret.hardwaremanagementuser", "secret.hardwaremanagementpassword"], - decrypt=True, - ) + credcfg = configmanager.get_node_attributes(self.node, + ['secret.hardwaremanagementuser', + 'secret.hardwaremanagementpassword'], + decrypt=True) credcfg = credcfg.get(self.node, {}) - username = credcfg.get("secret.hardwaremanagementuser", {}).get("value", None) - passwd = credcfg.get("secret.hardwaremanagementpassword", {}).get("value", None) + username = credcfg.get( + 'secret.hardwaremanagementuser', {}).get('value', None) + passwd = credcfg.get( + 'secret.hardwaremanagementpassword', {}).get('value', None) if not isinstance(username, str): - username = username.decode("utf8") + username = username.decode('utf8') if not isinstance(passwd, str): - passwd = passwd.decode("utf8") + passwd = passwd.decode('utf8') if not username or not passwd: - raise Exception("Missing username or password") + raise Exception('Missing username or password') self.username = username rsp = self.wc.grab_json_response( - "/api/auth/{0}".format(username), - {"cmd": "login", "data": {"password": passwd}}, - ) - token = rsp["data"]["token"] + '/api/auth/{0}'.format(username), + {'cmd': 'login', 'data': {'password': passwd}}) + token = rsp['data']['token'] return token def logout(self): if self._token: - self.wc.grab_json_response( - "/api/auth/{0}".format(self.username), - {"cmd": "logout", "token": self.token}, - ) + self.wc.grab_json_response('/api/auth/{0}'.format(self.username), + {'cmd': 'logout', 'token': self.token}) self._token = None def get_outlet(self, outlet): - rsp = self.wc.grab_json_response("/api/dev") - rsp = rsp["data"] + rsp = self.wc.grab_json_response('/api/dev') + rsp = rsp['data'] dbt = data_by_type(rsp) - if "t3hd" in dbt: - del dbt["t3hd"] + + if 't3hd' in dbt: + del dbt['t3hd'] if len(dbt) != 1: - raise Exception("Multiple PDUs not supported per pdu") + raise Exception('Multiple PDUs not supported per pdu') pdutype = list(dbt)[0] - outlet = dbt[pdutype]["outlet"][str(int(outlet) - 1)] - state = outlet["state"].split("2")[-1] + + outlet = dbt[pdutype]['outlet'][ str(int(outlet[0]) - 1) ] + + state = outlet['state'].split('2')[-1] return state def set_outlet(self, outlet, state): - rsp = self.wc.grab_json_response("/api/dev") - dbt = data_by_type(rsp["data"]) - if "t3hd" in dbt: - del dbt["t3hd"] + rsp = self.wc.grab_json_response('/api/dev') + dbt = data_by_type(rsp['data']) + if 't3hd' in dbt: + del dbt['t3hd'] if len(dbt) != 1: self.logout() - raise Exception("Multiple PDUs per endpoint not supported") - pdu = dbt[list(dbt)[0]]["keyname"] + raise Exception('Multiple PDUs per endpoint not supported') + pdu = dbt[list(dbt)[0]]['keyname'] outlet = int(outlet) - 1 rsp = self.wc.grab_json_response( - "/api/dev/{0}/outlet/{1}".format(pdu, outlet), - { - "cmd": "control", - "token": self.token, - "data": {"action": state, "delay": False}, - }, - ) + '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), + {'cmd': 'control', 'token': self.token, + 'data': {'action': state, 'delay': False}}) - -def process_measurement( - keyname, name, enttype, entname, measurement, readings, category -): - if measurement["type"] == "realPower": - if category not in ("all", "power"): +def process_measurement(keyname, name, enttype, entname, measurement, readings, category): + if measurement['type'] == 'realPower': + if category not in ('all', 'power'): return - readtype = "Real Power" - elif measurement["type"] == "apparentPower": - if category not in ("all", "power"): + readtype = 'Real Power' + elif measurement['type'] == 'apparentPower': + if category not in ('all', 'power'): return - readtype = "Apparent Power" - elif measurement["type"] == "energy": - if category not in ("all", "energy"): + readtype = 'Apparent Power' + elif measurement['type'] == 'energy': + if category not in ('all', 'energy'): return - readtype = "Energy" - elif measurement["type"] == "voltage": - if category not in ("all",): + readtype = 'Energy' + elif measurement['type'] == 'voltage': + if category not in ('all',): return - readtype = "Voltage" - elif measurement["type"] == "temperature": - readtype = "Temperature" - elif measurement["type"] == "dewpoint": - readtype = "Dewpoint" - elif measurement["type"] == "humidity": - readtype = "Humidity" + readtype = 'Voltage' + elif measurement['type'] == 'temperature': + readtype = 'Temperature' + elif measurement['type'] == 'dewpoint': + readtype = 'Dewpoint' + elif measurement['type'] == 'humidity': + readtype = 'Humidity' else: return - myname = entname + " " + readtype - if name != "all" and simplify_name(myname) != name: + myname = entname + ' ' + readtype + if name != 'all' and simplify_name(myname) != name: return - readings.append( - { - "name": myname, - "value": float(measurement["value"]), - "units": measurement["units"], - "type": readtype.split()[-1], - } - ) - + readings.append({ + 'name': myname, + 'value': float(measurement['value']), + 'units': measurement['units'], + 'type': readtype.split()[-1] + }) + def process_measurements(name, category, measurements, enttype, readings): for measure in util.natural_sort(list(measurements)): - measurement = measurements[measure]["measurement"] - entname = measurements[measure]["name"] + measurement = measurements[measure]['measurement'] + entname = measurements[measure]['name'] for measureid in measurement: - process_measurement( - measure, - name, - enttype, - entname, - measurement[measureid], - readings, - category, - ) - + process_measurement(measure, name, enttype, entname, measurement[measureid], readings, category) + _sensors_by_node = {} - - def read_sensors(element, node, configmanager): category, name = element[-2:] justnames = False if len(element) == 3: # just get names category = name - name = "all" + name = 'all' justnames = True - if category in ("leds, fans", "temperature"): + if category in ('leds, fans', 'temperature'): return sn = _sensors_by_node.get(node, None) if not sn or sn[1] < time.time(): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/dev") + adev = gc.wc.grab_json_response('/api/dev') _sensors_by_node[node] = (adev, time.time() + 1) sn = _sensors_by_node.get(node, None) - dbt = data_by_type(sn[0]["data"]) + dbt = data_by_type(sn[0]['data']) readings = [] - for datatype in dbt: + for datatype in dbt: datum = dbt[datatype] - process_measurements(name, category, datum["entity"], "entity", readings) - if "outlet" in datum: - process_measurements(name, category, datum["outlet"], "outlet", readings) + process_measurements(name, category, datum['entity'], 'entity', readings) + if 'outlet' in datum: + process_measurements(name, category, datum['outlet'], 'outlet', readings) if justnames: for reading in readings: - yield msg.ChildCollection(simplify_name(reading["name"])) + yield msg.ChildCollection(simplify_name(reading['name'])) else: yield msg.SensorReadings(readings, name=node) - -def get_outlet(node, configmanager, element): +def get_outlet(element, node, configmanager): gc = GeistClient(node, configmanager) state = gc.get_outlet(element[-1]) - return msg.PowerState(node=node, state=state) + return msg.PowerState(node=node, state=state) def read_firmware(node, configmanager): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/sys") - myversion = adev["data"]["version"] - yield msg.Firmware([{"PDU Firmware": {"version": myversion}}], node) + adev = gc.wc.grab_json_response('/api/sys') + myversion = adev['data']['version'] + yield msg.Firmware([{'PDU Firmware': {'version': myversion}}], node) def read_inventory(element, node, configmanager): _inventory = {} inventory = {} gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/sys") - basedata = adev["data"] - inventory["present"] = True - inventory["name"] = "PDU" + adev = gc.wc.grab_json_response('/api/sys') + basedata = adev['data'] + inventory['present'] = True + inventory['name'] = 'PDU' for elem in basedata.items(): - if ( - elem[0] != "component" - and elem[0] != "locale" - and elem[0] != "state" - and elem[0] != "contact" - ): # and elem[0] !='name': - _inventory[elem[0]] = elem[1] - elif elem[0] == "component": - tempname = "" - for component in basedata["component"].items(): + if elem[0] !='component' and elem[0] !='locale' and elem[0] !='state' and elem[0] !='contact': # and elem[0] !='name': + _inventory[elem[0]] = elem[1] + elif elem[0] =='component': + tempname = '' + for component in basedata['component'].items(): for item in component: if type(item) == str: tempname = item else: for entry in item.items(): - _inventory[tempname + " " + entry[0]] = entry[1] + _inventory[tempname + ' ' + entry[0]] = entry[1] + - inventory["information"] = _inventory - - yield msg.KeyValueData({"inventory": [inventory]}, node) + inventory['information']= _inventory + yield msg.KeyValueData({'inventory': [inventory]}, node) + def retrieve(nodes, element, configmanager, inputdata): - if "outlets" in element: + if 'outlets' in element: gp = greenpool.GreenPile(pdupool) for node in nodes: + print(element) gp.spawn(get_outlet, element, node, configmanager) for res in gp: yield res - + return - elif element[0] == "sensors": + elif element[0] == 'sensors': gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_sensors, element, node, configmanager) @@ -291,7 +266,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum return - elif "/".join(element).startswith("inventory/firmware/all"): + elif '/'.join(element).startswith('inventory/firmware/all'): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_firmware, node, configmanager) @@ -299,7 +274,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum - elif "/".join(element).startswith("inventory/hardware/all"): + elif '/'.join(element).startswith('inventory/hardware/all'): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_inventory, element, node, configmanager) @@ -308,13 +283,12 @@ def retrieve(nodes, element, configmanager, inputdata): yield datum else: for node in nodes: - yield msg.ConfluentResourceUnavailable(node, "Not implemented") + yield msg.ConfluentResourceUnavailable(node, 'Not implemented') return - - + def update(nodes, element, configmanager, inputdata): - if "outlets" not in element: - yield msg.ConfluentResourceUnavailable(node, "Not implemented") + if 'outlets' not in element: + yield msg.ConfluentResourceUnavailable(node, 'Not implemented') return for node in nodes: gc = GeistClient(node, configmanager) From 7b19e67bf0daeb87a0b526a0acf636c7e50bcd81 Mon Sep 17 00:00:00 2001 From: weragrzeda Date: Thu, 21 Sep 2023 06:27:12 +0200 Subject: [PATCH 05/12] amperage and outlet fix for geist.py --- .../plugins/hardwaremanagement/geist.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index 620a0576..a628eb34 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -84,6 +84,7 @@ class GeistClient(object): 'secret.hardwaremanagementuser', {}).get('value', None) passwd = credcfg.get( 'secret.hardwaremanagementpassword', {}).get('value', None) + if not isinstance(username, str): username = username.decode('utf8') if not isinstance(passwd, str): @@ -94,6 +95,7 @@ class GeistClient(object): rsp = self.wc.grab_json_response( '/api/auth/{0}'.format(username), {'cmd': 'login', 'data': {'password': passwd}}) + token = rsp['data']['token'] return token @@ -113,9 +115,7 @@ class GeistClient(object): if len(dbt) != 1: raise Exception('Multiple PDUs not supported per pdu') pdutype = list(dbt)[0] - - outlet = dbt[pdutype]['outlet'][ str(int(outlet[0]) - 1) ] - + outlet = dbt[pdutype]['outlet'][ str(int(outlet.join(c for c in outlet if c.isdigit())) - 1) ] state = outlet['state'].split('2')[-1] return state @@ -128,7 +128,8 @@ class GeistClient(object): self.logout() raise Exception('Multiple PDUs per endpoint not supported') pdu = dbt[list(dbt)[0]]['keyname'] - outlet = int(outlet) - 1 + outlet = int(outlet.join(c for c in outlet if c.isdigit())) - 1 + rsp = self.wc.grab_json_response( '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), {'cmd': 'control', 'token': self.token, @@ -151,6 +152,10 @@ def process_measurement(keyname, name, enttype, entname, measurement, readings, if category not in ('all',): return readtype = 'Voltage' + elif measurement['type'] == 'current': + if category not in ('all',): + return + readtype = 'Current' elif measurement['type'] == 'temperature': readtype = 'Temperature' elif measurement['type'] == 'dewpoint': @@ -196,10 +201,12 @@ def read_sensors(element, node, configmanager): _sensors_by_node[node] = (adev, time.time() + 1) sn = _sensors_by_node.get(node, None) dbt = data_by_type(sn[0]['data']) + readings = [] for datatype in dbt: datum = dbt[datatype] process_measurements(name, category, datum['entity'], 'entity', readings) + if 'outlet' in datum: process_measurements(name, category, datum['outlet'], 'outlet', readings) if justnames: @@ -249,10 +256,11 @@ def read_inventory(element, node, configmanager): def retrieve(nodes, element, configmanager, inputdata): + if 'outlets' in element: gp = greenpool.GreenPile(pdupool) for node in nodes: - print(element) + gp.spawn(get_outlet, element, node, configmanager) for res in gp: yield res From ac68f1f22c90a7852459996bd87e07804900d90e Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Fri, 20 Oct 2023 11:38:11 +0200 Subject: [PATCH 06/12] new eaton pdu power readings --- .../plugins/hardwaremanagement/eatonpdu.py | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py index da60b182..9b5ade5b 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py @@ -156,6 +156,7 @@ def get_sensor_data(element, node, configmanager): gc.logout() _sensors_by_node[node] = [sdata, time.time() + 1] sn = _sensors_by_node.get(node, None) +# print(sn) for outlet in sn[0]: for sensename in sn[0][outlet]: myname = '{0} {1}'.format(outlet, sensename) @@ -277,22 +278,35 @@ class PDUClient(object): if outdata[0] == outlet: return 'on' if outdata[3] else 'off' return + def get_outlet_sensors(self): + rsp = self.do_request('cgi_pdu_outlets') + data = sanitize_json(rsp[0]) + data = json.loads(data) + data = data['data'][0] + + + return data def get_sensor_data(self): rsp = self.do_request1('cgi_overview') - + data = sanitize_json(rsp[0]) data = json.loads(data) + data1 = data['data'][4][0][8] - data = data['data'][0] - sdata = {} - for outdata in data: + data = self.get_outlet_sensors() + sdata = {} + + for outdata in data: + outsense = {} - outletname = outdata[3] + outletname = outdata[0][1] + + outsense['Power'] = { - 'value': outdata[5], - 'units': 'kW', + 'value': outdata[4], + 'units': 'W', 'type': 'Power', } sdata[outletname] = outsense From 62ab361ef80eba4ee3d0930f1bb0b40769047b71 Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Mon, 23 Oct 2023 08:16:27 +0200 Subject: [PATCH 07/12] nicer output for inventory --- .../plugins/hardwaremanagement/geist.py | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index a628eb34..06af8675 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -115,7 +115,8 @@ class GeistClient(object): if len(dbt) != 1: raise Exception('Multiple PDUs not supported per pdu') pdutype = list(dbt)[0] - outlet = dbt[pdutype]['outlet'][ str(int(outlet.join(c for c in outlet if c.isdigit())) - 1) ] + outlet = dbt[pdutype]['outlet'][ str(int(outlet)- 1) ] +# print(outlet) state = outlet['state'].split('2')[-1] return state @@ -128,7 +129,7 @@ class GeistClient(object): self.logout() raise Exception('Multiple PDUs per endpoint not supported') pdu = dbt[list(dbt)[0]]['keyname'] - outlet = int(outlet.join(c for c in outlet if c.isdigit())) - 1 + outlet = int(outlet) - 1 rsp = self.wc.grab_json_response( '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), @@ -237,17 +238,29 @@ def read_inventory(element, node, configmanager): inventory['present'] = True inventory['name'] = 'PDU' for elem in basedata.items(): - if elem[0] !='component' and elem[0] !='locale' and elem[0] !='state' and elem[0] !='contact': # and elem[0] !='name': - _inventory[elem[0]] = elem[1] + + if elem[0] !='component' and elem[0] !='locale' and elem[0] !='state' and elem[0] !='contact' and elem[0] !='appVersion' and elem[0] !='build' and elem[0] !='version' and elem[0] !='apiVersion': + temp = elem[0] + if elem[0] == "serialNumber": + temp = "Serial" + elif elem[0] == "partNumber": + temp = "P/N" + elif elem[0] == "modelNumber": + temp= "Lenovo P/N and Serial" + _inventory[temp] = elem[1] elif elem[0] =='component': tempname = '' for component in basedata['component'].items(): for item in component: if type(item) == str: + tempname = item else: for entry in item.items(): - _inventory[tempname + ' ' + entry[0]] = entry[1] + temp = entry[0] + if temp == 'sn': + temp = "Serial" + _inventory[tempname + ' ' + temp] = entry[1] inventory['information']= _inventory From 9954b227a95b33c53c2869e29c091ee68f81cfc9 Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Tue, 23 Apr 2024 15:06:28 +0200 Subject: [PATCH 08/12] Revert "nodeconfig ntp servers for smms" This reverts commit 44405baaf39af36d1b695d1f8be6836319257816. --- confluent_client/bin/nodeconfig | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/confluent_client/bin/nodeconfig b/confluent_client/bin/nodeconfig index 0ba8d351..06d512c7 100755 --- a/confluent_client/bin/nodeconfig +++ b/confluent_client/bin/nodeconfig @@ -1,4 +1,4 @@ -#!/usr/libexec/platform-python +#!/usr/bin/python2 # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2017 Lenovo @@ -98,17 +98,8 @@ cfgpaths = { 'static_v6_gateway'), 'bmc.hostname': ( 'configuration/management_controller/hostname', 'hostname'), - 'bmc.ntp': ( - 'configuration/management_controller/ntp/enabled', 'state'), - 'bmc.ntpServer1': ( - 'configuration/management_controller/ntp/servers/1', 'server'), - 'bmc.ntpServer2': ( - 'configuration/management_controller/ntp/servers/2', 'server'), - 'bmc.ntpServer3': ( - 'configuration/management_controller/ntp/servers/3', 'server') } - autodeps = { 'bmc.ipv4_address': (('bmc.ipv4_method', 'static'),) } @@ -122,7 +113,6 @@ client.check_globbing(noderange) setmode = None assignment = {} queryparms = {} - printsys = [] printbmc = [] printextbmc = [] @@ -141,6 +131,7 @@ if len(args) == 1 or options.exclude: queryparms[path] = {} queryparms[path][attrib] = candidate + def _assign_value(): if key not in cfgpaths: setsys[key] = value @@ -242,7 +233,6 @@ else: parse_config_line(args[1:]) session = client.Command() rcode = 0 - if options.restoredefault: session.stop_if_noderange_over(noderange, options.maxnodes) if options.restoredefault.lower() in ( @@ -305,10 +295,8 @@ else: for path in queryparms: if options.comparedefault: continue - - rcode |= client.print_attrib_path(path, session, list(queryparms[path]),NullOpt(), queryparms[path]) - - + rcode |= client.print_attrib_path(path, session, list(queryparms[path]), + NullOpt(), queryparms[path]) if printsys == 'all' or printextbmc or printbmc or printallbmc: if printbmc or not printextbmc: rcode |= client.print_attrib_path( From 3b69c542034a7311942537c5398c2ac334e88d4e Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Tue, 23 Apr 2024 15:08:36 +0200 Subject: [PATCH 09/12] Revert "new eaton pdu power readings" This reverts commit ac68f1f22c90a7852459996bd87e07804900d90e. --- .../plugins/hardwaremanagement/eatonpdu.py | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py index 9b5ade5b..da60b182 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py @@ -156,7 +156,6 @@ def get_sensor_data(element, node, configmanager): gc.logout() _sensors_by_node[node] = [sdata, time.time() + 1] sn = _sensors_by_node.get(node, None) -# print(sn) for outlet in sn[0]: for sensename in sn[0][outlet]: myname = '{0} {1}'.format(outlet, sensename) @@ -278,35 +277,22 @@ class PDUClient(object): if outdata[0] == outlet: return 'on' if outdata[3] else 'off' return - def get_outlet_sensors(self): - rsp = self.do_request('cgi_pdu_outlets') - data = sanitize_json(rsp[0]) - data = json.loads(data) - data = data['data'][0] - - - return data def get_sensor_data(self): rsp = self.do_request1('cgi_overview') - + data = sanitize_json(rsp[0]) data = json.loads(data) - data1 = data['data'][4][0][8] - - data = self.get_outlet_sensors() + data = data['data'][0] sdata = {} - for outdata in data: - + outsense = {} - outletname = outdata[0][1] - - + outletname = outdata[3] outsense['Power'] = { - 'value': outdata[4], - 'units': 'W', + 'value': outdata[5], + 'units': 'kW', 'type': 'Power', } sdata[outletname] = outsense From 21b8534fefaaee5ebee23247da6dbacf94d3f506 Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Tue, 23 Apr 2024 15:29:35 +0200 Subject: [PATCH 10/12] Revert "my changes to Eaton PDU sensors" This reverts commit 6d87d11f5e6decd854995d4b5bd7188c049c418a. --- .../plugins/hardwaremanagement/eatonpdu.py | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py index da60b182..16be5b38 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/eatonpdu.py @@ -158,7 +158,7 @@ def get_sensor_data(element, node, configmanager): sn = _sensors_by_node.get(node, None) for outlet in sn[0]: for sensename in sn[0][outlet]: - myname = '{0} {1}'.format(outlet, sensename) + myname = 'Outlet {0} {1}'.format(outlet, sensename) measurement = sn[0][outlet][sensename] if name == 'all' or simplify_name(myname) == name: readings.append({ @@ -259,11 +259,6 @@ class PDUClient(object): url = '/config/gateway?page={}&sessionId={}&_dc={}'.format(suburl, self.sessid, int(time.time())) return wc.grab_response(url) - def do_request1(self, suburl): - wc = self.wc - url = '/config/gateway?page={}&sessionId={}'.format(suburl, self.sessid) - return wc.grab_response(url) - def logout(self): self.do_request('cgi_logout') @@ -279,51 +274,29 @@ class PDUClient(object): return def get_sensor_data(self): - rsp = self.do_request1('cgi_overview') - + rsp = self.do_request('cgi_pdu_outlets') data = sanitize_json(rsp[0]) data = json.loads(data) - data1 = data['data'][4][0][8] data = data['data'][0] sdata = {} for outdata in data: - outsense = {} - outletname = outdata[3] + outletname = outdata[0][0] + outsense['Energy'] = { + 'value': float(outdata[11] / 1000), + 'units': 'kwh', + 'type': 'Energy' + } outsense['Power'] = { - 'value': outdata[5], - 'units': 'kW', + 'value': float(outdata[4]), + 'units': 'w', 'type': 'Power', } sdata[outletname] = outsense - for outdata in data1: - - outsense = {} - outletname = outdata[0] - if type(outdata[1]) == str : - splitter = outdata[1].split(" ") - - if len(splitter) == 1: - splitter.append('w') - outsense['Power'] = { - 'value': splitter[0], - 'units': splitter[1], - 'type': 'Power', - } - elif type(outdata[1]) == list: - if type(outdata[1][1]) == float: - outletname=outletname.strip('
Since') - - outsense['Energy'] = { - 'value': outdata[1][0] / 1000, - 'units': 'kWh', - 'type': 'Energy', - } - sdata[outletname] = outsense return sdata def set_outlet(self, outlet, state): - rsp = self.do_request('cgi_overview') + rsp = self.do_request('cgi_pdu_outlets') data = sanitize_json(rsp[0]) data = json.loads(data) data = data['data'][0] From bf004fb7b97e426217337848b21f39a62bd86aad Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Tue, 23 Apr 2024 15:53:35 +0200 Subject: [PATCH 11/12] cleaned geist.py --- .../plugins/hardwaremanagement/geist.py | 277 ++++++++++-------- 1 file changed, 156 insertions(+), 121 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index 06af8675..d3fce9e1 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -19,25 +19,29 @@ import confluent.exceptions as exc import eventlet.green.time as time import eventlet import eventlet.greenpool as greenpool -import json + + def simplify_name(name): - return name.lower().replace(' ', '_').replace('/', '-').replace( - '_-_', '-') + return name.lower().replace(" ", "_").replace("/", "-").replace("_-_", "-") + pdupool = greenpool.GreenPool(128) + def data_by_type(indata): databytype = {} for keyname in indata: obj = indata[keyname] - objtype = obj.get('type', None) + objtype = obj.get("type", None) if not objtype: continue if objtype in databytype: - raise Exception("Multiple instances of type {} not yet supported".format(objtype)) + raise Exception( + "Multiple instances of type {} not yet supported".format(objtype) + ) databytype[objtype] = obj - obj['keyname'] = keyname + obj["keyname"] = keyname return databytype @@ -59,198 +63,229 @@ class GeistClient(object): def wc(self): if self._wc: return self._wc - targcfg = self.configmanager.get_node_attributes(self.node, - ['hardwaremanagement.manager'], - decrypt=True) + targcfg = self.configmanager.get_node_attributes( + self.node, ["hardwaremanagement.manager"], decrypt=True + ) targcfg = targcfg.get(self.node, {}) - target = targcfg.get( - 'hardwaremanagement.manager', {}).get('value', None) + target = targcfg.get("hardwaremanagement.manager", {}).get("value", None) if not target: target = self.node - target = target.split('/', 1)[0] + target = target.split("/", 1)[0] cv = util.TLSCertVerifier( - self.configmanager, self.node, - 'pubkeys.tls_hardwaremanager').verify_cert + self.configmanager, self.node, "pubkeys.tls_hardwaremanager" + ).verify_cert self._wc = wc.SecureHTTPConnection(target, port=443, verifycallback=cv) return self._wc def login(self, configmanager): - credcfg = configmanager.get_node_attributes(self.node, - ['secret.hardwaremanagementuser', - 'secret.hardwaremanagementpassword'], - decrypt=True) + credcfg = configmanager.get_node_attributes( + self.node, + ["secret.hardwaremanagementuser", "secret.hardwaremanagementpassword"], + decrypt=True, + ) credcfg = credcfg.get(self.node, {}) - username = credcfg.get( - 'secret.hardwaremanagementuser', {}).get('value', None) - passwd = credcfg.get( - 'secret.hardwaremanagementpassword', {}).get('value', None) + username = credcfg.get("secret.hardwaremanagementuser", {}).get("value", None) + passwd = credcfg.get("secret.hardwaremanagementpassword", {}).get("value", None) if not isinstance(username, str): - username = username.decode('utf8') + username = username.decode("utf8") if not isinstance(passwd, str): - passwd = passwd.decode('utf8') + passwd = passwd.decode("utf8") if not username or not passwd: - raise Exception('Missing username or password') + raise Exception("Missing username or password") self.username = username rsp = self.wc.grab_json_response( - '/api/auth/{0}'.format(username), - {'cmd': 'login', 'data': {'password': passwd}}) + "/api/auth/{0}".format(username), + {"cmd": "login", "data": {"password": passwd}}, + ) - token = rsp['data']['token'] + token = rsp["data"]["token"] return token def logout(self): if self._token: - self.wc.grab_json_response('/api/auth/{0}'.format(self.username), - {'cmd': 'logout', 'token': self.token}) + self.wc.grab_json_response( + "/api/auth/{0}".format(self.username), + {"cmd": "logout", "token": self.token}, + ) self._token = None def get_outlet(self, outlet): - rsp = self.wc.grab_json_response('/api/dev') - rsp = rsp['data'] + rsp = self.wc.grab_json_response("/api/dev") + rsp = rsp["data"] dbt = data_by_type(rsp) - if 't3hd' in dbt: - del dbt['t3hd'] + if "t3hd" in dbt: + del dbt["t3hd"] if len(dbt) != 1: - raise Exception('Multiple PDUs not supported per pdu') + raise Exception("Multiple PDUs not supported per pdu") pdutype = list(dbt)[0] - outlet = dbt[pdutype]['outlet'][ str(int(outlet)- 1) ] -# print(outlet) - state = outlet['state'].split('2')[-1] + outlet = dbt[pdutype]["outlet"][str(int(outlet) - 1)] + + state = outlet["state"].split("2")[-1] return state def set_outlet(self, outlet, state): - rsp = self.wc.grab_json_response('/api/dev') - dbt = data_by_type(rsp['data']) - if 't3hd' in dbt: - del dbt['t3hd'] + rsp = self.wc.grab_json_response("/api/dev") + dbt = data_by_type(rsp["data"]) + if "t3hd" in dbt: + del dbt["t3hd"] if len(dbt) != 1: self.logout() - raise Exception('Multiple PDUs per endpoint not supported') - pdu = dbt[list(dbt)[0]]['keyname'] - outlet = int(outlet) - 1 + raise Exception("Multiple PDUs per endpoint not supported") + pdu = dbt[list(dbt)[0]]["keyname"] + outlet = int(outlet) - 1 rsp = self.wc.grab_json_response( - '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), - {'cmd': 'control', 'token': self.token, - 'data': {'action': state, 'delay': False}}) + "/api/dev/{0}/outlet/{1}".format(pdu, outlet), + { + "cmd": "control", + "token": self.token, + "data": {"action": state, "delay": False}, + }, + ) -def process_measurement(keyname, name, enttype, entname, measurement, readings, category): - if measurement['type'] == 'realPower': - if category not in ('all', 'power'): + +def process_measurement( + keyname, name, enttype, entname, measurement, readings, category +): + if measurement["type"] == "realPower": + if category not in ("all", "power"): return - readtype = 'Real Power' - elif measurement['type'] == 'apparentPower': - if category not in ('all', 'power'): + readtype = "Real Power" + elif measurement["type"] == "apparentPower": + if category not in ("all", "power"): return - readtype = 'Apparent Power' - elif measurement['type'] == 'energy': - if category not in ('all', 'energy'): + readtype = "Apparent Power" + elif measurement["type"] == "energy": + if category not in ("all", "energy"): return - readtype = 'Energy' - elif measurement['type'] == 'voltage': - if category not in ('all',): + readtype = "Energy" + elif measurement["type"] == "voltage": + if category not in ("all",): return - readtype = 'Voltage' - elif measurement['type'] == 'current': - if category not in ('all',): + readtype = "Voltage" + elif measurement["type"] == "current": + if category not in ("all",): return - readtype = 'Current' - elif measurement['type'] == 'temperature': - readtype = 'Temperature' - elif measurement['type'] == 'dewpoint': - readtype = 'Dewpoint' - elif measurement['type'] == 'humidity': - readtype = 'Humidity' + readtype = "Current" + elif measurement["type"] == "temperature": + readtype = "Temperature" + elif measurement["type"] == "dewpoint": + readtype = "Dewpoint" + elif measurement["type"] == "humidity": + readtype = "Humidity" else: return - myname = entname + ' ' + readtype - if name != 'all' and simplify_name(myname) != name: + myname = entname + " " + readtype + if name != "all" and simplify_name(myname) != name: return - readings.append({ - 'name': myname, - 'value': float(measurement['value']), - 'units': measurement['units'], - 'type': readtype.split()[-1] - }) - + readings.append( + { + "name": myname, + "value": float(measurement["value"]), + "units": measurement["units"], + "type": readtype.split()[-1], + } + ) + def process_measurements(name, category, measurements, enttype, readings): for measure in util.natural_sort(list(measurements)): - measurement = measurements[measure]['measurement'] - entname = measurements[measure]['name'] + measurement = measurements[measure]["measurement"] + entname = measurements[measure]["name"] for measureid in measurement: - process_measurement(measure, name, enttype, entname, measurement[measureid], readings, category) - + process_measurement( + measure, + name, + enttype, + entname, + measurement[measureid], + readings, + category, + ) + _sensors_by_node = {} + + def read_sensors(element, node, configmanager): category, name = element[-2:] justnames = False if len(element) == 3: # just get names category = name - name = 'all' + name = "all" justnames = True - if category in ('leds, fans', 'temperature'): + if category in ("leds, fans", "temperature"): return sn = _sensors_by_node.get(node, None) if not sn or sn[1] < time.time(): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response('/api/dev') + adev = gc.wc.grab_json_response("/api/dev") _sensors_by_node[node] = (adev, time.time() + 1) sn = _sensors_by_node.get(node, None) - dbt = data_by_type(sn[0]['data']) + dbt = data_by_type(sn[0]["data"]) readings = [] - for datatype in dbt: + for datatype in dbt: datum = dbt[datatype] - process_measurements(name, category, datum['entity'], 'entity', readings) + process_measurements(name, category, datum["entity"], "entity", readings) - if 'outlet' in datum: - process_measurements(name, category, datum['outlet'], 'outlet', readings) + if "outlet" in datum: + process_measurements(name, category, datum["outlet"], "outlet", readings) if justnames: for reading in readings: - yield msg.ChildCollection(simplify_name(reading['name'])) + yield msg.ChildCollection(simplify_name(reading["name"])) else: yield msg.SensorReadings(readings, name=node) + def get_outlet(element, node, configmanager): gc = GeistClient(node, configmanager) state = gc.get_outlet(element[-1]) return msg.PowerState(node=node, state=state) + def read_firmware(node, configmanager): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response('/api/sys') - myversion = adev['data']['version'] - yield msg.Firmware([{'PDU Firmware': {'version': myversion}}], node) + adev = gc.wc.grab_json_response("/api/sys") + myversion = adev["data"]["version"] + yield msg.Firmware([{"PDU Firmware": {"version": myversion}}], node) def read_inventory(element, node, configmanager): _inventory = {} inventory = {} gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response('/api/sys') - basedata = adev['data'] - inventory['present'] = True - inventory['name'] = 'PDU' + adev = gc.wc.grab_json_response("/api/sys") + basedata = adev["data"] + inventory["present"] = True + inventory["name"] = "PDU" for elem in basedata.items(): - if elem[0] !='component' and elem[0] !='locale' and elem[0] !='state' and elem[0] !='contact' and elem[0] !='appVersion' and elem[0] !='build' and elem[0] !='version' and elem[0] !='apiVersion': + if ( + elem[0] != "component" + and elem[0] != "locale" + and elem[0] != "state" + and elem[0] != "contact" + and elem[0] != "appVersion" + and elem[0] != "build" + and elem[0] != "version" + and elem[0] != "apiVersion" + ): temp = elem[0] if elem[0] == "serialNumber": temp = "Serial" - elif elem[0] == "partNumber": + elif elem[0] == "partNumber": temp = "P/N" - elif elem[0] == "modelNumber": - temp= "Lenovo P/N and Serial" + elif elem[0] == "modelNumber": + temp = "Lenovo P/N and Serial" _inventory[temp] = elem[1] - elif elem[0] =='component': - tempname = '' - for component in basedata['component'].items(): + elif elem[0] == "component": + tempname = "" + for component in basedata["component"].items(): for item in component: if type(item) == str: @@ -258,28 +293,27 @@ def read_inventory(element, node, configmanager): else: for entry in item.items(): temp = entry[0] - if temp == 'sn': + if temp == "sn": temp = "Serial" - _inventory[tempname + ' ' + temp] = entry[1] - + _inventory[tempname + " " + temp] = entry[1] - inventory['information']= _inventory + inventory["information"] = _inventory + + yield msg.KeyValueData({"inventory": [inventory]}, node) - yield msg.KeyValueData({'inventory': [inventory]}, node) - def retrieve(nodes, element, configmanager, inputdata): - if 'outlets' in element: + if "outlets" in element: gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(get_outlet, element, node, configmanager) for res in gp: yield res - + return - elif element[0] == 'sensors': + elif element[0] == "sensors": gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_sensors, element, node, configmanager) @@ -287,7 +321,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum return - elif '/'.join(element).startswith('inventory/firmware/all'): + elif "/".join(element).startswith("inventory/firmware/all"): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_firmware, node, configmanager) @@ -295,7 +329,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum - elif '/'.join(element).startswith('inventory/hardware/all'): + elif "/".join(element).startswith("inventory/hardware/all"): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_inventory, element, node, configmanager) @@ -304,12 +338,13 @@ def retrieve(nodes, element, configmanager, inputdata): yield datum else: for node in nodes: - yield msg.ConfluentResourceUnavailable(node, 'Not implemented') + yield msg.ConfluentResourceUnavailable(node, "Not implemented") return - + + def update(nodes, element, configmanager, inputdata): - if 'outlets' not in element: - yield msg.ConfluentResourceUnavailable(node, 'Not implemented') + if "outlets" not in element: + yield msg.ConfluentResourceUnavailable(node, "Not implemented") return for node in nodes: gc = GeistClient(node, configmanager) From d779f015d6c35d1f459886f9ab9f9b63b808b374 Mon Sep 17 00:00:00 2001 From: Wera Grzeda Date: Tue, 23 Apr 2024 18:14:48 +0200 Subject: [PATCH 12/12] sed to use single quotes --- .../plugins/hardwaremanagement/geist.py | 222 +++++++++--------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index d3fce9e1..3f086115 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -1,13 +1,13 @@ # Copyright 2022 Lenovo # -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, +# distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. @@ -23,7 +23,7 @@ import eventlet.greenpool as greenpool def simplify_name(name): - return name.lower().replace(" ", "_").replace("/", "-").replace("_-_", "-") + return name.lower().replace(' ', '_').replace('/', '-').replace('_-_', '-') pdupool = greenpool.GreenPool(128) @@ -33,15 +33,15 @@ def data_by_type(indata): databytype = {} for keyname in indata: obj = indata[keyname] - objtype = obj.get("type", None) + objtype = obj.get('type', None) if not objtype: continue if objtype in databytype: raise Exception( - "Multiple instances of type {} not yet supported".format(objtype) + 'Multiple instances of type {} not yet supported'.format(objtype) ) databytype[objtype] = obj - obj["keyname"] = keyname + obj['keyname'] = keyname return databytype @@ -64,15 +64,15 @@ class GeistClient(object): if self._wc: return self._wc targcfg = self.configmanager.get_node_attributes( - self.node, ["hardwaremanagement.manager"], decrypt=True + self.node, ['hardwaremanagement.manager'], decrypt=True ) targcfg = targcfg.get(self.node, {}) - target = targcfg.get("hardwaremanagement.manager", {}).get("value", None) + target = targcfg.get('hardwaremanagement.manager', {}).get('value', None) if not target: target = self.node - target = target.split("/", 1)[0] + target = target.split('/', 1)[0] cv = util.TLSCertVerifier( - self.configmanager, self.node, "pubkeys.tls_hardwaremanager" + self.configmanager, self.node, 'pubkeys.tls_hardwaremanager' ).verify_cert self._wc = wc.SecureHTTPConnection(target, port=443, verifycallback=cv) return self._wc @@ -80,68 +80,68 @@ class GeistClient(object): def login(self, configmanager): credcfg = configmanager.get_node_attributes( self.node, - ["secret.hardwaremanagementuser", "secret.hardwaremanagementpassword"], + ['secret.hardwaremanagementuser', 'secret.hardwaremanagementpassword'], decrypt=True, ) credcfg = credcfg.get(self.node, {}) - username = credcfg.get("secret.hardwaremanagementuser", {}).get("value", None) - passwd = credcfg.get("secret.hardwaremanagementpassword", {}).get("value", None) + username = credcfg.get('secret.hardwaremanagementuser', {}).get('value', None) + passwd = credcfg.get('secret.hardwaremanagementpassword', {}).get('value', None) if not isinstance(username, str): - username = username.decode("utf8") + username = username.decode('utf8') if not isinstance(passwd, str): - passwd = passwd.decode("utf8") + passwd = passwd.decode('utf8') if not username or not passwd: - raise Exception("Missing username or password") + raise Exception('Missing username or password') self.username = username rsp = self.wc.grab_json_response( - "/api/auth/{0}".format(username), - {"cmd": "login", "data": {"password": passwd}}, + '/api/auth/{0}'.format(username), + {'cmd': 'login', 'data': {'password': passwd}}, ) - token = rsp["data"]["token"] + token = rsp['data']['token'] return token def logout(self): if self._token: self.wc.grab_json_response( - "/api/auth/{0}".format(self.username), - {"cmd": "logout", "token": self.token}, + '/api/auth/{0}'.format(self.username), + {'cmd': 'logout', 'token': self.token}, ) self._token = None def get_outlet(self, outlet): - rsp = self.wc.grab_json_response("/api/dev") - rsp = rsp["data"] + rsp = self.wc.grab_json_response('/api/dev') + rsp = rsp['data'] dbt = data_by_type(rsp) - if "t3hd" in dbt: - del dbt["t3hd"] + if 't3hd' in dbt: + del dbt['t3hd'] if len(dbt) != 1: - raise Exception("Multiple PDUs not supported per pdu") + raise Exception('Multiple PDUs not supported per pdu') pdutype = list(dbt)[0] - outlet = dbt[pdutype]["outlet"][str(int(outlet) - 1)] + outlet = dbt[pdutype]['outlet'][str(int(outlet) - 1)] - state = outlet["state"].split("2")[-1] + state = outlet['state'].split('2')[-1] return state def set_outlet(self, outlet, state): - rsp = self.wc.grab_json_response("/api/dev") - dbt = data_by_type(rsp["data"]) - if "t3hd" in dbt: - del dbt["t3hd"] + rsp = self.wc.grab_json_response('/api/dev') + dbt = data_by_type(rsp['data']) + if 't3hd' in dbt: + del dbt['t3hd'] if len(dbt) != 1: self.logout() - raise Exception("Multiple PDUs per endpoint not supported") - pdu = dbt[list(dbt)[0]]["keyname"] + raise Exception('Multiple PDUs per endpoint not supported') + pdu = dbt[list(dbt)[0]]['keyname'] outlet = int(outlet) - 1 rsp = self.wc.grab_json_response( - "/api/dev/{0}/outlet/{1}".format(pdu, outlet), + '/api/dev/{0}/outlet/{1}'.format(pdu, outlet), { - "cmd": "control", - "token": self.token, - "data": {"action": state, "delay": False}, + 'cmd': 'control', + 'token': self.token, + 'data': {'action': state, 'delay': False}, }, ) @@ -149,51 +149,51 @@ class GeistClient(object): def process_measurement( keyname, name, enttype, entname, measurement, readings, category ): - if measurement["type"] == "realPower": - if category not in ("all", "power"): + if measurement['type'] == 'realPower': + if category not in ('all', 'power'): return - readtype = "Real Power" - elif measurement["type"] == "apparentPower": - if category not in ("all", "power"): + readtype = 'Real Power' + elif measurement['type'] == 'apparentPower': + if category not in ('all', 'power'): return - readtype = "Apparent Power" - elif measurement["type"] == "energy": - if category not in ("all", "energy"): + readtype = 'Apparent Power' + elif measurement['type'] == 'energy': + if category not in ('all', 'energy'): return - readtype = "Energy" - elif measurement["type"] == "voltage": - if category not in ("all",): + readtype = 'Energy' + elif measurement['type'] == 'voltage': + if category not in ('all',): return - readtype = "Voltage" - elif measurement["type"] == "current": - if category not in ("all",): + readtype = 'Voltage' + elif measurement['type'] == 'current': + if category not in ('all',): return - readtype = "Current" - elif measurement["type"] == "temperature": - readtype = "Temperature" - elif measurement["type"] == "dewpoint": - readtype = "Dewpoint" - elif measurement["type"] == "humidity": - readtype = "Humidity" + readtype = 'Current' + elif measurement['type'] == 'temperature': + readtype = 'Temperature' + elif measurement['type'] == 'dewpoint': + readtype = 'Dewpoint' + elif measurement['type'] == 'humidity': + readtype = 'Humidity' else: return - myname = entname + " " + readtype - if name != "all" and simplify_name(myname) != name: + myname = entname + ' ' + readtype + if name != 'all' and simplify_name(myname) != name: return readings.append( { - "name": myname, - "value": float(measurement["value"]), - "units": measurement["units"], - "type": readtype.split()[-1], + 'name': myname, + 'value': float(measurement['value']), + 'units': measurement['units'], + 'type': readtype.split()[-1], } ) def process_measurements(name, category, measurements, enttype, readings): for measure in util.natural_sort(list(measurements)): - measurement = measurements[measure]["measurement"] - entname = measurements[measure]["name"] + measurement = measurements[measure]['measurement'] + entname = measurements[measure]['name'] for measureid in measurement: process_measurement( measure, @@ -215,28 +215,28 @@ def read_sensors(element, node, configmanager): if len(element) == 3: # just get names category = name - name = "all" + name = 'all' justnames = True - if category in ("leds, fans", "temperature"): + if category in ('leds, fans', 'temperature'): return sn = _sensors_by_node.get(node, None) if not sn or sn[1] < time.time(): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/dev") + adev = gc.wc.grab_json_response('/api/dev') _sensors_by_node[node] = (adev, time.time() + 1) sn = _sensors_by_node.get(node, None) - dbt = data_by_type(sn[0]["data"]) + dbt = data_by_type(sn[0]['data']) readings = [] for datatype in dbt: datum = dbt[datatype] - process_measurements(name, category, datum["entity"], "entity", readings) + process_measurements(name, category, datum['entity'], 'entity', readings) - if "outlet" in datum: - process_measurements(name, category, datum["outlet"], "outlet", readings) + if 'outlet' in datum: + process_measurements(name, category, datum['outlet'], 'outlet', readings) if justnames: for reading in readings: - yield msg.ChildCollection(simplify_name(reading["name"])) + yield msg.ChildCollection(simplify_name(reading['name'])) else: yield msg.SensorReadings(readings, name=node) @@ -250,42 +250,42 @@ def get_outlet(element, node, configmanager): def read_firmware(node, configmanager): gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/sys") - myversion = adev["data"]["version"] - yield msg.Firmware([{"PDU Firmware": {"version": myversion}}], node) + adev = gc.wc.grab_json_response('/api/sys') + myversion = adev['data']['version'] + yield msg.Firmware([{'PDU Firmware': {'version': myversion}}], node) def read_inventory(element, node, configmanager): _inventory = {} inventory = {} gc = GeistClient(node, configmanager) - adev = gc.wc.grab_json_response("/api/sys") - basedata = adev["data"] - inventory["present"] = True - inventory["name"] = "PDU" + adev = gc.wc.grab_json_response('/api/sys') + basedata = adev['data'] + inventory['present'] = True + inventory['name'] = 'PDU' for elem in basedata.items(): if ( - elem[0] != "component" - and elem[0] != "locale" - and elem[0] != "state" - and elem[0] != "contact" - and elem[0] != "appVersion" - and elem[0] != "build" - and elem[0] != "version" - and elem[0] != "apiVersion" + elem[0] != 'component' + and elem[0] != 'locale' + and elem[0] != 'state' + and elem[0] != 'contact' + and elem[0] != 'appVersion' + and elem[0] != 'build' + and elem[0] != 'version' + and elem[0] != 'apiVersion' ): temp = elem[0] - if elem[0] == "serialNumber": - temp = "Serial" - elif elem[0] == "partNumber": - temp = "P/N" - elif elem[0] == "modelNumber": - temp = "Lenovo P/N and Serial" + if elem[0] == 'serialNumber': + temp = 'Serial' + elif elem[0] == 'partNumber': + temp = 'P/N' + elif elem[0] == 'modelNumber': + temp = 'Lenovo P/N and Serial' _inventory[temp] = elem[1] - elif elem[0] == "component": - tempname = "" - for component in basedata["component"].items(): + elif elem[0] == 'component': + tempname = '' + for component in basedata['component'].items(): for item in component: if type(item) == str: @@ -293,18 +293,18 @@ def read_inventory(element, node, configmanager): else: for entry in item.items(): temp = entry[0] - if temp == "sn": - temp = "Serial" - _inventory[tempname + " " + temp] = entry[1] + if temp == 'sn': + temp = 'Serial' + _inventory[tempname + ' ' + temp] = entry[1] - inventory["information"] = _inventory + inventory['information'] = _inventory - yield msg.KeyValueData({"inventory": [inventory]}, node) + yield msg.KeyValueData({'inventory': [inventory]}, node) def retrieve(nodes, element, configmanager, inputdata): - if "outlets" in element: + if 'outlets' in element: gp = greenpool.GreenPile(pdupool) for node in nodes: @@ -313,7 +313,7 @@ def retrieve(nodes, element, configmanager, inputdata): yield res return - elif element[0] == "sensors": + elif element[0] == 'sensors': gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_sensors, element, node, configmanager) @@ -321,7 +321,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum return - elif "/".join(element).startswith("inventory/firmware/all"): + elif '/'.join(element).startswith('inventory/firmware/all'): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_firmware, node, configmanager) @@ -329,7 +329,7 @@ def retrieve(nodes, element, configmanager, inputdata): for datum in rsp: yield datum - elif "/".join(element).startswith("inventory/hardware/all"): + elif '/'.join(element).startswith('inventory/hardware/all'): gp = greenpool.GreenPile(pdupool) for node in nodes: gp.spawn(read_inventory, element, node, configmanager) @@ -338,13 +338,13 @@ def retrieve(nodes, element, configmanager, inputdata): yield datum else: for node in nodes: - yield msg.ConfluentResourceUnavailable(node, "Not implemented") + yield msg.ConfluentResourceUnavailable(node, 'Not implemented') return def update(nodes, element, configmanager, inputdata): - if "outlets" not in element: - yield msg.ConfluentResourceUnavailable(node, "Not implemented") + if 'outlets' not in element: + yield msg.ConfluentResourceUnavailable(node, 'Not implemented') return for node in nodes: gc = GeistClient(node, configmanager)