92 行
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			可执行文件
		
	
	
	
	
			
		
		
	
	
			92 行
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			可执行文件
		
	
	
	
	
#!/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
 | 
						|
        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 tail -n +"${offset}"; else cat; fi \
 | 
						|
        | head -n 4 \
 | 
						|
        | tr '\n' ' ')
 | 
						|
fi
 |