X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=b3f03222034ea6c05bae6c8013f7e94e0236710d;hb=c1540ccd7990ec4bd151604dd63583d19fe4d0f6;hp=f28de6d065cbae54941df6703de4e9ed55a26248;hpb=e72ce56ce6973656acb064366459d54cda85f8cc;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index f28de6d0..b3f03222 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -32,8 +32,6 @@ use DXHash; use Route; use Route::Node; use Script; -use RouteDB; - use strict; @@ -46,6 +44,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $eph_pc15_restime $pc9x_past_age $pc9x_dupe_age $pc10_dupe_age $pc92_slug_changes $last_pc92_slug $pc92Ain $pc92Cin $pc92Din $pc92Kin $pc9x_time_tolerance + $pc92filterdef ); $pc9x_dupe_age = 60; # catch loops of circular (usually) D records @@ -57,6 +56,15 @@ $pc9x_past_age = (122*60)+ # maximum age in the past of a px9x (a config record $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. +$pc92filterdef = bless ([ + # tag, sort, field, priv, special parser + ['call', 'c', 0], + ['by', 'c', 0], + ['dxcc', 'nc', 1], + ['itu', 'ni', 2], + ['zone', 'nz', 3], + ], 'Filter::Cmd'); + # incoming talk commands sub handle_10 @@ -112,10 +120,6 @@ sub handle_10 } } - # remember a route to this node and also the node on which this user is - RouteDB::update($_[6], $self->{call}); -# RouteDB::update($to, $_[6]); - # convert this to a PC93, coming from mycall with origin set and process it as such $main::me->normal(pc93($to, $from, $via, $_[3], $_[6])); } @@ -193,10 +197,6 @@ sub handle_11 } } - # remember a route -# RouteDB::update($_[7], $self->{call}); -# RouteDB::update($_[6], $_[7]); - my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $nossid, $_[7]); # global spot filtering on INPUT if ($self->{inspotsfilter}) { @@ -226,7 +226,7 @@ sub handle_11 # # fix up qra locators of known users - my $user = DXUser->get_current($spot[4]); + my $user = DXUser::get_current($spot[4]); if ($user) { my $qra = $user->qra; unless ($qra && is_qra($qra)) { @@ -328,10 +328,6 @@ sub handle_12 $self->send_chat(0, $line, @_[1..6]); } elsif ($_[2] eq '*' || $_[2] eq $main::mycall) { - # remember a route -# RouteDB::update($_[5], $self->{call}); -# RouteDB::update($_[1], $_[5]); - # ignore something that looks like a chat line coming in with sysop # flag - this is a kludge... if ($_[3] =~ /^\#\d+ / && $_[4] eq '*') { @@ -412,7 +408,6 @@ sub handle_16 my $h; $h = 1 if DXChannel::get($ncall); - RouteDB::update($ncall, $self->{call}, $h); if ($h && $self->{call} ne $ncall) { dbg("PCPROT: trying to update a local node, ignored") if isdbg('chanerr'); return; @@ -463,7 +458,7 @@ sub handle_16 # reject this if we think it is a node already my $r = Route::Node::get($call); - my $u = DXUser->get_current($call) unless $r; + my $u = DXUser::get_current($call) unless $r; if ($r || ($u && $u->is_node)) { dbg("PCPROT: $call is a node") if isdbg('chanerr'); next; @@ -485,7 +480,7 @@ sub handle_16 } # add this station to the user database, if required - my $user = DXUser->get_current($ncall); + my $user = DXUser::get_current($ncall); $user = DXUser->new($call) unless $user; $user->homenode($parent->call) if !$user->homenode; $user->node($parent->call); @@ -532,8 +527,6 @@ sub handle_17 return; } - RouteDB::delete($ncall, $self->{call}); - my $uref = Route::User::get($ucall); unless ($uref) { dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr'); @@ -568,7 +561,7 @@ sub handle_17 $parent->del_user($uref); # send info to all logged in thingies - my $user = DXUser->get_current($ncall); + my $user = DXUser::get_current($ncall); $self->tell_login('logoutu', "$ncall: $ucall") if $user && $user->is_local_node; $self->tell_buddies('logoutb', $ucall, $ncall); @@ -638,7 +631,7 @@ sub check_add_node my $call = shift; # add this station to the user database, if required (don't remove SSID from nodes) - my $user = DXUser->get_current($call); + my $user = DXUser::get_current($call); if (!$user) { $user = DXUser->new($call); $user->priv(1); # I have relented and defaulted nodes @@ -727,7 +720,6 @@ sub handle_19 # next; # } - RouteDB::update($call, $self->{call}, $dxchan ? 1 : undef); unless ($h) { if ($parent->via_pc92) { @@ -833,8 +825,6 @@ sub handle_21 # we don't need any isolation code here, because we will never # act on a PC21 with self->call in it. - RouteDB::delete($call, $self->{call}); - my $parent = Route::Node::get($self->{call}); unless ($parent) { dbg("PCPROT: my parent $self->{call} has disappeared"); @@ -1142,7 +1132,7 @@ sub handle_41 } # add this station to the user database, if required - my $user = DXUser->get_current($call); + my $user = DXUser::get_current($call); $user = DXUser->new($call) unless $user; if ($sort == 1) { @@ -1231,13 +1221,12 @@ sub handle_50 my $call = $_[1]; - RouteDB::update($call, $self->{call}); - my $node = Route::Node::get($call); if ($node) { return unless $node->call eq $self->{call}; $node->usercount($_[2]) unless $node->users; $node->reset_obs; + $node->PC92C_dxchan($self->call, $_[-1]); # input filter if required # return unless $self->in_filter_route($node); @@ -1269,9 +1258,6 @@ sub handle_51 DXXml::Ping::handle_ping_reply($self, $from); } } else { - - RouteDB::update($from, $self->{call}); - if (eph_dup($line)) { return; } @@ -1405,6 +1391,9 @@ sub _add_thingy { my $parent = shift; my $s = shift; + my $dxchan = shift; + my $hops = shift; + my ($call, $is_node, $is_extnode, $here, $version, $build) = @$s; my @rout; @@ -1412,6 +1401,8 @@ sub _add_thingy if ($is_node) { dbg("ROUTE: added node $call to " . $parent->call) if isdbg('routelow'); @rout = $parent->add($call, $version, Route::here($here)); + my $r = Route::Node::get($call); + $r->PC92C_dxchan($dxchan->call, $hops) if $r; } else { dbg("ROUTE: added user $call to " . $parent->call) if isdbg('routelow'); @rout = $parent->add_user($call, Route::here($here)); @@ -1569,6 +1560,7 @@ sub pc92_handle_first_slot my $slot = shift; my $parent = shift; my $t = shift; + my $hops = shift; my $oparent = $parent; my @radd; @@ -1593,7 +1585,7 @@ sub pc92_handle_first_slot # from the true parent node for this external before we get one for the this node unless ($parent = Route::Node::get($call)) { if ($is_extnode && $oparent) { - @radd = _add_thingy($oparent, $slot); + @radd = _add_thingy($oparent, $slot, $self, $hops); $parent = $radd[0]; } else { dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); @@ -1602,7 +1594,7 @@ sub pc92_handle_first_slot } $parent = check_pc9x_t($call, $t, 92) || return; $parent->via_pc92(1); - $parent->PC92C_dxchan($self->{call}); + $parent->PC92C_dxchan($self->{call}, $hops); } } else { dbg("PCPROT: must be \$mycall or external node as first entry, ignored") if isdbg('chanerr'); @@ -1611,7 +1603,7 @@ sub pc92_handle_first_slot $parent->here(Route::here($here)); $parent->version($version || $pc19_version) if $version; $parent->build($build) if $build; - $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; + $parent->PC92C_dxchan($self->{call}, $hops) unless $self->{call} eq $parent->call; return ($parent, @radd); } @@ -1628,6 +1620,7 @@ sub handle_92 my $pcall = $_[1]; my $t = $_[2]; my $sort = $_[3]; + my $hops = $_[-1]; # this catches loops of A/Ds # if (eph_dup($line, $pc9x_dupe_age)) { @@ -1709,17 +1702,17 @@ sub handle_92 } } elsif ($sort eq 'K') { - $pc92Kin += length $line if $sort eq 'K'; + $pc92Kin += length $line; # remember the last channel we arrived on - $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; + $parent->PC92C_dxchan($self->{call}, $hops) unless $self->{call} eq $parent->call; my @ent = _decode_pc92_call($_[4]); if (@ent) { my $add; - ($parent, $add) = $self->pc92_handle_first_slot(\@ent, $parent, $t); + ($parent, $add) = $self->pc92_handle_first_slot(\@ent, $parent, $t, $hops); return unless $parent; # dupe push @radd, $add if $add; @@ -1736,7 +1729,7 @@ sub handle_92 $pc92Din += length $line if $sort eq 'D'; # remember the last channel we arrived on - $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; + $parent->PC92C_dxchan($self->{call}, $hops) unless $self->{call} eq $parent->call; # this is the main route section # here is where all the routes are created and destroyed @@ -1755,7 +1748,7 @@ sub handle_92 # that needs to be done. my $add; - ($parent, $add) = $self->pc92_handle_first_slot($ent[0], $parent, $t); + ($parent, $add) = $self->pc92_handle_first_slot($ent[0], $parent, $t, $hops); return unless $parent; # dupe shift @ent; @@ -1775,7 +1768,7 @@ sub handle_92 if ($sort eq 'A') { for (@nent) { - push @radd, _add_thingy($parent, $_); + push @radd, _add_thingy($parent, $_, $self, $hops); } } elsif ($sort eq 'D') { for (@nent) { @@ -1808,7 +1801,7 @@ sub handle_92 foreach my $r (@nent) { my $call = $r->[0]; if ($call) { - push @radd,_add_thingy($parent, $r) if grep $call eq $_, (@$nnodes, @$nusers); + push @radd,_add_thingy($parent, $r, $self, $hops) if grep $call eq $_, (@$nnodes, @$nusers); } } # del users here