diff --git a/packages/control/optional.py b/packages/control/optional.py index 938f082595..dea75d3df8 100644 --- a/packages/control/optional.py +++ b/packages/control/optional.py @@ -14,6 +14,7 @@ from helpermodules.timecheck import create_unix_timestamp_current_full_hour from helpermodules.utils import thread_handler from modules.common.configurable_tariff import ConfigurableElectricityTariff +from modules.common.configurable_monitoring import ConfigurableMonitoring log = logging.getLogger(__name__) @@ -23,11 +24,20 @@ def __init__(self): try: self.data = OptionalData() self.et_module: ConfigurableElectricityTariff = None + self.monitoring_module: ConfigurableMonitoring = None self.data.dc_charging = hardware_configuration.get_hardware_configuration_setting("dc_charging") Pub().pub("openWB/optional/dc_charging", self.data.dc_charging) except Exception: log.exception("Fehler im Optional-Modul") + def monitoring_start(self): + if self.monitoring_module is not None: + self.monitoring_module.start_monitoring() + + def monitoring_stop(self): + if self.mon_module is not None: + self.mon_module.stop_monitoring() + def et_provider_available(self) -> bool: return self.et_module is not None and self.data.et.get.fault_state != 2 diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index ea244b61b9..f834771322 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -689,15 +689,14 @@ def process_optional_topic(self, var: optional.Optional, msg: mqtt.MQTTMessage): # do not reconfigure monitoring if topic is received on startup if self.event_subdata_initialized.is_set(): config = decode_payload(msg.payload) - if config["type"] is not None: + if config["type"] is None: + var.monitoring_stop() + var.monitoring_module = None + else: mod = importlib.import_module(f".monitoring.{config['type']}.api", "modules") config = dataclass_from_dict(mod.device_descriptor.configuration_factory, config) - mod.create_config(config) - run_command(["sudo", "systemctl", "restart", "zabbix-agent2"], process_exception=True) - run_command(["sudo", "systemctl", "enable", "zabbix-agent2"], process_exception=True) - else: - run_command(["sudo", "systemctl", "stop", "zabbix-agent2"], process_exception=True) - run_command(["sudo", "systemctl", "disable", "zabbix-agent2"], process_exception=True) + var.monitoring_module = mod.create_monitoring(config) + var.monitoring_start() else: log.debug("skipping monitoring config on startup") else: diff --git a/packages/modules/common/configurable_monitoring.py b/packages/modules/common/configurable_monitoring.py new file mode 100644 index 0000000000..27b7b18889 --- /dev/null +++ b/packages/modules/common/configurable_monitoring.py @@ -0,0 +1,22 @@ +import logging +from typing import Callable + + +log = logging.getLogger(__name__) + + +class ConfigurableMonitoring(): + def __init__(self, + start_initializer: Callable[[], None], + stop_initializer: Callable[[], None]) -> None: + try: + self._start_monitoring = start_initializer + self._stop_monitoring = stop_initializer + except Exception: + log.exception("Fehler im Monitoring Modul") + + def start_monitoring(self): + self._start_monitoring() + + def stop_monitoring(self): + self._stop_monitoring() diff --git a/packages/modules/monitoring/zabbix/api.py b/packages/modules/monitoring/zabbix/api.py index 782a648dc6..f0e51d05de 100644 --- a/packages/modules/monitoring/zabbix/api.py +++ b/packages/modules/monitoring/zabbix/api.py @@ -2,24 +2,20 @@ import os from modules.common.abstract_device import DeviceDescriptor from modules.monitoring.zabbix.config import Zabbix +from modules.common.configurable_monitoring import ConfigurableMonitoring KEY_PATH = "/etc/zabbix/encrypt.psk" CONFIG_PATH = "/etc/zabbix/zabbix_agent2.conf" -def set_value(path, key, value): - with open(path, "r+") as file: - lines = file.readlines() - for i, line in enumerate(lines): - if line.startswith(key): - lines[i] = f"{key}={value}\n" - break - else: - lines.append(f"{key}={value}\n") - file.seek(0) - file.writelines(lines) - file.truncate() +def set_value(lines, key, value): + for i, line in enumerate(lines): + if line.startswith(key): + lines[i] = f"{key}={value}\n" + break + else: + lines.append(f"{key}={value}\n") def create_config(config: Zabbix): @@ -28,12 +24,30 @@ def create_config(config: Zabbix): os.system(f"sudo chmod 666 {CONFIG_PATH}") with open(KEY_PATH, "w") as key_file: key_file.write(config.configuration.psk_key) - set_value(CONFIG_PATH, "ServerActive", config.configuration.destination_host) - set_value(CONFIG_PATH, "Hostname", config.configuration.hostname) - set_value(CONFIG_PATH, "TLSConnect", "psk") - set_value(CONFIG_PATH, "TLSAccept", "psk") - set_value(CONFIG_PATH, "TLSPSKFile", KEY_PATH) - set_value(CONFIG_PATH, "TLSPSKIdentity", config.configuration.psk_identifier) + with open(CONFIG_PATH, "r+") as config_file: + lines = config_file.readlines() + set_value(lines, "ServerActive", config.configuration.destination_host) + set_value(lines, "Hostname", config.configuration.hostname) + set_value(lines, "TLSConnect", "psk") + set_value(lines, "TLSAccept", "psk") + set_value(lines, "TLSPSKFile", KEY_PATH) + set_value(lines, "TLSPSKIdentity", config.configuration.psk_identifier) + config_file.seek(0) + config_file.writelines(lines) + config_file.truncate() + + +def create_monitoring(config: Zabbix): + def start_monitoring(): + os.system("sudo ./runs/install_zabbix.sh") + create_config(config) + os.system("sudo systemctl restart zabbix-agent2") + os.system("sudo systemctl enable zabbix-agent2") + + def stop_monitoring(): + os.system("sudo systemctl stop zabbix-agent2") + os.system("sudo systemctl disable zabbix-agent2") + return ConfigurableMonitoring(start_monitoring, stop_monitoring) device_descriptor = DeviceDescriptor(configuration_factory=Zabbix) diff --git a/runs/install_packages.sh b/runs/install_packages.sh index 3025dcf69f..2273bf1abb 100755 --- a/runs/install_packages.sh +++ b/runs/install_packages.sh @@ -10,14 +10,4 @@ echo "install required packages with 'apt-get'..." python3-pip \ xserver-xorg x11-xserver-utils openbox-lxde-session lightdm lightdm-autologin-greeter accountsservice \ chromium chromium-l10n -if [ -z "$(dpkg -l | grep zabbix-agent2)" ] -then - echo "install zabbix" - wget -P /tmp/ https://repo.zabbix.com/zabbix/6.2/raspbian/pool/main/z/zabbix-release/zabbix-release_6.2-3%2Bdebian11_all.deb - sudo dpkg -i /tmp/zabbix-release_6.2-3+debian11_all.deb - echo "download" - sudo apt-get -q update - sudo apt install zabbix-agent2 zabbix-agent2-plugin-* - sudo rm /tmp/zabbix-release_6.2-3+debian11_all.deb -fi echo "done" diff --git a/runs/install_zabbix.sh b/runs/install_zabbix.sh new file mode 100644 index 0000000000..4c9df924ca --- /dev/null +++ b/runs/install_zabbix.sh @@ -0,0 +1,15 @@ +#!/bin/bash +echo "check if zabbix agent is already installed..." +if [ -z "$(dpkg -l | grep zabbix-agent2)" ] +then + echo "start download..." + wget -P /tmp/ https://repo.zabbix.com/zabbix/6.2/raspbian/pool/main/z/zabbix-release/zabbix-release_6.2-3%2Bdebian11_all.deb + sudo dpkg -i /tmp/zabbix-release_6.2-3+debian11_all.deb + echo "install zabbix." + sudo apt-get -q update + sudo apt install zabbix-agent2 zabbix-agent2-plugin-* + sudo rm /tmp/zabbix-release_6.2-3+debian11_all.deb +else + echo "nothing to do." +fi +echo "done" \ No newline at end of file