class Listener(object): root_allowed = False def __init__(self, config_path): self.config = Config(config_path) self.settings = self.config.get('settings', {}) self.devices = { key.lower(): Device(key, value) for key, value in self.config['devices'].items() } assert len(self.devices) == len( self.config['devices']), "Duplicate(s) MAC(s) on devices config." def on_push(self, device): src = device.src.lower() if last_execution[src] + self.settings.get( 'delay', DEFAULT_DELAY) > time.time(): return last_execution[src] = time.time() self.execute(device) def execute(self, device): src = device.src.lower() device = self.devices[src] device.execute(root_allowed=self.root_allowed) def run(self, root_allowed=False): self.root_allowed = root_allowed scan(self.on_push, lambda d: d.src.lower() in self.devices)
class Listener(object): """Start listener daemon for execute on button press """ root_allowed = False #: Only used for ExecuteCmd def __init__(self, config_path, ignore_perms=False): """ :param str config_path: Path to config file """ self.config = Config(config_path, ignore_perms) self.settings = self.config.get('settings', {}) self.devices = { key.lower(): Device(key, value, self.config) for key, value in self.config['devices'].items() } assert len(self.devices) == len( self.config['devices']), "Duplicate(s) MAC(s) on devices config." def on_push(self, device): """Press button. Check DEFAULT_DELAY. :param scapy.packet.Packet device: Scapy packet :return: None """ src = device.src.lower() if last_execution[src] + self.settings.get( 'delay', DEFAULT_DELAY) > time.time(): return last_execution[src] = time.time() self.execute(device) def execute(self, device): """Execute a device. Used if the time between executions is greater than DEFAULT_DELAY :param scapy.packet.Packet device: Scapy packet :return: None """ src = device.src.lower() device = self.devices[src] threading.Thread(target=device.execute, kwargs={ 'root_allowed': self.root_allowed }).start() def run(self, root_allowed=False): """Start daemon mode :param bool root_allowed: Only used for ExecuteCmd :return: loop """ self.root_allowed = root_allowed scan_devices(self.on_push, lambda d: d.src.lower() in self.devices, self.settings.get('interface'))