Seite 1 von 1

namen eines CIFS-shares ermitteln ...

Verfasst: Mittwoch 29. Oktober 2025, 10:02
von drnicolas
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.

Re: namen eines CIFS-shares ermitteln ...

Verfasst: Mittwoch 29. Oktober 2025, 10:36
von Sirius3
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))

Re: namen eines CIFS-shares ermitteln ...

Verfasst: Mittwoch 29. Oktober 2025, 11:21
von __blackjack__
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)
    )

Re: namen eines CIFS-shares ermitteln ...

Verfasst: Mittwoch 29. Oktober 2025, 11:42
von drnicolas
Vielen Dank! Vielversprechende Ansätze. kannte ich nicht.