changes
authorJoerg Jaspert <joerg@nsb-software.de>
Mon, 5 Jan 2015 13:08:15 +0000 (14:08 +0100)
committerJoerg Jaspert <joerg@nsb-software.de>
Mon, 5 Jan 2015 13:08:15 +0000 (14:08 +0100)
bin/tm

diff --git a/bin/tm b/bin/tm
index e8c8a69..c7bd719 100755 (executable)
--- a/bin/tm
+++ b/bin/tm
@@ -61,6 +61,9 @@ declare -r TMDIR=${TMDIR:-"${HOME}/.tmux.d"}
 # TMSESSHOST=false -> session name is host1_host2
 declare -r TMSESSHOST=${TMSESSHOST:-"true"}
 
+# Allow to globally define a custom ssh command line.
+TMSSHCMD=${TMSSHCMD:-"ssh"}
+
 # Where does your tmux starts numbering its windows? Mine does at 1,
 # default for tmux is 0. We try to find it out, but if we fail, (as we
 # only check $HOME/.tmux.conf you can set this variable to whatever it
@@ -71,7 +74,7 @@ if [[ -f ${HOME}/.tmux.conf ]]; then
 else
     bindex=0
 fi
-TMWIN=${TMWIN:-$bindex}
+declare -r TMWIN=${TMWIN:-$bindex}
 unset bindex
 
 ########################################################################
