211 lines
6.5 KiB
Bash
Executable File
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 "$@"
|