Beispiel #1
0
 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();
Beispiel #2
0
 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();
Beispiel #3
0
 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();
Beispiel #4
0
 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);
Beispiel #5
0
 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);
Beispiel #6
0
 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)
Beispiel #7
0
 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
Beispiel #8
0
 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)
Beispiel #9
0
 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
Beispiel #10
0
 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);
Beispiel #11
0
 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)
Beispiel #12
0
 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
Beispiel #13
0
 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);
Beispiel #14
0
 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);
Beispiel #15
0
 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();
Beispiel #16
0
 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)
Beispiel #17
0
 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'])
Beispiel #18
0
 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);
Beispiel #19
0
 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;
Beispiel #20
0
 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"])
Beispiel #21
0
 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']);
Beispiel #22
0
 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)
Beispiel #23
0
 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)
Beispiel #24
0
 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();
Beispiel #25
0
 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);