X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=2bf621e1a1883d61776c0b689bb2c3b5961e917b;hb=bcf099764f49e68ef016964e420b906e7900623e;hp=89f8f9d524e70a828b88c29e05c79c3137501ec3;hpb=dcbafa96df9fbad90df86076b6ee9fa6a673a61c;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 89f8f9d5..2bf621e1 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -40,14 +40,14 @@ use Thingy::Dx; use Thingy::Rt; use Thingy::Ping; use Thingy::T; +use Thingy::Hello; +use Thingy::Bye; use strict; use vars qw($VERSION $BRANCH); -$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /^\d+\.\d+(?:\.(\d+)\.(\d+))?$/ || (0,0)); -$main::build += $VERSION; -$main::branch += $BRANCH; + +main::mkver($VERSION = q$Revision$); use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk @@ -223,7 +223,7 @@ sub init $main::me->{metric} = 0; $main::me->{pingave} = 0; $main::me->{registered} = 1; - $main::me->{version} = 5251 + $main::version; + $main::me->{version} = 5252 + $main::version; $main::me->{build} = $main::build; } @@ -239,7 +239,11 @@ sub new my $pkg = shift; my $call = shift; $main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall; - + if ($self->{call} ne $main::mycall) { + my $thing = Thingy::Hello->new(user=>$call); + $thing->broadcast($self); + } + return $self; } @@ -309,6 +313,9 @@ sub start $self->state('init'); $self->{pc50_t} = $main::systime; + my $thing = Thingy::Hello->new(origin=>$main::mycall, user=>$call); + $thing->broadcast($self); + # send info to all logged in thingies $self->tell_login('loginn'); @@ -535,7 +542,7 @@ sub handle_11 my $thing = Thingy::Dx->new(origin=>$main::mycall); $thing->from_DXProt(DXProt=>$line,spotdata=>\@spot); - $thing->queue($self); + $thing->process($self); # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup @@ -593,20 +600,6 @@ sub handle_11 } } } - - # local processing - my $r; - eval { - $r = Local::spot($self, @spot); - }; - # dbg("Local::spot1 error $@") if isdbg('local') if $@; - return if $r; - - # DON'T be silly and send on PC26s! - return if $pcno == 26; - - # send out the filtered spots -# send_dx_spot($self, $line, @spot) if @spot; } # announces @@ -707,15 +700,14 @@ sub handle_16 return; } - - RouteDB::update($ncall, $origin); + RouteDB::update($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -729,17 +721,74 @@ sub handle_16 # if there is a parent, proceed, otherwise if there is a latent PC19 in the PC19list, # fix it up in the routing tables and issue it forth before the PC16 + unless ($parent) { + my $nl = $pc19list{$ncall}; + + if ($nl && @_ > 3) { # 3 because of the hop count! + + # this is a new (remembered) node, now attach it to me if it isn't in filtered + # and we haven't disallowed it + my $user = DXUser->get_current($ncall); + if (!$user) { + $user = DXUser->new($ncall); + $user->sort('A'); + $user->priv(1); # I have relented and defaulted nodes + $user->lockout(1); + $user->homenode($ncall); + $user->node($ncall); + } + + my $wantpc19 = $user->wantroutepc19; + if ($wantpc19 || !defined $wantpc19) { + my $new = Route->new($ncall); # throw away + if ($self->in_filter_route($new)) { + my @nrout; + for (@$nl) { + $parent = Route::Node::get($_->[0]); + $dxchan = $parent->dxchan if $parent; + if ($dxchan && $dxchan ne $self) { + dbg("PCPROT: PC19 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + $parent = undef; + } if ($parent) { + my $r = $parent->add($ncall, $_->[1], $_->[2]); + push @nrout, $r unless @nrout; + } + } + $user->wantroutepc19(1) unless defined $wantpc19; # for now we work on the basis that pc16 = real route + $user->lastin($main::systime) unless DXChannel->get($ncall); + $user->put; + + # route the pc19 - this will cause 'stuttering PC19s' for a while + $self->route_pc19($origin, $line, @nrout) if @nrout ; + $parent = Route::Node::get($ncall); + unless ($parent) { + dbg("PCPROT: lost $ncall after sending PC19 for it?"); + return; + } + } else { + return; + } + delete $pc19list{$ncall}; + } + } else { + dbg("PCPROT: Node $ncall not in config") if isdbg('chanerr'); + return; + } + } else { $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC16 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC16 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } + # input filter if required + return unless $self->in_filter_route($parent); + } my $i; - my $rout; + my @rout; for ($i = 2; $i < $#_; $i++) { my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o; next unless $call && $conf && defined $here && is_callsign($call); @@ -747,21 +796,41 @@ sub handle_16 eph_del_regex("^PC17\\^$call\\^$ncall"); - my $flags = $here ? 1 : 0; - $rout .= ":U$flags$call"; + $conf = $conf eq '*'; + + # reject this if we think it is a node already + my $r = Route::Node::get($call); + my $u = DXUser->get_current($call) unless $r; + if ($r || ($u && $u->is_node)) { + dbg("PCPROT: $call is a node") if isdbg('chanerr'); + next; } + $r = Route::User::get($call); + my $flags = Route::here($here)|Route::conf($conf); - if ($rout) { - my $thing = Thingy::Rt->new(origin=>$main::mycall, user=>$self->{call}); - $thing->from_DXProt(t=>'eau', d=>"N1$ncall$rout", DXProt=>$line); - $thing->queue($self); - } else { - dbg("PCPROT: No usable users") if isdbg('chanerr'); + if ($r) { + my $au = $r->addparent($parent); + if ($r->flags != $flags) { + $r->flags($flags); + $au = $r; } + push @rout, $r if $au; } else { - dbg("PCPROT: no PC19 seen for $ncall" ) if isdbg('chanerr'); + push @rout, $parent->add_user($call, $flags); + } + + + # add this station to the user database, if required + $call =~ s/-\d+$//o; # remove ssid for users + my $user = DXUser->get_current($call); + $user = DXUser->new($call) if !$user; + $user->homenode($parent->call) if !$user->homenode; + $user->node($parent->call); + $user->lastin($main::systime) unless DXChannel->get($call); + $user->put; } + $self->route_pc16($origin, $line, $parent, @rout) if @rout; } # remove a user @@ -779,7 +848,7 @@ sub handle_17 # do I want users from this channel? unless ($self->user->wantpc16) { - dbg("PCPROT: don't send users to $origin") if isdbg('chanerr'); + dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr'); return; } if ($ncall eq $main::mycall) { @@ -787,14 +856,14 @@ sub handle_17 return; } - RouteDB::delete($ncall, $origin); + RouteDB::delete($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -810,19 +879,25 @@ sub handle_17 $dxchan = $parent->dxchan if $parent; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC17 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } + # input filter if required and then remove user if present + if ($parent) { +# return unless $self->in_filter_route($parent); + $parent->del_user($uref) if $uref; + } else { + $parent = Route->new($ncall); # throw away + } + if (eph_dup($line)) { dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); return; } $uref = Route->new($ucall) unless $uref; # throw away - my $thing = Thingy::Rt->new(origin=>$main::mycall, user=>$self->{call}); - $thing->from_DXProt(t=>'edu', d=>"N1$ncall:U1$ucall", DXProt=>$line); - $thing->queue($self); + $self->route_pc17($origin, $line, $parent, $uref); } # link request @@ -2219,6 +2294,9 @@ sub disconnect # broadcast to all other nodes that all the nodes connected to via me are gone unless ($pc39flag && $pc39flag == 2) { + my $thing = Thingy::Bye->new(user=>$call); + $thing->broadcast($self); + $self->route_pc21($main::mycall, undef, @rout) if @rout; }