prioritise PC61 over PC11

As promote PC11 to PC61 if the spotter's IP address is in the routing
table.
This commit is contained in:
Dirk Koopman 2021-12-22 16:02:46 +00:00
parent efe672a962
commit b29626c537
3 changed files with 80 additions and 6 deletions

11
Changes
View File

@ -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

View File

@ -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

View File

@ -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;