#
# Copyright (c) 1998 - Dirk Koopman G1TLH
#
-# $Id$
+#
#
package DXCron;
use DXM;
use DXDebug;
use IO::File;
+use DXLog;
+
+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,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
-
# cron initialisation / reading in cronjobs
sub init
{
{
my $call = uc shift;
return $main::systime if DXChannel::get($call);
- my $user = DXUser->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');
- }
- # coordinate
- sleep(1);
+ my $fc = Mojo::IOLoop::Subprocess->new();
+ $fc->run(
+ sub {my @res = `$line`; 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");
+ }
+ }
+ );
+}
+
+sub spawn_cmd
+{
+ my $line = shift;
+
+ dbg("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};
+ return @res;
+ },
+ sub {
+ my ($fc, $err, @res) = @_;
+ if ($err) {
+ my $s = "spawn_cmd: error $err";
+ dbg($s);
+ }
+ for (@res) {
+ chomp;
+ dbg("spawn_cmd: $_") if isdbg("cron");
+ }
+ }
+ );
}
# do an rcmd to another cluster from the crontab
sub run_cmd
{
my $line = shift;
- my @in = DXCommandmode::run_cmd($main::me, $line);
+ my @in = $main::me->run_cmd($line);
dbg("cmd run: $line") if isdbg('cron');
for (@in) {
s/\s*$//og;
dbg("cmd out: $_") if isdbg('cron');
}
}
+
1;
__END__