#
# Copyright (c) 1998 - Dirk Koopman G1TLH
#
-# $Id$
+#
#
package DXCron;
use DXM;
use DXDebug;
use IO::File;
+use DXLog;
+use Time::HiRes qw(gettimeofday tv_interval);
+use Mojo::IOLoop::Subprocess;
use strict;
my $fn = "$main::cmd/crontab";
my $localfn = "$main::localcmd/crontab";
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
-$main::build += $VERSION;
-$main::branch += $BRANCH;
-
# cron initialisation / reading in cronjobs
sub init
{
my $line = 0;
my @out;
- dbg("cron: reading $fn\n") if isdbg('cron');
+ dbg("DXCron::cread reading $fn\n") if isdbg('cron');
open($fh, $fn) or confess("cron: can't open $fn $!");
while (<$fh>) {
$line++;
if (!$err) {
$ref->{cmd} = $cmd;
push @out, $ref;
- dbg("cron: adding $_\n") if isdbg('cron');
+ dbg("DXCron::cread: adding $_\n") if isdbg('cron');
} else {
- dbg("cron: error on line $line '$_'\n") if isdbg('cron');
+ dbg("DXCron::cread: error on line $line '$_'\n") if isdbg('cron');
}
}
close($fh);
sub connected
{
my $call = uc shift;
- return DXChannel->get($call);
+ return DXChannel::get($call);
}
# is it remotely connected anywhere (with exact callsign)?
sub last_connect
{
my $call = uc shift;
- return $main::systime if DXChannel->get($call);
- my $user = DXUser->get($call);
+ return $main::systime if DXChannel::get($call);
+ my $user = DXUser::get($call);
return $user ? $user->lastin : 0;
}
sub spawn
{
my $line = shift;
-
- my $pid = fork();
- if (defined $pid) {
- if (!$pid) {
- # in child, unset warnings, disable debugging and general clean up from us
- $^W = 0;
- eval "{ package DB; sub DB {} }";
- DXChannel::closeall();
- for (@main::listeners) {
- $_->close_server;
- }
- unless ($main::is_win) {
- $SIG{HUP} = 'IGNORE';
- $SIG{CHLD} = $SIG{TERM} = $SIG{INT} = $SIG{__WARN__} = 'DEFAULT';
- alarm(0);
- }
- exec "$line" or dbg("exec '$line' failed $!") if isdbg('cron');
- }
- dbg("spawn of $line started") if isdbg('cron');
- } else {
- dbg("can't fork for $line $!") if isdbg('cron');
- }
+ my $t0 = [gettimeofday];
+
+ dbg("DXCron::spawn: $line") if isdbg("cron");
+ my $fc = Mojo::IOLoop::Subprocess->new();
+ $fc->run(
+ sub {
+ my @res = `$line`;
+# diffms("DXCron spawn 1", $line, $t0, scalar @res) if isdbg('chan');
+ return @res
+ },
+ sub {
+ my ($fc, $err, @res) = @_;
+ if ($err) {
+ my $s = "DXCron::spawn: error $err";
+ dbg($s);
+ return;
+ }
+ for (@res) {
+ chomp;
+ dbg("DXCron::spawn: $_") if isdbg("cron");
+ }
+ diffms("by DXCron::spawn", $line, $t0, scalar @res) if isdbg('chan');
+ }
+ );
+}
- # coordinate
- sleep(1);
+sub spawn_cmd
+{
+ my $line = shift;
+ my $t0 = [gettimeofday];
+
+ dbg("DXCron::spawn_cmd run: $line") if isdbg('cron');
+ my $fc = Mojo::IOLoop::Subprocess->new();
+ $fc->run(
+ sub {
+ $main::me->{_nospawn} = 1;
+ my @res = $main::me->run_cmd($line);
+ delete $main::me->{_nospawn};
+# diffms("DXCron spawn_cmd 1", $line, $t0, scalar @res) if isdbg('chan');
+ return @res;
+ },
+ sub {
+ my ($fc, $err, @res) = @_;
+ if ($err) {
+ my $s = "DXCron::spawn_cmd: error $err";
+ dbg($s);
+ }
+ for (@res) {
+ chomp;
+ dbg("DXCron::spawn_cmd: $_") if isdbg("cron");
+ }
+ diffms("by DXCron::spawn_cmd", $line, $t0, scalar @res) if isdbg('chan');
+ }
+ );
}
# do an rcmd to another cluster from the crontab
return unless $noderef && $noderef->version;
# send it
- DXProt::addrcmd($DXProt::me, $call, $line);
+ DXProt::addrcmd($main::me, $call, $line);
}
sub run_cmd
{
my $line = shift;
- my @in = DXCommandmode::run_cmd($DXProt::me, $line);
- dbg("cmd run: $line") if isdbg('cron');
+ my @in = $main::me->run_cmd($line);
+ dbg("DXCron::run_cmd: $line") if isdbg('cron');
for (@in) {
s/\s*$//og;
- dbg("cmd out: $_") if isdbg('cron');
+ dbg("DXCron::cmd out: $_") if isdbg('cron');
}
}
+
1;
__END__