use Mrtg;
use USDB;
use UDPMsg;
+use QSL;
+use Thingy;
+use RouteDB;
+use AMsg;
use Data::Dumper;
use IO::File;
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
#@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 <othercall>", 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 += 6; # 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;
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 ?
$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);
return unless defined $sort;
# do the really sexy console interface bit! (Who is going to do the TK interface then?)
- dbg("<- $sort $call $line\n") if $sort ne 'D' && isdbg('chan');
+ dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan');
if ($self->{disconnecting}) {
dbg('In disconnection, ignored');
next;
# load Prefixes
dbg("loading prefixes ...");
+dbg(USDB::init());
my $r = Prefix::init();
confess $r if $r;
-dbg(USDB::init());
# load band data
dbg("loading band data ...");
# 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;
# starting local stuff
dbg("doing local initialisation ...");
+QSL::init(1);
eval {
Local::init();
};
DXUser::process();
DXDupe::process();
AGWMsg::process();
-
+
+ # this where things really start to happen (in DXSpider 2)
+ Thingy::process();
+
eval {
Local::process(); # do any localised processing
};