#!/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