diff --git a/deploy/tesm-helper b/deploy/tesm-helper index c508b21..cd7dfc1 100644 --- a/deploy/tesm-helper +++ b/deploy/tesm-helper @@ -258,8 +258,19 @@ case "$verb" in # Kommandozeile (Prozessliste) und nie ueber die Umgebung # (/proc//environ). read_stdin_limited > "$creds" - mkdir -p "$target" - if mount -t cifs "$share" "$target" \ + # Der aufrufende Dienst laeuft in einem eigenen Mount-Namensraum + # (ProtectSystem, PrivateTmp, ReadWritePaths). Ein Einbinden *darin* + # scheitert mit "mount error(1): Operation not permitted" -- gemessen: mit + # denselben Optionen und denselben Zugangsdaten gelingt es aus einer + # normalen Root-Shell sofort. Deshalb wird im Namensraum des Wirts + # eingebunden; von dort wird der Mount in den Namensraum des Dienstes + # weitergegeben (er haengt als "slave" darunter), die Anwendung sieht ihn + # also. Die Zugangsdatei unter /run ist ueber die Grenze lesbar, /run ist + # nicht privatisiert. + im_wirt=(nsenter --mount=/proc/1/ns/mnt --) + command -v nsenter >/dev/null 2>&1 || im_wirt=() + "${im_wirt[@]}" mkdir -p "$target" + if "${im_wirt[@]}" mount -t cifs "$share" "$target" \ -o "credentials=$creds,uid=$(id -u tesm 2>/dev/null || echo 0),gid=$(id -g tesm 2>/dev/null || echo 0),file_mode=0640,dir_mode=0750,vers=3.1.1,seal" then shred -u "$creds" 2>/dev/null || rm -f "$creds" @@ -271,8 +282,13 @@ case "$verb" in umount) check_mount_target "${1:?Ziel fehlt}" - umount -l "$1" || true - rmdir "$1" 2>/dev/null || true + # Gegenstueck zu mount-cifs: der Mount liegt im Namensraum des Wirts, also + # muss er auch dort geloest werden. Ein umount im Dienst-Namensraum wuerde + # ihn nur dort ausblenden und die Freigabe bliebe eingebunden. + im_wirt=(nsenter --mount=/proc/1/ns/mnt --) + command -v nsenter >/dev/null 2>&1 || im_wirt=() + "${im_wirt[@]}" umount -l "$1" || true + "${im_wirt[@]}" rmdir "$1" 2>/dev/null || true ;; apt-install)