From 08b4667b2cb1b615dada657759d00a53ec9fe607 Mon Sep 17 00:00:00 2001 From: Lloyd Date: Thu, 25 Jun 2026 00:00:28 +0100 Subject: [PATCH] refactor: disable legacy pymc services and normalize paths in management scripts --- manage.sh | 38 ++++++++++++++++++++++++++++++++ repeater/web/update_endpoints.py | 17 ++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/manage.sh b/manage.sh index 8fb33f1..2975673 100755 --- a/manage.sh +++ b/manage.sh @@ -230,6 +230,26 @@ is_enabled() { systemctl is-enabled "$SERVICE_NAME" >/dev/null 2>&1 } +# Stop/disable legacy service names that can conflict on GPIO. +disable_legacy_services() { + local legacy_services="pymc-repeater pymc-repeater.service" + local svc removed_unit=0 + + for svc in $legacy_services; do + systemctl stop "$svc" >/dev/null 2>&1 || true + systemctl disable "$svc" >/dev/null 2>&1 || true + done + + if [ -f /etc/systemd/system/pymc-repeater.service ]; then + rm -f /etc/systemd/system/pymc-repeater.service + removed_unit=1 + fi + + if [ "$removed_unit" -eq 1 ]; then + systemctl daemon-reload >/dev/null 2>&1 || true + fi +} + # Function to get current version get_version() { # Read version from the pip-installed package in the venv @@ -405,6 +425,8 @@ install_repeater() { useradd --system --home "$DATA_DIR" --shell /sbin/nologin "$SERVICE_USER" fi + disable_legacy_services + ( echo "10"; echo "# Adding user to hardware groups..." for grp in plugdev dialout gpio i2c spi; do @@ -838,6 +860,7 @@ upgrade_repeater() { echo "=== Upgrade Progress ===" echo "[1/9] Stopping service..." systemctl stop "$SERVICE_NAME" 2>/dev/null || true + disable_legacy_services echo "[1.5/9] Migrating legacy paths..." migrate_legacy_paths @@ -1372,6 +1395,16 @@ validate_and_update_config() { local example_file="config.yaml.example" local updated_example="$CONFIG_DIR/config.yaml.example" + normalize_legacy_paths_in_config() { + local target_file="$1" + [ -f "$target_file" ] || return 0 + + sed -i 's|/var/lib/pymc_repeater|/var/lib/openhop_repeater|g' "$target_file" 2>/dev/null || true + sed -i 's|/etc/pymc_repeater|/etc/openhop_repeater|g' "$target_file" 2>/dev/null || true + sed -i 's|/var/log/pymc_repeater|/var/log/openhop_repeater|g' "$target_file" 2>/dev/null || true + sed -i 's|/opt/pymc_repeater|/opt/openhop_repeater|g' "$target_file" 2>/dev/null || true + } + # Ensure destination config directory exists before copy/merge steps. mkdir -p "$CONFIG_DIR" @@ -1387,6 +1420,7 @@ validate_and_update_config() { if [ ! -f "$config_file" ]; then echo " ⚠ No existing config.yaml found, copying example" cp "$updated_example" "$config_file" + normalize_legacy_paths_in_config "$config_file" return 0 fi @@ -1427,18 +1461,22 @@ validate_and_update_config() { # Verify the merged file is valid YAML if "$YQ_CMD" eval '.' "$temp_merged" > /dev/null 2>&1; then mv "$temp_merged" "$config_file" + normalize_legacy_paths_in_config "$config_file" echo " ✓ Configuration merged successfully" + echo " ✓ Legacy pymc_* paths normalized" echo " ✓ User settings preserved, new options added" return 0 else echo " ✗ Merged config is invalid, restoring backup" rm -f "$temp_merged" cp "$backup_file" "$config_file" + normalize_legacy_paths_in_config "$config_file" return 1 fi else echo " ✗ Config merge failed, keeping original" rm -f "$temp_merged" "$stripped_user" + normalize_legacy_paths_in_config "$config_file" return 1 fi } diff --git a/repeater/web/update_endpoints.py b/repeater/web/update_endpoints.py index a614175..996a26d 100644 --- a/repeater/web/update_endpoints.py +++ b/repeater/web/update_endpoints.py @@ -887,6 +887,22 @@ def _cleanup_stale_source_trees() -> None: _state.append_line("[pyMC updater] No stale source-tree paths found") +def _disable_legacy_services() -> None: + legacy_units = ["pymc-repeater", "pymc-repeater.service"] + + for unit in legacy_units: + subprocess.run([_SYSTEMCTL_BIN, "stop", unit], check=False) # nosec B603 + subprocess.run([_SYSTEMCTL_BIN, "disable", unit], check=False) # nosec B603 + + if os.path.isfile("/etc/systemd/system/pymc-repeater.service"): + try: + os.remove("/etc/systemd/system/pymc-repeater.service") + except OSError: + pass + + subprocess.run([_SYSTEMCTL_BIN, "daemon-reload"], check=False) # nosec B603 + + def _do_install() -> None: channel = _state.channel @@ -944,6 +960,7 @@ def _do_install() -> None: ) cmd = ["/bin/sh", _BUILDROOT_UPGRADE_HELPER, "upgrade"] elif is_root: + _disable_legacy_services() _migrate_pymc_install_dir() _migrate_service_unit()