#!/bin/bash
# hip - hack in pairs  )c( 2009 Sam Watkins <sam@nipl.net>  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
