X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=846a6c9245f3d0cdc45f8c3f08ea9e0a6e8e97ee;hb=9f7e2a3ed64a53dbb0bf2e44bcd463bceef6c45b;hp=4b96fe9608fad9b2eeebbf143c27e302cb654b82;hpb=2a43619b670b8f9249558f814b0183262c3ba4f6;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 4b96fe96..846a6c92 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -34,7 +34,14 @@ use Route; use Route::Node; use strict; -use vars qw($me $pc11_max_age $pc23_max_age + +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + +use vars qw($me $pc11_max_age $pc23_max_age $last_pc50 $last_hour $last10 %eph %pings %rcmds %nodehops $baddx $badspotter $badnode $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist); @@ -52,7 +59,7 @@ $censorpc = 1; # Do a BadWords::check on text fields and reject things $baddx = new DXHash "baddx"; $badspotter = new DXHash "badspotter"; $badnode = new DXHash "badnode"; -$last10 = time; +$last10 = $last_pc50 = time; @checklist = ( @@ -220,13 +227,14 @@ sub start $self->{isolate} = $user->{isolate}; $self->{consort} = $line; # save the connection type $self->{here} = 1; + $self->{width} = 80; # get the output filters $self->{spotsfilter} = Filter::read_in('spots', $call, 0) || Filter::read_in('spots', 'node_default', 0); $self->{wwvfilter} = Filter::read_in('wwv', $call, 0) || Filter::read_in('wwv', 'node_default', 0); $self->{wcyfilter} = Filter::read_in('wcy', $call, 0) || Filter::read_in('wcy', 'node_default', 0); $self->{annfilter} = Filter::read_in('ann', $call, 0) || Filter::read_in('ann', 'node_default', 0) ; - $self->{routefilter} = Filter::read_in('route', $call, 0) || Filter::read_in('route', 'node_default', 0) ; + $self->{routefilter} = Filter::read_in('route', $call, 0) || Filter::read_in('route', 'node_default', 0) unless $self->{isolate} ; # get the INPUT filters (these only pertain to Clusters) @@ -234,7 +242,7 @@ sub start $self->{inwwvfilter} = Filter::read_in('wwv', $call, 1) || Filter::read_in('wwv', 'node_default', 1); $self->{inwcyfilter} = Filter::read_in('wcy', $call, 1) || Filter::read_in('wcy', 'node_default', 1); $self->{inannfilter} = Filter::read_in('ann', $call, 1) || Filter::read_in('ann', 'node_default', 1); - $self->{inroutefilter} = Filter::read_in('route', $call, 1) || Filter::read_in('route', 'node_default', 1); + $self->{inroutefilter} = Filter::read_in('route', $call, 1) || Filter::read_in('route', 'node_default', 1) unless $self->{isolate}; # set unbuffered and no echo $self->send_now('B',"0"); @@ -571,7 +579,7 @@ sub normal $r->flags($flags); push @rout, $r; } - $r->addparent($ncall); + $r->addparent($parent); } else { push @rout, $parent->add_user($call, $flags); } @@ -619,11 +627,17 @@ sub normal dbg("PCPROT: Route::Node $ncall not in config") if isdbg('chanerr'); return; } + my $uref = Route::User::get($ucall); + unless ($uref) { + dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr'); + return; + } + # input filter if required return unless $self->in_filter_route($parent); - - my @rout = $parent->del_user($ucall); + + my @rout = $parent->del_user($uref); if (eph_dup($line)) { dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); @@ -640,7 +654,7 @@ sub normal # first clear out any nodes on this dxchannel my $parent = Route::Node::get($self->{call}); my @rout = $parent->del_nodes; - $self->route_pc21(@rout, $parent); + $self->route_pc21(@rout, $parent) if @rout; $self->send_local_config(); $self->send(pc20()); return; # we don't pass these on @@ -858,7 +872,7 @@ sub normal return; } - Log('DXProt', "Merge request for $field[3] spots and $field[4] WWV from $field[1]"); + Log('DXProt', "Merge request for $field[3] spots and $field[4] WWV from $field[2]"); # spots if ($field[3] > 0) { @@ -1115,20 +1129,22 @@ sub process my $t = time; my @dxchan = DXChannel->get_all(); my $dxchan; + my $pc50s; + # send out a pc50 on EVERY channel all at once + if ($t >= $last_pc50 + $DXProt::pc50_interval) { + $pc50s = pc50($me, scalar DXChannel::get_all_users); + eph_dup($pc50s); + $last_pc50 = $t; + } + foreach $dxchan (@dxchan) { next unless $dxchan->is_node(); next if $dxchan == $me; - - # send a pc50 out on this channel - $dxchan->{pc50_t} = $main::systime unless exists $dxchan->{pc50_t}; - if ($t >= $dxchan->{pc50_t} + $DXProt::pc50_interval) { - my $s = pc50($me, scalar DXChannel::get_all_users); - eph_dup($s); - $dxchan->send($s); - $dxchan->{pc50_t} = $t; - } + # send the pc50 + $dxchan->send($pc50s) if $pc50s; + # send a ping out on this channel if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { if ($dxchan->{nopings} <= 0) { @@ -1350,10 +1366,7 @@ sub send_announce foreach $dxchan (@dxchan) { next if $dxchan == $me; next if $dxchan == $self && $self->is_node; - my $routeit; - my ($filter, $hops); - - $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq) + $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq); } } @@ -1364,6 +1377,7 @@ sub announce my $isolate = shift; my $to = shift; my $target = shift; + my $text = shift; my ($filter, $hops); if ($self->{annfilter}) { @@ -1391,7 +1405,7 @@ sub send_local_config # create a list of all the nodes that are not connected to this connection # and are not themselves isolated, this to make sure that isolated nodes # don't appear outside of this node - my @dxchan = grep { $_->call ne $main::mycall && $_->call ne $self->{call} } DXChannel::get_all_nodes(); + my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes(); @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan; my @intcalls = map { $_->nodes } @localnodes if @localnodes; my $ref = Route::Node::get($self->{call}); @@ -1712,6 +1726,8 @@ sub disconnect my $pc39flag = shift; my $call = $self->call; + return if $self->{disconnecting}++; + unless ($pc39flag && $pc39flag == 1) { $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); } @@ -1720,7 +1736,6 @@ sub disconnect my $node = Route::Node::get($call); my @rout; if ($node) { -# @rout = $node->del_nodes; # at the next level @rout = $node->del($main::routeroot); } @@ -1774,7 +1789,7 @@ sub send_route for (; @_ && $no; $no--) { my $r = shift; - if ($self->{routefilter}) { + if (!$self->{isolate} && $self->{routefilter}) { $filter = undef; if ($r) { ($filter, $hops) = $self->{routefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq); @@ -1787,7 +1802,7 @@ sub send_route dbg("was sent a null value") if isdbg('chanerr'); } } else { - push @rin, $r; + push @rin, $r unless $self->{isolate} && $r->call ne $main::mycall; } } if (@rin) { @@ -1818,7 +1833,7 @@ sub broadcast_route if ($dxchan->{routefilter}) { $dxchan->send_route($generate, @_); } else { - $dxchan->send_route($generate, @_) unless $self->{isolate} || $dxchan->{isolate}; + $dxchan->send_route($generate, @_) unless $self->{isolate}; } } }