X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=30f815418acdc00d3d640ac3aa2ee3050985483a;hb=d16a47c69c71370281d87c975bc6089d976eaa7b;hp=b4cb11c0a898700d842a072e0c0d218e40ee1eac;hpb=9e6f237bf04fc102b519085e171d81b28d418ccb;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index b4cb11c0..30f81541 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -10,6 +10,8 @@ # $Id$ # +require 5.004; + # make sure that modules are searched in the order local then perl BEGIN { # root of directory tree for this system @@ -18,9 +20,6 @@ BEGIN { unshift @INC, "$root/perl"; # this IS the right way round! unshift @INC, "$root/local"; - -# require Exporter; -# $Exporter::Verbose = 1; } use Msg; @@ -42,13 +41,15 @@ use Prefix; use Bands; use Geomag; use CmdAlias; +use Local; + use Carp; package main; @inqueue = (); # the main input queue, an array of hashes $systime = 0; # the time now (in seconds) -$version = "1.11"; # the version no of the software +$version = "1.22"; # the version no of the software $starttime = 0; # the starting time of the cluster # handle disconnections @@ -59,6 +60,18 @@ sub disconnect $dxchan->disconnect(); } +# send a message to call on conn and disconnect +sub already_conn +{ + my ($conn, $call, $mess) = @_; + + dbg('chan', "-> D $call $mess\n"); + $conn->send_now("D$call|$mess"); + sleep(1); + dbg('chan', "-> Z $call bye\n"); + $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect +} + # handle incoming messages sub rec { @@ -74,40 +87,28 @@ sub rec if (!defined $dxchan) { my ($sort, $call, $line) = $msg =~ /^(\w)(\S+)\|(.*)$/; - # is there one already connected? - if (DXChannel->get($call)) { - my $mess = DXM::msg($lang, 'conother', $call); - dbg('chan', "-> D $call $mess\n"); - $conn->send_now("D$call|$mess"); - sleep(1); - dbg('chan', "-> Z $call bye\n"); - $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect - return; - } - # is there one already connected elsewhere in the cluster (and not a cluster) my $user = DXUser->get($call); - if ($user && $user->sort eq 'A' && !DXCluster->get_exact($call)) { - ; - } elsif (($call eq $main::myalias && DXCluster->get_exact($call)) || - DXCluster->get($call)) { - my $mess = DXM::msg($lang, 'concluster', $call); - dbg('chan', "-> D $call $mess\n"); - $conn->send_now("D$call|$mess"); - sleep(1); - dbg('chan', "-> Z $call bye\n"); - $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect - return; - } - - # the user MAY have an SSID if local, but otherwise doesn't - my $user = DXUser->get($call); - if (!defined $user) { - $user = DXUser->new($call); - } else { + if ($user) { + if (($user->sort eq 'A' || $call eq $myalias) && !DXCluster->get_exact($call)) { + ; + } else { + if (DXCluster->get($call) || DXChannel->get($call)) { + my $mess = DXM::msg($lang, $user->sort eq 'A' ? 'concluster' : 'conother', $call); + already_conn($conn, $call, $mess); + return; + } + } $user->{lang} = $main::lang if !$user->{lang}; # to autoupdate old systems + } else { + if (DXCluster->get($call)) { + my $mess = DXM::msg($lang, 'conother', $call); + already_conn($conn, $call, $mess); + return; + } + $user = DXUser->new($call); } - + # is he locked out ? if ($user->lockout) { Log('DXCommand', "$call is locked out, disconnected"); @@ -139,8 +140,14 @@ sub login sub cease { my $dxchan; + + eval { + Local::finish(); # end local processing + }; + dbg('local', "Local::finish error $@") if $@; + foreach $dxchan (DXChannel->get_all()) { - disconnect($dxchan); + disconnect($dxchan) unless $dxchan == $DXProt::me; } Log('cluster', "DXSpider V$version stopped"); exit(0); @@ -149,6 +156,7 @@ sub cease # the reaper of children sub reap { + $SIG{'CHLD'} = \&reap; my $cpid = wait; } @@ -243,27 +251,41 @@ DXM->init(); # read in command aliases CmdAlias->init(); -# initialise the protocol engine -DXProt->init(); - # initialise the Geomagnetic data engine Geomag->init(); # initial the Spot stuff Spot->init(); +# initialise the protocol engine +print "reading in duplicate spot and WWV info ...\n"; +DXProt->init(); + + # put in a DXCluster node for us here so we can add users and take them away 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"; +print "reading existing message headers ...\n"; DXMsg->init(); DXMsg::clean_old(); # read in any cron jobs -print "reading cron jobs\n"; +print "reading cron jobs ...\n"; DXCron->init(); +# starting local stuff +print "doing local initialisation ...\n"; +eval { + Local::init(); +}; +dbg('local', "Local::init error $@") if $@; + + + +# print various flags +#print "useful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P\n"; + # this, such as it is, is the main loop! print "orft we jolly well go ...\n"; for (;;) { @@ -281,6 +303,10 @@ for (;;) { DXCommandmode::process(); # process ongoing command mode stuff DXProt::process(); # process ongoing ak1a pcxx stuff DXConnect::process(); + eval { + Local::process(); # do any localised processing + }; + dbg('local', "Local::process error $@") if $@; } if ($decease) { last if --$decease <= 0;