From b29626c537438016f7221c667628d5e49b9f4fce Mon Sep 17 00:00:00 2001 From: Dirk Koopman Date: Wed, 22 Dec 2021 16:02:46 +0000 Subject: [PATCH] prioritise PC61 over PC11 As promote PC11 to PC61 if the spotter's IP address is in the routing table. --- Changes | 11 +++++++ perl/DXProtHandle.pm | 71 +++++++++++++++++++++++++++++++++++++++++--- perl/Spot.pm | 4 +-- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index f072ce67..69032476 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,14 @@ +22Dec21======================================================================= +1. Add the possibility to do "sender verify" that spots (and later on, other + things like announce etc) are coming from spotters that exist on the node + that the PC11/61 says it does. At the moment, this is advisory as many + users seem to be on web clusters and many of them do not send PC61 and also + don't update the node's routing tables that normal node usage would do. +2. Prioritise PC61 spots over PC11 spots wherever possible. Also promote PC11 + spots to PC61 where the spotter's IP is known. +3. Add a shell script "perlbrew-dxspider" that can be used for starting the + node when using perlbrew (i.e. more modern perls) on older distros such + as Centos 7/8. 11Dec21======================================================================= 1. Removed dependency on perl Git package. 2. Force code to change directory to $DXSPIDER_ROOT || '/spider'. Also force diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index 84afd64d..942f6faa 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -55,7 +55,7 @@ $pc9x_time_tolerance = 15*60; # the time on a pc9x is allowed to be out by this $pc9x_past_age = (122*60)+ # maximum age in the past of a px9x (a config record might be the only $pc9x_time_tolerance; # thing a node might send - once an hour and we allow an extra hour for luck) # this is actually the partition between "yesterday" and "today" but old. -$senderverify = 1; # 1 - check for forged PC11 or PC61. +$senderverify = 0; # 1 - check for forged PC11 or PC61. # 2 - if forged, dump them. @@ -133,6 +133,8 @@ sub handle_10 } my $last; +my $pc11_saved; +my $pc11_saved_time; # DX Spot handling sub handle_11 @@ -142,6 +144,7 @@ sub handle_11 my $line = shift; my $origin = shift; my $pc = shift; + my $recurse = shift || 0; # route 'foreign' pc26s if ($pcno == 26) { @@ -151,6 +154,8 @@ sub handle_11 } } + dbg("INPUT PC$pcno $line origin $origin recurse: $recurse") if isdbg("pc11"); + # my ($hops) = $pc->[8] =~ /^H(\d+)/; # is the spotted callsign blank? This should really be trapped earlier but it @@ -220,14 +225,65 @@ sub handle_11 } } + # this is where we decide to delay PC11s in the hope that a PC61 will be along soon. + + my $key = join '|', @spot[0..2,4,7]; # not including text + unless ($recurse) { + if ($pcno == 61) { + if ($pc11_saved) { + if ($key eq $pc11_saved->[0]) { + dbg("saved PC11 spot $key dumped, better pc61 received") if isdbg("pc11"); + undef $pc11_saved; + } + } + } + if ($pcno == 11) { + if ($pc11_saved) { + if ($key eq $pc11_saved->[0]) { + dbg("saved PC11 spot $key, dupe pc11 received and dumped") if isdbg("pc11"); + return; # because it's a dup + } + } + + # can we promote this to a PC61? + my $r = Route::User::get($spot[4]); # find spotter + if ($r && $r->ip) { # do we have an ip addres + $pcno = 61; # now turn this into a PC61 + $spot[14] = $r->ip; + dbg("PC11 spot $key promoted to pc61 ip $spot[14]") if isdbg("pc11"); + undef $pc11_saved; + } + } + + if ($pc11_saved && $key ne $pc11_saved) { + dbg("saved PC11 spot $pc11_saved->[0] ne new key $key, recursing") if isdbg("pc11"); + shift @$pc11_saved; # saved key + my $self = shift @$pc11_saved; + my @saved = @$pc11_saved; + undef $pc11_saved; + $self->handle_11(@saved, 1); + } + + # if we are still a PC11, save it for a better offer + if ($pcno == 11) { + $pc11_saved = [$key, $self, $pcno, $line, $origin, $pc]; + $pc11_saved_time = $main::systime; + dbg("saved new PC11 spot $key for a better offer") if isdbg("pc11"); + return; + } else { + dbg("PC61 spot $key passed onward") if isdbg("pc11"); + } + } + + # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup # list. This allows it to come in from a "legitimate" source - if (my $key = Spot::dup(@spot[0..4,7])) { + if (Spot::dup(@spot[0..4,7])) { dbg("PCPROT: Duplicate Spot $pc->[0] $key ignored\n") if isdbg('chanerr') || isdbg('dupespot'); return; } - + # here we verify the spotter is currently connected to the node it says it is one. AKA email sender verify # but without the explicit probe to the node. We are relying on "historical" information, but it very likely # to be current once we have seen the first PC92C from that node. @@ -346,7 +402,14 @@ sub handle_11 # used to kick outstanding PC11 if required sub pc11_process { - + if ($pc11_saved && $main::systime > $pc11_saved_time) { + dbg("saved PC11 spot $pc11_saved->[0] timed out waiting, recursing") if isdbg("pc11"); + shift @$pc11_saved; # saved key + my $self = shift @$pc11_saved; + my @saved = @$pc11_saved; + undef $pc11_saved; + $self->handle_11(@saved, 1); + } } # announces diff --git a/perl/Spot.pm b/perl/Spot.pm index 92ce5249..852a3bda 100644 --- a/perl/Spot.pm +++ b/perl/Spot.pm @@ -502,9 +502,9 @@ sub dup $text =~ s/\s{2,}[\dA-Z]?[A-Z]\d?$// if length $text > 24; $text =~ s/[\W\x00-\x2F\x7B-\xFF]//g; # tautology, just to make quite sure! $text = substr($text, 0, $duplth) if length $text > $duplth; - my $ldupkey = "X$|$call|$by|$node|$freq|$d||$text"; + my $ldupkey = "X$|$call|$by|$node|$freq|$d|$text"; my $t = DXDupe::find($ldupkey); - return $ldupkey if $t && $t - $main::systime > 0; + return 1 if $t && $t - $main::systime > 0; DXDupe::add($ldupkey, $main::systime+$dupage); $otext = substr($otext, 0, $duplth) if length $otext > $duplth; -- 2.43.0