staging commt for badword and badip
[spider.git] / perl / DXProt.pm
index 7c1ed1a4e0d2a976015d465abfb465e2409357f2..ac675f7cafefa6496064a65172c27a9a6bc32e88 100644 (file)
@@ -33,9 +33,10 @@ use Route;
 use Route::Node;
 use Script;
 use DXProtHandle;
+use DXCIDR;
 
 use Time::HiRes qw(gettimeofday tv_interval);
-use Mojo::IOLoop::Subprocess;
+use DXSubprocess;
 
 use strict;
 
@@ -49,7 +50,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim
                        %pc92_find $pc92_find_timeout $pc92_short_update_period
                        $next_pc92_obs_timeout $pc92_slug_changes $last_pc92_slug
                        $pc92_extnode_update_period $pc50_interval
-                       $pc92_keepalive_period
+                       $pc92_keepalive_period $senderverify
                   );
 
 $pc11_max_age = 1*3600;                        # the maximum age for an incoming 'real-time' pc11
@@ -82,6 +83,8 @@ $pc92_extnode_update_period = 1*60*60; # the update period for external nodes
 $pc92_keepalive_period = 1*60*60;      # frequency of PC92 K (keepalive) records
 %pc92_find = ();                               # outstanding pc92 find operations
 $pc92_find_timeout = 30;               # maximum time to wait for a reply
+$senderverify = 0;                             # 1 = check spotter is on node it says it is and check ip address if available
+                                # 2 = do 1 and dump if check 
 
 
 @checklist =
@@ -254,6 +257,7 @@ sub init
        $main::me->{version} = $main::version;
        $main::me->{build} = $main::build;
        $main::me->{do_pc9x} = 1;
+       $main::me->{hostname} = $main::clusteraddr;
        $main::me->update_pc92_next($pc92_short_update_period);
        $main::me->update_pc92_keepalive;
 }
@@ -294,9 +298,9 @@ sub start
        # log it
        my $host = $self->{conn}->peerhost;
        $host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport};
+       $host ||= $host if is_ipaddr($host);
        $host ||= "unknown";
        $self->{hostname} = $host if is_ipaddr($host);
-
        Log('DXProt', "$call connected from $host");
 
        # remember type of connection
@@ -425,14 +429,15 @@ sub normal
                }
        }
 
+       my $origin = $self->{call};
+
        if (defined &Local::pcprot) {
                my $r;
-               eval { $r = Local::pcprot($self, $pcno, $line, @field); };
+               eval { $r = Local::pcprot($self, $pcno, $line,  $origin, \@field); };
                return if $r;                   # i.e don't process it
        }
 
        # send it out for processing
-       my $origin = $self->{call};
        no strict 'subs';
        my $sub = "handle_$pcno";
 
@@ -536,6 +541,8 @@ sub process
        if ($main::systime - 3600 > $last_hour) {
                $last_hour = $main::systime;
        }
+
+    pc11_process();
 }
 
 #
@@ -560,6 +567,8 @@ sub send_dx_spot
        foreach $dxchan (@dxchan) {
                next if $dxchan == $main::me;
                next if $dxchan == $self && $self->is_node;
+               next if $dxchan == $self;
+               next if $dxchan->is_rbn;
                if ($line =~ /PC61/ && !($dxchan->is_spider || $dxchan->is_user)) {
                        unless ($pc11) {
                                my @f = split /\^/, $line;
@@ -620,6 +629,7 @@ sub send_wwv_spot
        foreach $dxchan (@dxchan) {
                next if $dxchan == $main::me;
                next if $dxchan == $self && $self->is_node;
+               next if $dxchan->is_rbn;
                my $routeit;
                my ($filter, $hops);
 
@@ -654,6 +664,7 @@ sub send_wcy_spot
        foreach $dxchan (@dxchan) {
                next if $dxchan == $main::me;
                next if $dxchan == $self;
+               next if $dxchan->is_rbn;
 
                $dxchan->wcy($line, $self->{isolate}, @_, $self->{call}, @dxcc);
        }
@@ -729,6 +740,7 @@ sub send_announce
        }
 
        Log('ann', $target, $from, $text);
+       AnnTalk::add_anncache('ann', $target, $from, $text);
 
        # send it if it isn't the except list and isn't isolated and still has a hop count
        # taking into account filtering and so on
@@ -737,6 +749,7 @@ sub send_announce
                next if $dxchan == $self && $self->is_node;
                next if $from_pc9x && $dxchan->{do_pc9x};
                next if $target eq 'LOCAL' && $dxchan->is_node;
+               next if $dxchan->is_rbn;
                $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call},
                                                  @a[0..2], @b[0..2]);
        }
@@ -809,6 +822,7 @@ sub send_chat
                        next unless $dxchan->is_spider && $dxchan->do_pc9x;
                        next if $target eq 'LOCAL';
                }
+               next if $dxchan->is_rbn;
 
                $dxchan->chat($line, $self->{isolate}, $target, $_[1],
                                          $text, @_, $self->{call}, @a[0..2], @b[0..2]);
