many changes (see Changes)
[spider.git] / perl / DXProt.pm
index b5606eff609d9d61896f2b8558a1bb0444efef91..bf2d5ed30395899d488fa4f2315f190c930d71fd 100644 (file)
@@ -33,6 +33,7 @@ use Route;
 use Route::Node;
 use Script;
 use DXProtHandle;
+use DXCIDR;
 
 use Time::HiRes qw(gettimeofday tv_interval);
 use DXSubprocess;
@@ -49,7 +50,8 @@ 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 $pc92_ad_enabled
+                       $pc92c_ipaddr_enable
                   );
 
 $pc11_max_age = 1*3600;                        # the maximum age for an incoming 'real-time' pc11
@@ -82,7 +84,10 @@ $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
+$pc92_ad_enabled = 1;                  # send pc92 A & D records.
+$pc92c_ipaddr_enable = 0;              # add the local ip address info to each callsign in a PC92 C
 
 @checklist =
 (
@@ -295,9 +300,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
@@ -426,14 +431,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";
 
@@ -537,6 +543,8 @@ sub process
        if ($main::systime - 3600 > $last_hour) {
                $last_hour = $main::systime;
        }
+
+    pc11_process();
 }
 
 #
@@ -561,6 +569,7 @@ 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) {
@@ -733,6 +742,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
@@ -928,7 +938,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 {
@@ -1074,7 +1084,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";
 }
 
@@ -1413,12 +1423,13 @@ sub talk
 {
        my ($self, $from, $to, $via, $line, $origin) = @_;
 
+       my $ipaddr = DXCommandmode::alias_localhost($self->hostname || '127.0.0.1');
        if ($self->{do_pc9x}) {
-               $self->send(pc93($to, $from, $via, $line));
+               $self->send(pc93($to, $from, $via, $line, undef, $ipaddr));
        } else {
                $self->send(pc10($from, $to, $via, $line, $origin));
        }
-       Log('talk', $to, $from, '>' . ($via || $origin || $self->call), $line) unless $origin && $origin ne $main::mycall;
+       Log('talk', $to, $from, '>' . ($via || $origin || $self->call), $line, $ipaddr) unless $origin && $origin ne $main::mycall;
 }
 
 # send it if it isn't the except list and isn't isolated and still has a hop count
@@ -1636,6 +1647,7 @@ sub route_pc92c
        my $self = shift;
        my $origin = shift;
        my $line = shift;
+
        broadcast_route_pc9x($self, $origin, \&pc92c, $line, 1, @_);
 }
 
@@ -1644,6 +1656,7 @@ sub route_pc92a
        my $self = shift;
        my $origin = shift;
        my $line = shift;
+       return unless $pc92_ad_enabled;
        broadcast_route_pc9x($self, $origin, \&pc92a, $line, 1, @_);
 }
 
@@ -1652,6 +1665,7 @@ sub route_pc92d
        my $self = shift;
        my $origin = shift;
        my $line = shift;
+       return unless $pc92_ad_enabled;
        broadcast_route_pc9x($self, $origin, \&pc92d, $line, 1, @_);
 }
 
@@ -1772,7 +1786,9 @@ sub import_chat
                                my $via = $target;
                                $via = '*' if $target eq 'ALL' || $target eq 'SYSOP';
                                Log('ann', $target, $main::mycall, $text);
-                               $main::me->normal(DXProt::pc93($target, $main::mycall, $via, $text));
+                               AnnTalk::add_anncache('ann', $target, $main::mycall, $text);
+                               my $ipaddr = DXCommandmode::alias_localhost($main::me->hostname || '127.0.0.1');
+                               $main::me->normal(DXProt::pc93($target, $main::mycall, $via, $text, undef, $ipaddr));
                        } else {
                                DXCommandmode::send_chats($main::me, $target, $text);
                        }