#!/usr/bin/env python3 import subprocess import re import os import json import argparse def restart_service(skip_restart=False, history=False): if not skip_restart and not history: subprocess.Popen(["systemctl", "restart", "wb-mqtt-serial"], stdout=subprocess.PIPE) def parse_config_file(filename): with open(filename, "r") as file: config_data = json.load(file) device_to_port = {} device_stats = {} for port in config_data["ports"]: for device in port["devices"]: device_to_port[device["slave_id"]] = port["path"] device_stats[device["slave_id"]] = {"type": device.get("device_type", "Unknown type"), "errors": 0, "disconnects": 0, "write_failures": 0, "invalid_crc_errors": 0} # New line return device_to_port, device_stats def parse_journal(device_to_port, device_stats, skip_lines=10, history=False): cmd = ["journalctl", "-f", "-u", "wb-mqtt-serial"] if not history else ["journalctl", "-u", "wb-mqtt-serial"] p = subprocess.Popen(cmd, stdout=subprocess.PIPE) last_log_line = None line_counter = 0 for line in iter(p.stdout.readline, b''): line_counter += 1 if line_counter <= skip_lines: continue line = line.decode('utf-8') # convert bytes to string match_error = re.search(r'modbus:(\d+): Serial protocol error: request timed out', line) match_disconnect = re.search(r'INFO: \[serial device\] device modbus:(\d+) is disconnected', line) match_write_failure = re.search(r'WARNING: \[modbus\] failed to write: