+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
$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.
}
my $last;
+my $pc11_saved;
+my $pc11_saved_time;
# DX Spot handling
sub handle_11
my $line = shift;
my $origin = shift;
my $pc = shift;
+ my $recurse = shift || 0;
# route 'foreign' pc26s
if ($pcno == 26) {
}
}
+ 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
}
}
+ # 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.
# 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
$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;