summaryrefslogtreecommitdiff
path: root/rc/bin/rconnect
diff options
context:
space:
mode:
Diffstat (limited to 'rc/bin/rconnect')
-rwxr-xr-xrc/bin/rconnect84
1 files changed, 84 insertions, 0 deletions
diff --git a/rc/bin/rconnect b/rc/bin/rconnect
new file mode 100755
index 000000000..44de0918f
--- /dev/null
+++ b/rc/bin/rconnect
@@ -0,0 +1,84 @@
+#!/bin/rc
+rfork e
+
+argv0=$0
+fn usage {
+ echo 'usage:' $argv0 '[-p] [-u user] [-k keyspec] host remotescript localcommand ...' >[1=2]
+ exit 'usage'
+}
+
+fn pvar {
+ while(! ~ $#* 0){
+ ~ $#$1 0 || path=/dev/null builtin whatis $1
+ shift
+ }
+}
+
+filter=()
+keyspec=()
+while(~ $1 -*){
+ switch($1){
+ case -p; filter=aan
+ case *
+ ~ $#* 1 && usage
+ switch($1){
+ case -k; keyspec=($keyspec $2)
+ case -u; keyspec=($keyspec `{user=$2 pvar user})
+ case *; usage
+ }
+ shift
+ }
+ shift
+}
+
+~ $#* 0 1 2 && usage
+
+host=$1
+shift
+
+fn sendscript {
+ echo -n $host >/proc/$pid/args
+ cat $1 >/env/v; wc -c </env/v; cat /env/v; rm /env/v
+ shift
+ $*
+}
+
+if(~ $filter aan){
+ fn aanserver {
+ ~ $#netdir 1 || netdir=/net/tcp/clone
+ netdir=`{basename -d $netdir} || exit
+ <>$netdir/clone {
+ netdir=$netdir/`{read} || exit
+ >[3] $netdir/ctl {
+ echo -n 'announce *!0' >[1=3]
+ echo `{cat $netdir/local} || exit
+ bind '#|' /mnt/aan || exit
+ exec aan $netdir <>/mnt/aan/data1 >[1=0] >[2]/dev/null &
+ }
+ }
+ <>/mnt/aan/data >[1=0] >[2]/dev/null {
+ rfork n
+ fn server {
+ echo -n aanserver $netdir >/proc/$pid/args
+ . <{n=`{read} && ! ~ $#n 0 && read -c $n} >[2=1]
+ }
+ rm -f /env/^'fn#aanserver'
+ exec tlssrv -A /bin/rc -c server
+ exit
+ }
+ }
+ fn aanclient {
+ host=`{echo $host | sed 's/(.*)!([^!]+)$/\1/'}^!^`{read | sed 's/(.*)!([^!]+)$/\2/'} || exit
+ tlsclient -a -o <>{rfork s; aan -c $host >[1=0]} /bin/rc -c 'sendscript $*' $*
+ }
+ exec $argv0 -k $"keyspec $host <{builtin whatis aanserver; echo aanserver} aanclient $*
+ exit
+}
+
+switch($host){
+case *!*!*;
+case *!*; host=$host!rcpu
+case *; host=net!$host!rcpu
+}
+
+exec tlsclient -ak $"keyspec $host /bin/rc -c 'sendscript $*' $*