start agentx daemon
This commit is contained in:
parent
e5bde92bca
commit
28aec867cd
@ -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
117
src/agentx-ntpsec.py
Normal 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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user