X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FRoute.pm;h=304b9c6830b97f77bde4767cc64ad954c2a310e1;hb=4b207544da78b182bd12e94eab01451694749012;hp=3c1c453e523a2a4088423576441b5730c771dade;hpb=b2dfa977515995b8ab19611b88cfc999ad78591b;p=spider.git diff --git a/perl/Route.pm b/perl/Route.pm index 3c1c453e..304b9c68 100644 --- a/perl/Route.pm +++ b/perl/Route.pm @@ -22,9 +22,10 @@ use DXUtil; use strict; -use vars qw(%list %valid $filterdef); +use vars qw(%list %valid $filterdef $maxlevel); %valid = ( + parent => '0,Parent Calls,parray', call => "0,Callsign", flags => "0,Flags,phex", dxcc => '0,Country Code', @@ -32,6 +33,7 @@ use vars qw(%list %valid $filterdef); cq => '0,CQ Zone', state => '0,State', city => '0,City', + ip => '0,IP Address', ); $filterdef = bless ([ @@ -53,6 +55,7 @@ $filterdef = bless ([ ['by_state', 'ns', 9], ], 'Filter::Cmd'); +$maxlevel = 25; # maximum recursion level in Route::config sub new { @@ -205,7 +208,7 @@ sub config $pcall = ' ' x length $pcall; # recursion detector - if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) { + if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) { $line .= ' ...'; push @out, $line; return @out; @@ -221,12 +224,14 @@ sub config my $c; if ($uref) { $c = $uref->user_call; - } else { + } + else { $c = "$ucall?"; } if ((length $line) + (length $c) + 1 < $width) { $line .= $c . ' '; - } else { + } + else { $line =~ s/\s+$//; push @out, $line; $line = ' ' x ($level*2) . "$pcall->$c "; @@ -237,9 +242,10 @@ sub config $line =~ s/->$//g; $line =~ s/\s+$//; push @out, $line if length $line; - } else { + } + else { # recursion detector - if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) { + if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) { return @out; } $seen->{$call}++; @@ -269,11 +275,14 @@ sub cluster { my $nodes = Route::Node::count(); my $tot = Route::User::count(); - my $users = scalar DXCommandmode::get_all(); + my ($users, $maxlocalusers) = DXCommandmode::user_count(); # the user count is wrong because of skimmers my $maxusers = Route::User::max(); my $uptime = main::uptime(); + my $localnodes = $DXChannel::count - $users; # this is now wrong because of skimmers + + return ($nodes, $tot, $users, $maxlocalusers, $maxusers, $uptime, $localnodes); + - return " $nodes nodes, $users local / $tot total users Max users $maxusers Uptime $uptime"; } # @@ -289,29 +298,33 @@ sub get sub findroutes { my $call = shift; + my %cand; my @out; dbg("ROUTE: findroutes $call") if isdbg('findroutes'); - # return immediately if we are directly connected + my $nref = Route::get($call); + return () unless $nref; + + # we are directly connected, force "best possible" priority, but + # carry on in case user is connected on other nodes. my $dxchan = DXChannel::get($call); if ($dxchan) { dbg("ROUTE: findroutes $call -> directly connected") if isdbg('findroutes'); - return [99, $dxchan]; + $cand{$call} = 99; } - my $nref = Route::get($call); - return () unless $nref; - # obtain the dxchannels that have seen this thingy my @parent = $nref->isa('Route::User') ? @{$nref->{parent}} : $call; - my %cand; foreach my $p (@parent) { - # return immediately if we are directly connected or a user's parent node is + next if $p eq $main::mycall; # this is dealt with above + + # deal with directly connected nodes, again "best priority" $dxchan = DXChannel::get($p); if ($dxchan) { dbg("ROUTE: findroutes $call -> connected direct via parent $p") if isdbg('findroutes'); - return [99, $dxchan]; + $cand{$p} = 99; + next; } my $r = Route::Node::get($p); @@ -371,7 +384,6 @@ sub delete_interface } - # # track destruction #