from __future__ import annotations import logging import uuid import capport.database import capport.comm.hub import capport.comm.message import capport.config import capport.utils.cli import capport.utils.nft_set import trio from capport import cptypes _logger = logging.getLogger(__name__) class ControlApp(capport.comm.hub.HubApplication): hub: capport.comm.hub.Hub def __init__(self) -> None: super().__init__() self.nft_set = capport.utils.nft_set.NftSet() def is_controller(self) -> bool: return True async def mac_states_changed(self, *, from_peer_id: uuid.UUID, pending_updates: capport.database.PendingUpdates) -> None: # deploy changes to netfilter set inserts = [] removals = [] now = cptypes.Timestamp.now() for mac, state in pending_updates.macs.items(): rem = state.allowed_remaining(now) if rem > 0: inserts.append((mac, rem)) else: removals.append(mac) self.nft_set.bulk_insert(inserts) self.nft_set.bulk_remove(removals) async def amain(config: capport.config.Config) -> None: app = ControlApp() hub = capport.comm.hub.Hub(config=config, app=app) app.hub = hub await hub.run() def main() -> None: config = capport.config.Config.load() capport.utils.cli.init_logger(config) try: trio.run(amain, config) except (KeyboardInterrupt, InterruptedError): print()