X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=20726684de2c7bbbd8f77d583dbe654a41e6d470;hb=9bc8098facc58d802923bdc0adf9b6cad1b0a800;hp=8ce857a7abdc2a3a27b7da48a30a0227cc765d8a;hpb=6de7782a48aba612f214f54bad5a9dc9584ce1c0;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index 8ce857a7..20726684 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -101,6 +101,7 @@ use UDPMsg; use QSL; use Thingy; use RouteDB; +use AMsg; use Data::Dumper; use IO::File; @@ -114,7 +115,8 @@ package main; use strict; use vars qw(@inqueue $systime $version $starttime $lockfn @outstanding_connects $zombies $root @listeners $lang $myalias @debug $userfn $clusteraddr - $clusterport $mycall $decease $is_win $routeroot $me $reqreg + $clusterport $mycall $decease $is_win $routeroot $me $reqreg $bumpexisting + $allowdxby ); @inqueue = (); # the main input queue, an array of hashes @@ -124,11 +126,14 @@ $starttime = 0; # the starting time of the cluster #@outstanding_connects = (); # list of outstanding connects @listeners = (); # list of listeners $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 + use vars qw($VERSION $BRANCH $build $branch); $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); -$main::build += 3; # add an offset to make it bigger than last system +$main::build += 1; # add an offset to make it bigger than last system $main::build += $VERSION; $main::branch += $BRANCH; @@ -169,9 +174,20 @@ sub new_channel my $user = DXUser->get_current($call); my $dxchan = DXChannel->get($call); if ($dxchan) { - my $mess = DXM::msg($lang, ($user && $user->is_node) ? 'concluster' : 'conother', $call, $main::mycall); - already_conn($conn, $call, $mess); - return; + if ($user && $user->is_node) { + already_conn($conn, $call, DXM::msg($lang, 'concluster', $call, $main::mycall)); + return; + } + if ($bumpexisting) { + my $ip = $conn->{peerhost} || 'unknown'; + $dxchan->send_now('D', DXM::msg($lang, 'conbump', $call, $ip)); + Log('DXCommand', "$call bumped off by $ip, disconnected"); + dbg("$call bumped off by $ip, disconnected"); + $dxchan->disconnect; + } else { + already_conn($conn, $call, DXM::msg($lang, 'conother', $call, $main::mycall)); + return; + } } # is he locked out ? @@ -194,24 +210,8 @@ sub new_channel $user = DXUser->new($call); } - # create the channel - if ($user->wantnp) { - if ($user->passphrase && $main::me->user->passphrase) { - $dxchan = QXProt->new($call, $conn, $user); - } else { - unless ($user->passphrase) { - Log('DXCommand', "$call using NP but has no passphrase"); - dbg("$call using NP but has no passphrase"); - } - unless ($main::me->user->passphrase) { - Log('DXCommand', "$main::mycall using NP but has no passphrase"); - dbg("$main::mycall using NP but has no passphrase"); - } - already_conn($conn, $call, "Need to exchange passphrases"); - return; - } - } elsif ($user->is_node) { + if ($user->is_node) { $dxchan = DXProt->new($call, $conn, $user); } elsif ($user->is_user) { $dxchan = DXCommandmode->new($call, $conn, $user); @@ -432,14 +432,16 @@ DXUser->init($userfn, 1); # start listening for incoming messages/connects dbg("starting listeners ..."); my $conn = IntMsg->new_server($clusteraddr, $clusterport, \&login); -$conn->conns("Server $clusteraddr/$clusterport"); +$conn->conns("Server $clusteraddr/$clusterport using IntMsg"); push @listeners, $conn; -dbg("Internal port: $clusteraddr $clusterport"); +dbg("Internal port: $clusteraddr $clusterport using IntMsg"); foreach my $l (@main::listen) { - $conn = ExtMsg->new_server($l->[0], $l->[1], \&login); - $conn->conns("Server $l->[0]/$l->[1]"); + no strict 'refs'; + my $pkg = $l->[2] || 'ExtMsg'; + $conn = $pkg->new_server($l->[0], $l->[1], \&login); + $conn->conns("Server $l->[0]/$l->[1] using $pkg"); push @listeners, $conn; - dbg("External Port: $l->[0] $l->[1]"); + dbg("External Port: $l->[0] $l->[1] using $pkg"); } dbg("AGW Listener") if $AGWMsg::enable;