X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=330e7a60eba433069a65a217ad5ebbb56ae91312;hb=6af9f2685f27610ff519df7da4ce3934f6ca1d85;hp=f68edc275bde45c1afe95bb67346136bcda02d76;hpb=70908cf7f69eb4fc0caf5d735382bc2c1c1466a3;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index f68edc27..330e7a60 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -38,12 +38,13 @@ 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; +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); $main::build += $VERSION; $main::branch += $BRANCH; 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 + $pingint $obscount %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck $allowzero $decode_dk0wcy $send_opernam @checklist); @@ -65,6 +66,8 @@ $rspfcheck = 1; $eph_restime = 180; $eph_info_restime = 60*60; $eph_pc34_restime = 30; +$pingint = 5*60; +$obscount = 2; @checklist = ( @@ -185,21 +188,8 @@ sub check sub init { - my $user = DXUser->get($main::mycall); - $DXProt::myprot_version += $main::version*100; - $main::me = DXProt->new($main::mycall, 0, $user); - $main::me->{here} = 1; - $main::me->{state} = "indifferent"; do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl"; confess $@ if $@; - $main::me->{sort} = 'S'; # S for spider - $main::me->{priv} = 9; - $main::me->{metric} = 0; - $main::me->{pingave} = 0; - $main::me->{version} = $main::version; - $main::me->{build} = $main::build; - -# $Route::Node::me->adddxchan($main::me); } # @@ -268,9 +258,9 @@ sub start # ping neighbour node stuff my $ping = $user->pingint; - $ping = 5*60 unless defined $ping; + $ping = $pingint unless defined $ping; $self->{pingint} = $ping; - $self->{nopings} = $user->nopings || 2; + $self->{nopings} = $user->nopings || $obscount; $self->{pingtime} = [ ]; $self->{pingave} = 999; $self->{metric} ||= 100; @@ -278,7 +268,7 @@ sub start # send initialisation string unless ($self->{outbound}) { - $self->send(pc18()); + $self->sendinit; } $self->state('init'); @@ -292,6 +282,16 @@ sub start $script->run($self) if $script; } +# +# send outgoing 'challenge' +# + +sub sendinit +{ + my $self = shift; + $self->send(pc18()); +} + # # This is the normal pcxx despatcher # @@ -474,7 +474,7 @@ sub normal # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup # list. This allows it to come in from a "legitimate" source - if (Spot::dup($field[1], $field[2], $d, $field[5])) { + if (Spot::dup($field[1], $field[2], $d, $field[5], $field[6])) { dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr'); return; } @@ -628,6 +628,12 @@ sub normal my $ncall = $field[1]; my $newline = "PC16^"; + # do I want users from this channel? + unless ($self->user->wantpc16) { + dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr'); + return; + } + # is it me? if ($ncall eq $main::mycall) { dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr'); return; @@ -702,6 +708,11 @@ sub normal eph_del_regex("^PC16\\^$ncall.*$ucall"); + # do I want users from this channel? + unless ($self->user->wantpc16) { + dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr'); + return; + } if ($ncall eq $main::mycall) { dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr'); return; @@ -1081,7 +1092,7 @@ sub normal # add this station to the user database, if required my $user = DXUser->get_current($call); - $user = DXUser->new($call) if !$user; + $user = DXUser->new($call) unless $user; if ($field[2] == 1) { $user->name($field[3]); @@ -1252,24 +1263,6 @@ sub normal return; } if ($pcno == 90) { # new style PC16,17,19,21 - my $node = $field[1]; - - # mark this node as wanting PC90s - my $parent = Route::Node::get($node); - if ($parent) { - my $t = hex $field[2]; - my $last = $parent->lastpc90 || 0; - if ($last < $t) { - $parent->pc90(1); - $parent->lastpc90($t); - my ($updsort, $n) = unpack "AA*", $field[3]; - for (my $i = 4; $i < $#field; $i++) { - my ($sort, $flag, $node, $ping) = $field[$i] =~ m{(\w)(\d)([-\w+])(,\d+)?}; - $ping /= 10 if (defined $ping); - } - } - } - return; } } @@ -1314,11 +1307,7 @@ sub process next if $dxchan == $main::me; # send the pc50 or PC90 - if ($pc50s && $dxchan->user->wantpc90) { - $dxchan->send_route(\&pc90, 1, $main::me, 'T', @dxchan); - } else { - $dxchan->send($pc50s) if $pc50s; - } + $dxchan->send($pc50s) if $pc50s; # send a ping out on this channel if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { @@ -1523,24 +1512,27 @@ sub send_announce # obtain country codes etc my ($ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq) = (0..0); + my ($ann_state, $org_state) = ("", ""); my @dxcc = Prefix::extract($_[0]); if (@dxcc > 0) { $ann_dxcc = $dxcc[1]->dxcc; $ann_itu = $dxcc[1]->itu; $ann_cq = $dxcc[1]->cq; + $ann_state = $dxcc[1]->state; } @dxcc = Prefix::extract($_[4]); if (@dxcc > 0) { $org_dxcc = $dxcc[1]->dxcc; $org_itu = $dxcc[1]->itu; $org_cq = $dxcc[1]->cq; + $org_state = $dxcc[1]->state; } if ($self->{inannfilter}) { my ($filter, $hops) = $self->{inannfilter}->it(@_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, - $org_dxcc, $org_itu, $org_cq); + $org_dxcc, $org_itu, $org_cq, $ann_state, $org_state); unless ($filter) { dbg("PCPROT: Rejected by input announce filter") if isdbg('chanerr'); return; @@ -1584,7 +1576,7 @@ sub announce sub send_local_config { my $self = shift; - my $n; + my $node; my @nodes; my @localnodes; my @remotenodes; @@ -1603,24 +1595,25 @@ sub send_local_config my @intcalls = map { $_->nodes } @localnodes if @localnodes; my $ref = Route::Node::get($self->{call}); my @rnodes = $ref->nodes; - for my $n (@intcalls) { - push @remotenodes, Route::Node::get($n) unless grep $n eq $_, @rnodes; + for my $node (@intcalls) { + push @remotenodes, Route::Node::get($node) unless grep $node eq $_, @rnodes; } unshift @localnodes, $main::routeroot; } - send_route($self, \&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes); + $self->send_route(\&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes); # get all the users connected on the above nodes and send them out - foreach $n (@localnodes, @remotenodes) { - if ($n) { - send_route($self, \&pc16, 1, $n, map {my $r = Route::User::get($_); $r ? ($r) : ()} $n->users); + foreach $node (@localnodes, @remotenodes) { + if ($node) { + $self->send_route(\&pc16, 1, $node, + map {my $r = Route::User::get($_); $r ? ($r) : ()} $node->users) + if $self->user->wantsendpc16; } else { dbg("sent a null value") if isdbg('chanerr'); } } - $self->send_route(\&pc90, 1, $main::me, 'T', DXChannel::get_all()) if $self->user->wantpc90; } # @@ -1901,7 +1894,7 @@ sub send_route if (!$self->{isolate} && $self->{routefilter}) { $filter = undef; if ($r) { - ($filter, $hops) = $self->{routefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq); + ($filter, $hops) = $self->{routefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq, $self->{state}, $r->{state}); if ($filter) { push @rin, $r; } else { @@ -1940,6 +1933,9 @@ sub broadcast_route foreach $dxchan (@dxchan) { next if $dxchan == $self; next if $dxchan == $main::me; + next if $dxchan->user->wantnp; + next if ($generate == \&pc16 || $generate==\&pc17) && !$dxchan->user->wantsendpc16; + $dxchan->send_route($generate, @_); } } @@ -1948,12 +1944,14 @@ sub broadcast_route sub route_pc16 { my $self = shift; + return unless $self->user->wantpc16; broadcast_route($self, \&pc16, 1, @_); } sub route_pc17 { my $self = shift; + return unless $self->user->wantpc16; broadcast_route($self, \&pc17, 1, @_); } @@ -2000,7 +1998,7 @@ sub in_filter_route my ($filter, $hops) = (1, 1); if ($self->{inroutefilter}) { - ($filter, $hops) = $self->{inroutefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq); + ($filter, $hops) = $self->{inroutefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq, $self->state, $r->state); dbg("PCPROT: $self->{call}/" . $r->call . ' rejected by in_filter_route') if !$filter && isdbg('chanerr'); } return $filter;