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
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
|