namen eines CIFS-shares ermitteln ...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 122
Registriert: Sonntag 24. Juli 2016, 10:32

Ich lege Dateien in mehreren/vielen CIFS-shares ab. Diese Verzeichnisse werden überwacht und ggf. ein Skript aufgerufen.

Ich versuche gerade eine Fehlerbehandlung zu verbessern.
Dazu soll in einer Mail der Name/Pfad der fehlerhaften Datei angezigt werden.

momentan bastele ich von Hand (Windows)Pfad und Name zusammen. Das wird in der Mail auch angezeigt, sogar als Verweis. prima soweit, aber momentan Handarbeit.

Gibt es irgendeinen Weg, vom Linux-Pfad einer Datei auf den Namen des CIFS-Shares zu schliessen?
Mir fiele momentan eine Tabelle mit Linux-Pda und korrespondierendem CIFS ein; scheint mir aber sehr kompliziert.
Sirius3
User
Beiträge: 18322
Registriert: Sonntag 21. Oktober 2012, 17:20

Von "Hand" solltest Du nichts machen, sondern pathlib benutzen. Erster Schritt wäre, die Mounts auszulesen und dann die passenden Pfade zusammenbauen:

Code: Alles auswählen

from pathlib import Path, PureWindowsPath

mounts = []
with open("/proc/self/mounts") as lines:
    for line in lines:
        parts = line.split()
        if parts[2] == "cifs":
            mounts.append((Path(parts[1]), PureWindowsPath(parts[0])))

path = Path("/mnt/cifs/irgendeine/datei")
for linux_path, windows_path in mounts:
    if path.is_relative_to(linux_path):
        print(windows_path / path.relative_to(linux_path))
Benutzeravatar
__blackjack__
User
Beiträge: 14220
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wäre es nicht sicherer vom Pfad der einen interessiert solange in den `parent`-Attributen hoch zu gehen bis man mit `is_mount()` den _ersten_ Mountpoint gefunden hat? Denn es könnte ja sein, dass die Datei zwar innerhalb eines gemounteten CIFS Verzeichnisses liegt, aber dort drin dann doch wieder noch was anderes gemountet wurde.

Ungetestet:

Code: Alles auswählen

    with open("/proc/self/mounts", encoding="utf-8") as lines:
        mountpoint_to_windows_path = {
            Path(mountpoint): PureWindowsPath(windows_path)
            for windows_path, mountpoint, filesystem_name, *_ in map(
                str.split, lines
            )
            if filesystem_name == "cifs"
        }

    path = Path("/mnt/cifs/irgendeine/datei")
    #
    # Get nearest mount point going up the directory tree.
    #
    mountpoint = path
    while not mountpoint.is_mount():
        mountpoint = mountpoint.parent
    assert mountpoint.is_mount()

    print(
        mountpoint_to_windows_path[mountpoint] / path.relative_to(mountpoint)
    )
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
drnicolas
User
Beiträge: 122
Registriert: Sonntag 24. Juli 2016, 10:32

Vielen Dank! Vielversprechende Ansätze. kannte ich nicht.
Antworten