Merge branch 'gruener-hintergrund'

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-18 10:03:22 +02:00
commit 424aeefe5c
2 files changed
+70 -5

No files matched your search

@@ -22,6 +22,11 @@ import sys
MARKER_DIR = "/var/lib/tuxflotte/persoenliche-konten"
ACCOUNTS_DIR = "/var/lib/AccountsService/users"
ANMELDENAME_MUSTER = re.compile(r"^[a-z][a-z0-9._-]{1,30}$")
# Persönliche Konten bekommen anfangs den grünen Mint-Hintergrund, damit sie
# sich auf einen Blick von gast und anderen Zugängen unterscheiden (Nutzer,
# 18.10.2026). Nur wo die Datei existiert (Mint); danach entscheidet die
# Person selbst.
GRUENER_HINTERGRUND = "/usr/share/backgrounds/linuxmint/sele_ring_green.jpg"
def ausfuehren(*befehl, eingabe=None):
@@ -81,6 +86,59 @@ def im_anmeldebildschirm(anmeldename, sichtbar):
return True
def hat_sitzung(anmeldename):
ergebnis = ausfuehren("loginctl", "show-user", anmeldename, "--property=State", "--value")
return ergebnis.returncode == 0 and ergebnis.stdout.strip() in ("active", "online", "lingering")
def hintergrund_vorgeben(anmeldename):
"""
Einmal je Konto (Marker <name>.hintergrund): grüner Hintergrund im
Cinnamon-Desktop und, über AccountsService, im Anmeldebildschirm. Läuft
eine Sitzung, erst beim nächsten Lauf - die laufende Sitzung schriebe
ihre eigene Einstellung sonst zurück. Gibt True zurück, wenn gesetzt.
"""
marker = marker_pfad(anmeldename) + ".hintergrund"
if os.path.exists(marker) or not os.path.exists(GRUENER_HINTERGRUND):
return False
if not os.path.exists("/usr/share/glib-2.0/schemas/org.cinnamon.desktop.background.gschema.xml"):
return False
if hat_sitzung(anmeldename):
return False
home = pwd.getpwnam(anmeldename).pw_dir
ergebnis = ausfuehren(
"runuser", "-u", anmeldename, "--",
"env", f"HOME={home}", "dbus-run-session", "--",
"gsettings", "set", "org.cinnamon.desktop.background", "picture-uri", f"file://{GRUENER_HINTERGRUND}",
)
if ergebnis.returncode != 0:
print(f"{anmeldename}: Hintergrund nicht gesetzt ({ergebnis.stderr.strip()[:200]})")
return False
pfad = os.path.join(ACCOUNTS_DIR, anmeldename)
datei = configparser.ConfigParser(interpolation=None)
datei.optionxform = str
try:
datei.read(pfad, encoding="utf-8")
except configparser.Error:
datei = configparser.ConfigParser(interpolation=None)
datei.optionxform = str
if not datei.has_section("User"):
datei.add_section("User")
datei.set("User", "BackgroundFile", GRUENER_HINTERGRUND)
os.makedirs(ACCOUNTS_DIR, exist_ok=True)
with open(pfad, "w", encoding="utf-8") as f:
datei.write(f, space_around_delimiters=False)
ausfuehren("systemctl", "try-restart", "accounts-daemon.service")
with open(marker, "w", encoding="utf-8") as f:
f.write(GRUENER_HINTERGRUND + "\n")
print(f"{anmeldename}: grüner Hintergrund gesetzt")
return True
def sitzungen_beenden(anmeldename):
ausfuehren("loginctl", "terminate-user", anmeldename)
@@ -152,10 +210,11 @@ def entfernen(konto):
os.remove(os.path.join(ACCOUNTS_DIR, name))
except FileNotFoundError:
pass
try:
os.remove(marker_pfad(name) + ".reset")
except FileNotFoundError:
pass
for endung in (".reset", ".hintergrund"):
try:
os.remove(marker_pfad(name) + endung)
except FileNotFoundError:
pass
os.remove(marker_pfad(name))
return "entfernt", None
@@ -219,6 +278,12 @@ def main():
ergebnis, meldung = "fehler", str(fehler)[:300]
eintrag = {"id": konto["id"], "ergebnis": ergebnis, "meldung": meldung}
if ergebnis in ("angelegt", "aktiv"):
try:
hintergrund_vorgeben(name)
except (OSError, KeyError) as fehler:
print(f"{name}: Hintergrund nicht gesetzt ({fehler})")
reset = konto.get("passwort_reset")
if isinstance(reset, dict) and ergebnis in ("aktiv", "gesperrt"):
try:
+1 -1
View File
@@ -31,7 +31,7 @@
- /run/tuxflotte/agent/persoenliche-konten-soll.json
- /run/tuxflotte/agent/persoenliche-konten.json
register: tuxflotte_konten_lauf
changed_when: tuxflotte_konten_lauf.stdout | regex_search('-> (angelegt|gesperrt|entfernt)|Passwort zurückgesetzt') is not none
changed_when: tuxflotte_konten_lauf.stdout | regex_search('-> (angelegt|gesperrt|entfernt)|Passwort zurückgesetzt|Hintergrund gesetzt') is not none
when: tuxflotte_persoenliche_konten | length > 0
- name: Remove desired personal accounts file