def reboot_d3(self, json_obj, connection): """ Asks "reboot_d3" to the slave described in json_obj for reboot daemon. """ query = "SELECT serial, secretkey FROM daemon WHERE daemon_id=" + str(json_obj['data']['daemon_id']); res = self.sql.mysql_handler_personnal_query(query); if res is None or len(res) == 0: self.logger.error('in reboot_d3: No daemon for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; elif len(res) > 1: self.logger.error('in reboot_d3: Too much daemons for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; hostname = res[0][0]; ip = ''; for h in self.hostlist: if hostname in h._Hostname.upper(): ip = h._IpAddr; if ip == '': self.logger.error('in reboot_d3: ' + hostname + ' not in hostlist. Try perform network scan again.'); connection.close(); return ; port = self._parser.getValueFromSection('connect', 'port'); sock = socket.create_connection((ip, port)); self_hostname = socket.gethostname(); if '.' in self_hostname: self_hostname = self_hostname.split('.')[0]; aes_IV = AESManager.get_IV(); aes_key = self.get_secret_key(hostname); obj_to_send = '{"packet_type": "reboot_d3", "sender_name": "' + self_hostname + '"}'; encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(obj_to_send) % 16; sock.send(bytes(aes_IV, 'utf-8') + encode_obj.encrypt(obj_to_send + (spaces * ' '))); connection.close();
def send_interfaces(self, json_obj, connection): query = "SELECT serial, secretkey FROM daemon WHERE daemon_id=" + str(json_obj['data']['daemon_id']); res = self.sql.mysql_handler_personnal_query(query); if res is None or len(res) == 0: self.logger.error('in send_interfaces: No daemon for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; elif len(res) > 1: self.logger.error('in send_interfaces: Too much daemons for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; hostname = res[0][0]; ip = ''; for h in self.hostlist: if hostname in h._Hostname.upper(): ip = h._IpAddr; if ip == '': self.logger.error('in send_interfaces: ' + hostname + ' not in hostlist. Try perform network scan again.'); connection.close(); return ; port = self._parser.getValueFromSection('connect', 'port'); sock = socket.create_connection((ip, port)); self_hostname = socket.gethostname(); if '.' in self_hostname: self_hostname = self_hostname.split('.')[0]; aes_IV = AESManager.get_IV(); aes_key = self.get_secret_key(hostname); obj_to_send = json.JSONEncoder().encode( { "packet_type": "send_interfaces", "sender_name": self_hostname, "interface_knx": json_obj['data']['interface_knx'], "interface_EnOcean": json_obj['data']['interface_EnOcean'], "interface_arg_knx": json_obj['data']['interface_arg_knx'], "interface_arg_EnOcean": json_obj['data']['interface_arg_EnOcean'], "daemon_knx": json_obj['data']['daemon_knx'] } ); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(obj_to_send) % 16; sock.send(bytes(aes_IV, 'utf-8') + encode_obj.encrypt(obj_to_send + (spaces * ' '))); rlist, wlist, elist = select.select([sock], [], [], SELECT_TIMEOUT * 300); re = ''; data = sock.recv(4096); if data: decrypt_IV = data[:16].decode(); host = None; for h in self.hostlist: if h._IpAddr == ip: host = h; decode_obj = AES.new(res[0][1], AES.MODE_CBC, decrypt_IV); data2 = decode_obj.decrypt(data[16:]).decode(); resp = json.JSONDecoder().decode(data2); hostname = host._Hostname; if '.' in host._Hostname: hostname = host._Hostname.split('.')[0]; if str(self.aes_slave_keys[hostname]) == str(resp['aes_pass']): re = '1'; connection.send(bytes(re, 'utf-8')); connection.close();
def wifi_update(self, json_obj, connection, db): """ Send "wifi_update" to the slave described in json_obj for update the wifi configuration. """ query = ''.join(["SELECT serial, secretkey FROM daemon WHERE daemon_id=", str(json_obj['data']['daemon_id'])]); res = self.sql.mysql_handler_personnal_query(query, db); if res is None or not res: self.logger.error('in wifi_update: No daemon for id '+str(json_obj['data']['daemon_id'])); connection.close(); return ; elif len(res) > 1: self.logger.error('in wifi_update: Too much daemons for id '+str(json_obj['data']['daemon_id'])); connection.close(); return ; hostname = res[0][0]; ip = ''; for h in self.hostlist: if hostname in h._Hostname.upper(): ip = h._IpAddr; if not ip: self.logger.error('in wifi_update: '+hostname+' not in hostlist. Try perform network scan again.'); connection.close(); return ; port = self._parser.getValueFromSection('connect', 'port'); sock = socket.create_connection((ip, port)); self_hostname = socket.gethostname(); if '.' in self_hostname: self_hostname = self_hostname.split('.')[0]; aes_IV = AESManager.get_IV(); aes_key = self.get_secret_key(hostname); obj_to_send = ''.join(['{"packet_type": "wifi_update", "sender_name": "', str(self_hostname), '", "ssid": "', str(json_obj['data']['ssid']), '", "password": "******", "security": "', str(json_obj['data']['security']), '", "mode": "', str(json_obj['data']['mode']), '"}']); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(obj_to_send) % 16; sock.send(bytes(aes_IV, 'utf-8') + encode_obj.encrypt(obj_to_send + (spaces * ' '))); rlist, wlist, elist = select.select([sock], [], [], SELECT_TIMEOUT * 300); re = ''; for s in rlist: data = sock.recv(4096); if not data: continue; decrypt_IV = data[:16].decode(); host = None; for h in self.hostlist: if h._IpAddr == ip: host = h; decode_obj = AES.new(res[0][1], AES.MODE_CBC, decrypt_IV); data2 = decode_obj.decrypt(data[16:]).decode(); resp = json.JSONDecoder().decode(data2); hostname = host._Hostname; if '.' in host._Hostname: hostname = host._Hostname.split('.')[0]; if str(self.aes_slave_keys[hostname]) == str(resp['aes_pass']): re = '1'; connection.send(bytes(re, 'utf-8')); connection.close(); sock.close();
def update(self, json_obj, connection): p = call(['dpkg', '--configure', '-a']) call(['apt-get', 'update']); call(['DEBIAN_FRONTEND=noninteractive', 'apt-get', 'install', 'domoslave', '-y']); version = os.popen("dpkg-query -W -f='${Version}\n' domoslave").read().split('\n')[0]; json_str = '{"packet_type": "update_finished", "aes_pass": "******", "new_version": ' + version + '}'; encrypt_IV = AESManager.get_IV(); spaces = 16 - len(json_str) % 16; json_str = json_str + (spaces * ' '); encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str);
def send_json_obj_to_slave(self, json_str, sock, hostname, aes_key): hostname_key = ''; if '.' in hostname: hostname_key = hostname.split('.')[0]; else: hostname_key = hostname; AES.key_size = 32; aes_IV = AESManager.get_IV(); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(json_str) % 16; data2 = encode_obj.encrypt(json_str + (spaces * ' ')); sock.send(bytes(aes_IV, 'utf-8') + data2);
def update(self, json_obj, connection): p = call(["dpkg", "--configure", "-a"]) call(["apt-get", "update"]) call(["DEBIAN_FRONTEND=noninteractive", "apt-get", "install", "domoslave", "-y"]) version = os.popen("dpkg-query -W -f='${Version}\n' domoslave").read().split("\n")[0] json_str = ( '{"packet_type": "update_finished", "aes_pass": "******", "new_version": ' + version + "}" ) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * " ") encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str)
def SendRequest(obj_to_send, admin_addr, aes_key): hostname = socket.gethostname() aes_IV = AESManager.get_IV(); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(obj_to_send) % 16; obj_to_send = encode_obj.encrypt(obj_to_send + (spaces * ' ')); data = { "sender_name": hostname, "data": base64.b64encode(obj_to_send), "iv": aes_IV } r = requests.post("http://"+admin_addr+"/md_receive.php", data = data) return r
def check_slave(self, json_obj, connection): interface_knx = self._parser.getValueFromSection( SLAVE_CONF_KNX_SECTION, SLAVE_CONF_KNX_INTERFACE) interface_enocean = self._parser.getValueFromSection( SLAVE_CONF_ENOCEAN_SECTION, SLAVE_CONF_ENOCEAN_INTERFACE) version = os.popen( "dpkg-query -W -f='${Version}\n' domoslave").read().split('\n')[0] json_str = '{"packet_type": "check_slave", "aes_pass": "******", "version": "' + version + '", "interface_knx": "' + interface_knx + '", "interface_enocean": "' + interface_enocean + '"}' master_hostname = str(json_obj['sender_name']) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * ' ') encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, 'utf-8') + data)
def send_data_to_all_masters(self, json_str): self.connect_to_masters() for name in self.connected_masters.keys(): try: master = self.connected_masters[name] AES.key_size = 32 aes_IV = AESManager.get_IV() encode_obj = AES.new(self.private_aes, AES.MODE_CBC, aes_IV) spaces = 16 - len(json_str) % 16 data2 = encode_obj.encrypt(json_str + (spaces * ' ')) master.send(bytes(aes_IV, 'utf-8') + data2) master.close() except KeyError as e: self.logger.error('in send_data_to_all_masters: ' + str(e)) pass
def check_slave(self, json_obj, connection): """ Callback called each time a check_slave packet is received. Used to confirm the existence of this daemon. """ print("===== CHECK SLAVE ====="); print(json_obj); print("======================="); json_str = '{"packet_type": "check_slave", "aes_pass": "******"}' master_hostname = str(json_obj['sender_name']); encrypt_IV = AESManager.get_IV(); json_str = json_str + (' ' * (320 - len(json_str))) encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str); connection.send(bytes(encrypt_IV, 'utf-8') + data);
def update(self, json_obj, connection): p = call(['dpkg', '--configure', '-a']) call(['apt-get', 'update']) call([ 'DEBIAN_FRONTEND=noninteractive', 'apt-get', 'install', 'domoslave', '-y' ]) version = os.popen( "dpkg-query -W -f='${Version}\n' domoslave").read().split('\n')[0] json_str = '{"packet_type": "update_finished", "aes_pass": "******", "new_version": ' + version + '}' encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * ' ') encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str)
def send_data_to_all_masters(self, json_str): self.connect_to_masters() for name in self.connected_masters.keys(): try: master = self.connected_masters[name] AES.key_size = 32 aes_IV = AESManager.get_IV() encode_obj = AES.new(self.private_aes, AES.MODE_CBC, aes_IV) spaces = 16 - len(json_str) % 16 data2 = encode_obj.encrypt(json_str + (spaces * " ")) master.send(bytes(aes_IV, "utf-8") + data2) master.close() except KeyError as e: self.logger.error("in send_data_to_all_masters: " + str(e)) pass
def check_slave(self, json_obj, connection): """ Callback called each time a check_slave packet is received. Used to confirm the existence of this daemon. """ interface_knx = self._parser.getValueFromSection(SLAVE_CONF_KNX_SECTION, SLAVE_CONF_KNX_INTERFACE); interface_enocean = self._parser.getValueFromSection(SLAVE_CONF_ENOCEAN_SECTION, SLAVE_CONF_ENOCEAN_INTERFACE); version = os.popen("dpkg-query -W -f='${Version}\n' domoslave").read().split('\n')[0]; json_str = '{"packet_type": "check_slave", "aes_pass": "******", "version": "' + version + '", "interface_knx": "' + interface_knx + '", "interface_enocean": "' + interface_enocean + '"}'; master_hostname = str(json_obj['sender_name']); encrypt_IV = AESManager.get_IV(); spaces = 16 - len(json_str) % 16; json_str = json_str + (spaces * ' '); encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str); connection.send(bytes(encrypt_IV, 'utf-8') + data);
def update(self, json_obj, connection): call(['apt-get', 'update']); call(['apt-get', 'install', 'glslave', '-y']); version_file = open('/etc/greenleaf/.glslave.version', 'r'); if not version_file: self.logger.error('/etc/greenleaf/.glslave.version: no such file or directory'); print('/etc/greenleaf/.glslave.version: no such file or directory'); return; version = version_file.read(); if '\n' in version: version = version.split('\n')[0]; json_str = '{"packet_type": "update_finished", "aes_pass": "******", "new_version": ' + version + '}' encrypt_IV = AESManager.get_IV(); json_str = json_str + (' ' * (320 - len(json_str))) encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str);
def send_json_obj_to_slave(self, json_str, sock, hostname, aes_key, close_flag = True): """ Send 'json_obj' to 'hostname' via 'sock' """ hostname_key = ''; if '.' in hostname: hostname_key = hostname.split('.')[0]; else: hostname_key = hostname; AES.key_size = 32; aes_IV = AESManager.get_IV(); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); data2 = encode_obj.encrypt(json_str + (176 - len(json_str)) * ' '); sock.send(bytes(aes_IV, 'utf-8') + data2); if close_flag == True: sock.close();
def wifi_update(self, json_obj, connection): try: self._parser.writeValueFromSection("wifi", "ssid", json_obj["ssid"]) self._parser.writeValueFromSection("wifi", "password", json_obj["password"]) self._parser.writeValueFromSection("wifi", "encryption", json_obj["security"]) self._parser.writeValueFromSection("wifi", "mode", json_obj["mode"]) self.wifi_init(json_obj["ssid"], json_obj["password"], json_obj["security"], json_obj["mode"], 1) except Exception as e: self.logger.error(e) json_str = '{"packet_type": "wifi_update", "aes_pass": "******"}' master_hostname = str(json_obj["sender_name"]) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * " ") encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, "utf-8") + data)
def send_interfaces(self, json_obj, connection): try: if os.path.exists('/tmp/knxd'): call(['service', 'knxd', 'stop']) previous_val_knx = self._parser.getValueFromSection( 'knx', 'interface') previous_val_EnOcean = self._parser.getValueFromSection( 'enocean', 'interface') new_val = str(json_obj['interface_arg_knx']) self._parser.writeValueFromSection('knx', 'interface', new_val) self._parser.writeValueFromSection('knx', 'activated', str(json_obj['daemon_knx'])) self._parser.writeValueFromSection( 'enocean', 'interface', str(json_obj['interface_arg_EnOcean'])) if not previous_val_knx or previous_val_knx is None: call(['update-rc.d', 'knxd', 'defaults']) call(['update-rc.d', 'knxd', 'enable']) if not new_val or new_val is None: Popen(['systemctl', '-q', 'disable', 'knxd']) else: knx_edit = 'KNXD_OPTS="-e 1.0.254 -D -T -S -b ' if json_obj['interface_knx'] == 'tpuarts': knx_edit += json_obj[ 'interface_knx'] + ':/dev/' + new_val + '"' else: knx_edit += json_obj['interface_knx'] + ':' + new_val + '"' conf_knx = open('/etc/knxd.conf', 'w') conf_knx.write(knx_edit + '\n') conf_knx.close() call(['service', 'knxd', 'start']) if json_obj['daemon_knx'] == 1: if os.path.exists('/var/run/monitor_knx.pid'): os.remove('/var/run/monitor_knx.pid') Popen(['monitor_knx', 'ip:localhost', '--daemon']) except Exception as e: self.logger.error(e) json_str = '{"packet_type": "send_interfaces", "aes_pass": "******"}' master_hostname = str(json_obj['sender_name']) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * ' ') encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, 'utf-8') + data) if previous_val_EnOcean != str(json_obj['interface_arg_EnOcean']): call(['service', 'domoslave', 'restart'])
def wifi_update(self, json_obj, connection): try: self._parser.writeValueFromSection('wifi', 'ssid', json_obj['ssid']); self._parser.writeValueFromSection('wifi', 'password', json_obj['password']); self._parser.writeValueFromSection('wifi', 'encryption', json_obj['security']); self._parser.writeValueFromSection('wifi', 'mode', json_obj['mode']); self.wifi_init(json_obj['ssid'], json_obj['password'], json_obj['security'], json_obj['mode'], 1); except Exception as e: self.logger.error(e); json_str = '{"packet_type": "wifi_update", "aes_pass": "******"}'; master_hostname = str(json_obj['sender_name']); encrypt_IV = AESManager.get_IV(); spaces = 16 - len(json_str) % 16; json_str = json_str + (spaces * ' '); encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str); connection.send(bytes(encrypt_IV, 'utf-8') + data);
def send_data_to_all_masters(self, json_str): """ Sends a string 'json_str' to available slaves on network. """ self.connect_to_masters(); # ici envoyer a tous les masters for name in self.connected_masters.keys(): try: master = self.connected_masters[name]; AES.key_size = 32; aes_IV = AESManager.get_IV(); encode_obj = AES.new(self.private_aes, AES.MODE_CBC, aes_IV); spaces = 16 - len(json_str) % 16; data2 = encode_obj.encrypt(json_str + (spaces * ' ')); master.send(bytes(aes_IV, 'utf-8') + data2); master.close(); except KeyError as e: self.logger.error('in send_data_to_all_masters: '+str(e)); print(e); pass;
def send_interfaces(self, json_obj, connection): try: if os.path.exists("/tmp/knxd"): call(["service", "knxd", "stop"]) previous_val_knx = self._parser.getValueFromSection("knx", "interface") previous_val_EnOcean = self._parser.getValueFromSection("enocean", "interface") new_val = str(json_obj["interface_arg_knx"]) self._parser.writeValueFromSection("knx", "interface", new_val) self._parser.writeValueFromSection("knx", "activated", str(json_obj["daemon_knx"])) self._parser.writeValueFromSection("enocean", "interface", str(json_obj["interface_arg_EnOcean"])) if not previous_val_knx or previous_val_knx is None: call(["update-rc.d", "knxd", "defaults"]) call(["update-rc.d", "knxd", "enable"]) if not new_val or new_val is None: Popen(["systemctl", "-q", "disable", "knxd"]) else: knx_edit = 'KNXD_OPTS="-e 1.0.254 -D -T -S -b ' if json_obj["interface_knx"] == "tpuarts": knx_edit += json_obj["interface_knx"] + ":/dev/" + new_val + '"' else: knx_edit += json_obj["interface_knx"] + ":" + new_val + '"' conf_knx = open("/etc/knxd.conf", "w") conf_knx.write(knx_edit + "\n") conf_knx.close() call(["service", "knxd", "start"]) if json_obj["daemon_knx"] == 1: if os.path.exists("/var/run/monitor_knx.pid"): os.remove("/var/run/monitor_knx.pid") Popen(["monitor_knx", "ip:localhost", "--daemon"]) except Exception as e: self.logger.error(e) json_str = '{"packet_type": "send_interfaces", "aes_pass": "******"}' master_hostname = str(json_obj["sender_name"]) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * " ") encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, "utf-8") + data) if previous_val_EnOcean != str(json_obj["interface_arg_EnOcean"]): call(["service", "domoslave", "restart"])
def send_interfaces(self, json_obj, connection): try: if os.path.exists('/tmp/knxd'): call(['service', 'knxd', 'stop']); previous_val_knx = self._parser.getValueFromSection('knx', 'interface'); previous_val_EnOcean = self._parser.getValueFromSection('enocean', 'interface'); new_val = str(json_obj['interface_arg_knx']) self._parser.writeValueFromSection('knx', 'interface', new_val); self._parser.writeValueFromSection('knx', 'activated', str(json_obj['daemon_knx'])); self._parser.writeValueFromSection('enocean', 'interface', str(json_obj['interface_arg_EnOcean'])); if not previous_val_knx or previous_val_knx is None: call(['update-rc.d', 'knxd', 'defaults']); call(['update-rc.d', 'knxd', 'enable']); if not new_val or new_val is None: Popen(['systemctl', '-q', 'disable', 'knxd']); else: knx_edit = 'KNXD_OPTS="-e 1.0.254 -D -T -S -b '; if json_obj['interface_knx'] == 'tpuarts': knx_edit += json_obj['interface_knx']+':/dev/'+new_val+'"'; else: knx_edit += json_obj['interface_knx']+':'+new_val+'"'; conf_knx = open('/etc/knxd.conf', 'w'); conf_knx.write(knx_edit+'\n'); conf_knx.close(); call(['service', 'knxd', 'start']); if json_obj['daemon_knx'] == 1: if os.path.exists('/var/run/monitor_knx.pid'): os.remove('/var/run/monitor_knx.pid'); Popen(['monitor_knx', 'ip:localhost', '--daemon']); except Exception as e: self.logger.error(e); json_str = '{"packet_type": "send_interfaces", "aes_pass": "******"}'; master_hostname = str(json_obj['sender_name']); encrypt_IV = AESManager.get_IV(); spaces = 16 - len(json_str) % 16; json_str = json_str + (spaces * ' '); encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV); data = encode_obj.encrypt(json_str); connection.send(bytes(encrypt_IV, 'utf-8') + data); if previous_val_EnOcean != str(json_obj['interface_arg_EnOcean']): call(['service', 'domoslave', 'restart']);
def check_slave(self, json_obj, connection): interface_knx = self._parser.getValueFromSection(SLAVE_CONF_KNX_SECTION, SLAVE_CONF_KNX_INTERFACE) interface_enocean = self._parser.getValueFromSection(SLAVE_CONF_ENOCEAN_SECTION, SLAVE_CONF_ENOCEAN_INTERFACE) version = os.popen("dpkg-query -W -f='${Version}\n' domoslave").read().split("\n")[0] json_str = ( '{"packet_type": "check_slave", "aes_pass": "******", "version": "' + version + '", "interface_knx": "' + interface_knx + '", "interface_enocean": "' + interface_enocean + '"}' ) master_hostname = str(json_obj["sender_name"]) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * " ") encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, "utf-8") + data)
def wifi_update(self, json_obj, connection): try: self._parser.writeValueFromSection('wifi', 'ssid', json_obj['ssid']) self._parser.writeValueFromSection('wifi', 'password', json_obj['password']) self._parser.writeValueFromSection('wifi', 'encryption', json_obj['security']) self._parser.writeValueFromSection('wifi', 'mode', json_obj['mode']) self.wifi_init(json_obj['ssid'], json_obj['password'], json_obj['security'], json_obj['mode'], 1) except Exception as e: self.logger.error(e) json_str = '{"packet_type": "wifi_update", "aes_pass": "******"}' master_hostname = str(json_obj['sender_name']) encrypt_IV = AESManager.get_IV() spaces = 16 - len(json_str) % 16 json_str = json_str + (spaces * ' ') encode_obj = AES.new(self.private_aes, AES.MODE_CBC, encrypt_IV) data = encode_obj.encrypt(json_str) connection.send(bytes(encrypt_IV, 'utf-8') + data)
def check_slave(self, json_obj, connection, db): """ Asks "check_slave" to the slave described in json_obj and waits for answer. """ query = ''.join(["SELECT serial, secretkey FROM daemon WHERE daemon_id=", str(json_obj['data']['daemon_id'])]); res = self.sql.mysql_handler_personnal_query(query, db); if res is None or not res: self.logger.error('in check_slave: No daemon for id '+str(json_obj['data']['daemon_id'])); connection.close(); return ; elif len(res) > 1: self.logger.error('in check_slave: Too much daemons for id '+str(json_obj['data']['daemon_id'])); connection.close(); return ; hostname = res[0][0]; self_hostname = socket.gethostname(); if hostname == self_hostname: ip = '127.0.0.1'; else: ip = ''; for h in self.hostlist: if hostname in h._Hostname.upper(): ip = h._IpAddr; if not ip: self.logger.error('in check_slave: '+hostname+' not in hostlist. Try perform network scan again.'); connection.close(); return ; port = self._parser.getValueFromSection('connect', 'port'); sock = socket.create_connection((ip, port)); if '.' in self_hostname: self_hostname = self_hostname.split('.')[0]; aes_IV = AESManager.get_IV(); aes_key = self.get_secret_key(hostname); obj_to_send = ''.join(['{"packet_type": "check_slave", "sender_name": "', self_hostname, '"}']); encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); spaces = 16 - len(obj_to_send) % 16; sock.send(bytes(aes_IV, 'utf-8') + encode_obj.encrypt(obj_to_send + (spaces * ' '))); rlist, wlist, elist = select.select([sock], [], [], SELECT_TIMEOUT * 10); val = '0'; version = ''; interface_knx = ''; interface_enocean = ''; data = sock.recv(4096); if data: decrypt_IV = data[:16].decode(); decode_obj = AES.new(res[0][1], AES.MODE_CBC, decrypt_IV); data2 = decode_obj.decrypt(data[16:]).decode(); resp = json.JSONDecoder().decode(data2); if str(self.aes_slave_keys[hostname]) == str(resp['aes_pass']): val = '1'; version = resp['version']; interface_knx = resp['interface_knx']; interface_enocean = resp['interface_enocean']; connection.send(bytes(version, 'utf-8')); connection.close(); query = ''.join(['UPDATE daemon SET validation=', val, ', version="', version, '" WHERE serial="', hostname, '"']); self.sql.mysql_handler_personnal_query(query, db); query = ''.join(['UPDATE daemon_protocol SET interface="', interface_knx, '" WHERE daemon_id="', str(json_obj['data']['daemon_id']), '" AND protocol_id="1"']); self.sql.mysql_handler_personnal_query(query, db); query = ''.join(['UPDATE daemon_protocol SET interface="', interface_enocean, '" WHERE daemon_id="', str(json_obj['data']['daemon_id']), '" AND protocol_id="2"']); self.sql.mysql_handler_personnal_query(query, db); sock.close();
def check_slave(self, json_obj, connection): """ Asks "check_slave" to the slave described in json_obj and waits for answer. """ query = "SELECT serial, secretkey FROM daemon WHERE daemon_id=" + str(json_obj['data']['daemon_id']); res = self.sql.mysql_handler_personnal_query(query); if res is None or len(res) == 0: self.logger.error('in check_slave: No daemon for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; elif len(res) > 1: self.logger.error('in check_slave: Too much daemons for id ' + str(json_obj['data']['daemon_id'])); connection.close(); return ; hostname = res[0][0]; if hostname == socket.gethostname(): connection.send(bytes('1', 'utf-8')); query = 'UPDATE daemon SET validation=1 WHERE serial="' + socket.gethostname() + '"'; self.sql.mysql_handler_personnal_query(query); connection.close(); return ; ip = ''; for h in self.hostlist: if hostname in h._Hostname.upper(): ip = h._IpAddr; if ip == '': self.logger.error('in check_slave: ' + hostname + ' not in hostlist. Try perform network scan again.'); connection.close(); return ; port = self._parser.getValueFromSection('connect', 'port'); sock = socket.create_connection((ip, port)); self_hostname = socket.gethostname(); if '.' in self_hostname: self_hostname = self_hostname.split('.')[0]; aes_IV = AESManager.get_IV(); aes_key = self.get_secret_key(hostname); obj_to_send = '{"packet_type": "check_slave", "sender_name": "' + self_hostname + '"}'; encode_obj = AES.new(aes_key, AES.MODE_CBC, aes_IV); sock.send(bytes(aes_IV, 'utf-8') + encode_obj.encrypt(obj_to_send + (176 - len(obj_to_send)) * ' ')); rlist, wlist, elist = select.select([sock], [], [], SELECT_TIMEOUT * 10); val = '0'; for s in rlist: data = sock.recv(4096); if not data: continue; decrypt_IV = data[:16].decode(); host = None; for h in self.hostlist: if h._IpAddr == ip: host = h; decode_obj = AES.new(res[0][1], AES.MODE_CBC, decrypt_IV); data2 = decode_obj.decrypt(data[16:]).decode(); resp = json.JSONDecoder().decode(data2); hostname = host._Hostname; if '.' in host._Hostname: hostname = host._Hostname.split('.')[0]; if str(self.aes_slave_keys[hostname]) == str(resp['aes_pass']): val = '1'; connection.send(bytes(val, 'utf-8')); connection.close(); query = 'UPDATE daemon SET validation=' + val + ' WHERE serial="' + hostname + '"'; self.sql.mysql_handler_personnal_query(query);