@@ -865,11 +879,11 @@ sub send_local_config
        my @remotenodes;
 
        if ($self->{isolate}) {
-               dbg("send_local_config: isolated");
+               dbg("$self->{call} send_local_config: isolated");
                @localnodes = ( $main::routeroot );
                $self->send_route($main::mycall, \&pc19, 1, $main::routeroot);
        } elsif ($self->{do_pc9x}) {
-               dbg("send_local_config: doing pc9x");
+               dbg("$self->{call} send_local_config: doing pc9x");
                my $node = Route::Node::get($self->{call});
 #              $self->send_last_pc92_config($main::routeroot);
 #              $self->send(pc92a($main::routeroot, $node)) unless $main::routeroot->last_PC92C =~ /$self->{call}/;
@@ -880,7 +894,7 @@ sub send_local_config
                # and are not themselves isolated, this to make sure that isolated nodes
                # don't appear outside of this node
 
-               dbg("send_local_config: traditional");
+               dbg("$self->{call} send_local_config: traditional");
 
                # send locally connected nodes
                my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes();
@@ -922,7 +936,7 @@ sub gen_my_pc92_config
                clear_pc92_changes();           # remove any slugged data, we are generating it as now
                my @dxchan = grep { $_->call ne $main::mycall && !$_->{isolate} } DXChannel::get_all();
                dbg("ROUTE: all dxchan: " . join(',', map{$_->{call}} @dxchan)) if isdbg('routelow');
-               my @localnodes = map { my $r = Route::get($_->{call}); $r ? $r : () } @dxchan;
+               my @localnodes = map { my $r = Route::get($_->{call}); ($_->is_node || $_->is_user) && $r ? $r : () } @dxchan;
                dbg("ROUTE: localnodes: " . join(',', map{$_->{call}} @localnodes)) if isdbg('routelow');
                return pc92c($node, @localnodes);
        } else {
@@ -1068,7 +1082,7 @@ sub get_hops
 {
        my $pcno = shift;
        my $hops = $DXProt::hopcount{$pcno};
-       $hops = $DXProt::def_hopcount if !$hops;
+       $hops = $DXProt::def_hopcount unless $hops;
        return "H$hops";
 }
 
@@ -1118,6 +1132,7 @@ sub load_hops
 sub process_rcmd
 {
        my ($self, $tonode, $fromnode, $user, $cmd) = @_;
+
        if ($tonode eq $main::mycall) {
                my $ref = DXUser::get_current($fromnode);
                unless ($ref && UNIVERSAL::isa($ref, 'DXUser')) {
@@ -1125,13 +1140,13 @@ sub process_rcmd
                        $self->send_rcmd_reply($main::mycall, $fromnode, $user, "sorry...!");
                        return;
                }
+               Log('rcmd', 'in', ($ref->{priv}||0), $fromnode, $cmd, $user);
                my $cref = Route::Node::get($fromnode);
                unless ($cref && UNIVERSAL::isa($cref, 'Route')) {
                        dbg("DXProt process_rcmd: Route $fromnode isn't a reference (tell G1TLH)"); 
                        $self->send_rcmd_reply($main::mycall, $fromnode, $user, "sorry...!");
                        return;
                }
-               Log('rcmd', 'in', ($ref->{priv}||0), $fromnode, $cmd);
                if ($cmd !~ /^\s*rcmd/i && $ref->homenode && $cref->call eq $ref->homenode) { # not allowed to relay RCMDS!
                        if ($ref->{priv}) {             # you have to have SOME privilege, the commands have further filtering
                                $self->{remotecmd} = 1; # for the benefit of any command that needs to know
@@ -1173,7 +1188,7 @@ sub send_rcmd_reply
        while (@_) {
                my $line = shift;
                $line =~ s/\s*$//;
-               Log('rcmd', 'out', $fromnode, $line);
+               Log('rcmd', 'out', $fromnode, $line, $user);
                if ($self->is_clx) {
                        $self->send(pc85($main::mycall, $fromnode, $user, "$main::mycall:$line"));
                } else {
@@ -1214,20 +1229,34 @@ sub spawn_cmd
 
        no strict 'refs';
                
-       my $fc = Mojo::IOLoop::Subprocess->new;
+       my $fc = DXSubprocess->new;
+
+       # just behave normally if something has set the "one-shot" _nospawn in the channel
+       if ($self->{_nospawn}) {
+               eval { @out = $cmdref->(@$args); };
+               if ($@) {
+                       DXDebug::dbgprintring(25);
+                       push @out, DXDebug::shortmess($@);
+               }
+               return @out;
+       }
 
        #       $fc->serializer(\&encode_json);
 #      $fc->deserializer(\&decode_json);
        $fc->run(
                         sub {
                                 my $subpro = shift;
-                                if (isdbg('chan')) {
-                                        my $s = "line: $line";
-                                        $s .= ", args: " . join(', ', @$args) if $args && @$args;
+                                if (isdbg('progress')) {
+                                        my $s = qq{line: "$line"};
+                                        $s .= ", args: " . join(', ', map { defined $_ ? qq{'$_'} : q{'undef'} } @$args) if $args && @$args;
+                                        dbg($s);
                                 }
-
-                                my @res = $cmdref->(@$args);
-                                return @res;
+                                eval { @out = $cmdref->(@$args); };
+                                if ($@) {
+                                        DXDebug::dbgprintring(25);
+                                        push @out, DXDebug::shortmess($@);
+                                }
+                                return @out;
                         },
 #                       $args,
                         sub {
@@ -1256,7 +1285,7 @@ sub spawn_cmd
                                                 $self->send(@res);
                                         }
                                 }
-                                DXCommandmode::_diffms($call, $line, $t0);
+                                diffms("rcmd from $user on $call", $line, $t0, scalar @res) if isdbg('progress');
                         });
        
        return @out;
@@ -1751,6 +1780,8 @@ sub import_chat
                                my $via = $target;
                                $via = '*' if $target eq 'ALL' || $target eq 'SYSOP';
                                Log('ann', $target, $main::mycall, $text);
+                               AnnTalk::add_anncache('ann', $target, $main::mycall, $text);
+                               
                                $main::me->normal(DXProt::pc93($target, $main::mycall, $via, $text));
                        } else {
                                DXCommandmode::send_chats($main::me, $target, $text);