femctl: overlay patches and idk

This commit is contained in:
2025-12-21 13:08:33 +01:00
parent b8d02ed6fa
commit ec18b3ef0c
3 changed files with 78 additions and 6 deletions

60
femctl
View File

@@ -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,9 +99,54 @@ 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"):
@@ -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()

11
overlays.json Normal file
View File

@@ -0,0 +1,11 @@
{
"blfs_version": "20250225",
"overlays": {
"sddm": {
"target": "xdm",
"patches": [
"0001-plymouth-quit.patch"
]
}
}
}

View File

@@ -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