do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl";
confess $@ if $@;
$me->{sort} = 'S'; # S for spider
+ $me->{priv} = 9;
}
#
$self->{lastping} = $main::systime + ($self->pingint / 2);
}
$self->state('init');
- $self->pc50_t(time);
+ $self->{pc50_t} = $main::systime;
# send info to all logged in thingies
$self->tell_login('loginn');
return;
}
}
+
+ my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]);
+ # global spot filtering on INPUT
+ if ($self->{inspotsfilter}) {
+ my ($filter, $hops) = $self->{inspotsfilter}->it(@spot);
+ unless ($filter) {
+ dbg('chan', "PCPROT: Rejected by filter");
+ return;
+ }
+ }
- my @spot = Spot::add($field[1], $field[2], $d, $field[5], $field[6], $field[7]);
+ # add it
+ Spot::add(@spot);
#
# @spot at this point contains:-
# queue up any messages (look for privates only)
DXMsg::queue_msg(1) if $self->state eq 'normal';
+# broadcast_route($line, $self, $field[1]);
+# return;
last SWITCH;
}
dbg('chan', "PCPROT: $field[1] not known" );
return;
}
+# broadcast_route($line, $self, $field[2]);
+# return;
last SWITCH;
}
dbg('chan', "PCPROT: I WILL _NOT_ be disconnected!");
return;
}
+# broadcast_route($line, $self, $call);
+# return;
last SWITCH;
}
next if $dxchan == $me;
# send a pc50 out on this channel
- if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) {
+ if ($t >= $dxchan->{pc50_t} + $DXProt::pc50_interval) {
$dxchan->send(pc50(scalar DXChannel::get_all_users));
- $dxchan->pc50_t($t);
+ $dxchan->{pc50_t} = $t;
}
# send a ping out on this channel
#
# finish up a pc context
#
-sub finish
+
+#
+# some active measures
+#
+sub send_route
{
my $self = shift;
- my $call = $self->call;
- my $ref = DXCluster->get_exact($call);
-
- # unbusy and stop and outgoing mail
- my $mref = DXMsg::get_busy($call);
- $mref->stop_msg($call) if $mref;
-
- # broadcast to all other nodes that all the nodes connected to via me are gone
- my @gonenodes = grep { $_->dxchan != $self && $_->dxchan != $me } DXNode::get_all();
- my $node;
-
- foreach $node (@gonenodes) {
- next if $node->call eq $call;
- broadcast_ak1a(pc21($node->call, 'Gone') , $self) unless $self->{isolate};
- $node->del();
- }
-
- # remove outstanding pings
- delete $pings{$call};
+ my $line = shift;
+ my @dxchan = DXChannel::get_all_nodes();
+ my $dxchan;
- # now broadcast to all other ak1a nodes that I have gone
- broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate};
-
- # I was the last node visited
- $self->user->node($main::mycall);
-
- # send info to all logged in thingies
- $self->tell_login('logoutn');
+ # send it if it isn't the except list and isn't isolated and still has a hop count
+ # taking into account filtering and so on
+ foreach $dxchan (@dxchan) {
+ my $routeit;
+ my ($filter, $hops);
- Log('DXProt', $call . " Disconnected");
- $ref->del() if $ref;
+ if ($dxchan->{routefilter}) {
+ ($filter, $hops) = $dxchan->{routefilter}->it($self->{call}, @_);
+ next unless $filter;
+ }
+ next if $dxchan == $self;
+ if ($hops) {
+ $routeit = $line;
+ $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/;
+ } else {
+ $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name
+ next unless $routeit;
+ }
+ if ($filter) {
+ $dxchan->send($routeit) if $routeit;
+ } else {
+ $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
+ }
+ }
}
-#
-# some active measures
-#
sub send_dx_spot
{
my $self = shift;
sub disconnect
{
my $self = shift;
- my $nopc39 = shift;
+ my $pc39flag = shift;
+ my $call = $self->call;
- if ($self->{conn} && !$nopc39) {
+ unless ($pc39flag && $pc39flag == 1) {
$self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
}
+ # unbusy and stop and outgoing mail
+ my $mref = DXMsg::get_busy($call);
+ $mref->stop_msg($call) if $mref;
+
+ # create a list of all the nodes that have gone and delete them from the table
+ my @nodes;
+ foreach my $node (grep { $_->dxchancall eq $call } DXNode::get_all) {
+ next if $node->call eq $call;
+ next if $node->call eq $main::mycall;
+ push @nodes, $node->call;
+ $node->del;
+ }
+
+ # broadcast to all other nodes that all the nodes connected to via me are gone
+ unless ($pc39flag && $pc39flag == 2) {
+ unless ($self->{isolate}) {
+ push @nodes, $call;
+ for (@nodes) {
+ broadcast_ak1a(pc21($_, 'Gone.'), $self);
+ }
+ }
+ }
+
+ # remove this node from the tables
+ my $node = DXCluster->get_exact($call);
+ $node->del if $node;
+
+ # remove outstanding pings
+ delete $pings{$call};
+
+ # I was the last node visited
+ $self->user->node($main::mycall);
+
+ # send info to all logged in thingies
+ $self->tell_login('logoutn');
+
+ Log('DXProt', $call . " Disconnected");
+
$self->SUPER::disconnect;
}