#!/usr/bin/env python3 # -*- coding: utf-8 -*- # SPDX-FileCopyrightText: 2025 KUNBUS GmbH # SPDX-License-Identifier: GPL-2.0-or-later from argparse import ArgumentParser, SUPPRESS from typing import NamedTuple from pydbus import SessionBus, SystemBus FeatureMapping = NamedTuple("FeatureMapping", [("dbus_interface", str), ("name", str)]) REVPI_DBUS_NAME = "com.revolutionpi.middleware1" REVPI_DBUS_BASE_PATH = "/com/revolutionpi/middleware1" IFACE_SOFTWARE_SERVICES = "com.revolutionpi.middleware1.SoftwareServices" IFACE_REVPI_CONFIG = "com.revolutionpi.middleware1.RevpiConfig" REVPI_FEATURE_MAPPINGS = { "gui": FeatureMapping(IFACE_REVPI_CONFIG, "gui"), "revpi-con-can": FeatureMapping(IFACE_REVPI_CONFIG, "revpi-con-can"), "dphys-swapfile": FeatureMapping(IFACE_REVPI_CONFIG, "swapfile"), "pimodbus-master": FeatureMapping(IFACE_SOFTWARE_SERVICES, "pimodbus-master"), "pimodbus-slave": FeatureMapping(IFACE_SOFTWARE_SERVICES, "pimodbus-slave"), "systemd-timesyncd": FeatureMapping(IFACE_SOFTWARE_SERVICES, "ntp"), "ssh": FeatureMapping(IFACE_SOFTWARE_SERVICES, "ssh"), "nodered": FeatureMapping(IFACE_SOFTWARE_SERVICES, "nodered"), "noderedrevpinodes-server": FeatureMapping(IFACE_SOFTWARE_SERVICES, "noderedrevpinodes-server"), "revpipyload": FeatureMapping(IFACE_SOFTWARE_SERVICES, "revpipyload"), "bluetooth": FeatureMapping(IFACE_REVPI_CONFIG, "bluetooth"), "ieee80211": FeatureMapping(IFACE_REVPI_CONFIG, "wlan"), "avahi": FeatureMapping(IFACE_SOFTWARE_SERVICES, "avahi"), "external-antenna": FeatureMapping(IFACE_REVPI_CONFIG, "external-antenna"), } # Generate command arguments parser = ArgumentParser( prog="revpi-config", description="Configuration tool for Revolution Pi.", ) parser.add_argument( "--use-session-bus", dest="use_session_bus", action="store_true", default=False, help=SUPPRESS, ) parser.add_argument( "action", choices=["enable", "disable", "status", "available", "availstat"], help="Action to be executed: enable, disable, status or available.", ) parser.add_argument( "feature", nargs="*", help="Name of the feature to configure.", ) args = parser.parse_args() # Init dbus bus = SessionBus() if args.use_session_bus else SystemBus() revpi_middleware = bus.get(REVPI_DBUS_NAME, REVPI_DBUS_BASE_PATH) lst_results = [] for feature in args.feature: # Get the mappings feature_mapping = REVPI_FEATURE_MAPPINGS.get(feature, None) if feature_mapping is None: if args.action in ("enable", "disable"): # Missing feature with action enable/disable will return 5 lst_results.append(5) elif args.action == "availstat": # Missing feature with action availstat will return 2 lst_results.append(2) else: # Missing feature with action status/available will return 0 lst_results.append(0) continue dbus_interface = revpi_middleware[feature_mapping.dbus_interface] if args.action == "enable": dbus_interface.Enable(feature_mapping.name) lst_results.append(0) elif args.action == "disable": dbus_interface.Disable(feature_mapping.name) lst_results.append(0) elif args.action in ("status", "availstat"): status = dbus_interface.GetStatus(feature_mapping.name) lst_results.append(int(status)) elif args.action == "available": availability = dbus_interface.GetAvailability(feature_mapping.name) lst_results.append(int(availability)) if lst_results: print(" ".join(map(str, lst_results)))