initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user