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.
636 lines
10 KiB
636 lines
10 KiB
#!/usr/bin/env bash
|
|
|
|
set +u
|
|
[ -z "$USER" ] && USER=$(id -un)
|
|
set -u
|
|
|
|
GUEST_OWNER=$USER
|
|
|
|
|
|
# Ces fonctions peuvent êtres utilisées par les scripts de configuration et
|
|
# de test d'un réseau.
|
|
|
|
error() {
|
|
echo -e "\033[0;31;1mError in $SCRIPT !\033[0m" >&2
|
|
echo
|
|
if [ $READ -eq 1 ]; then
|
|
echo
|
|
echo "touche \"Entrée\" pour terminer."
|
|
read
|
|
fi
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
diagOld() {
|
|
printf "%-70s" "$@"
|
|
}
|
|
|
|
green() {
|
|
local n=""
|
|
[ "$1" = "-n" ] && { n="-n"; shift; }
|
|
echo $n -e "\033[0;32;1m$@\033[0m"
|
|
}
|
|
|
|
red() {
|
|
local n=""
|
|
[ "$1" = "-n" ] && { n="-n"; shift; }
|
|
echo $n -e "\033[0;31;1m$@\033[0m"
|
|
}
|
|
|
|
diagResult() {
|
|
[ "$1" = 0 ] && green " ok" || red " ko"
|
|
echo
|
|
}
|
|
|
|
diagResultWithMessage() {
|
|
echo
|
|
echo -en "$1 ... "
|
|
[ "$2" = 0 ] && green " ok" || red " ko"
|
|
echo
|
|
}
|
|
|
|
|
|
diag() {
|
|
local r
|
|
local term="-t"
|
|
|
|
#if [ "$1" = "-t" ]; then
|
|
# term="-t"
|
|
# shift
|
|
#fi
|
|
|
|
if [ "$1" = "-n" ]; then
|
|
term=""
|
|
shift
|
|
fi
|
|
echo -e "$2"
|
|
echo -ne " Please wait...\r"
|
|
|
|
set +e
|
|
vdn-ssh $term $1 "$3 &> /dev/null"
|
|
r=$?
|
|
set -e
|
|
echo -ne " \r"
|
|
#diagResult $r
|
|
return $r
|
|
}
|
|
|
|
|
|
vdnTest() {
|
|
local error=0
|
|
local message="$1"
|
|
local cmd="$2"
|
|
|
|
b=$(echo "$1" | base64 | tr '/' '-')
|
|
|
|
echo -n "$1 ... "
|
|
eval $cmd &> /dev/null
|
|
error=$?
|
|
#echo -n ""
|
|
|
|
[ $error = 0 ] && green ok || red ko
|
|
|
|
VDN_TESTS_DIR=/tmp/vdn-$USER/tests
|
|
[ ! -d $VDN_TESTS_DIR ] && mkdir -p $VDN_TESTS_DIR
|
|
echo "$1" > $VDN_TESTS_DIR/$b
|
|
echo $error >> $VDN_TESTS_DIR/$b
|
|
|
|
#errors=$(($errors+$error))
|
|
|
|
return $error
|
|
}
|
|
|
|
|
|
warning() {
|
|
echo -e "\033[1;33;1mWarning in $SCRIPT !\033[0m" >&2
|
|
}
|
|
|
|
request() {
|
|
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
|
|
}
|
|
|
|
|
|
setDebugMode() {
|
|
[ $VDN_DEBUG = 1 ] && set -x || :
|
|
}
|
|
|
|
|
|
setErrorHandler() {
|
|
setDebugMode
|
|
set +u
|
|
[ -z "$SCRIPT" ] && SCRIPT=$(basename "$1") || :
|
|
set -u
|
|
trap "error" 0
|
|
}
|
|
|
|
echoStart() {
|
|
echo
|
|
echo "Start : $SCRIPT"
|
|
#START_DATE=$(date +%s)
|
|
}
|
|
|
|
echoDone() {
|
|
#echo -e "\033[0;32;1m$SCRIPT : done.\033[0m"
|
|
echo
|
|
echo -ne "\033[0;34;1mdone\033[0m (time : "
|
|
gawk 'BEGIN {print strftime("%M:%S)",'$(date +%s)-$START_DATE')}'
|
|
|
|
}
|
|
|
|
echoDoneWithTestErrors() {
|
|
#echo -e "\033[0;32;1m$SCRIPT : done.\033[0m"
|
|
errors=${errors:-0}
|
|
echo
|
|
[ "$errors" = 0 ] && green -n ok || red -n ko
|
|
echo -en " (time : "
|
|
gawk 'BEGIN {print strftime("%M:%S)",'$(date +%s)-$START_DATE')}'
|
|
}
|
|
|
|
|
|
unsetErrorHandler() {
|
|
trap - 0
|
|
}
|
|
|
|
startGuests() {
|
|
local i
|
|
local n=0
|
|
for i in $@; do
|
|
echo -n "Alive $i ? : "
|
|
if ! $VDN_PATH/bin/vdn-alive $i ; then
|
|
echo "No : Start $i..."
|
|
set +u
|
|
#set -x
|
|
if [ "$WITH_GUI" = 1 -o "$VDN_GUI" = 1 ]; then
|
|
vdn-start -g $i
|
|
elif [ $IN_BG = 1 ]; then
|
|
vdn-start -b $i
|
|
else
|
|
vdn-start $i
|
|
fi
|
|
#set +x
|
|
n=$((n+1))
|
|
set -u
|
|
else
|
|
echo "Yes"
|
|
fi
|
|
done
|
|
return $n
|
|
}
|
|
|
|
waitSsh() {
|
|
for i in $@; do
|
|
echo "Waiting ssh on $i..."
|
|
local n=0
|
|
#set -x
|
|
until $VDN_PATH/bin/vdn-ssh root@$i : &> /dev/null; do
|
|
if [ $n = 1 ]; then
|
|
echo "Waiting ssh on $i..." >&2
|
|
n=$(n+1)
|
|
fi
|
|
sleep 2
|
|
done
|
|
done
|
|
}
|
|
|
|
requireGuests() {
|
|
set +e
|
|
startGuests $@
|
|
|
|
#echo "All guests started !"
|
|
[ $? -ne 0 ] && sleep 1
|
|
set -e
|
|
return 0
|
|
}
|
|
|
|
startAndWaitSsh() {
|
|
#echo "startAndWaitSsh :$DISABLE_SCAN"
|
|
DISABLE_SCAN=${DISABLE_SCAN:-0}
|
|
if [ "$DISABLE_SCAN" != 1 ]; then
|
|
requireGuests $@
|
|
sleep 1
|
|
waitSsh $@
|
|
fi
|
|
}
|
|
|
|
requireSshGuests() { # DEPRECATED
|
|
startAndWaitSsh $@
|
|
}
|
|
|
|
setHostname() {
|
|
echo "setHostname $1"
|
|
vdn-ssh root@$1 "
|
|
echo $1 > /etc/hostname
|
|
hostname -F /etc/hostname
|
|
"
|
|
}
|
|
|
|
|
|
setFile() {
|
|
#echo "setFile $1 $2 (functions-script.sh)"
|
|
#set -x
|
|
vdn-ssh root@$1 "cat > $2"
|
|
#set +x
|
|
}
|
|
|
|
setHosts() {
|
|
echo "setHosts $1"
|
|
setFile $1 /etc/hosts
|
|
}
|
|
|
|
setInterfaces() {
|
|
echo "setInterfaces $1"
|
|
setFile $1 /etc/network/interfaces
|
|
#vdn-ssh root@$1 "ip route | grep -q default && ip route del default || : ; service networking restart"
|
|
#cat /etc/network/interfaces
|
|
#ip addr
|
|
#ip route
|
|
vdn-ssh root@$1 "service networking restart"
|
|
#sleep 1
|
|
}
|
|
|
|
setForwarding() {
|
|
echo "setForwarding $1"
|
|
# cat /proc/sys/net/ipv4/ip_forward
|
|
vdn-ssh root@$1 "
|
|
sed -i -re 's/#(net.ipv4.ip_forward=1)/\1/g' /etc/sysctl.conf
|
|
sysctl -p | grep net.ipv4.ip_forward
|
|
"
|
|
}
|
|
|
|
setIpv6WorkAround() {
|
|
vdn-ssh root@$1 "
|
|
echo setIpv6WorkAround $1
|
|
if ! grep -q \"^net.ipv6.conf.all.accept_dad = 0\" /etc/sysctl.conf; then
|
|
cat << EOF >> /etc/sysctl.conf
|
|
#broken for uml/kvm/qemu, mcast hears itself
|
|
net.ipv6.conf.all.accept_dad = 0
|
|
net.ipv6.conf.all.dad_transmits = 0
|
|
net.ipv6.conf.default.accept_dad = 0
|
|
net.ipv6.conf.default.dad_transmits = 0
|
|
# and since the interfacs are there before sysctl is run, and the
|
|
# all target is an utter linux failure, we have to set it per interface
|
|
net.ipv6.conf.lo.accept_dad = 0
|
|
net.ipv6.conf.eth0.accept_dad = 0
|
|
net.ipv6.conf.eth1.accept_dad = 0
|
|
net.ipv6.conf.eth2.accept_dad = 0
|
|
net.ipv6.conf.lo.dad_transmits = 0
|
|
net.ipv6.conf.eth0.dad_transmits = 0
|
|
net.ipv6.conf.eth1.dad_transmits = 0
|
|
net.ipv6.conf.eth2.dad_transmits = 0
|
|
EOF
|
|
sysctl -p &> /dev/null
|
|
service networking restart
|
|
fi
|
|
"
|
|
}
|
|
|
|
pauseRaw() {
|
|
echo
|
|
echo "*** touche \"Entrée\" pour terminer."
|
|
read
|
|
}
|
|
|
|
|
|
pause() {
|
|
set +u
|
|
VDN_GUI=${VDN_GUI:-0}
|
|
set +u
|
|
#echo "PAUSE:$PAUSE RUN_PARALLEL:$RUN_PARALLEL IN_PARALLEL=$IN_PARALLEL VDN_GUI=$VDN_GUI VDN_SCRIPTS_LEVEL=$VDN_SCRIPTS_LEVEL"
|
|
#echo "read..."
|
|
#read
|
|
#set -x
|
|
#echo "$PAUSE = 1 -a $IN_PARALLEL = 0 -a \( $VDN_GUI = 1 -a $VDN_SCRIPTS_LEVEL = 1"
|
|
if [ $PAUSE = 1 -a $IN_PARALLEL = 0 -a \( $VDN_GUI = 1 -a $VDN_SCRIPTS_LEVEL = 1 \) ]; then
|
|
if [ "$NO_INTERACTIVE" != 1 ]; then
|
|
echo
|
|
echo "*** touche \"Entrée\" pour terminer."
|
|
read
|
|
fi
|
|
else
|
|
#echo VDN_SCRIPTS_LEVEL:$VDN_SCRIPTS_LEVEL
|
|
if [ $READ = 1 -a $VDN_SCRIPTS_LEVEL -gt 2 ]; then
|
|
#echo "reading"
|
|
#echo "VDN_SCRIPTS_LEVEL:$VDN_SCRIPTS_LEVEL"
|
|
#echo "sleep infinit disable"
|
|
sleep infinity
|
|
#while :; do
|
|
# read
|
|
#done
|
|
fi
|
|
fi
|
|
|
|
#set +x
|
|
}
|
|
|
|
#parallelDisablePause() {
|
|
#[ $RUN_PARALLEL = 1 ] && PAUSE=0 || :
|
|
#}
|
|
|
|
canRunParallel() {
|
|
local r
|
|
set +u
|
|
[ $RUN_PARALLEL = 1 -a "$DISABLE_PARALLEL" != 1 -a $(echo $@ | wc -w) -gt 1 ] && r=0 || r=1
|
|
#[ $RUN_PARALLEL = 1 -a "$DISABLE_PARALLEL" != 1 ] && r=0 || r=1
|
|
set -u
|
|
return $r
|
|
}
|
|
|
|
|
|
|
|
runParallel() {
|
|
local tmp name
|
|
|
|
#[ $RUN_PARALLEL = 1 ] && PAUSE=0 || :
|
|
|
|
export RUN_PARALLEL
|
|
#export IN_PARALLEL=1
|
|
|
|
#export IN_PARALLEL=1
|
|
#export PAUSE=0
|
|
|
|
[ ! -d $HOME/.tmuxinator ] && (umask 077 && mkdir $HOME/.tmuxinator )
|
|
|
|
tmp=$(mktemp -p $HOME/.tmuxinator vdn-tmuxinator-XXXXXX)
|
|
name=$(basename $tmp)
|
|
|
|
#echo "runParallel: PAUSE:$PAUSE"
|
|
|
|
#sleep 3
|
|
|
|
#if [ $VDN_DEBUG = 1 ]; then
|
|
#tmuxinator new $name
|
|
#else
|
|
#
|
|
#tmuxinator new $name &> /dev/null
|
|
#fi
|
|
|
|
|
|
#echo "NAME is $name"
|
|
#echo "WRITE to $tmp.yml"
|
|
|
|
cat << EOF > $tmp.sh
|
|
#!/bin/bash
|
|
|
|
quit() {
|
|
tmuxinator stop $name;
|
|
}
|
|
|
|
trap quit 0
|
|
|
|
tput reset
|
|
echo -e '\n\n\n QUIT : Return / CTRL C'
|
|
read
|
|
EOF
|
|
|
|
cat << EOF > $tmp.conf
|
|
set -g mouse on
|
|
set -g status-bg white
|
|
set -g status-fg blue
|
|
set -g status-left '#[fg=blue](#S) #(whoami)@#H#[default]'
|
|
set -g pane-active-border-fg blue
|
|
EOF
|
|
|
|
|
|
cat << EOF > $tmp.yml
|
|
|
|
name: $name
|
|
root: $PWD
|
|
tmux_options: -f $tmp.conf
|
|
|
|
windows:
|
|
- terminal:
|
|
layout: tiled
|
|
panes:
|
|
- clear; bash "$tmp.sh"
|
|
EOF
|
|
|
|
chmod 700 $tmp.yml
|
|
|
|
local i n payload
|
|
n=$(($#+1))
|
|
#n=$(($#))
|
|
payload=0
|
|
if [ $(($n % 3)) != 0 ]; then
|
|
payload=$(( (($n/3)+1)*3 - $n ))
|
|
fi
|
|
|
|
[ $n = 2 -o $n = 4 ] && payload=0 || :
|
|
[ $n = 3 ] && payload=1 || :
|
|
|
|
#echo "#:$# @:$@"
|
|
#echo "N: $n"
|
|
#echo "PAYLOAD: $payload"
|
|
#sleep 10
|
|
#set -x
|
|
for i in $@; do
|
|
echo " - cd; export NETWORK_DIR=$NETWORK_DIR; export VDN_GUI=1; export READ=$READ; export PAUSE=$PAUSE; export FORCE_SEQUENTIAL=$FORCE_SEQUENTIAL; clear; $VDN_PATH/bin/vdn-scripts $i" >> $tmp.yml
|
|
done
|
|
|
|
for i in $(seq 1 $payload); do
|
|
echo " - cd; clear; echo -e \"\n\"' Not used !'; sleep infinity" >> $tmp.yml
|
|
done
|
|
#set +x
|
|
#sleep 10
|
|
|
|
#echo "Press Return"
|
|
#read
|
|
|
|
if [ $VDN_DEBUG = 1 ]; then
|
|
tmuxinator start $name
|
|
else
|
|
tmuxinator start $name &> /dev/null
|
|
fi
|
|
|
|
# dump
|
|
|
|
local pane
|
|
|
|
#for pane in $(tmux list-pane | sed -re 's/^.*(%[0-9]+).*$/\1/'); do
|
|
# echo "----------------------------"
|
|
# tmux capture-pane -S -100 -p -t $pane
|
|
#done
|
|
|
|
rm $tmp $tmp.yml $tmp.sh $tmp.conf
|
|
|
|
#[ $VDN_DEBUG = 0 ] && clear
|
|
#echo "leave: parallel"
|
|
}
|
|
|
|
fn_exists() {
|
|
local r
|
|
#set -x
|
|
set | grep -q "$1 ()"
|
|
r=$?
|
|
#set +x
|
|
return $r
|
|
}
|
|
|
|
prepareRun() {
|
|
|
|
#echo "### prepareRun : "
|
|
|
|
#setErrorHandler
|
|
#set | grep test
|
|
#echo "SCRIPT:$SCRIPT."
|
|
#echo "ARGS:$ARGS."
|
|
|
|
|
|
if [ -n "$ARGS" ]; then
|
|
fn_exists $ARGS
|
|
else
|
|
fn_exists $SCRIPT
|
|
fi
|
|
local fn=$?
|
|
|
|
#echo "FN:$fn (0 is true)"
|
|
|
|
|
|
if [ $fn = 0 ]; then
|
|
if [ -n "$ARGS" ]; then
|
|
$ARGS
|
|
else
|
|
$SCRIPT $@
|
|
fi
|
|
exit
|
|
fi
|
|
|
|
#read
|
|
|
|
# Not a function
|
|
|
|
# is a script ?
|
|
if [ -r $SCRIPT ]; then
|
|
#echo "$SCRIPT is a script !"
|
|
#echo "ARGS:$ARGS"
|
|
if [ -n "$ARGS" ]; then
|
|
SCRIPT=$ARGS
|
|
$SCRIPT
|
|
exit
|
|
fi
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
echo "$SCRIPT not a script !"
|
|
|
|
#read
|
|
|
|
#if [ -n "$ARGS" ]; then
|
|
# SCRIPT=$1
|
|
# shift
|
|
# $SCRIPT $@
|
|
# exit
|
|
#fi
|
|
|
|
exit
|
|
}
|
|
|
|
vdnExec() {
|
|
local L=""
|
|
|
|
for i in $@; do
|
|
set | egrep -q "^$i \(\)"
|
|
|
|
fn=$?
|
|
#echo "$i => $fn"
|
|
|
|
[ $fn = 0 ] && i="$SCRIPT:$i"
|
|
L="$L $i"
|
|
done
|
|
|
|
vdn-scripts $L
|
|
}
|
|
|
|
vdnExecWithErrors() {
|
|
export SHOW_ERRORS=1
|
|
vdnExec $@
|
|
|
|
}
|
|
|
|
|
|
|
|
runSequential() {
|
|
local i
|
|
local r
|
|
local lerrors=0
|
|
|
|
#export IN_PARALLEL=0
|
|
|
|
#echo "runSeq: $@ PAUSE:$PAUSE"
|
|
|
|
errors=${errors:-0}
|
|
|
|
for i in $@; do
|
|
#echo
|
|
#echo -e "Run : $i [$(echo $i | tr ':' ' ')]"
|
|
#echo
|
|
SCRIPT=$i
|
|
#echo "SCRIPT1:$SCRIPT"
|
|
SCRIPT=$(echo $i | tr ':' ' ' | sed -re 's/^ *//' | cut -d ' ' -f 1)
|
|
ARGS=$(echo $i | tr ':' ' ' | sed -re 's/^ *//' | gawk ' { print $2 $3 $4 $5 $6 $7 }')
|
|
|
|
#. $VDN_PATH/bin/functions-scripts.sh
|
|
|
|
#echo "SCRIPT2:$SCRIPT"
|
|
|
|
. $SCRIPT
|
|
|
|
|
|
START_DATE=$(date +%s)
|
|
|
|
set -e
|
|
|
|
PAUSE=1
|
|
|
|
|
|
#echo "runSeq : $SCRIPT args : $ARGS"
|
|
if [ -z "$ARGS" ]; then
|
|
run
|
|
r=$?
|
|
else
|
|
$ARGS
|
|
r=$?
|
|
#echoDone
|
|
fi
|
|
|
|
set +u
|
|
|
|
#echo "R:$r"
|
|
if [ $r = 0 ]; then
|
|
success=$((success+1))
|
|
else
|
|
errors=$((errors+1))
|
|
lerrors=$((lerrors+1))
|
|
|
|
#echo "ERRORS ! : $errors"
|
|
#echo "LERRORS ! : $lerrors"
|
|
fi
|
|
set -u
|
|
|
|
done
|
|
|
|
if [ $VDN_SCRIPTS_LEVEL = 1 ]; then
|
|
if [ $errors != 0 ]; then
|
|
red "Error(s) detected !"
|
|
fi
|
|
fi
|
|
|
|
return $errors
|
|
}
|
|
|
|
|
|
[ "$VDN_DEBUG" = 1 ] && set -x || :
|
|
|
|
|