ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/shell.pl
Revision: 1.8
Committed: Sat Aug 11 19:59:20 2001 UTC (22 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.7: +11 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 # a server command shell
2
3 use Coro;
4 use Coro::Handle;
5 use Coro::Socket;
6 use Event;
7 use Time::HiRes 'time';
8
9 my $last_ts = time;
10
11 sub shell {
12 my $fh = shift;
13
14 while (defined (print $fh "cmd> "), $_ = <$fh>) {
15 s/\015?\012$//;
16 chomp;
17 if (/^q/) {
18 Event::unloop;
19 } elsif (/^i/) {
20 $::NOW = time+1e-6;
21 my @data;
22 for (values %conn::conn) {
23 for (values %$_) {
24 next unless $_;
25 my $rate = sprintf "%.1f", $_->{written} / ($::NOW - $_->{time});
26 push @data, "$_->{country}/$_->{remote_addr} $_->{written} $rate $_->{method} $_->{uri}\n";
27 }
28 }
29 print $fh sort @data;
30 print $fh scalar@data, " connections\n";#d#
31 print $fh "$::written bytes written in the last ",$::NOW - $last_ts, " seconds\n";
32 printf $fh "(%.1f bytes/s)\n", $::written / ($::NOW - $last_ts);
33 ($last_ts, $::written) = ($::NOW, 0);
34 } elsif (/^ref/) {
35 read_blocklist;
36 } elsif (/^r/) {
37 $::RESTART = 1;
38 unloop;
39 print $fh "bye bye.\n";
40 last;
41 } elsif (/^co\S*\s+(\S+)/) {
42 print $fh ip_request($1), "\n";
43 } else {
44 print $fh "try quit, info, restart, refresh\n";
45 }
46 }
47 }
48
49 # bind to tcp port
50 if ($CMDSHELL_PORT) {
51 my $port = new Coro::Socket
52 LocalAddr => "127.0.0.1",
53 LocalPort => $CMDSHELL_PORT,
54 ReuseAddr => 1,
55 Listen => 1,
56 or die "unable to bind cmdshell port: $!";
57
58 push @listen_sockets, $port;
59
60 async {
61 while () {
62 async \&shell, scalar $port->accept;
63 }
64 };
65 }
66
67 # bind to stdin (debug)
68 if (1) {
69 my $tty;
70 open $tty, "+</dev/tty"
71 and async \&shell, unblock $tty;
72 }
73