diff --git a/devices/statistics_writer/receiver.py b/devices/statistics_writer/receiver.py index 919357764a2196cb7955e4ec77f2487b81d24d59..92d0d6d34bfc69f8f89f306c86b906c68956e47b 100644 --- a/devices/statistics_writer/receiver.py +++ b/devices/statistics_writer/receiver.py @@ -54,6 +54,15 @@ class tcp_receiver(receiver): super().__init__(fd=self.sock.fileno()) + def reconnect(self): + self.fd = None + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.host, self.port)) + self.fd = self.sock.fileno() + return True + + + class file_receiver(receiver): def __init__(self, filename): self.filename = filename diff --git a/devices/statistics_writer/statistics_writer.py b/devices/statistics_writer/statistics_writer.py index 594e261c6d1e00e0ea7882c595449813c305c8ce..8bf8fa64fbba9626f60abec0bb6cacb7e7288c51 100644 --- a/devices/statistics_writer/statistics_writer.py +++ b/devices/statistics_writer/statistics_writer.py @@ -2,23 +2,28 @@ import argparse from receiver import tcp_receiver, file_receiver from hdf5_writer import hdf5_writer +import time +from datetime import datetime + import sys import signal import logging -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.INFO, format = '%(asctime)s:%(levelname)s: %(message)s') logger = logging.getLogger("statistics_writer") + parser = argparse.ArgumentParser(description='Converts a stream of statistics packets into HDF5 files.') -parser.add_argument('-a', '--host', type=str, help='the host to connect to') -parser.add_argument('-p', '--port', type=int, default=0, help='the port to connect to, or 0 to use default port for the selected mode (default: %(default)s)') -parser.add_argument('-f', '--file', type=str, help='the file to read from') +parser.add_argument('-a', '--host', type=str, help='The host to connect to.') +parser.add_argument('-p', '--port', type=int, default=0, help='The port to connect to, or 0 to use default port for the selected mode. (default: %(default)s)') +parser.add_argument('-f', '--file', type=str, help='The file to read from. (will ignore --host and --port)') -parser.add_argument('-m', '--mode', type=str, choices=['SST', 'XST', 'BST'], default='SST', help='sets the statistics type to be decoded options (default: %(default)s)') -parser.add_argument('-i', '--interval', type=float, default=3600, nargs="?", help='The time between creating new files in seconds (default: %(default)s)') -parser.add_argument('-o', '--output_dir', type=str, default=".", nargs="?", help='specifies the folder to write all the files (default: %(default)s)') -parser.add_argument('-v', '--debug', dest='debug', action='store_true', default=False, help='increase log output') -parser.add_argument('-d', '--decimation', type=int, default=1, help='Configure the writer to only store one every n samples. Saves storage space') +parser.add_argument('-m', '--mode', type=str, choices=['SST', 'XST', 'BST'], default='SST', help='Sets the statistics type to be decoded options. (default: %(default)s)') +parser.add_argument('-i', '--interval', type=float, default=3600, nargs="?", help='The time between creating new files in seconds. (default: %(default)s)') +parser.add_argument('-o', '--output_dir', type=str, default=".", nargs="?", help='Specifies the folder to write all the files. (default: %(default)s)') +parser.add_argument('-d', '--decimation', type=int, default=1, help='Configure the writer to only store one every n samples. Saves storage space.') +parser.add_argument('-v', '--debug', dest='debug', action='store_true', default=False, help='Increase log output.') +parser.add_argument('-r', '--reconnect', dest='reconnect', action='store_true', default=False, help='Set the writer to keep trying to reconnect whenever connection is lost. (default: %(default)s)') if __name__ == "__main__": @@ -31,8 +36,9 @@ if __name__ == "__main__": output_dir = args.output_dir interval = args.interval mode = args.mode - debug = args.debug decimation = args.decimation + debug = args.debug + reconnect = args.reconnect if decimation < 1: raise ValueError("Please use an integer --Decimation value 1 or higher to only store one every n statistics' ") @@ -60,13 +66,27 @@ if __name__ == "__main__": # start looping try: while True: - packet = receiver.get_packet() - writer.next_packet(packet) + try: + packet = receiver.get_packet() + writer.next_packet(packet) + except EOFError: + if reconnect and not filename: + logger.warning("Connection lost, attempting to reconnect") + while True: + try: + receiver.reconnect() + except Exception as e: + logger.warning(f"Could not reconnect: {e.__class__.__name__}: {e}") + time.sleep(10) + else: + break + logger.warning("Reconnected! Resuming operations") + else: + logger.info("End of input.") + raise SystemExit + except KeyboardInterrupt: # user abort, don't complain logger.warning("Received keyboard interrupt. Stopping.") - except EOFError: - # done processing all input, don't complain - logger.info("End of input.") finally: writer.close_writer() diff --git a/devices/statistics_writer/test/test_server.py b/devices/statistics_writer/test/test_server.py index eec9ec3eed992b03ee809ca37de012bad43bd213..74101b93de2e83824c70e4630e8560ae24b28fa8 100644 --- a/devices/statistics_writer/test/test_server.py +++ b/devices/statistics_writer/test/test_server.py @@ -45,6 +45,9 @@ while True: time.sleep(INTERVAL) conn.sendall(data) + except KeyboardInterrupt: + logger.info("Received keyboard interrupt. Stopping.") + exit() except Exception as e: logger.warning(f"Exception occurred: {e}")