#!/bin/bash ## EXPERIMENT RUNNER # exemple: sudo ./scripts/run-3 2 . orig-client 100 100 100, orig-client 100 100 100 . orig-server, orig-server die() { echo "$*" 1>&2 ; exit 1; } DOCKNAME=`mktemp -u XXXXX` WAITFOR=7200 # 2 hours # SPLIT CLIENT AND SERVER TARGETS OLD_IFS=$IFS; IFS="." read -a PARTS <<< "$@" IFS=$OLD_IFS [[ ${#PARTS[@]} == 5 ]] || die "Separate count, clients, servers experiments and tor daemon command by dots. I expect 5 parts but got ${#PARTS[@]}" # EXTRACT DATA OLD_IFS=$IFS; IFS="," read -a CONFIG <<< "${PARTS[0]}" read -a CLIENT_TARGETS <<< "${PARTS[1]}" read -a SERVER_TARGETS <<< "${PARTS[2]}" read -a TOR_DAEMON_CLIENT <<< "${PARTS[3]}" read -a TOR_DAEMON_SERVER <<< "${PARTS[4]}" IFS=$OLD_IFS [[ ${#CLIENT_TARGETS[@]} == ${#SERVER_TARGETS[@]} ]] \ && [[ ${#SERVER_TARGETS[@]} == ${#TOR_DAEMON_CLIENT[@]} ]] \ && [[ ${#TOR_DAEMON_CLIENT[@]} == ${#TOR_DAEMON_SERVER[@]} ]] \ || die "Same number of declaration is required. Got ${#CLIENT_TARGETS[@]} clients, ${#SERVER_TARGETS[@]} servers, ${#TOR_DAEMON_CLIENT[@]} Tor daemon clients and ${#TOR_DAEMON_SERVER[@]} Tor daemon servers" instances=${#CLIENT_TARGETS[@]} REPEAT=${CONFIG[0]} IDENTIFIER=${CONFIG[1]} echo ":: Configuration Summary" echo "repeat=$REPEAT, identifier=$IDENTIFIER" for i in $(seq 0 $(expr $instances - 1)); do echo " instance=$i - server=${SERVER_TARGETS[$i]} - client=${CLIENT_TARGETS[$i]} - tor server=${TOR_DAEMON_SERVER[$i]} - tor client=${TOR_DAEMON_CLIENT[$i]}" done echo ":: Bootstrap" echo "Create output folder..." docker pull registry.gitlab.inria.fr/qdufour/donar docker run \ --rm \ --user root \ -v `pwd`/out:/home/donar/out \ registry.gitlab.inria.fr/qdufour/donar \ chown -R 1000:1000 /home/donar echo ":: Start experiment..." for j in $(seq 1 $REPEAT); do run_fold=`mktemp -up ./out XXXXXXXXXXXXXXXX` echo "start - batch_count=$j - folder=$run_fold" echo "__reset containers" for i in $(seq 0 $(expr $instances - 1)); do echo "____clear $i" docker container inspect ${DOCKNAME}_donarxp_server_${i} > /dev/null 2>&1 && docker kill ${DOCKNAME}_donarxp_server_${i} docker container inspect ${DOCKNAME}_donarxp_client_${i} > /dev/null 2>&1 && docker kill ${DOCKNAME}_donarxp_client_${i} echo "____spawning container for instance=$i..." docker run \ --rm \ -d \ --name "${DOCKNAME}_donarxp_server_${i}" \ --privileged \ --cap-add=SYS_PTRACE \ --security-opt seccomp=unconfined \ -e HOME='/tmp' \ -v `pwd`/out:/home/donar/out \ registry.gitlab.inria.fr/qdufour/donar \ ${TOR_DAEMON_SERVER[$i]} docker run \ --rm \ -d \ --privileged \ --cap-add=SYS_PTRACE \ --security-opt seccomp=unconfined \ --name "${DOCKNAME}_donarxp_client_${i}" \ -e HOME='/tmp' \ -v `pwd`/out:/home/donar/out \ registry.gitlab.inria.fr/qdufour/donar \ ${TOR_DAEMON_CLIENT[$i]} echo "____create folder struct..." docker exec ${DOCKNAME}_donarxp_client_${i} sh -c "mkdir -p $run_fold-$i; echo repeat=$REPEAT,identifier=$IDENTIFIER > $run_fold-$i/info.txt" docker exec ${DOCKNAME}_donarxp_client_${i} sh -c "echo instance=$i - server=${SERVER_TARGETS[$i]} - client=${CLIENT_TARGETS[$i]} - tor server=${TOR_DAEMON_SERVER[$i]} - tor client=${TOR_DAEMON_CLIENT[$i]}>> $run_fold-$i/info.txt" done sleep 10 echo "__launch servers" for i in $(seq 0 $(expr $instances - 1)); do echo " instance=$i - exec=${SERVER_TARGETS[$i]}" docker exec ${DOCKNAME}_donarxp_server_$i ${SERVER_TARGETS[$i]} ${run_fold}-$i & sleep 1 done sleep 2 echo "__launch clients" (subshellpid=$BASHPID (sleep $WAITFOR; echo " timeout"; kill -9 $subshellpid) & (for i in $(seq 0 $(expr $instances - 1)); do echo " instance=$i - exec=${CLIENT_TARGETS[$i]}" docker exec ${DOCKNAME}_donarxp_client_$i ${CLIENT_TARGETS[$i]} ${run_fold}-$i & sleep 1 done; wait; echo " ok"; for i in $(seq 0 $(expr $instances - 1)); do docker exec ${DOCKNAME}_donarxp_client_${i} killall -15 donar; docker exec ${DOCKNAME}_donarxp_server_${i} killall -15 donar; done; kill -15 $subshellpid )) 2>/dev/null echo "done" done echo ":: Clear Resources" for i in $(seq 0 $(expr $instances - 1)); do echo "clear $i" docker kill "${DOCKNAME}_donarxp_server_${i}" docker kill "${DOCKNAME}_donarxp_client_${i}" done