You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
3.8 KiB

#!/usr/bin/env bash
set -eu
#set -x
FOR_ROOT=0
USE_SUDO=0
UMOUNT=0
synopsis() {
cat << EOF
Usage : `basename $0` [-h] [-r] [-i user] [-s] [-u]
EOF
}
help() {
cat << EOF
`basename $0` exécute VDN dans un environnement chroot en utilisant le disque :
$VDN_DISK_ENV
* Le mot de passe root vous sera demandé !
AVERTISSEMENTS :
1. Cette commande n'a pas vocation à être exécutée manuellement.
2. Quelques opérations sous root sont effectuées (montages, chroot,
démontages). Pour que le démontage se fasse correctement, fermez toutes
les fénêtres et processus de l'environnement chroot (VDN).
3. L'isolation entre le système initial et le système chrooté n'est pas
totale. Les répertoires suivants du système initial sont partagés :
/home, /etc, /dev, /dev/pts, /sys, /proc, /tmp.
Autrement dit, ne faites pas n'importe quoi avec ces répertoires, ce
sont ceux de votre système.
`synopsis`
-h : affiche cette aide.
-r : (réservé) exécution spécifique à l'utilisateur root. Ne pas utiliser
directement sans savoir ce que vous faites !
-s : utilise "sudo" plutôt que "su -" pour basculer sous le compte root.
-i user : (réservé) indique l'utilisateur pour l'option -r. Ne pas utiliser
directement sans savoir ce que vous faites !
-u : démontages seulement.
EOF
}
usage() {
synopsis
exit 1
}
args() {
local opt
while getopts "hrsi:u" opt; do
case $opt in
h) help; exit 0;;
r) FOR_ROOT=1;;
s) USE_SUDO=1;;
i) USER="$OPTARG";;
u) UMOUNT=1;;
?) usage;;
esac
done
shift $(($OPTIND - 1))
[ $# -ne 0 ] && usage || :
}
vdnMountChrootForRoot() {
disp=$(cat $TMPDIR/vdn-display-$USER)
d=$TMPDIR/vdn-chroot-$USER;
if [ $UMOUNT = 0 ]; then
mount | grep -q $d || mount -o loop,offset=$((2048*512)) $DISK $d
for i in /dev /dev/pts /sys /proc /tmp /etc; do
mount | grep -q $d$i || { mount --bind $i $d$i; }
done
mount --rbind /home $d/home
chroot $d su - --session-command \
"export DISPLAY=:"$disp"; export RUN_IN_CHROOT=1; \
export VDN_DISK_ENV=$VDN_DISK_ENV; \
export LANGUAGE=C.UTF-8; \
export LANG=C.UTF-8; \
export LC_ALL=C.UTF-8; \
$VDN_PATH/bin/vdn -n" $USER || :
fi
mount | grep -q $d/home && { umount -l $d/home; } || :
for i in /proc /sys /dev/pts /dev /etc /tmp; do
mount | grep -q $d$i && { umount $d$i || { umount -l $d$i; } ; } || :
done
mount | grep -q $d && { umount $d || umount -l $d; } || :
mount | grep $d
}
vdnMountChroot() {
d=$TMPDIR/vdn-chroot-$USER; [ ! -d $d ] && mkdir $d || :
if [ $UMOUNT = 0 ]; then
# get display
(rm -f $TMPDIR/vdn-display-$USER; umask 077 ; touch $TMPDIR/vdn-display-$USER)
DISP=$(echo $DISPLAY | cut -d ':' -f 2 | cut -d '.' -f 1)
echo $DISPLAY | cut -d ':' -f 2 >> $TMPDIR/vdn-display-$USER
fi
if [ $USE_SUDO = 0 ]; then
echo "Le mot de passe demandé est celui de l'administrateur (root)"
if [ $UMOUNT = 0 ]; then
su - -c "$VDN_PATH/bin/vdn-mount-chroot -r -i $USER"
else
su - -c "$VDN_PATH/bin/vdn-mount-chroot -r -i $USER -u"
fi
else
if [ $UMOUNT = 0 ]; then
sudo $VDN_PATH/bin/vdn-mount-chroot -r -i $USER
else
sudo $VDN_PATH/bin/vdn-mount-chroot -r -i $USER -u
fi
fi
}
# Programme principal
VDN_PATH=$(readlink -f $(dirname $0)/..); . $VDN_PATH/bin/functions.sh
export VDN_DISK_ENV="DebianBuster-amd64-env.disk"
export VDN_DISK_NAME="DebianBuster-amd64.disk"
[ ! -e $VDN_PATH/files/$VDN_DISK_ENV ] && VDN_DISK_ENV=$VDN_DISK_NAME || :
DISK=$VDN_PATH/files/$VDN_DISK_ENV
[ ! -e $DISK ] && error "$DISK not found !" || :
if [ ! -w $DISK ]; then
error "$DISK doit être accessible à l'utilisateur en écriture !"
fi
args "$@"
if [ $FOR_ROOT = 1 ];then
vdnMountChrootForRoot
else
vdnMountChroot
fi