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.
IUT/vdn/bin/functions-scripts.sh

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