X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=46f4818325af00ef5945e48ac2027e58dbef3877;hb=8081646e932b160975ad061a7a2741418b099761;hp=e1e75472223fc7beef785258b1f43b7cb7826320;hpb=281bb0799ecf66390c48719f76ca5d9f83fe4c73;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index e1e75472..46f48183 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -7,7 +7,7 @@ # # Copyright (c) 1998 Dirk Koopman G1TLH # -# $Id$ +# # require 5.004; @@ -98,10 +98,10 @@ use Mrtg; use USDB; use UDPMsg; use QSL; -use RouteDB; use DXXml; use DXSql; use IsoTime; +use BPQMsg; use Data::Dumper; use IO::File; @@ -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 = 8; # 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 @@ -164,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) { @@ -182,10 +185,23 @@ sub new_channel } } + # (fairly) politely disconnect people that are connected to too many other places at once + my $r = Route::get($call); + if ($r) { + my @n = $r->parents; + my $v = $r->isa('Route::Node') ? $maxconnect_node : $maxconnect_user; + 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) { @@ -207,8 +223,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"; } @@ -240,10 +256,12 @@ sub cease DXUser::sync; - eval { - Local::finish(); # end local processing - }; - dbg("Local::finish error $@") if $@; + if (defined &Local::finish) { + eval { + Local::finish(); # end local processing + }; + dbg("Local::finish error $@") if $@; + } # disconnect nodes foreach $dxchan (DXChannel::get_all_nodes) { @@ -258,6 +276,7 @@ sub cease # disconnect AGW AGWMsg::finish(); + BPQMsg::finish(); # disconnect UDP customers UDPMsg::finish(); @@ -383,9 +402,9 @@ DXUser->init($userfn, 1); # look for the sysop and the alias user and complain if they aren't there { - my $ref = DXUser->get($mycall); + 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; } @@ -409,6 +428,9 @@ foreach my $l (@main::listen) { dbg("AGW Listener") if $AGWMsg::enable; AGWrestart(); +dbg("BPQ Listener") if $BPQMsg::enable; +BPQMsg::init(\&new_channel); + dbg("UDP Listener") if $UDPMsg::enable; UDPMsg::init(\&new_channel); @@ -484,17 +506,20 @@ DXMsg::clean_old(); dbg("reading cron jobs ..."); DXCron->init(); -# read in database descriptors +# read in database desriptors dbg("reading database descriptors ..."); DXDb::load(); # starting local stuff dbg("doing local initialisation ..."); QSL::init(1); -eval { - Local::init(); -}; -dbg("Local::init error $@") if $@; +if (defined &Local::init) { + eval { + Local::init(); + }; + dbg("Local::init error $@") if $@; +} + # this, such as it is, is the main loop! dbg("orft we jolly well go ..."); @@ -533,11 +558,14 @@ for (;;) { DXUser::process(); DXDupe::process(); AGWMsg::process(); + BPQMsg::process(); - eval { - Local::process(); # do any localised processing - }; - dbg("Local::process error $@") if $@; + if (defined &Local::process) { + eval { + Local::process(); # do any localised processing + }; + dbg("Local::process error $@") if $@; + } } if ($decease) { last if --$decease <= 0;