start agentx daemon

This commit is contained in:
Wolfgang Hottgenroth 2025-02-20 12:10:17 +01:00
parent e5bde92bca
commit 28aec867cd
2 changed files with 123 additions and 1 deletions

View File

@ -1,16 +1,21 @@
import ntp.packet
import json
session = ntp.packet.ControlSession()
session.openhost('localhost')
peers = session.readstat()
k = []
l = session.readvar(0)
print(f"{l=}")
k.append(list(dict(l).keys()))
for p in peers:
l = session.readvar(p.associd)
print(f"{p.associd}: {dict(l)}")
k.append(list(dict(l).keys()))
print(json.dumps(k, indent=4))

117
src/agentx-ntpsec.py Normal file
View File

@ -0,0 +1,117 @@
import ntp.packet
import threading
import time
import argparse
import os
import sys
import logging
import logging.handlers
class NtpDataCollector(threading.Thread):
def __init__(self, ntpserver='localhost', period=60):
self.ntpserver = ntpserver
self.period = period
self.stop_event = threading.Event()
self.session = ntp.packet.ControlSession()
self.session.openhost(self.ntpserver)
threading.Thread.__init__(self)
def run(self):
while not self.stop_event.is_set():
logger.debug('Query ntp server')
ntpserver_vars = self.session.readvar(0)
logger.debug(f"{ntpserver_vars=}")
peers = self.session.readstat()
for peer in peers:
peer_vars = self.session.readvar(peer.associd)
logger.debug(f"{peer.associd=}, {peer_vars=}")
time.sleep(self.period)
logger.info('NtpDataCollector terminating')
def stop(self):
self.stop_event.set()
self.join()
def daemonize(pid_filename):
if os.fork() > 0:
sys.exit(0)
os.setsid()
pid = os.fork()
if pid > 0:
with open(pid_filename, 'w') as pid_file:
pid_file.write(str(pid))
sys.exit(0)
sys.stdout.flush()
sys.stderr.flush()
with open("/dev/null", "r") as devnull:
os.dup2(devnull.fileno(), sys.stdin.fileno())
with open("/tmp/agentx-ntpsec.log", "a+") as log:
os.dup2(log.fileno(), sys.stdout.fileno())
os.dup2(log.fileno(), sys.stderr.fileno())
logger.removeHandler(stdout_handler)
if __name__ == '__main__':
logging.basicConfig(
level=logging.DEBUG,
format="%(name)s - %(levelname)s - %(message)s",
handlers=[logging.handlers.SysLogHandler(address='/dev/log')]
)
logger = logging.getLogger('agentx-ntpsec')
stdout_handler = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(formatter)
logger.addHandler(stdout_handler)
pid_filename = '/tmp/agentx-ntpsec.pid'
parser = argparse.ArgumentParser(description='snmpd agentx extension for ntpsec')
parser.add_argument('--period', '-p',
help='Period to query the NTP server, in seconds, default 60s',
required=False,
default=60)
parser.add_argument('--ntpserver', '-n',
help='NTP server to query, default is localhost',
required=False,
default='localhost')
parser.add_argument('--daemonize', '-d',
help='Run process in background',
required=False,
action='store_true',
default=False)
parser.add_argument('--pid',
help=f"pid-file when running as daemon, default is {pid_filename}",
required=False,
default=pid_filename)
args = parser.parse_args()
if args.daemonize:
daemonize(pid_filename)
ntpserver = args.ntpserver
period = args.period
try:
ndc = NtpDataCollector(ntpserver=ntpserver, period=period)
ndc.start()
except Exception as e:
logger.error(f"Unhandled exception: {e}")
ndc.stop()
except KeyboardInterrupt:
ndc.stop()