use DXProtVars;
use DXProtout;
use DXProt;
-use QXProt;
+use Aranea;
use DXMsg;
use DXCron;
use DXConnect;
@inqueue = (); # the main input queue, an array of hashes
$systime = 0; # the time now (in seconds)
-$version = "1.51"; # the version no of the software
+$version = "2.01"; # the version no of the software
$starttime = 0; # the starting time of the cluster
#@outstanding_connects = (); # list of outstanding connects
@listeners = (); # list of listeners
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));
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /^\d+\.\d+(?:\.(\d+)\.(\d+))?$/ || (0,0));
$main::build += 1; # add an offset to make it bigger than last system
$main::build += $VERSION;
$main::branch += $BRANCH;
already_conn($conn, $call, DXM::msg($lang, 'concluster', $call, $main::mycall));
return;
}
- if ($bumpexisting) {
+ if ($bumpexisting && $call ne $main::mycall) {
my $ip = $conn->{peerhost} || 'unknown';
$dxchan->send_now('D', DXM::msg($lang, 'conbump', $call, $ip));
Log('DXCommand', "$call bumped off by $ip, disconnected");
# set callbacks
$conn->set_error(sub {error_handler($dxchan)});
- $conn->set_rproc(sub {my ($conn,$msg) = @_; rec($dxchan, $conn, $msg);});
- rec($dxchan, $conn, $msg);
+ $conn->set_rproc(sub {my ($conn,$msg) = @_; $dxchan->rec($msg);});
+ $dxchan->rec($msg);
}
-sub rec
-{
- my ($dxchan, $conn, $msg) = @_;
-
- # queue the message and the channel object for later processing
- if (defined $msg) {
- my $self = bless {}, "inqueue";
- $self->{dxchan} = $dxchan;
- $self->{data} = $msg;
- push @inqueue, $self;
- }
-}
-
-# remove any outstanding entries on the inqueue after a disconnection (usually)
-sub clean_inqueue
-{
- my $dxchan = shift;
- @inqueue = grep {$_->{dxchan} != $dxchan} @inqueue;
-}
sub login
{
# this is where the input queue is dealt with and things are dispatched off to other parts of
# the cluster
-sub process_inqueue
-{
- while (@inqueue) {
- my $self = shift @inqueue;
- return if !$self;
-
- my $data = $self->{data};
- my $dxchan = $self->{dxchan};
- my $error;
- my ($sort, $call, $line) = DXChannel::decode_input($dxchan, $data);
- return unless defined $sort;
-
- # do the really sexy console interface bit! (Who is going to do the TK interface then?)
- dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan');
- if ($self->{disconnecting}) {
- dbg('In disconnection, ignored');
- next;
- }
-
- # handle A records
- my $user = $dxchan->user;
- if ($sort eq 'A' || $sort eq 'O') {
- $dxchan->start($line, $sort);
- } elsif ($sort eq 'I') {
- die "\$user not defined for $call" if !defined $user;
-
- # normal input
- $dxchan->normal($line);
- } elsif ($sort eq 'Z') {
- $dxchan->disconnect;
- } elsif ($sort eq 'D') {
- ; # ignored (an echo)
- } elsif ($sort eq 'G') {
- $dxchan->enhanced($line);
- } else {
- print STDERR atime, " Unknown command letter ($sort) received from $call\n";
- }
- }
-}
sub uptime
{
foreach my $l (@main::listen) {
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");
+ my $login = $l->[3] || 'login';
+
+ $conn = $pkg->new_server($l->[0], $l->[1], \&{"${pkg}::${login}"});
+ $conn->conns("Server $l->[0]/$l->[1] using ${pkg}::${login}");
push @listeners, $conn;
- dbg("External Port: $l->[0] $l->[1] using $pkg");
+ dbg("External Port: $l->[0] $l->[1] using ${pkg}::${login}");
}
dbg("AGW Listener") if $AGWMsg::enable;
# initialise the protocol engine
dbg("Start Protocol Engines ...");
DXProt->init();
-QXProt->init();
+Aranea->init();
# put in a DXCluster node for us here so we can add users and take them away
-$routeroot = Route::Node->new($mycall, $version*100+5300, Route::here($main::me->here)|Route::conf($main::me->conf));
+$routeroot = Route::Node->new($mycall, $version*100+5251, Route::here($main::me->here)|Route::conf($main::me->conf));
# make sure that there is a routing OUTPUT node default file
#unless (Filter::read_in('route', 'node_default', 0)) {
Msg->event_loop(10, 0.010);
my $timenow = time;
- process_inqueue(); # read in lines from the input queue and despatch them
+
+ DXChannel::process();
+ Thingy::process();
+
# $DB::trace = 0;
# do timed stuff, ongoing processing happens one a second
if ($timenow != $systime) {
+ rand(); # keep randomising to reduce (but not eliminate) predictability
reap if $zombies;
$systime = $timenow;
DXCron::process(); # do cron jobs
DXCommandmode::process(); # process ongoing command mode stuff
DXProt::process(); # process ongoing ak1a pcxx stuff
- QXProt::process();
+ Aranea::process();
DXConnect::process();
DXMsg::process();
DXDb::process();
DXDupe::process();
AGWMsg::process();
- # this where things really start to happen (in DXSpider 2)
- Thingy::process();
-
eval {
Local::process(); # do any localised processing
};