X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=5d6248efa296ab372364f9ddb684e3de8c3c2149;hb=502f900651a46b96008028945616a3b610d6cc7a;hp=a84918bd10e4616eed0725256194ab57b352485b;hpb=a453254d687774f352822492d500330a09fd7ebe;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index a84918bd..5d6248ef 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -58,19 +58,20 @@ use Bands; use Geomag; use CmdAlias; use Filter; -use Local; use DXDb; -use Data::Dumper; +use AnnTalk; +use WCY; +use Data::Dumper; use Fcntl ':flock'; -use Carp qw(cluck); +use Local; package main; @inqueue = (); # the main input queue, an array of hashes $systime = 0; # the time now (in seconds) -$version = "1.37"; # the version no of the software +$version = "1.41"; # the version no of the software $starttime = 0; # the starting time of the cluster $lockfn = "cluster.lock"; # lock file name @outstanding_connects = (); # list of outstanding connects @@ -103,9 +104,16 @@ sub rec my ($conn, $msg, $err) = @_; my $dxchan = DXChannel->get_by_cnum($conn); # get the dxconnnect object for this message - if (defined $err && $err) { + if (!defined $msg || (defined $err && $err)) { if ($dxchan) { + if (defined $err) { + $conn->disconnect; + undef $conn; + $dxchan->conn(undef); + } $dxchan->disconnect; + } elsif ($conn) { + $conn->disconnect; } return; } @@ -117,18 +125,18 @@ sub rec # is there one already connected to me - locally? my $user = DXUser->get($call); if (DXChannel->get($call)) { - my $mess = DXM::msg($lang, ($user && $user->sort eq 'A') ? 'concluster' : 'conother', $call); + my $mess = DXM::msg($lang, ($user && $user->is_node) ? 'concluster' : 'conother', $call); already_conn($conn, $call, $mess); return; } # is there one already connected elsewhere in the cluster? if ($user) { - if (($user->sort eq 'A' || $call eq $myalias) && !DXCluster->get_exact($call)) { + if (($user->is_node || $call eq $myalias) && !DXCluster->get_exact($call)) { ; } else { if (DXCluster->get_exact($call)) { - my $mess = DXM::msg($lang, $user->sort eq 'A' ? 'concluster' : 'conother', $call); + my $mess = DXM::msg($lang, $user->is_node ? 'concluster' : 'conother', $call); already_conn($conn, $call, $mess); return; } @@ -151,9 +159,9 @@ sub rec } # create the channel - $dxchan = DXCommandmode->new($call, $conn, $user) if ($user->sort eq 'U'); - $dxchan = DXProt->new($call, $conn, $user) if ($user->sort eq 'A'); - $dxchan = BBS->new($call, $conn, $user) if ($user->sort eq 'B'); + $dxchan = DXCommandmode->new($call, $conn, $user) if $user->is_user; + $dxchan = DXProt->new($call, $conn, $user) if $user->is_node; + $dxchan = BBS->new($call, $conn, $user) if $user->is_bbs; die "Invalid sort of user on $call = $sort" if !$dxchan; } @@ -186,7 +194,7 @@ sub cease # disconnect nodes foreach $dxchan (DXChannel->get_all()) { - next unless $dxchan->is_ak1a; + next unless $dxchan->is_node; disconnect($dxchan) unless $dxchan == $DXProt::me; } Msg->event_loop(1, 0.05); @@ -198,7 +206,7 @@ sub cease # disconnect users foreach $dxchan (DXChannel->get_all()) { - next if $dxchan->is_ak1a; + next if $dxchan->is_node; disconnect($dxchan) unless $dxchan == $DXProt::me; } Msg->event_loop(1, 0.05); @@ -238,7 +246,7 @@ sub process_inqueue my $data = $self->{data}; my $dxchan = $self->{dxchan}; - my ($sort, $call, $line) = $data =~ /^(\w)([A-Z0-9\-]+)\|(.*)$/; + my ($sort, $call, $line) = $data =~ /^(\w)([^\|]+)\|(.*)$/; my $error; # the above regexp must work @@ -299,22 +307,22 @@ STDOUT->autoflush(1); Log('cluster', "DXSpider V$version started"); # banner -print "DXSpider DX Cluster Version $version\nCopyright (c) 1998-1999 Dirk Koopman G1TLH\n"; +dbg('err', "DXSpider DX Cluster Version $version", "Copyright (c) 1998-2000 Dirk Koopman G1TLH"); # load Prefixes -print "loading prefixes ...\n"; +dbg('err', "loading prefixes ..."); Prefix::load(); # load band data -print "loading band data ...\n"; +dbg('err', "loading band data ..."); Bands::load(); # initialise User file system -print "loading user file system ...\n"; +dbg('err', "loading user file system ..."); DXUser->init($userfn, 1); # start listening for incoming messages/connects -print "starting listener ...\n"; +dbg('err', "starting listener ..."); Msg->new_server("$clusteraddr", $clusterport, \&login); # prime some signals @@ -331,12 +339,13 @@ CmdAlias->init(); # initialise the Geomagnetic data engine Geomag->init(); +WCY->init(); # initial the Spot stuff Spot->init(); # initialise the protocol engine -print "reading in duplicate spot and WWV info ...\n"; +dbg('err', "reading in duplicate spot and WWV info ..."); DXProt->init(); @@ -344,36 +353,46 @@ DXProt->init(); DXNode->new(0, $mycall, 0, 1, $DXProt::myprot_version); # read in any existing message headers and clean out old crap -print "reading existing message headers ...\n"; +dbg('err', "reading existing message headers ..."); DXMsg->init(); DXMsg::clean_old(); # read in any cron jobs -print "reading cron jobs ...\n"; +dbg('err', "reading cron jobs ..."); DXCron->init(); # read in database descriptors -print "reading database descriptors ...\n"; +dbg('err', "reading database descriptors ..."); DXDb::load(); # starting local stuff -print "doing local initialisation ...\n"; +dbg('err', "doing local initialisation ..."); eval { Local::init(); }; dbg('local', "Local::init error $@") if $@; # print various flags -#print "useful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P\n"; +#dbg('err', "seful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P"); # this, such as it is, is the main loop! -print "orft we jolly well go ...\n"; -dbg('chan', "DXSpider version $version started..."); +dbg('err', "orft we jolly well go ..."); + +#open(DB::OUT, "|tee /tmp/aa"); + +$SIG{PIPE} = sub { + #$DB::single = 1; + dbg('err', "Broken PIPE signal received"); +}; + for (;;) { my $timenow; +# $DB::trace = 1; + Msg->event_loop(1, 0.1); $timenow = time; process_inqueue(); # read in lines from the input queue and despatch them +# $DB::trace = 0; # do timed stuff, ongoing processing happens one a second if ($timenow != $systime) {