fix users delete? messages, local::pcprot()
[spider.git] / perl / DXProt.pm
index 1f631120800c42db0de01096540941b08d981d48..67dc56632d80b4d2e06abcb509daa2d239c7c71e 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 {
@@ -1215,7 +1229,7 @@ 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}) {
@@ -1233,8 +1247,8 @@ sub spawn_cmd
                         sub {
                                 my $subpro = shift;
                                 if (isdbg('progress')) {
-                                        my $s = "line: $line";
-                                        $s .= ", args: " . join(', ', @$args) if $args && @$args;
+                                        my $s = qq{line: "$line"};
+                                        $s .= ", args: " . join(', ', map { defined $_ ? qq{'$_'} : q{'undef'} } @$args) if $args && @$args;
                                         dbg($s);
                                 }
                                 eval { @out = $cmdref->(@$args); };
@@ -1766,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);