91 lines
2.6 KiB
Bash
Executable File
91 lines
2.6 KiB
Bash
Executable File
#!/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 <ircs://irc.aninix.net:6697/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
|
|
inventory=$(grep -E ^inventory ~/.ansible.cfg | cut -f 2 -d '=')
|
|
fi
|
|
|
|
tmuxHosts $(ansible -i "$inventory" --list-hosts "$group"\
|
|
| grep -v hosts\ \( \
|
|
| sed 's/\s\+//g' \
|
|
| if [ $offset -gt 0 ]; then tail -n +"${offset}"; else cat; fi \
|
|
| head -n 4 \
|
|
| tr '\n' ' ')
|
|
fi
|