projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
add KEEPALIVE to TCP connections
[spider.git]
/
perl
/
DXProt.pm
diff --git
a/perl/DXProt.pm
b/perl/DXProt.pm
index 4d716ce79844f486132e09d917b715381aebd070..9e07d9e4165e71c45e08ce78a8cd59a48c016c34 100644
(file)
--- a/
perl/DXProt.pm
+++ b/
perl/DXProt.pm
@@
-42,7
+42,7
@@
$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
$main::build += $VERSION;
$main::branch += $BRANCH;
$main::build += $VERSION;
$main::branch += $BRANCH;
-use vars qw($pc11_max_age $pc23_max_age $last_pc50
+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
%nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
$allowzero $decode_dk0wcy $send_opernam @checklist);
$last_hour $last10 %eph %pings %rcmds $ann_to_talk
%nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
$allowzero $decode_dk0wcy $send_opernam @checklist);
@@
-62,6
+62,9
@@
$badnode = new DXHash "badnode";
$last10 = $last_pc50 = time;
$ann_to_talk = 1;
$rspfcheck = 1;
$last10 = $last_pc50 = time;
$ann_to_talk = 1;
$rspfcheck = 1;
+$eph_restime = 180;
+$eph_info_restime = 60*60;
+$eph_pc34_restime = 30;
@checklist =
(
@checklist =
(
@@
-823,6
+826,14
@@
sub normal
return;
}
return;
}
+ # if I get a PC21 from the same callsign as self then treat it
+ # as a PC39: I have gone away
+ if ($call eq $self->call) {
+ $self->disconnect(1);
+ eph_del_regex("^PC(?:1[679]|21).*$field[1]");
+ return;
+ }
+
eph_del_regex("^PC1[79].*$call");
my @rout;
eph_del_regex("^PC1[79].*$call");
my @rout;
@@
-833,11
+844,6
@@
sub normal
return;
}
if ($call ne $main::mycall) { # don't allow malicious buggers to disconnect me!
return;
}
if ($call ne $main::mycall) { # don't allow malicious buggers to disconnect me!
- if ($call eq $self->{call}) {
- dbg("PCPROT: Trying to disconnect myself with PC21") if isdbg('chanerr');
- return;
- }
-
my $node = Route::Node::get($call);
if ($node) {
my $node = Route::Node::get($call);
if ($node) {
@@
-974,11
+980,16
@@
sub normal
}
if ($pcno == 34 || $pcno == 36) { # remote commands (incoming)
}
if ($pcno == 34 || $pcno == 36) { # remote commands (incoming)
- $self->process_rcmd($field[1], $field[2], $field[2], $field[3]);
+ if (eph_dup($line, $eph_pc34_restime)) {
+ dbg("PCPROT: dupe") if isdbg('chanerr');
+ } else {
+ $self->process_rcmd($field[1], $field[2], $field[2], $field[3]);
+ }
return;
}
if ($pcno == 35) { # remote command replies
return;
}
if ($pcno == 35) { # remote command replies
+ eph_del_regex("^PC35\^$field[2]\^$field[1]\^");
$self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]);
return;
}
$self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]);
return;
}
@@
-1002,6
+1013,11
@@
sub normal
if ($pcno == 41) { # user info
my $call = $field[1];
if ($pcno == 41) { # user info
my $call = $field[1];
+ if (eph_dup($line, $eph_info_restime)) {
+ dbg("PCPROT: dupe") if isdbg('chanerr');
+ return;
+ }
+
# input filter if required
# my $ref = Route::get($call) || Route->new($call);
# return unless $self->in_filter_route($ref);
# input filter if required
# my $ref = Route::get($call) || Route->new($call);
# return unless $self->in_filter_route($ref);
@@
-1032,11
+1048,11
@@
sub normal
} elsif ($field[2] == 4) {
$user->homenode($field[3]);
} elsif ($field[2] == 5) {
} elsif ($field[2] == 4) {
$user->homenode($field[3]);
} elsif ($field[2] == 5) {
- if (is_qra($field[3])) {
- my ($lat, $long) = DXBearing::qratoll($field[3]);
+ if (is_qra(
uc
$field[3])) {
+ my ($lat, $long) = DXBearing::qratoll(
uc
$field[3]);
$user->lat($lat);
$user->long($long);
$user->lat($lat);
$user->long($long);
- $user->qra($field[3]);
+ $user->qra(
uc
$field[3]);
} else {
dbg('PCPROT: not a valid QRA locator') if isdbg('chanerr');
return;
} else {
dbg('PCPROT: not a valid QRA locator') if isdbg('chanerr');
return;
@@
-1045,9
+1061,13
@@
sub normal
$user->lastoper($main::systime); # to cut down on excessive for/opers being generated
$user->put;
$user->lastoper($main::systime); # to cut down on excessive for/opers being generated
$user->put;
+ unless ($self->{isolate}) {
+ DXChannel::broadcast_nodes($line, $self); # send it to everyone but me
+ }
+
# perhaps this IS what we want after all
# $self->route_pc41($ref, $call, $field[2], $field[3], $field[4]);
# perhaps this IS what we want after all
# $self->route_pc41($ref, $call, $field[2], $field[3], $field[4]);
-
#
return;
+
return;
}
if ($pcno == 43) {
}
if ($pcno == 43) {
@@
-1155,7
+1175,7
@@
sub normal
return;
}
@field = map { unpad($_) } @field;
return;
}
@field = map { unpad($_) } @field;
- if (WCY::dup($d
,@field[3..7]
)) {
+ if (WCY::dup($d)) {
dbg("PCPROT: Dup WCY Spot ignored\n") if isdbg('chanerr');
return;
}
dbg("PCPROT: Dup WCY Spot ignored\n") if isdbg('chanerr');
return;
}
@@
-1164,7
+1184,7
@@
sub normal
my $rep;
eval {
my $rep;
eval {
- $rep = Local::w
wv
($self, @field[1..12]);
+ $rep = Local::w
cy
($self, @field[1..12]);
};
# dbg("Local::wcy error $@") if isdbg('local') if $@;
return if $rep;
};
# dbg("Local::wcy error $@") if isdbg('local') if $@;
return if $rep;
@@
-1904,12
+1924,13
@@
sub in_filter_route
sub eph_dup
{
my $s = shift;
sub eph_dup
{
my $s = shift;
+ my $t = shift || $eph_restime;
my $r;
# chop the end off
$s =~ s/\^H\d\d?\^?\~?$//;
$r = 1 if exists $eph{$s}; # pump up the dup if it keeps circulating
my $r;
# chop the end off
$s =~ s/\^H\d\d?\^?\~?$//;
$r = 1 if exists $eph{$s}; # pump up the dup if it keeps circulating
- $eph{$s} = $main::systime;
+ $eph{$s} = $main::systime
+ $t
;
return $r;
}
return $r;
}
@@
-1929,11
+1950,21
@@
sub eph_clean
my ($key, $val);
while (($key, $val) = each %eph) {
my ($key, $val);
while (($key, $val) = each %eph) {
- if ($main::systime
- $val > 180
) {
+ if ($main::systime
>= $val
) {
delete $eph{$key};
}
}
}
delete $eph{$key};
}
}
}
+sub eph_list
+{
+ my ($key, $val);
+ my @out;
+
+ while (($key, $val) = each %eph) {
+ push @out, $key, $val;
+ }
+ return @out;
+}
1;
__END__
1;
__END__