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