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.

484 lines
11 KiB

#!/usr/bin/env bash
#set -x
MULTIPLE=1
RUN_SINGULARITY=0
export VDN_PATH=$(readlink -f $(dirname $0)/..); . $VDN_PATH/bin/functions.sh
FIRST_REQUEST=1
ACCEPT_CHROOT=0
USE_SUDO=0
NO_HOST_KVM_TEST=0
FORCE_CHROOT=0 # for test
TEST_ONLY=0 # test host and quit.
NETWORK=""
set +u
[ -z "$RUN_IN_CHROOT" ] && RUN_IN_CHROOT=0 || :
set -u
export RUN_IN_CHROOT
set -a
NO_MOZ=0
set +a
quit() {
echo "quit..."
#sendToGui "gui"
#sleep 1
pid=$(ps auwx | grep 'ruby' | grep 'vdn-gui' | tr -s " " | cut -d ' ' -f 2)
if [ -n "$pid" ]; then
echo "kill : $pid" >&2
kill $pid
sleep 1
fi
echo
}
synopsis() {
cat << EOF
Usage : $(basename $0) [-h] [-v]
EOF
}
help() {
cat << EOF
$(basename $0) démarre l'interface graphique de Vdn.
$(synopsis)
-h : affiche cette aide.
-v : affiche la version.
EOF
}
usage() {
synopsis
exit 1
}
args() {
local opt
while getopts "cdfhsmntv" opt; do
case $opt in
h) help; exit 0;;
v) cat $VDN_PATH/release; exit 0;;
c) ACCEPT_CHROOT=1;;
d) export VDN_DEBUG=1; vdn-set-var VDN_DEBUG 1; set -x;;
m) MULTIPLE=1;;
n) NO_HOST_KVM_TEST=1;;
s) USE_SUDO=1;;
f) FORCE_CHROOT=1;;
t) TEST_ONLY=1;;
?) usage;;
esac
done
shift $(($OPTIND - 1))
[ $# -eq 1 ] && NETWORK="$1"
}
request() {
if [ $FIRST_REQUEST = 1 ]; then
FIRST_REQUEST=0
request "Une ou plusieurs questions vont vous être posées. Sauf bonne raison, acceptez\nles choix par défaut en appuyant sur \"Entrée\"."
if [ $? -ne 0 ]; then
echo "Bye !"
exit 0
fi
fi
echo
echo -e "$@"
echo
echo -n "Confirmez (O/n) : "
read
if [ -z "$REPLY" -o "$REPLY" = "o" -o "$REPLY" = "O" ]; then
return 0
fi
return 1
}
testHost() {
if [ "$(uname -m)" != "x86_64" ]; then
echo "Désolé, cette version de VDN ne fonctionne que sur architecture x86_64 !" >&2
exit 1
fi
#if [ "$DISPLAY" = "" ]; then
# echo "Désolé, cette version de VDN nécessite un serveur graphique compatible X11 !" >&2
# exit 1
#fi
if [ $NO_HOST_KVM_TEST = 0 ]; then
grep -Eq '(vmx|svm)' /proc/cpuinfo
virtproc=$?
[ -w /dev/kvm ]
kvmwrite=$?
lsmod | grep -q 'kvm_'
kvmproc=$?
lsmod | grep -q 'kvm[^_]'
kvm=0
if [ $virtproc -ne 0 ]; then
echo "Votre processeur ne dispose pas d'instructions de virtualisation :-( !"
#else
# echo "Votre processeur dispose d'instructions de virtualisation ;-)"
fi
if [ $virtproc -eq 0 -a $kvmwrite -ne 0 ]; then
echo
echo "Votre processeur dispose d'instructions de virtualisation."
echo "Cependant vous ne pouvez pas les utiliser :-( !"
echo
if [ -e /dev/kvm ]; then
msg=" Vous n'avez pas les droits de lecture/écriture sur /dev/kvm !\n L'administrateur (root) doit, au choix, effectuer les actions suivantes :\n 1. chmod 666 /dev/kvm.\n 2. Vous ajouter au groupe $(stat -c %G /dev/kvm) (commande \"addgroup $USER $(stat -c %G /dev/kvm)\" par exemple).\n\n Si la deuxième solution est choisie, vous devrez vous déconnecter de votre\n session graphique et vous reconnecter ou, plus simplement, ouvrir un nouveau\n shell de connexion via par exemple la commande \"su - $USER\"."
elif lsmod | grep -q kvm; then
msg=" Les instructions de virtualisation de votre processeur ne sont pas activées dans votre BIOS/UEFI.\n
Redémarrez et configurez le BIOS/UEFI pour bénéficier de la virtualisation."
else
proc="intel"
if cat /proc/cpuinfo | grep -i -q amd; then
proc="amd"
fi
msg=" Le module noyau \"kvm-$proc\" n'est pas chargé !\n L'administrateur du système doit exécuter : modprobe kvm-$proc ."
fi
echo "Il semblerait que la raison soit :"
echo -e "$msg"
echo
request "Continuer en mode \"sans instructions de virtualisation\" ?"
[ $? -ne 0 ] && exit 1
fi
fi
}
runInChrootOld() {
#[ $RUN_IN_CHROOT = 1 ] && good=1 || :
if [ $ACCEPT_CHROOT = 0 ]; then
if [ $good = 0 -o \( $FORCE_CHROOT = 1 -a $RUN_IN_CHROOT = 0 \) ]; then
request "Le sytème hôte n'est pas une Debian 10 (buster).\nBasculer dans un environnement chroot ? (accès root nécessaire)"
[ $? -ne 0 ] && exit 0
fi
fi
if [ $good = 0 -o \( $FORCE_CHROOT = 1 -a $RUN_IN_CHROOT = 0 \) ]; then
RUN_IN_CHROOT=1
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
DISK_SIZE=0
if [ -e $DISK ]; then
DISK_SIZE=$(ls -l $DISK | tr -s ' ' | cut -d ' ' -f 5)
fi
if [ $DISK_SIZE -lt $REMOTE_DISK_SIZE ]; then
request "Télécharger du disque virtuel de VDN (6 Go) ?"
[ $? -ne 0 ] && exit 0
local notFound=0
local bin="bzip2 wget"
for i in $bin; do
if ! whereis $i | grep -q bin; then
echo "Impossible de trouver l'exécutable : $i !"
notFound=1
fi
done
if [ $notFound = 1 ]; then
error "Programme(s) manquant(s) !\nL'administrateur doit installer ces programmes !"
fi
vdn-download-disks -t DebianBuster-amd64.disk.gz
fi
echo
echo "Running in chroot."
if [ $USE_SUDO = 1 ]; then
vdn-mount-chroot -s
else
vdn-mount-chroot
fi
exit $?
fi
}
runInChrootIfNecessary() {
local good=0
# chroot ?
if [ -e /etc/debian_version ]; then
if grep -q '^10\.' /etc/debian_version ; then
good=1
fi
fi
[ $RUN_IN_CHROOT = 1 ] && good=1 || :
#runInChrootOld
# Not in chroot
}
runWithSingularityIfNecessary() {
local good=0
# chroot ?
if [ -e /etc/debian_version ]; then
if grep -q '^10\.' /etc/debian_version ; then
good=1
fi
fi
if [ $good = 0 ]; then
RUN_SINGULARITY=1
fi
}
updateVdnrc() {
if [ -e ~/.vdnrc ]; then
request "Lors d'un changement de version de VDN, il est conseillé de mettre à jour\nle fichier ~/.vdnrc (la version courante sera enregistrée sous ~/.vdnrc.old).\nVoulez-vous mettre à jour ~/.vdnrc ?"
if [ $? -eq 0 ]; then
mv ~/.vdnrc ~/.vdnrc.old
fi
fi
}
pathWarning() {
echo
echo "*******************************************************************************"
echo "Le chemin de l'exécutable de VDN sera connu uniquement des NOUVEAUX shells !"
echo "*******************************************************************************"
}
### main
export VDN_DEBUG=0; vdn-set-var VDN_DEBUG 0
args "$@"
if [ -n "$NETWORK" -a "$NETWORK" = "stop" ]; then
quit
exit 0
fi
if [ -n "$NETWORK" ]; then
if [ ! -d $NETWORK ]; then
if [ -d $NETWORK_DIR/../$NETWORK ]; then
NETWORK=$(readlink -f $NETWORK_DIR/../$NETWORK)
fi
fi
if [ ! -d $NETWORK ]; then
error "Can' find network $NETWORK !"
fi
# set and reload
vdn-set-var NETWORK_DIR "$NETWORK"
export NETWORK_DIR="$NETWORK"
. $VDN_PATH/bin/functions.sh
fi
#for i in 1 2 3 4 5; do
# if ! ps auwx | grep -v grep | grep -q 'ruby.*vdn-gui' ; then
# break
# fi
# sleep 0.1
#done
if [ $MULTIPLE = 0 ]; then
if ps auwx | grep -v grep | grep -q 'ruby.*vdn-gui' ; then
error "Une instance de l'interface graphique de VDN est déjà active"
fi
else
#echo "Multiple..."
if ps auwx | grep -v grep | grep -q 'ruby.*vdn-gui' ; then
export NETWORK_DIR=""
vdn-set-var NETWORK_DIR ""
fi
fi
#clear
#if ! /sbin/route -n | grep -q '0.0.0.0' ; then
#/sbin/ip route
if ! /sbin/ip route | grep -q default; then
cat << EOF >&2
Pas de route par défaut !
Si le système hôte ne dispose pas d'interface réseau, vous pouvez
autoriser la diffusion sur l'interface lo (loopback) via les commandes
(il faut être root) :
Avec ifconfig :
ifconfig lo multicast
route add default gw 127.0.0.1
avec ip :
ip link set dev lo multicast on
ip route add default via 127.0.0.1
EOF
error "Pas de route par défaut ! Voir ci-dessus ou consultez la FAQ !"
fi
testHost # chroot if necessary
runInChrootIfNecessary
# Not in chroot
# download extras
#if [ -e $VDN_PATH/distribs/hosts/$HOST_RELEASE/download-extras.sh ]; then
# . $VDN_PATH/distribs/hosts/$HOST_RELEASE/download-extras.sh
# if ! testDownloadExtras; then
# downloadExtras
# fi
#fi
testInstallDebian
testVersionOld() {
while :; do
version="$VDN_PATH"
current=$(cat ~/.bashrc |sed -nre 's/^[^#]*PATH.*:([^:]*vdn[^:]*)\/bin.*$/\1/p')
[ "$current" = "$version" ] && break;
# La version courante diffère de la version lancée
if [ -n "$current" ] && [ "$version" != "$current" ]; then
request "Votre fichier ~/.bashrc définit la version $current comme étant la version à utiliser. Cependant vous exécutez $version.\nVotre fichier ~/.bashrc doit être adapté !\nVoulez-vous que ce programme l'adapte pour vous ?"
if [ $? -ne 0 ]; then
echo "Adaptez votre fichier ~/.bashrc puis relancez $0.";
exit 1;
else
cp ~/.bashrc ~/.bashrc.vdn.old
echo "Ancien fichier ~/.bashrc copié sous ~/.bashrc.vdn.old"
cat ~/.bashrc |sed -re 's,[^:]*'$current','$VDN_PATH',g'> \
~/.bashrc-vdn
mv ~/.bashrc-vdn ~/.bashrc
echo
pathWarning
updateVdnrc
fi
elif [ -z "$current" ]; then
line="PATH=\"\$PATH:$VDN_PATH/bin\""
request "Votre fichier ~/.bashrc ne définit pas le chemin des exécutables de $version.\nLa ligne suivante doit être ajoutée :\n$line\nVoulez vous que ce programme adapte votre fichier ~/.bashrc pour vous ?"
if [ $? -eq 0 ]; then
echo "Adaptation de ~/.bashrc"
echo "PATH=\"\$PATH:$VDN_PATH/bin\"" >> ~/.bashrc
pathWarning
updateVdnrc
else
break
fi
# echo "Ajoutez une ligne PATH=\"\$PATH:$VDN_PATH/bin\" à votre fichier ~/.bashrc puis relancez $0."
# exit 1;
fi
done
if [ ! -e ~/.ssh/id_dsa.pub -a ! -e ~/.ssh/id_rsa.pub ]; then
request "Vous ne disposez pas d'un couple de clé SSH RSA nécessaire au fonctionnement de Vdn.\nVoulez vous que ce programme vous génère un couple de clé RSA ?"
if [ $? -eq 0 ]; then
echo
echo "Create ssh keys..."
ssh-keygen -q -N '' -f ~/.ssh/id_rsa -t rsa
else
echo "Exécutez la commde ci-dessous pour générer un couple de
clé SSH RSA puis relancez $0 :"
echo "ssh-keygen -q -N '' -f ~/.ssh/id_rsa -t rsa"
exit 1
fi
set +x
fi
}
export VDN_RELEASE="$(cat $VDN_PATH/release)"
export PATH="$VDN_PATH/bin:$PATH"
[ $TEST_ONLY = 1 ] && exit 0 || :
setEnv
rm -f $HOME/.tmuxinator/vdn-tmuxinator*
trap 'quit' SIGINT
if [ ! -e /usr/bin/tmuxinator ]; then
$VDN_PATH/bin/vdn-set-var RUN_PARALLEL 0
echo "/usr/bin/tmuxinator not found ! RUN_PARALLEL disable..." >&2
sleep 1
fi
rm -f $TMPDIR/vdn-$USER-gui-log
mkfifo $TMPDIR/vdn-$USER-gui-log
chmod 600 $TMPDIR/vdn-$USER-gui-log
export GUI=1
export VDN_GUI=1
export LANG=fr_FR.UTF-8
$VDN_PATH/bin/vdn-gui.rb 2>&1 # | tee $TMPDIR/vdn-$USER-gui-log
#$VDN_PATH/bin/vdn-gui.rb #2>&1 > $TMPDIR/vdn-$USER-gui-log &
#echo