Use LIST instead of REMOTE and let it go recursive
authorJoerg Jaspert <joerg@nsb-software.de>
Mon, 29 Dec 2014 14:48:37 +0000 (15:48 +0100)
committerJoerg Jaspert <joerg@nsb-software.de>
Mon, 29 Dec 2014 14:48:37 +0000 (15:48 +0100)
bin/tm

diff --git a/bin/tm b/bin/tm
index c34c7de..e8c8a69 100755 (executable)
--- a/bin/tm
+++ b/bin/tm
@@ -239,8 +239,8 @@ function own_config() {
         setup_command_aliases
     fi
     # Set IFS to be NEWLINE only, not also space/tab, as our input files
-    # are \n seperated (one entry per line) and lines may well have spaces
-    IFS="
+    # are \n seperated (one entry per line) and lines may well have spaces.
+    local IFS="
 "
     # Fill an array with our config
     TMDATA=( $(cat "${TMDIR}/$1") )
@@ -253,17 +253,45 @@ function own_config() {
         TMOPTS=${TMDATA[1]}
     fi
 
-    # Line 3 may start with REMOTE, then we get the list of hosts from elsewhere.
-    # So if it does, we exec the command given, then take the output as one host per
-    # line and appen it to TMDATA - while deleting the actual line with REMOTE in.
-    if [[ "${TMDATA[2]}" =~ ^REMOTE\ (.*) ]]; then
-        echo "Fetching hostnames from remote, please stand by..."
-        out=( $( ${BASH_REMATCH[1]} ) )
-        unset TMDATA[2]
-        TMDATA=( "${TMDATA[@]}" "${out[@]}" )
-        unset out
-    fi
+    # Seperate the lines we work with
+    local IFS=""
+    local workdata=(${TMDATA[@]:2})
+    IFS=${OLDIFS}
+
+    # Lines (starting with line 3) may start with LIST, then we get
+    # the list of hosts from elsewhere. So if one does, we exec the
+    # command given, then append the output to TMDATA - while deleting
+    # the actual line with LIST in.
+
+    TMPDATA=$(mktemp -u -p ${TMPDIR} .tmux_tm_XXXXXXXXXX)
+    trap "rm -f ${TMPDATA}" EXIT ERR HUP INT QUIT TERM
 
+    index=0
+    while [[ ${index} -lt ${#workdata[@]} ]]; do
+        if [[ "${workdata[${index}]}" =~ ^LIST\ (.*)$ ]]; then
+            # printf -- 'workdata: %s\n' "${workdata[@]}"
+            cmd=${BASH_REMATCH[1]}
+            echo "Line ${index}: Fetching hostnames using provided shell command '${cmd}', please stand by..."
+
+            $( ${cmd} >| "${TMPDATA}" )
+
+            # Set IFS to be NEWLINE only, not also space/tab, the list may have ssh options
+            # and what not, so \n is our seperator, not more.
+            IFS="
+"
+            out=( $(cat "${TMPDATA}") )
+            # Restore IFS
+            IFS=${OLDIFS}
+
+            unset workdata[${index}]
+            workdata=( "${workdata[@]}" "${out[@]}" )
+            unset out
+            # printf -- 'workdata: %s\n' "${workdata[@]}"
+        fi
+        index=$(( index + 1 ))
+    done
+    rm -f "${TMPDATA}"
+    TMDATA=( "${TMDATA[@]:0:2}" "${workdata[@]}"  )
 }
 
 # Simple overview of running sessions