diff --git a/femctl b/femctl index eeff8d6..77a3426 100755 --- a/femctl +++ b/femctl @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# femctl - a simplle sysv cli bootscript manager +# femctl - a simple sysv cli bootscript manager # Copyright (C) 2025 Gabriel Di Martino # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,8 +21,9 @@ import urllib.request import difflib from pathlib import Path import re +import json -"""This is a small utility frontend for blfs bootscripts, the bootscripts remain to the BLFS Authors""" +"""Femctl: small utility frontend for BLFS bootscripts with remote overlays.""" BOOTSCRIPT_VER = "20250225" BLFS_URL = f"https://anduin.linuxfromscratch.org/BLFS/blfs-bootscripts/blfs-bootscripts-{BOOTSCRIPT_VER}.tar.xz" @@ -30,6 +31,8 @@ CACHE_DIR = Path.home() / ".blfs_cache" TARBALL = CACHE_DIR / "blfs-bootscripts.tar.xz" SRC_DIR = CACHE_DIR / f"blfs-bootscripts-{BOOTSCRIPT_VER}" +OVERLAY_INDEX_URL = "https://rocketleaguechatp.duckdns.org/femctl/overlays.json" + def check_root(): if os.geteuid() != 0: print("This script must be run as root!") @@ -82,7 +85,7 @@ def run_make(service, action, services): subprocess.run(["make", target], cwd=SRC_DIR, check=True) def print_version(): - print("""Femctl version 1.0.1 + print("""Femctl version 1.0.2 Made by gabry for FemboyOS Credits to the BLFS authors for the BLFS bootscripts""") @@ -96,15 +99,60 @@ Commands: help Show this message Example: - femctl enable sshd + femctl enable xdm femctl disable sshd""") +# ----------------- remote overlay logic ----------------- + +def fetch_overlay_index(): + """Fetch overlay index dynamically from server""" + with urllib.request.urlopen(OVERLAY_INDEX_URL) as resp: + return json.load(resp) + +def apply_remote_overlay_live(service, patch_name): + """Download and apply a patch directly to /etc/init.d/{service}""" + url = f"https://rocketleaguechatp.duckdns.org/femctl/patches/{service}/{patch_name}" + target_script_dir = Path("/etc/init.d") + target_script_path = target_script_dir / service + + if not target_script_path.exists(): + print(f"Service script {target_script_path} not found!") + return + + print(f"Downloading and applying overlay {patch_name} to {target_script_path}...") + + # download patch in memory + with urllib.request.urlopen(url) as resp: + patch_data = resp.read().decode("utf-8") + + # apply patch to /etc/init.d + subprocess.run( + ["patch", str(target_script_path)], + input=patch_data, + text=True, + check=True + ) + +def apply_service_overlays(service): + """Fetch overlay index and apply all patches for a service""" + index = fetch_overlay_index() + + # optionally warn if BLFS versions mismatch + if index.get("blfs_version") != BOOTSCRIPT_VER: + print("Warning: overlay BLFS version mismatch") + + patches = index.get("overlays", {}).get(service, []) + for patch_name in patches: + apply_remote_overlay(service, patch_name) + +# --------------------------------------------------------- + def main(): check_root() if len(sys.argv) < 2 or sys.argv[1] in ("help", "-h", "--help"): print_help() return - elif len(sys.argv) <2 or sys.argv[1] in ("version"): + elif len(sys.argv) < 2 or sys.argv[1] in ("version"): print_version() return @@ -118,6 +166,9 @@ def main(): return service = sys.argv[2] + # apply remote overlays first + apply_service_overlays(service) + if command == "enable": run_make(service, "install", services) elif command == "disable": @@ -127,4 +178,3 @@ def main(): if __name__ == "__main__": main() - diff --git a/overlays.json b/overlays.json new file mode 100644 index 0000000..d1e11bb --- /dev/null +++ b/overlays.json @@ -0,0 +1,11 @@ +{ + "blfs_version": "20250225", + "overlays": { + "sddm": { + "target": "xdm", + "patches": [ + "0001-plymouth-quit.patch" + ] + } + } +} diff --git a/patches/xdm/0001-plymouth-quit.patch b/patches/xdm/0001-plymouth-quit.patch new file mode 100644 index 0000000..6a0f982 --- /dev/null +++ b/patches/xdm/0001-plymouth-quit.patch @@ -0,0 +1,11 @@ +--- /tmp/xdm.orig 2025-12-21 11:19:37.763436780 +0100 ++++ /etc/init.d/xdm 2025-12-21 11:19:49.884939311 +0100 +@@ -16,6 +16,8 @@ + + source /etc/sysconfig/xdm + ++plymouth quit || true ++ + if [ -z "${DISPLAY_MANAGER}" ]; then + echo Please set DISPLAY_MANAGER in /etc/sysconfig/xdm \ + before running /etc/rc.d/init.d/xdm