support des options --[no-]recursive et --[no-]poweroff

This commit is contained in:
Jephté Clain 2017-01-10 16:32:00 +04:00
parent a7ee78fb7f
commit f34f32a7a3
2 changed files with 95 additions and 22 deletions

View File

@ -1,12 +1,5 @@
# TODO # TODO
* ajouter une option pour ne pas démonter les systèmes des fichier
récursivement. dans ce cas, umountr == umount
* ajouter une option --off qui serait activée par défaut pour les montages dans
/media, et qui éteindrait le périphérique associée au montage après démontage
du système de fichier.
* autocomplétion pour umountr comme pour umount * autocomplétion pour umountr comme pour umount
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

110
umountr
View File

@ -9,19 +9,36 @@ function display_help() {
USAGE USAGE
$scriptname mountpoint $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 OPTION
-c, --continuous -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= continuous=
recursive=auto
poweroff=auto
args=( args=(
--help '$exit_with display_help' --help '$exit_with display_help'
-c,--continuous continuous=1 -c,--continuous continuous=1
-r,--recursive recursive=1
-1,--no-recursive recursive=
-o,--poweroff poweroff=1
-k,--no-poweroff poweroff=
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
@ -30,26 +47,89 @@ mountp="$1"
[ -d "$mountp" ] || die "$mountp: répertoire introuvable" [ -d "$mountp" ] || die "$mountp: répertoire introuvable"
setx mountp=abspath "$mountp" 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 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() { function show_all() {
findmnt -T "$mountp" -Rnlo TARGET findmnt -T "$mountp" -Rnlo TARGET
findmnt -nlo TARGET | awkrun mountp="$mountp" '{ if (substr($0, 1, length(mountp) + 1) == (mountp "/")) print }' 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() { function die_maybe() {
[ -n "$continuous" ] && return [ -n "$continuous" ] && return
die "$@" 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 // \ if [ -n "$poweroff" ]; then
awk '{print length($0) "," $0}' // \ etitle "Arrêt des périphériques"
sort -nr // \ estep "$device"
awk '{sub(/[0-9]+,/, ""); print}' udisksctl power-off -b "$device" || die
eend
for mount in "${mounts[@]}"; do enote "Vous pouvez maintenant débrancher le périphérique!"
estep "$mount" fi
umount "$mount" || die_maybe
done exit 0