#!/bin/bash set -e #set -x usage() { cat >&2 < Options: -h print this help -n dry-run mode (for debugging) -c (continue) do not overwrite previous results -z compress output files with gzip EOF exit $1 } log() { echo "-#- $@" >&2 } die() { echo "ERROR: $@" >&2 exit 2 } variable_check() { eval test -n "\${$1}" || die "undefined $1" } array_check() { eval test "\${#$1}" -gt 0 || die "undefined $1" } # read args overwrite=1 debug=0 compress=0 while getopts "chnz" c; do case "$c" in 'c') overwrite=0 ;; 'h') usage 0 ;; 'n') debug=1 ;; 'z') compress=1 ;; '?') usage 1 ;; esac done shift $((OPTIND - 1)) [ $# -eq 1 ] || usage 1 parameters="$1" log "Running: $0 $@" log "Hostname: $(hostname -f)" declare -a TOPOLOGIES ALGORITHMS PLATFORMS COMMON_OPTS MORE_ARGS # read parameters log "Reading parameters from \"$1\"." source "$parameters" || die "cannot read parameters file: \"$parameters\"" array_check TOPOLOGIES array_check ALGORITHMS array_check PLATFORMS variable_check NHOSTS variable_check LOAD variable_check DEADLINE # default values : ${RESULTS:=$PWD/results} : ${LOBA:=$PWD/loba} COMMON_OPTS=( --cfg=contexts/factory:raw "${MORE_ARGS[@]}" ) log "Results put in: \"$RESULTS\"." [ $debug = 1 ] && log "Running in dry-run mode" outfile() { echo "$*" | sed 's,[^ ]*/,,g;s/\.xml//;y/ /_/' } summary() { gzip -cdf "$@" \ | sed -n '\!^\[main/INFO\] ,----\[ Results \]!,${ /send\|recv\|wall clock\|Simulation succeeded/d;p; }' } if [ $compress = 1 ]; then outsuffix=".gz" else outsuffix="" fi for plat in "${PLATFORMS[@]}"; do tmp=$(basename "$plat" ".xml") plat_output="$RESULTS/plat_$tmp" for topo in "${TOPOLOGIES[@]}"; do topo_output="$plat_output/topo_$topo" [ $debug = 0 ] && mkdir -p "$topo_output" for lr in "1" "N"; do case "$lr" in "1") loadinit=( ) ;; "N") loadinit=( "-R" "-r42" ) ;; *) die "internal error (lr = \"$lr\")" ;; esac for mode in "R" "Z"; do case "$mode" in "R") computemode=( );; "Z") computemode=( "-Z" );; *) die "internal error (mode = \"$mode\")" ;; esac for algo in "${ALGORITHMS[@]}"; do algo_output="$topo_output/algo_$algo" args=( -T"$topo" -a"$algo" -N"$NHOSTS" -L"$LOAD" -t"$DEADLINE" "${loadinit[@]}" "${computemode[@]}" "$plat" ) for bk in "plain" "bookkeeping"; do cmd=( "$LOBA" "${COMMON_OPTS[@]}" ) case "$bk" in "plain") : ;; "bookkeeping") cmd+=( "-b" ) ;; *) die "internal error (bk = \"$bk\")" ;; esac out="${algo_output}_${bk}_${lr}${mode}.out" outf="$out$outsuffix" cmd+=( "${args[@]}" ) log "Run: ${cmd[@]}"$'\n'"... &> $outf" if [ $overwrite = 0 -a -e "$outf" ]; then log "already run !" summary "$outf" continue fi if [ $debug = 1 ]; then log "skipped (dry-run)" continue fi rm -f "$outf"; echo "# ${cmd[@]}" > "$out" if "${cmd[@]}" >> "$out" 2>&1; then summary "$out" else grep -v '/INFO\]' "$out" fi if [ $compress = 1 ]; then log "Compress output file." gzip --best "$out" fi done done done done done done