Merge branch 'gruener-hintergrund'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user