ProgettoMartinelli2023/Fig_src/gnuplot/bin/getMobiusResults_bradipo.bash

211 lines
6.5 KiB
Bash
Executable File

#!/bin/bash
#
# import mobius results files from remote host
function main () {
# the absolute project path where is all the stuff, three directories above the script:
# 3 2 1 0
# basedir/gnuplot/bin/<script>
BASEDIR=$(scriptancestorpath 3)
# check if basedir contains Fig_src/gnuplot/bin
checkmergedpaths "${BASEDIR}" "gnuplot/bin"
# name of the basedir
BASENAME=$(basename "${BASEDIR}")
# Fig_src
FIG_SRC_DIR="${BASEDIR}"
# list of project name (different project names for different lines) and (space separed) solver name patterns from which the files are imported
# PROJECTPATTERNLIST="projectname1 solvernamepattern1a solvernamepattern1b
# projectname1 solvernamepattern2
# ...
# projectname4 solvernamepattern4a solvernamepattern4b solvernamepattern4c"
#
# e.g.:
# PROJECTPATTERNLIST="EPS_MultiRegion_LP MS_*_kDPmax1p2_* MS_*varIndex
# EPS_trunk MS_EPSREG_simpleG2S2L3_varCNETfailRepRate"
#
PROJECTPATTERNLIST="
#parallelWorkingStations_TwoApps_cs ms_vark_n100_delta10 ms_vark_n1000_delta10
#STINGRAY_Availability sim_vardelta_T0m15_T0w*_DPT0diff*_DPw*
STINGRAY_Availability sim_vardelta_T0m15_T0w*_DPT0diff*_DPw*
"
# list space separed patterns of file names to imports
#FILES_PATTERN="Results_Experiment_*.txt Results_results.csv Results_results.txt"
FILES_PATTERN="Results_results.csv Results_results.txt"
# where are the projects on remote host
REMOTE_MOBIUS_PROJECT="\${HOME}/mobius-project"
# imported files are restored on local host in ${OUTDIR}/Solver/<solvername>/
OUTDIR="${FIG_SRC_DIR}/mobius"
MYDIR="$PWD"
# remote host
REMOTE_HOST="bradipo.isti.cnr.it"
REMOTE_USER="silvano"
#CPIO="cpio -oaV --verbose -H ustar "
CPIO="cpio -oaV --verbose "
GZIP="gzip -c "
GUNZIP="gunzip -c "
SSH="/usr/bin/ssh "
E_BADARGS=1
while getopts ":nh" opt; do
case $opt in
n)
if [ "${OPTARG:0:1}" == "-" ]; then
echo "Invalid parameter \"${OPTARG}\" provided for agurment \"-${opt}!\""
hflag=1
else
# echo "-n was triggered! Parameter: $OPTARG" >&2
nflag=1
fi
;;
h)
if [ "${OPTARG:0:1}" == "-" ]; then
echo "Invalid parameter \"${OPTARG}\" provided for agurment \"-${opt}!\""
hflag=1
else
# echo "-h was triggered! Parameter: $OPTARG" >&2
hflag=1
fi
;;
\?)
echo "Invalid option: -$OPTARG" >&2
hflag=1
E_BADARGS=65
;;
:)
echo "Option -$OPTARG requires an argument." >&2
hflag=1
E_BADARGS=65
;;
esac
done
if [ "$hflag" ]; then
echo -e "Usage: `basename $0` [-n]"
echo -e "Option -n: are imported only the (matching patterns) files that have a more recent last modification time than last time this script has been executed."
exit $E_BADARGS
fi
mkdir "${OUTDIR}"
IFS=$' '
FINDNAMES=""
for i in ${FILES_PATTERN}; do
if [ "${FINDNAMES}" == "" ]; then
FINDNAMES="-name \"${i}\" "
else
FINDNAMES="${FINDNAMES} -o -name \"${i}\" "
fi
done
# remove comments
PROJECTPATTERNLIST=$(echo "${PROJECTPATTERNLIST}" | awk '!/^[ ]*#.*/ {printf "%s\n", $0}')
IFS=$'\n'
for i in ${PROJECTPATTERNLIST}; do
PROJECT=$(echo ${i} | awk '{print $1}')
PATTERN=$(echo ${i} | awk '{for(i=2;i<=NF;i++)printf"\"%s\"\n",$i}')
SOLVER="./${PROJECT}/Solver"
# get -path
FINDPATHS=""
for j in ${PATTERN}; do
j=${j#\"} # remove starting "
j=${j%\"} # remove ending "
PATHPATTERN="${SOLVER}/${j}/*"
if [ "${FINDPATHS}" == "" ]; then
FINDPATHS="-path \"${PATHPATTERN}\" "
else
FINDPATHS="${FINDPATHS} -o -path \"${PATHPATTERN}\" "
fi
done
OUTFILENAME="archive_${PROJECT}.cpio.gz"
OUTFILE="${OUTDIR}/${OUTFILENAME}"
LASTTIMEFLAG="${REMOTE_MOBIUS_PROJECT}/${SOLVER}/._LASTIMPORTFLAG"
FINDNEWER=""
if [ "$nflag" == "1" ]; then
echo -e "Importing only files modified after last execution."
FINDNEWER="-newer ${LASTTIMEFLAG}"
fi
cd "${MYDIR}"
echo ""
echo "Obtaining: ${PROJECT} with pattern ${PATTERN} ..."
REMOTECMD="cd \"${REMOTE_MOBIUS_PROJECT}\" && find ./ ${FINDNEWER} \\( ${FINDPATHS} \\) \\( ${FINDNAMES} \\) -print | ${CPIO} | ${GZIP}; touch \"${LASTTIMEFLAG}\" "
echo "${REMOTECMD}"
echo "${REMOTECMD}" | eval ${SSH} -v -l "${REMOTE_USER}" "${REMOTE_HOST}" bash -s | cat > "${OUTFILE}"
# important note about alternative commands to transfer data from remote host:
# the following transfer data commands corrupt the .gz file, due to the first "cd" command in the REMOTECMD variable:
# /usr/bin/ssh -l "${REMOTE_USER}" "${REMOTE_HOST}" "${REMOTECMD}" > "${OUTFILE}"
# /usr/bin/ssh -l "${REMOTE_USER}" "${REMOTE_HOST}" bash -c "${REMOTECMD}" > "${OUTFILE}"
cd "${OUTDIR}"
# on local host
echo ""
echo "Restoring files from ${OUTFILE}..."
UNAME="$(uname -n)"
if [ "${UNAME}" == "cicala.local" ]; then
eval "${GUNZIP} ${OUTFILENAME}" | cpio -u -i -d
else
eval "${GUNZIP} ${OUTFILENAME}" | cpio -u -i -d
fi
done
cd "${MYDIR}"
echo ""
echo "Done!"
}
# get the i-th ancestor path of the script that calls this function (the currently running script)
# i=0: for the path of the script,
# i=1: for the directory where is the script,
# i=2: for the directory including the directory corresponding to i=1,
# etc...
# $1: level of the ancestor path (from the end of the path)
scriptancestorpath () {
[[ $1 -lt 0 ]] && { echo "Ops! Input less than 0: $1"; exit 1; }
local THEPATH="$(cd "$(dirname "$0")"; pwd)/$(basename "$0")"
i=1
while [[ $i -le ${1} && "${THEPATH}" != "/" ]]; do
THEPATH="$(cd "$(dirname "$THEPATH")"; pwd)"
let i=i+1
done
# echo "depth: $i"
echo "${THEPATH}"
}
# check if the $1/$2 exists
# $1: path of directory
# $2: path of directory or file
checkmergedpaths() {
if [[ ! -e "${1}/${2}" ]]; then
echo "Ops! Element not found: ${1}/${2}"
exit 1
fi
}
main "$@"