# # Used to fetch the stats url and determine if # aprsd server is 'healthy' # # # python included libs import datetime import logging import sys import click from oslo_config import cfg from rich.console import Console import aprsd from aprsd import cli_helper from aprsd import conf # noqa # local imports here from aprsd.main import cli from aprsd.threads import stats as stats_threads # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 CONF = cfg.CONF LOG = logging.getLogger("APRSD") console = Console() @cli.command() @cli_helper.add_options(cli_helper.common_options) @click.option( "--timeout", show_default=True, default=3, help="How long to wait for healtcheck url to come back", ) @click.pass_context @cli_helper.process_standard_options def healthcheck(ctx, timeout): """Check the health of the running aprsd server.""" ver_str = f"APRSD HealthCheck version: {aprsd.__version__}" console.log(ver_str) with console.status(ver_str): try: stats_obj = stats_threads.StatsStore() stats_obj.load() stats = stats_obj.data # console.print(stats) except Exception as ex: console.log(f"Failed to load stats: '{ex}'") sys.exit(-1) else: now = datetime.datetime.now() if not stats: console.log("No stats from aprsd") sys.exit(-1) email_stats = stats.get("EmailStats") if email_stats: email_thread_last_update = email_stats["last_check_time"] if email_thread_last_update != "never": d = now - email_thread_last_update max_timeout = {"hours": 0.0, "minutes": 5, "seconds": 0} max_delta = datetime.timedelta(**max_timeout) if d > max_delta: console.log(f"Email thread is very old! {d}") sys.exit(-1) client_stats = stats.get("APRSClientStats") if not client_stats: console.log("No APRSClientStats") sys.exit(-1) else: aprsis_last_update = client_stats["server_keepalive"] d = now - aprsis_last_update max_timeout = {"hours": 0.0, "minutes": 5, "seconds": 0} max_delta = datetime.timedelta(**max_timeout) if d > max_delta: LOG.error(f"APRS-IS last update is very old! {d}") sys.exit(-1) console.log("OK") sys.exit(0)