mirror of https://github.com/probonopd/MiniDexed
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Syslog server to receive and display syslog messages from MiniDexed.
|
|
"""
|
|
|
|
import socket
|
|
import time
|
|
import threading
|
|
|
|
class SyslogServer:
|
|
def __init__(self, host='0.0.0.0', port=8514):
|
|
self.host = host
|
|
self.port = port
|
|
self.server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
self.server.bind((self.host, self.port))
|
|
self.start_time = None
|
|
self.running = True
|
|
|
|
def start(self):
|
|
ip_address = socket.gethostbyname(socket.gethostname())
|
|
print(f"Syslog server listening on {ip_address}:{self.port}")
|
|
input_thread = threading.Thread(target=self.wait_for_input)
|
|
input_thread.daemon = True
|
|
input_thread.start()
|
|
while self.running:
|
|
try:
|
|
data, address = self.server.recvfrom(1024)
|
|
self.handle_message(data)
|
|
except KeyboardInterrupt:
|
|
self.running = False
|
|
|
|
def handle_message(self, data):
|
|
message = data[2:].decode('utf-8').strip()
|
|
|
|
if self.start_time is None:
|
|
self.start_time = time.time()
|
|
relative_time = "0:00:00.000"
|
|
else:
|
|
elapsed_time = time.time() - self.start_time
|
|
hours = int(elapsed_time // 3600)
|
|
minutes = int((elapsed_time % 3600) // 60)
|
|
seconds = int(elapsed_time % 60)
|
|
milliseconds = int((elapsed_time % 1) * 1000)
|
|
relative_time = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}"
|
|
|
|
print(f"{relative_time} {message}")
|
|
|
|
def wait_for_input(self):
|
|
input("Press any key to exit...")
|
|
self.running = False
|
|
|
|
if __name__ == "__main__":
|
|
server = SyslogServer()
|
|
server.start()
|
|
print("Syslog server stopped.") |