#!/usr/bin/env python3 # SPDX-License-Identifier: BSD-3-Clause OR Apache-2.0 # encoding: utf-8 """Simple debug tool to log FIB updates issued by µD3TN.""" import argparse import logging import sys from ud3tn_utils.aap2 import ( AAP2UnixClient, AAP2TCPClient, AAP2ServerDisconnected, AuthType, LinkStatus, ResponseStatus, ) from ud3tn_utils.aap2.bin.helpers import ( add_common_parser_arguments, add_keepalive_parser_argument, get_secret_from_args, initialize_logger, ) logger = logging.getLogger(__name__) def run_fib_logger(aap2_client): logger.info("Waiting for FIB events...") while True: try: msg = aap2_client.receive_msg() except AAP2ServerDisconnected: logger.warning("µD3TN has closed the connection.") sys.exit(1) except KeyboardInterrupt: logger.info("Terminated by keyboard interrupt.") sys.exit(130) # exit status for SIGINT if msg.WhichOneof("msg") == "link": logger.warning( "%s: %s%s", { LinkStatus.LINK_STATUS_UNSPECIFIED: "CONNECTING", LinkStatus.LINK_STATUS_UP: "UP", LinkStatus.LINK_STATUS_DOWN: "DOWN", }.get(msg.link.status, f"(status={msg.link.status})"), ( f"{msg.link.peer_node_id} via " if msg.link.peer_node_id else "" ), msg.link.peer_cla_addr, ) aap2_client.send_response_status( ResponseStatus.RESPONSE_STATUS_SUCCESS, ) else: if msg.WhichOneof("msg") != "keepalive": logger.warning( "Received unhandled '%s' message discarding.", msg.WhichOneof("msg"), ) # ACK the message in any case -- same response KA, unhandled aap2_client.send_response_status( ResponseStatus.RESPONSE_STATUS_ACK, ) def main(): parser = argparse.ArgumentParser( description="FIB update logger for µD3TN", ) add_common_parser_arguments(parser) add_keepalive_parser_argument(parser) args = parser.parse_args() global logger logger = initialize_logger(args.verbosity) if args.tcp: aap2_client = AAP2TCPClient(address=args.tcp) else: aap2_client = AAP2UnixClient(address=args.socket) with aap2_client: secret = aap2_client.configure( args.agentid, subscribe=True, secret=get_secret_from_args(args), auth_type=AuthType.AUTH_TYPE_FIB_CONTROL, keepalive_seconds=args.keepalive_seconds, ) logger.info("AAP 2.0 agent configured as FIB subscriber!") logger.debug("Assigned agent secret: '%s'", secret) run_fib_logger(aap2_client) if __name__ == "__main__": main()