X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=7b889fc4c63781d4e9ace3641932a7d594e8695e;hb=02f97e2b119bcd216e4ce68850d48d21029fa2f5;hp=0fe3b575a98588be279dac7e658f24170219a8e3;hpb=a90885c5c10b837b05ef1ebf718fd88e428a3c91;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index 0fe3b575..7b889fc4 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} =~ /^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) { @@ -208,8 +226,8 @@ sub new_channel $dxchan = DXProt->new($call, $conn, $user); } elsif ($user->is_user) { $dxchan = DXCommandmode->new($call, $conn, $user); - } elsif ($user->is_bbs) { - $dxchan = BBS->new($call, $conn, $user); +# } elsif ($user->is_bbs) { # there is no support so +# $dxchan = BBS->new($call, $conn, $user); # don't allow it!!! } else { die "Invalid sort of user on $call = $sort"; } @@ -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; }