X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=09c00b26502ff8de7b3edabd54a25e23e3b6a834;hb=95a03441d20680a914673d1b6bbf46c0d673ad4c;hp=3f4575aa3907ca18ac361c364d5978eaff05a2e9;hpb=3a975cc50b24798726adab18cf9d57bf4c2c530a;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 3f4575aa..09c00b26 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -35,7 +35,7 @@ use Route::Node; use strict; use vars qw($me $pc11_max_age $pc23_max_age - $last_hour %pings %rcmds + $last_hour $last10 %eph %pings %rcmds %nodehops $baddx $badspotter $badnode $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist); @@ -52,6 +52,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; @checklist = ( @@ -553,7 +554,15 @@ sub normal next unless $call && $conf && defined $here && is_callsign($call); $conf = $conf eq '*'; - push @rout, $parent->add_user($call, Route::here($here)|Route::conf($conf)); + my $r = Route::User::get($call); + my $flags = Route::here($here)|Route::conf($conf); + + if ($r && $r->flags != $flags) { + $r->$flags($flags); + push @rout, $r; + } elsif (!$r) { + push @rout, $parent->add_user($call, $flags); + } # add this station to the user database, if required $call =~ s/-\d+$//o; # remove ssid for users @@ -569,7 +578,6 @@ sub normal # queue up any messages (look for privates only) DXMsg::queue_msg(1) if $self->state eq 'normal'; - dbg('route', "B/C PC16 on $ncall for: " . join(',', map{$_->call} @rout)) if @rout; $self->route_pc16($parent, @rout) if @rout; return; } @@ -577,6 +585,7 @@ sub normal if ($pcno == 17) { # remove a user my $dxchan; my $ncall = $field[2]; + my $ucall = $field[1]; if ($ncall eq $main::mycall) { dbg('chan', "PCPROT: trying to alter config on this node from outside!"); return; @@ -591,8 +600,8 @@ sub normal dbg('chan', "PCPROT: Route::Node $ncall not in config"); return; } - my @rout = $parent->del_user($field[1]); - dbg('route', "B/C PC17 on $ncall for: $field[1]"); + my $r = Route::User::get($ucall); + my @rout = $parent->del_user($ucall) if $r; $self->route_pc17($parent, @rout) if @rout; return; } @@ -635,9 +644,10 @@ sub normal # update it if required my $r; - if ($parent->call eq $call && !$parent->version) { + my $flags = Route::here($here)|Route::conf($conf); + if ($parent->call eq $call && ($parent->version ne $ver || $parent->flags != $flags)) { $parent->version($ver); - $parent->flags(Route::here($here)|Route::conf($conf)); + $parent->flags($flags); push @rout, $parent; } elsif ($parent->call ne $call) { next if $call eq $main::mycall || $call eq $self->{call}; @@ -646,7 +656,7 @@ sub normal push @rout, $r if $r; } else { $r = Route::Node::get($call); - if ($r && (!$r->version || $r->version eq '0000')) { + if ($r && ($r->version ne $ver || $r->flags != $flags)) { $r->version($ver); $r->flags(Route::here($here)|Route::conf($conf)); push @rout, $r; @@ -671,8 +681,6 @@ sub normal $user->put; } - dbg('route', "B/C PC19 for: " . join(',', map{$_->call} @rout)) if @rout; - $self->route_pc19(@rout) if @rout; return; } @@ -705,8 +713,6 @@ sub normal dbg('chan', "PCPROT: I WILL _NOT_ be disconnected!"); return; } - dbg('route', "B/C PC21 for: " . join(',', (map{$_->call} @rout))) if @rout; - $self->route_pc21(@rout) if @rout; return; } @@ -1070,9 +1076,13 @@ sub normal # NOTE - don't arrive here UNLESS YOU WANT this lump of protocol to be # REBROADCAST!!!! # - - unless ($self->{isolate}) { - broadcast_ak1a($line, $self); # send it to everyone but me + + if (eph_dup($line)) { + dbg('chan', "PCPROT: Ephemeral dup, dropped"); + } else { + unless ($self->{isolate}) { + broadcast_ak1a($line, $self); # send it to everyone but me + } } } @@ -1093,7 +1103,9 @@ sub process # 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) { - $dxchan->send(pc50(scalar DXChannel::get_all_users)); + my $s = pc50(scalar DXChannel::get_all_users); + eph_dup($s); + $dxchan->send($s); $dxchan->{pc50_t} = $t; } @@ -1108,14 +1120,17 @@ sub process } } } + + # every ten seconds + if ($t - $last10 >= 10) { + # clean out ephemera + + eph_clean(); + + $last10 = $t; + } - my $key; - my $val; - my $cutoff; if ($main::systime - 3600 > $last_hour) { -# Spot::process; -# Geomag::process; -# AnnTalk::process; $last_hour = $main::systime; } } @@ -1748,5 +1763,27 @@ sub route_pc21 broadcast_route($self, \&pc21, scalar @_, @_); } +sub eph_dup +{ + my $s = shift; + + # chop the end off + $s =~ s/\^H\d\d?\^?~?$//; + return 1 if exists $eph{$s}; + $eph{$s} = $main::systime; + return undef; +} + +sub eph_clean +{ + my ($key, $val); + + while (($key, $val) = each %eph) { + if ($main::systime - $val > 90) { + delete $eph{$key}; + } + } +} + 1; __END__