extend the Web interface protocol further
[spider.git] / perl / DXCommandmode.pm
index 14e0dd2c9b8e599a856ddbb76410755d1efa5d48..9a00febbf44ca90c58afabacf49980e10afedb97 100644 (file)
@@ -13,6 +13,8 @@ package DXCommandmode;
 
 @ISA = qw(DXChannel);
 
+require 5.10.1;
+
 use POSIX qw(:math_h);
 use DXUtil;
 use DXChannel;
@@ -39,6 +41,7 @@ use DXXml;
 use AsyncMsg;
 use JSON;
 use Time::HiRes qw(gettimeofday tv_interval);
+use Regexp::IPv6 qw($IPv6_re);
 
 use Mojo::IOLoop;
 use Mojo::IOLoop::ForkCall;
@@ -109,6 +112,13 @@ sub start
        $pagelth = $default_pagelth unless defined $pagelth;
        $self->{pagelth} = $pagelth;
        ($self->{width}) = $line =~ /width=(\d+)/; $line =~ s/\s*width=\d+\s*//;
+       if ($line =~ /host=/) {
+               ($self->{hostname}) = $line =~ /host=(\d+\.\d+\.\d+\.\d+)/; $line =~ s/\s*host=\d+\.\d+\.\d+\.\d+//;
+               unless ($self->{hostname}) {
+                       ($self->{hostname}) = $line =~ /host=($IPv6_re)/; 
+            $line =~ s/\s*host=$IPv6_re//;
+               }
+       }
        $self->{width} = 80 unless $self->{width} && $self->{width} > 80;
        $self->{consort} = $line;       # save the connection type
        
@@ -567,7 +577,7 @@ sub process
        my $dxchan;
        
        foreach $dxchan (@dxchan) {
-               next unless $dxchan->{sort} eq 'U';  
+               next unless $dxchan->is_user;  
        
                # send a outstanding message prompt if required
                if ($t >= $dxchan->lastmsgpoll + $msgpolltime) {
@@ -661,7 +671,7 @@ sub broadcast
        my $s = shift;                          # the line to be rebroadcast
        
     foreach my $dxchan (DXChannel::get_all()) {
-               next unless $dxchan->{sort} eq 'U'; # only interested in user channels  
+               next unless $dxchan->is_user; # only interested in user channels  
                next if grep $dxchan == $_, @_;
                $dxchan->send($s);                      # send it
        }
@@ -670,7 +680,7 @@ sub broadcast
 # gimme all the users
 sub get_all
 {
-       return grep {$_->{sort} eq 'U'} DXChannel::get_all();
+       return grep {$_->is_user} DXChannel::get_all();
 }
 
 # run a script for this user
@@ -1256,16 +1266,15 @@ sub _diffms
 {
        return unless isdbg('chan');
        my $call = shift;
-       my $a = shift;
-       my $b = shift || [gettimeofday];
-       my $prefix = shift;
+       my $line = shift;
+       my $ta = shift;
+       my $tb = shift || [gettimeofday];
 
-       my $secs = $b->[0] - $a->[0];
-       my $msecs = int(($b->[1] - $a->[1]) / 1000);
+       my $a = int($ta->[0] * 1000) + int($ta->[1] / 1000); 
+       my $b = int($tb->[0] * 1000) + int($tb->[1] / 1000);
+       my $msecs = $b - $a;
 
-       my $s = "forkcall stats: $call ";
-       $s .= "$prefix " if $prefix;
-       $s .= "${secs}S" if $secs;
+       my $s = "forkcall stats: $call '$line' ";
        $s .= "${msecs}mS";
        dbg($s);
 }
@@ -1280,10 +1289,11 @@ sub _diffms
 #       IT DOES NOT START UP SOME NEW PROGRAM AND RELIES ON THE FACT THAT IT IS RUNNING DXSPIDER 
 #       THE CURRENT CONTEXT!!
 # 
-# call: $self->spawn_cmd(\<function>, [cb => sub{...}], [prefix => "cmd> "], [progress => 0|1], [args => [...]]);
+# call: $self->spawn_cmd($original_cmd_line, \<function>, [cb => sub{...}], [prefix => "cmd> "], [progress => 0|1], [args => [...]]);
 sub spawn_cmd
 {
        my $self = shift;
+       my $line = shift;
        my $cmdref = shift;
        my $call = $self->{call};
        my %args = @_;
@@ -1324,7 +1334,7 @@ sub spawn_cmd
                                                 $dxchan->send(@res);
                                         }
                                 }
-                                _diffms($call, $t0, [gettimeofday], $prefix);
+                                _diffms($call, $line, $t0);
                         });
        
        return @out;