X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=0bde0d2cd010623bc34dfd551989a45336369b61;hb=cc91428ca79b3cdfdc7733505384f5983ad6c7fa;hp=dded0e6451073153fea76fd1e77b8834e8cced9b;hpb=8b0c842c51c3a51b45ff8c4940d6b5fad00cdde8;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index dded0e64..0bde0d2c 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -30,14 +30,17 @@ use Carp; use strict; use vars qw($me $pc11_max_age $pc11_dup_age $pc23_dup_age %spotdup %wwvdup $last_hour %pings %rcmds - %nodehops @baddx $baddxfn); + %nodehops @baddx $baddxfn $pc12_dup_age + %anndup); $me = undef; # the channel id for this cluster $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 $pc11_dup_age = 24*3600; # the maximum time to keep the spot dup list for $pc23_dup_age = 24*3600; # the maximum time to keep the wwv dup list for +$pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for %spotdup = (); # the pc11 and 26 dup hash -%wwvdup = (); # the pc23 and 27 dup hash +%wwvdup = (); # the pc23 and 27 dup hash +%anndup = (); # the PC12 dup hash $last_hour = time; # last time I did an hourly periodic update %pings = (); # outstanding ping requests outbound %rcmds = (); # outstanding rcmd requests outbound @@ -113,8 +116,9 @@ sub start $self->{wwvfilter} = Filter::read_in('wwv', $call); $self->{annfilter} = Filter::read_in('ann', $call); - # set unbuffered + # set unbuffered and no echo $self->send_now('B',"0"); + $self->send_now('E',"0"); # send initialisation string if (!$self->{outbound}) { @@ -235,6 +239,21 @@ sub normal } if ($pcno == 12) { # announces + # announce duplicate checking + my $text = uc unpad($field[3]); + my $dupkey = $field[1].$field[2].$text.$field[4].$field[6]; + if ($anndup{$dupkey}) { + dbg('chan', "Duplicate Announce ignored\n"); + return; + } + $anndup{$dupkey} = $main::systime; + + # global ann filtering + my ($filter, $hops) = Filter::it($self->{annfilter}, @field[1..6], $self->{call} ) if $self->{annfilter}; + if ($self->{annfilter} && !$filter) { + dbg('chan', "Rejected by filter"); + return; + } if ($field[2] eq '*' || $field[2] eq $main::mycall) { @@ -475,8 +494,9 @@ sub normal if ($pcno == 34 || $pcno == 36) { # remote commands (incoming) if ($field[1] eq $main::mycall) { my $ref = DXUser->get_current($field[2]); + my $cref = DXCluster->get($field[2]); Log('rcmd', 'in', $ref->{priv}, $field[2], $field[3]); - unless ($field[3] =~ /rcmd/i) { # not allowed to relay RCMDS! + unless ($field[3] =~ /rcmd/i || !$cref || !$ref || $cref->mynode->call ne $ref->homenode) { # not allowed to relay RCMDS! if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering $self->{remotecmd} = 1; # for the benefit of any command that needs to know my @in = (DXCommandmode::run_cmd($self, $field[3])); @@ -486,9 +506,11 @@ sub normal Log('rcmd', 'out', $field[2], $_); } delete $self->{remotecmd}; + } else { + $self->send(pc35($main::mycall, $field[2], "$main::mycall:sorry...!")); } } else { - $self->send(pc35($main::mycall, $field[2], "$main::mycall:Tut tut tut...!")); + $self->send(pc35($main::mycall, $field[2], "$main::mycall:your attempt is logged, Tut tut tut...!")); } } else { route($field[1], $line); @@ -643,6 +665,10 @@ sub process while (($key, $val) = each %wwvdup) { delete $wwvdup{$key} if $val < $cutoff; } + $cutoff = $main::systime - $pc12_dup_age; + while (($key, $val) = each %anndup) { + delete $anndup{$key} if $val < $cutoff; + } $last_hour = $main::systime; } } @@ -710,10 +736,14 @@ sub send_dx_spot $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; } - } elsif ($dxchan->is_user) { + } elsif ($dxchan->is_user && $dxchan->{dx}) { my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]); - $buf .= "\a\a" if $dxchan->beep; - $dxchan->send($buf) if !$hops || ($hops && $filter); + $buf .= "\a\a" if $dxchan->{beep}; + if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') { + $dxchan->send($buf) if !$hops || ($hops && $filter); + } else { + $dxchan->delay($buf) if !$hops || ($hops && $filter); + } } } }