dotfiles

Alpine Linux dotfiles

git clone git://git.lin.moe/dotfiles.git

 1#!/usr/bin/env zsh
 2
 3local usage=(
 4	"$0 -L local_port:remote_addr:remote_port target"
 5	"$0 [-k|--kill] target"
 6	"$0 [-l|--list]"
 7	"$0 [-h|--help]"
 8)
 9
10
11function _forward(){
12	local o_target addr_parts
13
14	o_addr="$1"
15	o_target="$2"
16	
17	addr_parts=(${(s/:/)o_addr})
18	case ${#addr_parts[@]} in
19		1)
20			o_addr="$addr_parts[1]:0:$addr_parts[1]"
21			;;
22		2)
23			o_addr="$addr_parts[1]:0:$addr_parts[2]"
24			;;
25	esac
26	
27	[[ -d $HOME/.ssh/controlmaster ]] || mkdir -p $HOME/.ssh/controlmaster
28
29	ssh -f -N -L $o_addr \
30	    -o ExitOnForwardFailure=yes \
31	    -o ControlMaster=auto \
32	    -o ControlPath="$HOME/.ssh/controlmaster/%n|$o_addr|%r@%h|%p" \
33	    $o_target
34}
35
36function _list() {
37	local controllers
38	controllers=`find $HOME/.ssh/controlmaster -maxdepth 1 -type s -exec basename {} \;`
39
40	for c in $controllers; do
41		echo $c
42	done
43}
44
45function _kill() {
46	setopt globstarshort
47	setopt null_glob
48	for pattern in $@; do
49		for controlpath in $(eval "echo $HOME/.ssh/controlmaster/$pattern(=)"); do
50			file=$(basename $controlpath)
51			echo "$file exiting"
52			ssh -o ControlMaster=auto \
53			    -o ControlPath="$controlpath" -O exit ${(s/:/)o_addr} \
54			    ${${(s/|/)file}[1]}
55		done
56
57	done	
58}
59
60local o_help o_addr o_list o_kill
61
62zmodload zsh/zutil
63zparseopts -D -F -K -- \
64	   L:=o_addr \
65	   {l,-list}=o_list \
66	   {k,-kill}=o_kill \
67	   {h,-help}=o_help || return 1
68
69[[ -z "$o_help" ]] || { print -l $usage && exit $? }
70[[ -z "$o_addr" ]] || { _forward $o_addr[-1] $@ && exit $?}
71[[ -z "$o_list" ]] || { _list $@ && exit $?}
72[[ -z "$o_kill" ]] || { _kill $@ && exit $?}
73