Added the -i option, changed the name of the temporary remote dir to include the...
[xremote.git] / xremote.sh
index cd6813c..9752a9a 100755 (executable)
@@ -35,12 +35,12 @@ function check_remote_is_defined () {
 
 function help () {
     cat <<EOF
-xremote.sh <script>
+xremote.sh [-h <remote_host>] [-i <remote_dir>] <script> [script arguments]
 
   This script takes a script as argument and executes it remotely in a
   temporary directory on a ssh-accessible server.
 
-  It parses the script first to find embedded arguments which defines
+  It parses the script first to find embedded arguments which define
   the hostname on which to run, the files to send, the files to get
   back when the execution is over, and commands to execute before
   running the executable remotely.
@@ -56,8 +56,15 @@ xremote.sh <script>
     @XREMOTE_GET: *.dat
     @XREMOTE_PRE: ln -s /home/fleuret/data/pytorch ./data
 
-  If no argument is provided to @XREMOTE_HOST, the environment
-  variable $XREMOTE_HOST is used instead
+  If the -h option is provided @XREMOTE_HOST is ignored.
+
+  If the -i option is provided, all the files are installed and
+  scripts run in the specified directory on the remote host, but the
+  main executable and post-run commands are ignored
+
+  If no argument is provided to @XREMOTE_HOST, and the -h option is
+  not specified, the environment variable \$XREMOTE_HOST is used
+  instead
 
   Contact <francois@fleuret.org> for comments.
 
@@ -66,16 +73,41 @@ EOF
 }
 
 function cleanup_remote_tmp () {
-    if [[ "${REMOTE_HOST}" ]] && [[ "${REMOTE_DIR}" ]]
+    if [[ "${REMOTE_HOST}" ]] && [[ "${REMOTE_DIR}" ]] && [[ ! "${ARG_DIR}" ]]
     then
         echo "xremote: Clean up remote workdir."
-        ssh "${REMOTE_HOST}" "rm -rf \"${REMOTE_DIR}\""
     fi
 }
 
 ######################################################################
 
-[[ -x "$1" ]] || (help && exit 1)
+while [[ "$1" =~ ^- ]]
+do
+    case "$1"
+    in
+        -h)
+            shift
+            ARG_HOST="$1"
+            echo "xremote: remote forced to ${ARG_HOST}"
+            ;;
+
+        -i)
+            shift
+            ARG_DIR="$1"
+            echo "xremote: remote dir set to ${ARG_DIR}"
+            ;;
+
+        *)
+            echo "Unknown option $1"
+            exit 1
+            ;;
+    esac
+    shift
+done
+
+######################################################################
+
+[[ -a "$1" ]] || (help && exit 1)
 
 main="$(basename "$1")"
 
@@ -118,10 +150,17 @@ do
 
             HOST)
                 [[ "${REMOTE_DIR}" ]] && (exit "Remote host already defined!" >&2 && exit 1)
-                REMOTE_HOST="${value}"
+                REMOTE_HOST="${ARG_HOST}" # Host given in argument has priority
+                [[ "${REMOTE_HOST}" ]] || REMOTE_HOST="${value}"
                 [[ "${REMOTE_HOST}" ]] || REMOTE_HOST="${XREMOTE_HOST}"
                 [[ "${REMOTE_HOST}" ]] || (echo "xremote: No remote host specified." >&2 && exit 1)
-                REMOTE_DIR="$(ssh </dev/null "${REMOTE_HOST}" mktemp -d /tmp/xremote.from_"$(hostname)_$(date +%Y%m%d-%H%M%S)".XXXXXX)"
+                if [[ "${ARG_DIR}" ]]
+                then
+                    ssh </dev/null "${REMOTE_HOST}" "mkdir -p \"${ARG_DIR}\""
+                    REMOTE_DIR="${ARG_DIR}"
+                else
+                    REMOTE_DIR="$(ssh </dev/null "${REMOTE_HOST}" mktemp -d /tmp/xremote_\$\(whoami\)_from_"$(hostname)_$(date +%Y%m%d_%H%M%S)".XXXXXX)"
+                fi
                 echo "xremote: target is ${REMOTE_HOST}"
                 ;;
         esac
@@ -135,6 +174,12 @@ check_remote_is_defined
 
 tar c "${main}" | ssh "${REMOTE_HOST}" "cd \"${REMOTE_DIR}\" && tar mx"
 
+if [[ "${ARG_DIR}" ]]
+then
+    echo "xremote: everything has been set up in ${REMOTE_HOST}:${ARG_DIR}"
+    exit 0
+fi
+
 echo "xremote: -- running the executable -----------------------------------"
 
 if [[ "${REMOTE_EXEC}" ]]
@@ -169,6 +214,12 @@ do
         label=$(echo "${line}" | sed -e 's/^.*@XREMOTE_\([^:]*\):.*$/\1/')
         value=$(echo "${line}" | sed -e 's/^.*@XREMOTE_[^:]*: *\(.*\)$/\1/')
         case "${label}" in
+            POST)
+                check_remote_is_defined
+                echo "xremote: ${value}"
+                ssh < /dev/null "${REMOTE_HOST}" "cd \"${REMOTE_DIR}\" && ${value}"
+                ;;
+
             GET)
                 check_remote_is_defined
                 ssh </dev/null "${REMOTE_HOST}" "cd \"${REMOTE_DIR}\" && tar 2>/dev/null c ${value}" | tar mxv