X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=c4f31232ea0ce2537d6b0bc8ee0f395f74b8399f;hb=378cbf24f1b918e78d8b93c9e7ce3cf46fe28ec7;hp=07c442f7a0e55a7f59d983f8bc8540ad0f0b920d;hpb=b29620c18cf281d199ce92bdb45e733198df2717;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index 07c442f7..c4f31232 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -49,7 +49,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $eph_pc15_restime $pc9x_past_age $pc9x_dupe_age $pc10_dupe_age $pc92_slug_changes $last_pc92_slug $pc92Ain $pc92Cin $pc92Din $pc92Kin $pc9x_time_tolerance - $pc92filterdef $senderverify $pc11_dwell_time $pc11_extract_route + $pc92filterdef $senderverify $pc11_dwell_time $pc11_extract_route $pc92_ad_enabled $pc92c_ipaddr_enabled ); $pc9x_dupe_age = 60; # catch loops of circular (usually) D records @@ -141,7 +141,9 @@ sub handle_10 } # convert this to a PC93, coming from mycall with origin set and process it as such - $main::me->normal(pc93($to, $from, $via, $pc->[3], $pc->[6])); + my $ref = Route::get($pc->[6]); + my $ip = $ref->ip; + $main::me->normal(pc93($to, $from, $via, $pc->[3], $pc->[6]), $ip); } my %pc11_saved; # delayed PC11s @@ -258,42 +260,11 @@ sub handle_11 } # Populate the routing table - my $rn = Route::Node::get($pc->[7]); - unless ($rn) { - $rn = Route::Node->new($pc->[7]); - dbg("ROUTE $self->{call}: ADD NEW node: $pc->[7]") if isdbg('pc11'); - } + $self->populate_routing_table($pc->[7], $pc->[6], $pc->[8]); my $r = Route::User::get($pc->[6]); - unless ($r) { - $rn->add_user($pc->[6], 0, undef); - dbg("ROUTE $self->{call}: ADD NEW user: $pc->[6] -> $pc->[7]") if isdbg('pc11'); - $r = Route::User::get($pc->[6]); - } - - # Add/Change any IP address info if ($pcno == 61) { - - # as we have a route to a user, if it (or the node) does not exist then create them - # link the user to the node if not already done. - # then add or alter the IP address - if ($pc->[8]) { - my $new = $pc->[8]; - if ($r) { - if ($r->ip ne $new) { - if ($r->ip) { - my $old = $r->ip; - $r->ip($new); - dbg("ROUTE $self->{call}: ALTER IP node: $pc->[7] user: $pc->[6] old IP: '$old'-> new IP: '$new'") if isdbg('pc11'); - } else{ - $r->ip($new); - dbg("ROUTE $self->{call}: NEW IP node: $pc->[7] user: $pc->[6] IP: '$new'") if isdbg('pc11'); - } - } - } else { - dbg("ROUTE $self->{call}: ADD Failed for node $pc->[7] user $pc->[6]") if isdbg('pc11'); - } - } else { - dbg("PCPROT: ROUTE $self->{call} NO IP ADDRESS in '$line'!"); + unless ($pc->[8] && is_ipaddr($pc->[8])) { + dbg("PCPROT: ROUTE $self->{call} NO IP ADDRESS in '$line'!"); } } @@ -320,7 +291,7 @@ sub handle_11 delete $pc11_saved{$key}; # because we have promoted it, no longer needed. # so unlike the promotion by route, there is a stored, but uncounted PC11 - # which have discarded. But we have chosed to use better PC61 that's just come in + # which have discarded. But we have chosen to use better PC61 that's just come in # so we allow the PC61 to be counted later, but count the now discarded PC11 # because it *did* come in. ++$pc11_rx; @@ -892,9 +863,11 @@ sub handle_18 $self->state('init'); my $parent = Route::Node::get($self->{call}); - + + my ($software, $version, $build) = (undef, 0, 0); + # record the type and version offered - if (my ($software, $version) = $pc->[1] =~ /(DXSpider|CC\s*Cluster)\s+Version: (\d+(?:\.\d+)?)/i) { + if (($software, $version) = $pc->[1] =~ /(DXSpider|CC\s*Cluster)\s+Version: (\d+(?:\.\d+)?)/i) { $version += 0; $version += 53 if $version < 6; $self->{version} = $version; @@ -914,7 +887,7 @@ sub handle_18 $self->sort('S'); } # $self->{handle_xml}++ if DXXml::available() && $pc->[1] =~ /\bxml/; - } elsif (my ($software, $version, $build) = $pc->[1] =~ /(AR-Cluster)\s+Version:\s+(\d+\.\d+).?(\d+\.\d+)?/) { + } elsif (($software, $version, $build) = $pc->[1] =~ /(AR-Cluster)\s+Version:\s+(\d+\.\d+).?(\d+\.\d+)?/) { dbg("$self->{call} = $software version $version build $build"); $self->{version} = $version; $self->user->version($version); @@ -2350,7 +2323,10 @@ sub handle_92 $self->route_pc16($pcall, undef, $parent, @pc16) if @pc16; } - # broadcast it if we get here + # broadcast it if we get here (but not if it's an A or D record and pc92_ad_enabled isn't set; + if ($sort eq 'A' || $sort eq 'D') { + return unless $pc92_ad_enabled; + } $self->broadcast_route_pc9x($pcall, undef, $line, 0); } @@ -2418,7 +2394,11 @@ sub handle_93 my $via = uc $pc->[5]; my $text = $pc->[6]; my $onode = uc $pc->[7]; - $onode = $pcall if @$pc <= 8; + my $ipaddr = $pc->[8]; + + $onode = undef unless $onode && is_callsign($onode); + $onode //= $pcall; + $ipaddr = undef unless $ipaddr && is_ipaddr($ipaddr); # this is catch loops caused by bad software ... if (eph_dup("PC93|$from|$text|$onode", $pc10_dupe_age)) { @@ -2457,6 +2437,8 @@ sub handle_93 } } + $self->populate_routing_table($onode, $from, $ipaddr); + # if it is routeable then then treat it like a talk my $ref = Route::get($to); if ($ref) { @@ -2535,4 +2517,49 @@ sub handle_default } } +# does what it says on the tin.. +sub populate_routing_table +{ + my ($self, $node, $user, $ip) = @_; + + my $rn = Route::Node::get($node); + unless ($rn) { + $rn = Route::Node->new($node); + dbg("ROUTE $self->{call}: ADD NEW node: $node") if isdbg('pc11'); + } + + my $ru; + if ($user ne $node) { + $ru = Route::User::get($user); + unless ($ru) { + $rn->add_user($user, 0, undef); + dbg("ROUTE $self->{call}: ADD NEW user: $user -> $node") if isdbg('pc11'); + } + $ru = Route::User::get($user); + } + + # Add/Change any IP address info + + # as we have a route to a user, if it (or the node) does not exist then create them + # link the user to the node if not already done. + # then add or alter the IP address + if ($ip && is_ipaddr($ip)) { + my $new = $ip; + if ($ru) { + if ($ru->ip ne $new) { + if ($ru->ip) { + my $old = $ru->ip; + $ru->ip($new); + dbg("ROUTE $self->{call}: ALTER IP node: $node user: $user old IP: '$old'-> new IP: '$new'") if isdbg('pc11'); + } else{ + $ru->ip($new); + dbg("ROUTE $self->{call}: NEW IP node: $node user: $user IP: '$new'") if isdbg('pc11'); + } + } + } else { + dbg("ROUTE $self->{call}: ADD Failed for node $node user $user") if isdbg('pc11'); + } + } +} + 1;