diff --git a/lib/completion.d/nutools b/lib/completion.d/nutools index 79494ac..527d07d 100644 --- a/lib/completion.d/nutools +++ b/lib/completion.d/nutools @@ -13,3 +13,7 @@ if __bash_completion_module_enabled ssh; then shopt -u hostcomplete complete -F _ssh ussh cssh fi + +if __bash_completion_module_enabled umount; then + complete -F _umount -o dirnames umountr +fi diff --git a/umountr b/umountr index 00c5a1a..2c46d8b 100755 --- a/umountr +++ b/umountr @@ -9,19 +9,36 @@ function display_help() { USAGE $scriptname mountpoint -Démonter tous les systèmes de fichiers qui sont montés en-dessous de mountpoint -puis démonter mountpoint. Démonter aussi tous les systèmes de fichiers -bind-montés à partir d'un sous-répertoire de mountpoint. - OPTION -c, --continuous - Continuer même en cas d'erreur" + Continuer même en cas d'erreur + -r, --recursive + -1, --no-recursive + Spécifier le type de démontage: + Avec -1, un démontage simple est effectué, comme avec umount. Ce type de + démontage est automatiquement sélectionné pour les systèmes de fichier + montés sous le répertoire /media + Avec -r, le démontage est récursif: tous les systèmes de fichiers qui + sont montés en-dessous de mountpoint sont démontés puis mountpoint est + démonté. Tous les systèmes de fichiers bind-montés à partir d'un sous- + répertoire de mountpoint sont démontés aussi. + -o, --poweroff + -k, --no-poweroff + Après avoir démonté le système de fichier mountpoint, éteindre le + périphérique qui y correspond. --poweroff est automatiquement activé + pour les systèmes de fichier montés sous le répertoire /media" } continuous= +recursive=auto +poweroff=auto args=( --help '$exit_with display_help' -c,--continuous continuous=1 + -r,--recursive recursive=1 + -1,--no-recursive recursive= + -o,--poweroff poweroff=1 + -k,--no-poweroff poweroff= ) parse_args "$@"; set -- "${args[@]}" @@ -30,26 +47,89 @@ mountp="$1" [ -d "$mountp" ] || die "$mountp: répertoire introuvable" setx mountp=abspath "$mountp" -run_as_root ${continuous:+-c} "$@" +args=( + $(get_verbosity_option) $(get_interaction_option) + ${continuous:+-c} +) +if [ "$recursive" == 1 ]; then array_add args --recursive +elif [ -z "$recursive" ]; then array_add args --no-recursive +fi +if [ "$poweroff" == 1 ]; then array_add args --poweroff +elif [ -z "$poweroff" ]; then array_add args --no-poweroff +fi +run_as_root "${args[@]}" "$mountp" + +if withinpath /media "$mountp"; then + [ "$recursive" == auto ] && recursive= + [ "$poweroff" == auto ] && poweroff=1 +else + [ "$recursive" == auto ] && recursive=1 + [ "$poweroff" == auto ] && poweroff= +fi + +etitle "Calcul des informations" setx -a mountps=findmnt -nlo TARGET -array_contains mountps "$mountp" || die "Vous devez spécifier un répertoire de montage valide" +array_contains mountps "$mountp" || die "$mountp: répertoire de montage invalide" function show_all() { findmnt -T "$mountp" -Rnlo TARGET findmnt -nlo TARGET | awkrun mountp="$mountp" '{ if (substr($0, 1, length(mountp) + 1) == (mountp "/")) print }' } +if [ -n "$recursive" ]; then + estepi "Type de démontage: récursif" + + setx -a mounts=evalp show_all // sort -u // \ + awk '{print length($0) "," $0}' // \ + sort -nr // \ + awk '{sub(/[0-9]+,/, ""); print}' + + estepi "${#mounts[*]} systèmes de fichier à démonter" + if show_debug; then + edebug "Les systèmes de fichiers suivants seront démontés:" + for mount in "${mounts[@]}"; do + estep "$mount" + done + fi +else + estepi "Type de démontage: simple" +fi + +setx device=findmnt -T "$mountp" -vnlo SOURCE +[ -n "$device" ] || die "Impossible de trouver le périphérique correspondant à $mountp" +if [ -n "$poweroff" ]; then + estepi "Le périphérique $device sera éteint après démontage" +else + edebug "Le périphérique correspondant est $device" +fi + +eend + +ask_yesno -i "Voulez-vous continuer?" O || die + function die_maybe() { [ -n "$continuous" ] && return die "$@" } +etitled "Démontage des systèmes de fichier" +if [ -n "$recursive" ]; then + for mount in "${mounts[@]}"; do + estep "$mount" + umount "$mount" || die_maybe + done +else + estep "$mountp" + umount "$mountp" || die_maybe +fi +eend -setx -a mounts=evalp show_all // sort -u // \ - awk '{print length($0) "," $0}' // \ - sort -nr // \ - awk '{sub(/[0-9]+,/, ""); print}' +if [ -n "$poweroff" ]; then + etitle "Arrêt des périphériques" + estep "$device" + udisksctl power-off -b "$device" || die + eend -for mount in "${mounts[@]}"; do - estep "$mount" - umount "$mount" || die_maybe -done + enote "Vous pouvez maintenant débrancher le périphérique!" +fi + +exit 0