]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/rconnect
merge
[plan9front.git] / rc / bin / rconnect
1 #!/bin/rc
2 rfork e
3
4 argv0=$0
5 aanto=86400 #one day
6 fn usage {
7         echo 'usage:' $argv0 '[-u user] [-k keypattern] [-p] [-t timeout] host remotescript localcommand arg ...' >[1=2]
8         exit 'usage'
9 }
10
11 fn pvar {
12         while(! ~ $#* 0){
13                 ~ $#$1 0 || path=/dev/null builtin whatis $1
14                 shift
15         }
16 }
17
18 filter=()
19 keyspec=()
20 while(~ $1 -*){
21         switch($1){
22         case -p; filter=aan
23         case *
24                 ~ $#* 1 && usage
25                 switch($1){
26                 case -k; keyspec=($keyspec $2)
27                 case -u; keyspec=($keyspec `{user=$2 pvar user})
28                 case -t; aanto=$2
29                 case *; usage
30                 }
31                 shift
32         }
33         shift
34 }
35
36 ~ $#* 0 1 2 && usage
37
38 host=$1
39 shift
40
41 fn sendscript {
42         echo -n $host >/proc/$pid/args
43         cat $1 >/env/v; wc -c </env/v; cat /env/v; rm /env/v
44         shift
45         $*
46 }
47
48 if(~ $filter aan){
49         fn aanserver {
50                 ~ $#netdir 1 || netdir=/net/tcp/clone
51                 netdir=`{basename -d $netdir} || exit
52                 <>$netdir/clone {
53                         netdir=$netdir/`{read} || exit
54                         >[3] $netdir/ctl {
55                                 echo -n 'announce *!0' >[1=3]
56                                 echo `{cat $netdir/local} || exit
57                                 bind '#|' /mnt/aan || exit
58                                 exec aan -m $aanto $netdir <>/mnt/aan/data1 >[1=0] >[2]/dev/null &
59                         }
60                 }
61                 <>/mnt/aan/data >[1=0] >[2]/dev/null {
62                         rfork n
63                         fn server {
64                                 echo -n aanserver $netdir >/proc/$pid/args
65                                 rm -f /env/^('fn#server' 'fn#aanserver' 'aanto')
66                                 . <{n=`{read} && ! ~ $#n 0 && read -c $n} >[2=1]
67                         }
68                         exec tlssrv -A /bin/rc -c server
69                         exit
70                 }
71         }
72         fn aanclient {
73                 host=`{echo $host | sed 's/(.*)!([^!]+)$/\1/'}^!^`{read | sed 's/(.*)!([^!]+)$/\2/'} || exit
74                 tlsclient -a -o <>{rfork s; aan -m $aanto -c $host >[1=0]} /bin/rc -c 'sendscript $*' $*
75         }
76         exec $argv0 -k $"keyspec $host <{builtin whatis aanserver; pvar aanto; echo aanserver} aanclient $*
77         exit
78 }
79
80 switch($host){
81 case *!*!*;
82 case *!*; host=$host!rcpu
83 case *; host=net!$host!rcpu
84 }
85
86 exec tlsclient -ak $"keyspec $host /bin/rc -c 'sendscript $*' $*