X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=a33e6da5f1a8e76b2907cf8547791702a146cdd9;hb=537a4a109f291c206d754ec2067d49f9964cca08;hp=25b84a9cec3ade5663a27a4fe7ca02eb62a8556f;hpb=c1540ccd7990ec4bd151604dd63583d19fe4d0f6;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index 25b84a9c..a33e6da5 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -118,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 @@ -129,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 @@ -172,7 +175,7 @@ sub new_channel return; } if ($bumpexisting) { - my $ip = $conn->{peerhost} || 'unknown'; + my $ip = $conn->peerhost || 'unknown'; $dxchan->send_now('D', DXM::msg($lang, 'conbump', $call, $ip)); LogDbg('DXCommand', "$call bumped off by $ip, disconnected"); $dxchan->disconnect; @@ -182,6 +185,22 @@ 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+$//; @@ -189,7 +208,7 @@ sub new_channel my $lock = $user->lockout if $user; if ($baseuser && $baseuser->lockout || $lock) { if (!$user || !defined $lock || $lock) { - my $host = $conn->{peerhost} || "unknown"; + my $host = $conn->peerhost || "unknown"; LogDbg('DXCommand', "$call on $host is locked out, disconnected"); $conn->disconnect; return; @@ -278,7 +297,7 @@ sub cease $l->close_server; } - LogDbg('cluster', "DXSpider V$version, build $subversion.$build ended"); + LogDbg('cluster', "DXSpider V$version, build $subversion.$build (git: $gitversion) ended"); dbgclose(); Logclose(); @@ -367,7 +386,7 @@ DXXml::init(); # banner my ($year) = (gmtime)[5]; $year += 1900; -LogDbg('cluster', "DXSpider V$version, build $subversion.$build started"); +LogDbg('cluster', "DXSpider V$version, build $subversion.$build (git: $gitversion) started"); dbg("Copyright (c) 1998-$year Dirk Koopman G1TLH"); # load Prefixes @@ -386,6 +405,7 @@ DXUser->init($userfn, 1); # look for the sysop and the alias user and complain if they aren't there { + 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);