@@ -161,6 +164,10 @@ function usage() {
     echo "              SESSION - replaced with the session name"
     echo "              TMWIN   - see below for explanation of TMWIN Environment variable"
     echo ""
+    echo "NOTE: Both types of files accept external listings of hostnames."
+    echo "      That is, the output of any shell command given will be used as a list"
+    echo "      of hostnames to connect to (or a set of tmux commands to run)."
+    echo ""
     echo "Environment variables recognized by this script:"
     echo "TMPDIR     - Where tmux stores its session information"
     echo "             DEFAULT: If unset: /tmp"
@@ -180,6 +187,11 @@ function usage() {
     echo "             like mine do at 1, then you can set TMWIN to 1"
     echo "TMSESSHOST - Should the hostname appear in session names?"
     echo "             DEFAULT: true"
+    echo "TMSSHCMD   - Allow to globally define a custom ssh command line."
+    echo "             This can be just the command or any option one wishes to have"
+    echo "             everywhere."
+    echo "             DEFAULT: ssh"
+    echo ""
     exit 42
 }
 
@@ -255,7 +267,7 @@ function own_config() {
 
     # Seperate the lines we work with
     local IFS=""
-    local workdata=(${TMDATA[@]:2})
+    local -a workdata=(${TMDATA[@]:2})
     IFS=${OLDIFS}
 
     # Lines (starting with line 3) may start with LIST, then we get
@@ -263,14 +275,14 @@ function own_config() {
     # command given, then append the output to TMDATA - while deleting
     # the actual line with LIST in.
 
-    TMPDATA=$(mktemp -u -p ${TMPDIR} .tmux_tm_XXXXXXXXXX)
+    local TMPDATA=$(mktemp -u -p ${TMPDIR} .tmux_tm_XXXXXXXXXX)
     trap "rm -f ${TMPDATA}" EXIT ERR HUP INT QUIT TERM
 
-    index=0
+    local index=0
     while [[ ${index} -lt ${#workdata[@]} ]]; do
         if [[ "${workdata[${index}]}" =~ ^LIST\ (.*)$ ]]; then
             # printf -- 'workdata: %s\n' "${workdata[@]}"
-            cmd=${BASH_REMATCH[1]}
+            local cmd=${BASH_REMATCH[1]}
             echo "Line ${index}: Fetching hostnames using provided shell command '${cmd}', please stand by..."
 
             $( ${cmd} >| "${TMPDATA}" )
@@ -283,14 +295,17 @@ function own_config() {
             # Restore IFS
             IFS=${OLDIFS}
 
-            unset workdata[${index}]
             workdata=( "${workdata[@]}" "${out[@]}" )
+            unset workdata[${index}]
             unset out
             # printf -- 'workdata: %s\n' "${workdata[@]}"
+        elif [[ "${workdata[${index}]}" =~ ^SSHCMD\ (.*)$ ]]; then
+            TMSSHCMD=${BASH_REMATCH[1]}
         fi
         index=$(( index + 1 ))
     done
     rm -f "${TMPDATA}"
+    trap - EXIT ERR HUP INT QUIT TERM
     TMDATA=( "${TMDATA[@]:0:2}" "${workdata[@]}"  )
 }
 
@@ -389,7 +404,7 @@ if [[ ${DOUBLENAME} == true ]] && tmux has-session -t ${SESSION} 2>/dev/null; th
 fi
 
 if [[ ${TMSESSHOST} = true ]]; then
-    declare -r SESSION="$(hostname -s)_${SESSION}"
+    declare -r SESSION="$(uname -n|cut -d. -f1)_${SESSION}"
 else
     declare -r SESSION
 fi
@@ -404,7 +419,7 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
     case ${cmdline} in
         s)
             # The user wants to open ssh to one or more hosts
-            tmux new-session -d -s ${SESSION} -n "${1}" "ssh ${1}"
+            tmux new-session -d -s ${SESSION} -n "${1}" "${TMSSHCMD} ${1}"
             # We disable any automated renaming, as that lets tmux set
             # the pane title to the process running in the pane. Which
             # means you can end up with tons of "bash". With this
@@ -412,17 +427,17 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
             tmux set-window-option -t ${SESSION} automatic-rename off >/dev/null
             # If we have at least tmux 1.7, allow-rename works, such also disabling
             # any rename based on shell escape codes.
-            if [ ${TMUXMINOR} -ge 7 ] || [ ${TMUXMAJOR} -gt 1 ]; then
+            if [ ${TMUXMINOR//[!0-9]/} -ge 7 ] || [ ${TMUXMAJOR//[!0-9]/} -gt 1 ]; then
                 tmux set-window-option -t ${SESSION} allow-rename off >/dev/null
             fi
             shift
             count=2
             while [ $# -gt 0 ]; do
-                tmux new-window -d -t ${SESSION}:${count} -n "${1}" "ssh ${1}"
+                tmux new-window -d -t ${SESSION}:${count} -n "${1}" "${TMSSHCMD} ${1}"
                 tmux set-window-option -t ${SESSION}:${count} automatic-rename off >/dev/null
                 # If we have at least tmux 1.7, allow-rename works, such also disabling
                 # any rename based on shell escape codes.
-                if [ ${TMUXMINOR} -ge 7 ] || [ ${TMUXMAJOR} -gt 1 ]; then
+                if [ ${TMUXMINOR//[!0-9]/} -ge 7 ] || [ ${TMUXMAJOR//[!0-9]/} -gt 1 ]; then
                     tmux set-window-option -t ${SESSION}:${count} allow-rename off >/dev/null
                 fi
                 count=$(( count + 1 ))
@@ -433,10 +448,10 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
             # We open a multisession window. That is, we tile the window as many times
             # as we have hosts, display them all and have the user input send to all
             # of them at once.
-            tmux new-session -d -s ${SESSION} -n "Multisession" "ssh ${1}"
+            tmux new-session -d -s ${SESSION} -n "Multisession" "${TMSSHCMD} ${1}"
             shift
             while [ $# -gt 0 ]; do
-                tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${1}"
+                tmux split-window -d -t ${SESSION}:${TMWIN} "${TMSSHCMD} ${1}"
                 # Always have tmux redo the layout, so all windows are evenly sized.
                 # Otherwise you quickly end up with tmux telling you there is no
                 # more space available for tiling - and also very different amount
@@ -472,13 +487,13 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
                     done
                 else
                     # So lets start with the "first" line, before dropping into a loop
-                    tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}" "ssh ${TMDATA[2]}"
+                    tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}" "${TMSSHCMD} ${TMDATA[2]}"
 
                     tmcount=${#TMDATA[@]}
                     index=3
                     while [ ${index} -lt ${tmcount} ]; do
                         # List of hostnames, open a new connection per line
-                        tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${TMDATA[$index]}"
+                        tmux split-window -d -t ${SESSION}:${TMWIN} "${TMSSHCMD} ${TMDATA[$index]}"
                         # Always have tmux redo the layout, so all windows are evenly sized.
                         # Otherwise you quickly end up with tmux telling you there is no
                         # more space available for tiling - and also very different amount