Ejemplo n.º 1
0
    def __appkey_list_handler(self, opcode, message):
        status, netkey_index = struct.unpack("<BH", message.data[0:3])
        status = AccessStatus(status)
        self.logger.info("Appkey list status: %s", status)
        if status == AccessStatus.SUCCESS:
            appkeys = struct.unpack("<" + "H" * (len(message.data[3:]) // 2),
                                    message.data[3:])
            appkeys = [mt.KeyIndex(k) for k in appkeys]
            node = self.node_get(message.meta["src"])

            # Add newly discovered keys
            for index in appkeys:
                if ((self.prov_db.app_keys[index].bound_net_key == netkey_index
                     and index not in node.app_keys)):
                    node.app_keys.append(index)

            # Remove old dead keys
            for index in node.app_keys:
                if ((self.prov_db.app_keys[index].bound_net_key == netkey_index
                     and index not in appkeys)):
                    node.app_keys.remove(index)

            self.db_save()
            self.logger.info("Node %04x has appkeys: %r", message.meta["src"],
                             appkeys)
Ejemplo n.º 2
0
 def __netkey_list_handler(self, opcode, message):
     node = self.node_get(message.meta["src"])
     if len(message.data) > 0:
         netkeys = struct.unpack("<" + "H" * (len(message.data) // 2),
                                 message.data)
         netkeys = [mt.KeyIndex(i) for i in netkeys]
         node.net_keys = netkeys
         self.db_save()
     self.logger.info("Node %04x has subnets %r", message.meta["src"],
                      node.net_keys)
Ejemplo n.º 3
0
 def __netkey_status_handler(self, opcode, message):
     status, netkey_index = struct.unpack("<BH", message.data)
     netkey_index = mt.KeyIndex(netkey_index)
     status = AccessStatus(status)
     self.logger.info("Netkey status: %s", status)
     if status == AccessStatus.SUCCESS:
         node = self.node_get(message.meta["src"])
         if netkey_index not in node.net_keys:
             node.net_keys.append(netkey_index)
         self.db_save()
         self.logger.info("Added subnet %d to node %04x", netkey_index,
                          message.meta["src"])
Ejemplo n.º 4
0
    def __model_sig_app_list_handler(self, opcode, message):
        status, element_address, model_id = struct.unpack(
            "<BHH", message.data[0:5])
        status = AccessStatus(status)
        self.logger.info("SIG Model App List status: %s", status)
        if status == AccessStatus.SUCCESS:
            if len(message.data) > 5:
                appkeys = struct.unpack(
                    "<" + "H" * (len(message.data[5:]) // 2), message.data[5:])
                appkeys = [mt.KeyIndex(i) for i in appkeys]
            else:
                appkeys = []

            model = self.model_get(element_address, mt.ModelId(model_id))
            model.bind = appkeys
            self.db_save()
            self.logger.info("SIG model %04x has appkey(s) %r bound", model_id,
                             appkeys)
Ejemplo n.º 5
0
    def __model_app_status_handler(self, opcode, message):
        status, element_address, appkey_index = struct.unpack(
            "<BHH", message.data[:5])
        status = AccessStatus(status)
        model_id = mt.ModelId.unpack(message.data[5:])
        element_address = mt.UnicastAddress(element_address)
        appkey_index = mt.KeyIndex(appkey_index)

        self.logger.info("Model app bind status: %s", status)
        if status == AccessStatus.SUCCESS:
            model = self.model_get(element_address, model_id)

            # Was last command a bind or unbind?
            if self.previous_command == "bind" and appkey_index not in model.bind:
                model.bind.append(appkey_index)
            elif appkey_index in model.bind:
                model.bind.remove(appkey_index)

            self.db_save()
            self.logger.info("Appkey %s %d to model %r at %04x",
                             self.previous_command, appkey_index, model_id, element_address)