#!/bin/bash # File: tmux-hosts # # Description: This script allows you to open groups of hosts in 2x2 tmux panes # # Package: AniNIX/Ubiqtorate # Copyright: WTFPL # # Author: DarkFeather # Sanity set -Eo pipefail # Defaults group=all offset=0 unset inventory function usage() { # Show helptext # param retcode: what to exit retcode="$1" echo "Usage: $0 [ -o offset ] [-g group ] -i inventory.yml" echo " $0 -h" echo "Group is optional -- add it if you only want to look at a specific subset." echo "Add -v for verbosity." exit "$retcode" } function tmuxHosts() { # Open hosts in Tmux -- ported from pnp/misc-scripts.git geotmux # param host1: the first host # param host2: the second host # param host3: the third host # param host4: the fourth host host1="$1" host2="$2" host3="$3" host4="$4" name="$group-$offset" # If no TMUX session started, then add one with four panes. if [ -z "$TMUX" ]; then tmux new-session -s "$name" -d "/bin/bash -l -c ssh\\ $host1" tmux select-window -t "$name":0 tmux split-window "/bin/bash -l -c ssh\\ $host2" tmux split-window -h -t 0 "/bin/bash -l -c ssh\\ $host3" tmux select-window -t "$name":1 tmux split-window -h -t 2 "/bin/bash -l -c ssh\\ $host4" tmux setw synchronize-panes tmux a -d -t "$name" # Otherwise, add a new window to the current session with all four sessions. else tmux new-window -n "$name" "/bin/bash -l -c ssh\\ $host1" tmux select-window -t "$name" tmux split-window "/bin/bash -l -c ssh\\ $host2" tmux select-window -t "$name" tmux split-window -h -t 0 "/bin/bash -l -c ssh\\ $host3" tmux select-window -t "$name" tmux split-window -h -t 2 "/bin/bash -l -c ssh\\ $host4" tmux setw synchronize-panes tmux select-window -t "$name" fi } # main if [ "$(basename $0)" == "tmux-hosts" ]; then while getopts 'g:hi:o:v' OPTION; do case "${OPTION}" in g) group="${OPTARG}" ;; h) echo Open Ansible hosts in TMUX panes.; usage 0 ;; i) inventory="${OPTARG}" ;; o) offset="${OPTARG}" ;; v) set -x ;; *) usage 1 ;; esac done if [ -z "$inventory" ]; then echo Need an inventory. usage 2; fi tmuxHosts $(ansible -i "$inventory" --list-hosts "$group"\ | grep -v hosts\ \( \ | sed 's/\s\+//g' \ | if [ $offset -gt 0 ]; then head -n -"${offset}"; else cat; fi \ | head -n 4 \ | tr '\n' ' ') fi