57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
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()
|