X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=0bd23a7ea16e9c80ed95500d092d113e95caec6b;hb=bea2d5918cc83eb92a5893cb9fbb83741c1644a8;hp=4c8a70564f5df1107933fcc7d075f0dc6a8af8b5;hpb=55f3823f3ad86d76e1e995b0f255f1804684de18;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 4c8a7056..0bd23a7e 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -63,7 +63,7 @@ $last10 = $last_pc50 = time; $ann_to_talk = 1; $rspfcheck = 1; $eph_restime = 180; -$eph_info_restime = 10*60; +$eph_info_restime = 60*60; $eph_pc34_restime = 30; @checklist = @@ -185,19 +185,8 @@ sub check sub init { - my $user = DXUser->get($main::mycall); - $DXProt::myprot_version += $main::version*100; - $main::me = DXProt->new($main::mycall, 0, $user); - $main::me->{here} = 1; - $main::me->{state} = "indifferent"; do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl"; confess $@ if $@; - $main::me->{sort} = 'S'; # S for spider - $main::me->{priv} = 9; - $main::me->{metric} = 0; - $main::me->{pingave} = 0; - -# $Route::Node::me->adddxchan($main::me); } # @@ -276,7 +265,7 @@ sub start # send initialisation string unless ($self->{outbound}) { - $self->send(pc18()); + $self->sendinit; } $self->state('init'); @@ -290,6 +279,16 @@ sub start $script->run($self) if $script; } +# +# send outgoing 'challenge' +# + +sub sendinit +{ + my $self = shift; + $self->send(pc18()); +} + # # This is the normal pcxx despatcher # @@ -349,6 +348,20 @@ sub normal $to = $field[2]; } + # if this is a 'nodx' node then ignore it + if ($badnode->in($field[6]) || ($via && $badnode->in($via))) { + dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr'); + return; + } + + # if this is a 'bad spotter' user then ignore it + my $nossid = $from; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { + dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); + return; + } + # if we are converting announces to talk is it a dup? if ($ann_to_talk) { if (AnnTalk::is_talk_candidate($from, $field[3]) && AnnTalk::dup($from, $to, $field[3])) { @@ -408,7 +421,9 @@ sub normal } # if this is a 'bad spotter' user then ignore it - if ($badspotter->in($field[6])) { + my $nossid = $field[6]; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); return; } @@ -442,6 +457,7 @@ sub normal } } + my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]); # global spot filtering on INPUT if ($self->{inspotsfilter}) { @@ -451,7 +467,10 @@ sub normal return; } } - + + # 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 (Spot::dup($field[1], $field[2], $d, $field[5])) { dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr'); return; @@ -545,6 +564,20 @@ sub normal } } + # if this is a 'nodx' node then ignore it + if ($badnode->in($field[5])) { + dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr'); + return; + } + + # if this is a 'bad spotter' user then ignore it + my $nossid = $field[1]; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { + dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); + return; + } + if ($field[2] eq '*' || $field[2] eq $main::mycall) { @@ -617,7 +650,7 @@ sub normal next unless $call && $conf && defined $here && is_callsign($call); next if $call eq $main::mycall; - eph_del_regex("^PC17\^$call\^$ncall"); + eph_del_regex("^PC17\\^$call\\^$ncall"); $conf = $conf eq '*'; @@ -664,12 +697,7 @@ sub normal my $ncall = $field[2]; my $ucall = $field[1]; - if (eph_dup($line)) { - dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); - return; - } - - eph_del_regex("^PC16.*$ncall.*$ucall"); + eph_del_regex("^PC16\\^$ncall.*$ucall"); if ($ncall eq $main::mycall) { dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr'); @@ -697,6 +725,12 @@ sub normal return unless $self->in_filter_route($parent); $parent->del_user($uref); + + if (eph_dup($line)) { + dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); + return; + } + $self->route_pc17($parent, $uref); return; } @@ -704,6 +738,23 @@ sub normal if ($pcno == 18) { # link request $self->state('init'); + # record the type and version offered + if ($field[1] =~ /DXSpider Version: (\d+\.\d+) Build: (\d+\.\d+)/) { + $self->version(53 + $1); + $self->user->version(53 + $1); + $self->build(0 + $2); + $self->user->build(0 + $2); + unless ($self->is_spider) { + $self->user->sort('S'); + $self->user->put; + $self->sort('S'); + } + } else { + $self->version(50.0); + $self->version($field[2] / 100) if $field[2] && $field[2] =~ /^\d+$/; + $self->user->version($self->version); + } + # first clear out any nodes on this dxchannel my $parent = Route::Node::get($self->{call}); my @rout = $parent->del_nodes; @@ -739,7 +790,7 @@ sub normal my $ver = $field[$i+3]; next unless defined $here && defined $conf && is_callsign($call); - eph_del_regex("^PC(?:21\^$call|17\^[^\^]+\^$call)"); + eph_del_regex("^PC(?:21\\^$call|17\\^[^\\^]+\\^$call)"); # check for sane parameters # $ver = 5000 if $ver eq '0000'; @@ -751,7 +802,7 @@ sub normal my $dxchan = DXChannel->get($call); if ($dxchan && $dxchan != $self) { dbg("PCPROT: PC19 from $self->{call} trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr'); - return; + next; } # update it if required @@ -821,21 +872,15 @@ sub normal if ($pcno == 21) { # delete a cluster from the list my $call = uc $field[1]; - if (eph_dup($line)) { - dbg("PCPROT: dup PC21 detected") if isdbg('chanerr'); - return; - } - + eph_del_regex("^PC1[79].*$call"); + # if I get a PC21 from the same callsign as self then treat it # as a PC39: I have gone away if ($call eq $self->call) { $self->disconnect(1); - eph_del_regex("^PC(?:1[679]|21).*$field[1]"); return; } - eph_del_regex("^PC1[79].*$call"); - my @rout; my $parent = Route::Node::get($self->{call}); unless ($parent) { @@ -864,6 +909,11 @@ sub normal return; } +# if (eph_dup($line)) { +# dbg("PCPROT: dup PC21 detected") if isdbg('chanerr'); +# return; +# } + $self->route_pc21(@rout) if @rout; return; } @@ -989,7 +1039,7 @@ sub normal } if ($pcno == 35) { # remote command replies - eph_del_regex("^PC35\^$field[2]\^$field[1]\^"); + eph_del_regex("^PC35\\^$field[2]\\^$field[1]\\^"); $self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]); return; } @@ -1003,7 +1053,6 @@ sub normal if ($pcno == 39) { # incoming disconnect if ($field[1] eq $self->{call}) { $self->disconnect(1); - eph_del_regex("^PC(?:1[679]|21).*$field[1]"); } else { dbg("PCPROT: came in on wrong channel") if isdbg('chanerr'); } @@ -1135,11 +1184,6 @@ sub normal } else { $tochan->{pingave} = $tochan->{pingave} + (($t - $tochan->{pingave}) / 6); } -# my $st; -# for (@{$tochan->{pingtime}}) { -# $st += $_; -# } -# $tochan->{pingave} = $st / @{$tochan->{pingtime}}; $tochan->{nopings} = $nopings; # pump up the timer } } @@ -1204,6 +1248,9 @@ sub normal return; } + if ($pcno == 90) { # new style PC16,17,19,21 + return; + } } # if get here then rebroadcast the thing with its Hop count decremented (if @@ -1245,7 +1292,7 @@ sub process next unless $dxchan->is_node(); next if $dxchan == $main::me; - # send the pc50 + # send the pc50 or PC90 $dxchan->send($pc50s) if $pc50s; # send a ping out on this channel @@ -1282,6 +1329,7 @@ sub process # some active measures # + sub send_dx_spot { my $self = shift; @@ -1536,6 +1584,7 @@ sub send_local_config unshift @localnodes, $main::routeroot; } + send_route($self, \&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes); # get all the users connected on the above nodes and send them out @@ -1762,6 +1811,10 @@ sub disconnect $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); } + # get rid of any PC16 and 19s + eph_del_regex("^PC16\\^$call"); + eph_del_regex("^PC19\\^.*$call"); + # do routing stuff my $node = Route::Node::get($call); my @rout; @@ -1861,6 +1914,8 @@ sub broadcast_route foreach $dxchan (@dxchan) { next if $dxchan == $self; next if $dxchan == $main::me; + next if $dxchan->user->wantnp; + $dxchan->send_route($generate, @_); } } @@ -1908,6 +1963,12 @@ sub route_pc50 broadcast_route($self, \&pc50, 1, @_); } +sub route_pc90 +{ + my $self = shift; + broadcast_route($self, \&pc90, 1, @_); +} + sub in_filter_route { my $self = shift; @@ -1966,5 +2027,10 @@ sub eph_list } return @out; } + +sub run_cmd +{ + goto &DXCommandmode::run_cmd; +} 1; __END__