diff --git a/scripts/timesync_monitor.py b/scripts/timesync_monitor.py new file mode 100644 index 0000000000000000000000000000000000000000..bed8df300a55d32fadb73021911b21f4f0b2be56 --- /dev/null +++ b/scripts/timesync_monitor.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +# coding=utf-8 +# Filename: timesync_monitor.py +# Author: Tamas Gal <tgal@km3net.de> +# vim: ts=4 sw=4 et +""" +Monitors the time sync of DOMs using the MSG of the CLB DOM STATUS 1 field +from the supernova timeslice stream (IO_TSSN). + +Usage: + timesync_monitor.py [options] + timesync_monitor.py (-h | --help) + +Options: + -l LIGIER_IP The IP of the ligier [default: 127.0.0.1]. + -p LIGIER_PORT The port of the ligier [default: 5553]. + -m LOGGING_LIGIER_IP The IP of the logging ligier [default: 127.0.0.1]. + -q LOGGING_LIGIER_PORT The port of the logging ligier [default: 5553]. + -h --help Show this screen. + +""" +import datetime +import km3pipe as kp + + +class TimeSyncChecker(kp.Module): + def configure(self): + logging_ligier = self.require("logging_ligier_ip") + logging_ligier_port = self.require("logging_ligier_port") + self.ch_client = kp.controlhost.Client(logging_ligier, + port=logging_ligier_port) + self.alert = kp.time.Cuckoo(interval=10, callback=self._alert) + + def _alert(self, msg): + date = datetime.datetime.utcnow().strftime("%c") + msg = f"ALERT (MONITORING) {date}: {msg}" + print(msg) + self.ch_client.put_message("MSG", "Monitoring Test") + + def process(self, blob): + dom_ids = [] + for dom_id, frameinfo in blob['TimesliceFrameInfos'].items(): + valid_time_sync = bool(frameinfo.dom_status[0] & (1 << (32 - 1))) + if not valid_time_sync: + dom_ids.append(dom_id) + if dom_ids: + self.alert("invalid time sync for DOM ID: {}".format(','.join( + map(str, dom_ids)))) + return blob + + def finish(self): + self.ch_client._disconnect() + + +def main(): + from docopt import docopt + args = docopt(__doc__) + + ligier_ip = args['-l'] + ligier_port = int(args['-p']) + logging_ligier_ip = args['-m'] + logging_ligier_port = int(args['-q']) + + pipe = kp.Pipeline() + pipe.attach(kp.io.ch.CHPump, + host=ligier_ip, + port=ligier_port, + tags="IO_TSSN") + pipe.attach(kp.io.daq.TimesliceParser) + pipe.attach(TimeSyncChecker, + logging_ligier_ip=logging_ligier_ip, + logging_ligier_port=logging_ligier_port) + pipe.drain() + + +if __name__ == '__main__': + main()