Korrektur-Flow + Freigaben-Auswahl + Schreibtest + Schnellwahl-Klartext
Ampel / ampel (push) Failing after 52s
Ampel / ampel (push) Failing after 52s
Commander-Befunde (23.07. spaet): - MANUELLE KORREKTUR (KONZEPT Schritt 5 endlich komplett): Metadaten-Seite hat jetzt Titelsuche ueber ALLE Quellen (GET /metadata/search) mit Poster-Kacheln; ein Klick uebernimmt den Treffer (POST /metadata/override) fuer Karte, Jobs UND merkt ihn sich 30 Tage per Disc-Fingerabdruck — dieselbe Disc wird beim naechsten Einlegen sofort richtig erkannt - PC/NAS per Klick: SMB-Freigaben eines Rechners auflisten (GET /storage-mounts/shares via smbclient) statt //host/share raten - Berechtigungs-PRUEFUNG beim Einhaengen: Schreibtest, Warnung bei nur-lesbaren Zielen (API + UI + Log) - "Standard-Unterordner" verstaendlich gemacht: heisst jetzt "Schnellwahl beim Rippen" mit Erklaertext; kryptisches Basis-Feld raus - Preview zeigt Poster; Fingerprint fuer Cache/Override vereinheitlicht (billiges Label+Groesse statt Mount-Titel) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+45
-3
@@ -33,13 +33,54 @@ def ist_gemountet(name: str) -> bool:
|
||||
return os.path.ismount(_mountpoint(name))
|
||||
|
||||
|
||||
def schreibtest(pfad: str) -> bool:
|
||||
"""Berechtigungs-Prüfung: können wir im Ziel wirklich schreiben?
|
||||
|
||||
Commander-Anforderung 23.07.: beim Hinzufügen muss geprüft werden, ob
|
||||
die Rechte stimmen — ein nur-lesbares Ziel fällt sonst erst beim Rip auf.
|
||||
"""
|
||||
testdatei = os.path.join(pfad, ".rippy-schreibtest")
|
||||
try:
|
||||
with open(testdatei, "w") as f:
|
||||
f.write("ok")
|
||||
os.unlink(testdatei)
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
|
||||
def liste_smb_freigaben(host: str, username: str = "", passwort: str = "") -> list:
|
||||
"""Listet die SMB-Freigaben eines Rechners (smbclient -L) — damit man
|
||||
seinen PC/NAS per Klick wählt statt //host/share zu raten."""
|
||||
cmd = ["smbclient", "-L", f"//{host}", "-g"]
|
||||
if username:
|
||||
cmd += ["-U", f"{username}%{passwort or ''}"]
|
||||
else:
|
||||
cmd += ["-N"]
|
||||
ergebnis = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
|
||||
freigaben = []
|
||||
for zeile in (ergebnis.stdout or "").splitlines():
|
||||
# -g-Format: Disk|Freigabename|Kommentar
|
||||
teile = zeile.split("|")
|
||||
if len(teile) >= 2 and teile[0] == "Disk" and not teile[1].endswith("$"):
|
||||
freigaben.append(teile[1])
|
||||
if not freigaben and ergebnis.returncode != 0:
|
||||
fehler = (ergebnis.stderr or ergebnis.stdout or "").strip()
|
||||
raise RuntimeError(f"Freigaben-Abfrage fehlgeschlagen: {fehler[:200]}")
|
||||
return freigaben
|
||||
|
||||
|
||||
def mounten(name: str, typ: str, quelle: str, optionen: str = "",
|
||||
username: str = "", passwort: str = "") -> None:
|
||||
"""Hängt ein NFS/CIFS-Ziel unter /app/media/<name> ein. Wirft RuntimeError."""
|
||||
username: str = "", passwort: str = "") -> bool:
|
||||
"""Hängt ein NFS/CIFS-Ziel unter /app/media/<name> ein.
|
||||
|
||||
Rückgabe: True wenn das Ziel SCHREIBBAR ist. Wirft RuntimeError bei
|
||||
Mount-Fehlern.
|
||||
"""
|
||||
ziel = _mountpoint(name)
|
||||
os.makedirs(ziel, exist_ok=True)
|
||||
if os.path.ismount(ziel):
|
||||
return
|
||||
return schreibtest(ziel)
|
||||
|
||||
creds_datei = None
|
||||
try:
|
||||
@@ -69,6 +110,7 @@ def mounten(name: str, typ: str, quelle: str, optionen: str = "",
|
||||
if ergebnis.returncode != 0:
|
||||
fehler = (ergebnis.stderr or ergebnis.stdout or "").strip()
|
||||
raise RuntimeError(f"mount schlug fehl: {fehler[:300]}")
|
||||
return schreibtest(ziel)
|
||||
finally:
|
||||
if creds_datei:
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user