<p>
<!-- Created: Sun Dec 13 20:25:14 GMT 1998 -->
<!-- hhmts start -->
-Last modified: Fri Jan 19 14:25:13 GMT 2001
+Last modified: Mon Apr 23 00:42:50 BST 2001
<!-- hhmts end -->
<h4>Introduction</h4>
to another cluster and a set of routines are specially provided in the context
of the <tt>DXCron</tt> package to make this easy. For example
<pre>
+ start_connect('gb7tlh') unless connected('gb7tlh')
+ </pre>
+ this could have also been written:
+ <pre>
start_connect('gb7tlh') if !connected('gb7tlh')
</pre>
- will attempt to start a <a href="connect.html">connection</a> process to GB7TLH if it isn't
+ but the first method is more 'perlish',
+ <p>Either of these commands will attempt to start a <a href="connect.html">connection</a> process to GB7TLH if it isn't
already locally connected.
<p>There is absolutely no reason why you could not do something more complicated using information
# check every 10 minutes to see if gb7tlh is connected and if not
# start a connect job going
- 0,10,20,30,40,50 * * * * start_connect('gb7tlh') if !connected('gb7tlh')
+ 0,10,20,30,40,50 * * * * start_connect('gb7tlh') unless connected('gb7tlh')
# at 03:15 on Sundays start a job called 'analyse.pl' which does something
# or other. This starts a new process and runs to completion, be careful
23 * * * * rcmd('rcmd/gb7dxm disc/noinform G9TLH') if present_on('G9TLH', 'GB7DXM')
+ # some people like to do an hourly announce to say who they are. There is a
+ # slight complication about this because of the announce duplicate checking
+ # so you need to make each announce unique. I do this by adding a date and time
+ # stamp on the end
+
+ 0 * * * * run_cmd('ann CLUSTER: GB7DJK JO02LQ at ' . cldate . ' ' . ztime)
+
</pre>
It is important remember that these <tt>crontab</tt> routines execute in line with the main
cluster code, so if you create a long, slow <tt>crontab</tt> command, it will impact on the speed
and usability of the cluster as a whole.
+ <p>If you want to see what commands are being run and/or the syntax errors in the
+ crontab, then run: <em>set/debug cron</em> on the console and monitor the
+ debuging output (I use <em>watchdbg</em> in another window).
+
+ <P> To set the debugging back to normal do: <em>unset/debug cron</em>.
+
<h4>Standard Routines</h4>
As mentioned earlier, there are a small number of routines that are declared in <tt>DXCron</tt>
They are:-
<ul>
- <p><li><b>connected(<callsign>)</b> - returns true if the <callsign> is directly connected
+ <li><b>run_cmd(<cluster command string>)</b> - run any cluster command as
+ the node callsign. Any output is sent to the 'cron' debug channel
+ (<tt>set/debug cron</tt> to see this).
+ <br><br><li><b>connected(<callsign>)</b> - returns true if the <callsign> is directly connected
to this cluster node.
- <p><li><b>start_connect(<script-name>)</b> - starts a <a href="connect.html">connection</a>
+ <br><br><li><b>start_connect(<script-name>)</b> - starts a <a href="connect.html">connection</a>
script just as if you had typed in <tt>connect script-name</tt> on the sysop console client.
- <p><li><b>spawn(<command>)</b> - start a <command> as a new process. This is used to do
+ <br><br><li><b>spawn(<command>)</b> - start a <command> as a new process. This is used to do
various batch jobs that you may wish to happen at certain times of the day or week that operate
on your machine but don't require access to the real-time internals of the cluster daemon. You can
execute just about any command you like, but <em>be warned</em> <b>stdin</b> and <b>stdout</b> are
still connected to the same terminal (if any) as the cluster daemon. Any unix command and arguments
can used, see <tt>exec</tt> in the <a href="http://www.perl.com">perl</a> documentation.
- <p><li><b>disconnect(<callsign>)</b> - disconnects a locally connected station from your node.
- <p><li><b>rcmd(<node-call>, <command>)</b> - send a command to another node in exactly the
+ <br><br><li><b>disconnect(<callsign>)</b> - disconnects a locally connected station from your node.
+ <br><br><li><b>rcmd(<node-call>, <command>)</b> - send a command to another node in exactly the
same way as, for example, <tt>RCMD/GB7TLH disc GB7DJK</tt> typed on a sysop console.
- <p><li><b>present(<exact-callsign>)</b> and <b>presentish(<callsign-no-ssid>)</b> - returns
+ <br><br><li><b>present(<exact-callsign>)</b> and <b>presentish(<callsign-no-ssid>)</b> - returns
true if the
callsign is connected anywhere on the cluster either with the exact callsign or with the callsign
minus its ssid respectively.
- <p><li><b>present_on(<exact-callsign>, <node>)</b> and <b>presentish_on(<callsign-no-ssid>, <node>)</b> - returns
+ <br><br><li><b>present_on(<exact-callsign>, <node>)</b> and <b>presentish_on(<callsign-no-ssid>, <node>)</b> - returns
true if the
callsign is connected on the node specified either with the exact callsign or with the callsign
minus its ssid respectively.
- <p><li><b>last_connect(<callsign>)</b> - Returns the last connect time of the callsign or the
+ <br><br><li><b>last_connect(<callsign>)</b> - Returns the last connect time of the callsign or the
current time if it is currently connected locally.
</ul>
- <h4>Caveats</h4>
-
- There was an intermittent problem when running
- (especially?) with the debugger on. Essentially you would
- experience random crashes with nonsensical error messages returning from funny places on the stack (if
- the debugger was on) or just core dumping (if it wasn't).
-
- <p>I believe this now to be fixed. YMMV, if so tell me about it!
-
<!-- Standard Footer!! -->
<p> </p>
<p>
# disconnect a locally connected thing
sub disconnect
{
- my $call = uc shift;
- my $dxchan = DXChannel->get($call);
- $dxchan->disconnect if $dxchan;
+ my $call = shift;
+ run_cmd("disconnect $call");
}
# start a connect process off
sub start_connect
{
- my $call = uc shift;
- my $lccall = lc $call;
-
- if (Msg->conns($call)) {
- dbg('cron', "Connect not started, outstanding connect to $call");
- return;
- }
- if (-e "$main::root/connect/$lccall") {
- ExtMsg::start_connect($call, "$main::root/connect/$lccall");
- } else {
- dbg('err', "Cannot find connect script for $lccall");
- }
+ my $call = shift;
+ # connecting is now done in one place - Yeah!
+ run_cmd("connect $call");
}
# spawn any old job off
# send it
DXProt::addrcmd($DXProt::me, $call, $line);
}
+
+sub run_cmd
+{
+ my $line = shift;
+ my @in = DXCommandmode::run_cmd($DXProt::me, $line);
+ dbg('cron', "cmd run: $line");
+ for (@in) {
+ s/\s*$//og;
+ dbg('cron', "cmd out: $_");
+ }
+}
1;
__END__