#!/bin/bash # hip - hack in pairs )c( 2009 Sam Watkins http://sam.nipl.net # dep: tightvnc ssh netcat bash, apps arcs git screen icewm mutt irssi centerim trap : TERM INT HUP; N=/dev/null pwd=$PWD/; { . ~/.hip; . ./.hip; } 2>$N [ "$1" = "${1#-}" ] || exec echo>&2 usage: ${0##*/} 'peer dir ldir server user' s() { sleep ${mo:=1}; }; [ "$dbg" = 1 ] && set >.a; : ${pw:=~/.vnc/hip,passwd} : ${io:=/tmp/.hip,io}; peer=${1:-$peer} dir=${2:-${pwd#$HOME/}} svr=${4:-$svr} : ${dir:=.}; ldir=${3:-$dir}; : ${svr:=pi}; : ${user:=$5} : ${user:=`(<~/.ssh/config sed -n "/^Host $svr *$/,/^Host / { /^User / { s/^User //; p; q; }; };") 2>$N`} : ${user:=$USER} ${ssh:=ssh}; svr=$user@$svr XA="$PWD/.hip,xa,$user" : ${d:=$[$UID*2-1976]} ${r:=$[$d+1]} ${w:=500} ${h:=720} ${depth:=24} ${bg:=X} : ${bar:=:} ${bar_term:=} ${bar_h:=192} ${bar_l:=16} ${bar_y:=$[$h-$bar_h]} : ${vv:=vncviewer} ${vs:=Xvnc} ${xt:=xterm} ${wm:=x-window-manager} ${sync:=0} : ${term_g:=80x55} ${t:=$xt} ${apps:='mutt,irssi,centerim'} ${vp:=vncpasswd} : ${sc:=$vs :$d -localhost -geometry $w\x$h -depth $depth -rfbauth "$pw,$user"} : ${sr:=xsetroot}; export io XAUTHORITY dir peer ldir svr user st apps DISPLAY [ "$dbg" = 1 ] && { set >.b; diff .a .b | grep '^[<>]'; exec rm -f .a .b; } mkdir -p "`dirname "$pw"`"; for u in "$user" "$peer"; do [ ! -e "$pw,$u" ] || [ "$npw" = 1 ] && { echo>&2 -n "$u "; $vp "$pw,$u" || exit 1; }; done cd && mkdir -p "$ldir" && cd "$ldir" || exit 1 if [ "$sync" != 0 ]; then if [ "$sync" != "${sync#arcs}" -a ! -d .arcs ]; then mkdir .arcs || exit 1; chmod -R g+rwX .; echo "$svr:$dir" >.arcs/peers; fi [ sync = 1 ] && sync="arcs -c -l -s 5 -S 1"; $sync & syncp=$!; fi if [ "$bar_term" = 1 ]; then STY= $xt -geometry 999x$bar_l+0+$bar_y -e $bar & else $bar -geometry $[$w*2]x$bar_h+0+$bar_y & fi $sc & vsp=$! s; (DISPLAY=:$d XAUTHORITY=$XA; $sr -solid $bg; $wm & $t -geom $term_g & $st &) i=$io,$user-$peer,bk; o=$io,$user-$peer,fd $ssh $svr "cd '$dir'; mkfifo -m660 '$i' 2>$N; exec cat <'$i'" | $nc 127.0.0.1 $[5900+$d] | $ssh $svr "cd '$dir'; mkfifo -m660 '$o' 2>$N; exec cat >'$o'" & c1=$! i=$io,$peer-$user,fd; o=$io,$peer-$user,bk $ssh $svr "cd '$dir'; mkfifo -m660 '$i' 2>$N; exec cat <'$i'" | ($nc -l -p $[5900+$r] || $nc -l $[5900+$r]) | $ssh $svr "cd '$dir'; mkfifo -m660 '$o' 2>$N; exec cat >'$o'" & c2=$! ($vv -geom +0+0 -passwd "$pw,$user" 127.0.0.1:$d; kill $vsp) & (while true; do $vv -encodings "copyrect tight hextile zlib corre rre raw" \ -geom +$w+0 -passwd "$pw,$peer" 127.0.0.1:$r && break; sleep $mo; done) & disown $syncp $vsp $c1 $c2; wait ; trap '' {TERM,INT,HUP}; echo >&2 exiting... rm -f "$XA" /tmp/.X$d-lock /tmp/.X11-unix/X$d [ "$cpw" = 1 ] && rm -f "$pw,$user" "$pw,$peer" $ssh $svr "cd '$dir'; F='$io',*; "' for A in $F; do <$A & >$A & done; sleep $mo; rm -f $F; kill 0' 2>$N; kill 0