X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=bec097821a7fd6dcf3046e29594f6e451c9d1284;hb=2926213cad1fdefa202b3e50c3387a69ae5f76af;hp=4b7abd585696bf2dabd4f9c8be63cc43a7072a98;hpb=71620f62f33c447fbc6e54e8c2681b8742e421a6;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index 4b7abd58..bec09782 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -98,7 +98,6 @@ use Mrtg; use USDB; use UDPMsg; use QSL; -use RouteDB; use DXXml; use DXSql; use IsoTime; @@ -119,7 +118,7 @@ use vars qw(@inqueue $systime $starttime $lockfn @outstanding_connects $zombies $root @listeners $lang $myalias @debug $userfn $clusteraddr $clusterport $mycall $decease $is_win $routeroot $me $reqreg $bumpexisting $allowdxby $dbh $dsn $dbuser $dbpass $do_xml $systime_days $systime_daystart - $can_encode + $can_encode $maxconnect_user $maxconnect_node ); @inqueue = (); # the main input queue, an array of hashes @@ -130,7 +129,10 @@ $starttime = 0; # the starting time of the cluster $reqreg = 0; # 1 = registration required, 2 = deregister people $bumpexisting = 1; # 1 = allow new connection to disconnect old, 0 - don't allow it $allowdxby = 0; # 1 = allow "dx by ", 0 - don't allow it - +$maxconnect_user = 3; # the maximum no of concurrent connections a user can have at a time +$maxconnect_node = 0; # Ditto but for nodes. In either case if a new incoming connection + # takes the no of references in the routing table above these numbers + # then the connection is refused. This only affects INCOMING connections. # send a message to call on conn and disconnect sub already_conn @@ -165,7 +167,7 @@ sub new_channel # set up the basic channel info # is there one already connected to me - locally? - my $user = DXUser->get_current($call); + my $user = DXUser::get_current($call); my $dxchan = DXChannel::get($call); if ($dxchan) { if ($user && $user->is_node) { @@ -183,10 +185,26 @@ sub new_channel } } + # (fairly) politely disconnect people that are connected to too many other places at once + my $r = Route::get($call); + if ($conn->{sort} && $conn->{sort} =~ /^I/ && $r && $user) { + my @n = $r->parents; + my $m = $r->isa('Route::Node') ? $maxconnect_node : $maxconnect_user; + my $c = $user->maxconnect; + my $v; + $v = defined $c ? $c : $m; + if ($v && @n >= $v) { + my $nodes = join ',', @n; + LogDbg('DXCommand', "$call has too many connections ($v) at $nodes - disconnected"); + already_conn($conn, $call, DXM::msg($lang, 'contomany', $call, $v, $nodes)); + return; + } + } + # is he locked out ? my $basecall = $call; $basecall =~ s/-\d+$//; - my $baseuser = DXUser->get_current($basecall); + my $baseuser = DXUser::get_current($basecall); my $lock = $user->lockout if $user; if ($baseuser && $baseuser->lockout || $lock) { if (!$user || !defined $lock || $lock) { @@ -387,9 +405,10 @@ DXUser->init($userfn, 1); # look for the sysop and the alias user and complain if they aren't there { - my $ref = DXUser->get($mycall); + die "\$myalias \& \$mycall are the same ($mycall)!, they must be different (hint: make \$mycall = '${mycall}-2';). Oh and don't forget to rerun create_sysop.pl!" if $mycall eq $myalias; + my $ref = DXUser::get($mycall); die "$mycall missing, run the create_sysop.pl script and please RTFM" unless $ref && $ref->priv == 9; - $ref = DXUser->get($myalias); + $ref = DXUser::get($myalias); die "$myalias missing, run the create_sysop.pl script and please RTFM" unless $ref && $ref->priv == 9; }