X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=99fc85ce7e3c42723bec9a8c5da038f2d540beb9;hb=575db552c5a635ce2eb431de07f568113374735f;hp=c7cd41b77cec153ca0b6a83c5aefddafab9dee2b;hpb=2b44cbaa7a18bf641aec3439384dd1fb10b99752;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index c7cd41b7..99fc85ce 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -30,11 +30,12 @@ use Geomag; use WCY; use Time::HiRes qw(gettimeofday tv_interval); use BadWords; +use DXHash; use strict; use vars qw($me $pc11_max_age $pc23_max_age $last_hour %pings %rcmds - %nodehops @baddx $baddxfn $censorpc + %nodehops $baddx $badspotter $badnode $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist); $me = undef; # the channel id for this cluster @@ -45,10 +46,11 @@ $last_hour = time; # last time I did an hourly periodic update %pings = (); # outstanding ping requests outbound %rcmds = (); # outstanding rcmd requests outbound %nodehops = (); # node specific hop control -@baddx = (); # list of illegal spotted callsigns $censorpc = 0; # Do a BadWords::check on text fields and reject things - -$baddxfn = "$main::data/baddx.pl"; + # loads of 'bad things' +$baddx = new DXHash "baddx"; +$badspotter = new DXHash "badspotter"; +$badnode = new DXHash "badnode"; @checklist = ( @@ -177,10 +179,6 @@ sub init do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl"; confess $@ if $@; $me->{sort} = 'S'; # S for spider - - # load the baddx file - do "$baddxfn" if -e "$baddxfn"; - print "$@\n" if $@; } # @@ -332,8 +330,14 @@ sub normal } # if this is a 'nodx' node then ignore it - if (grep $field[7] =~ /^$_/, @DXProt::nodx_node) { - dbg('chan', "PCPROT: Bad DXNode, dropped"); + if ($badnode->in($field[7])) { + dbg('chan', "PCPROT: Bad Node, dropped"); + return; + } + + # if this is a 'bad spotter' user then ignore it + if ($badspotter->in($field[6])) { + dbg('chan', "PCPROT: Bad Spotter, dropped"); return; } @@ -346,7 +350,7 @@ sub normal } # is it 'baddx' - if (grep $field[2] eq $_, @baddx) { + if ($baddx->in($field[2])) { dbg('chan', "PCPROT: Bad DX spot, ignored"); return; } @@ -848,7 +852,7 @@ sub normal } else { my $ref = DXUser->get_current($field[1]); if ($ref && $ref->is_clx) { - route($field[1], pc84($field[2], $field[1], $field[2], $field[3])); + $self->route($field[1], pc84($field[2], $field[1], $field[2], $field[3])); } else { $self->route($field[1], $line); } @@ -871,7 +875,7 @@ sub normal } else { my $ref = DXUser->get_current($field[1]); if ($ref && $ref->is_clx) { - route($field[1], pc85($field[2], $field[1], $field[2], $field[3])); + $self->route($field[1], pc85($field[2], $field[1], $field[2], $field[3])); } else { $self->route($field[1], $line); } @@ -956,7 +960,7 @@ sub normal $dxchan->send($dxchan->msg('pingi', $field[2], $s, $ave)) } elsif ($dxchan->is_node) { if ($tochan) { - $tochan->{nopings} = 2; # pump up the timer + $tochan->{nopings} = $tochan->user->nopings || 2; # pump up the timer push @{$tochan->{pingtime}}, $t; shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6; my $st; @@ -1040,7 +1044,7 @@ sub normal if ($ref && $ref->is_clx) { $self->route($field[1], $line); } else { - route($field[1], pc34($field[2], $field[1], $field[4])); + $self->route($field[1], pc34($field[2], $field[1], $field[4])); } } return; @@ -1068,7 +1072,7 @@ sub normal if ($ref && $ref->is_clx) { $self->route($field[1], $line); } else { - route($field[1], pc35($field[2], $field[1], $field[4])); + $self->route($field[1], pc35($field[2], $field[1], $field[4])); } } return; @@ -1475,12 +1479,20 @@ sub route unless ($dxchan) { my $cl = DXCluster->get_exact($call); $dxchan = $cl->dxchan if $cl; + if (ref $dxchan) { + if (ref $self && $dxchan eq $self) { + dbg('chan', "PCPROT: Trying to route back to source, dropped"); + return; + } + } } if ($dxchan) { my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name if ($routeit) { $dxchan->send($routeit); } + } else { + dbg('chan', "PCPROT: No route available, dropped"); } }