Fixed cron day of the week on linux agents
Former-commit-id: 2e920e1a3387d0a42dcd67eec1fbd0e0a08d998d
This commit is contained in:
parent
14ea1a4714
commit
e50fb4c585
|
@ -2101,45 +2101,23 @@ sub cron_next_execution {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get day of the week and month from cron config
|
# Get day of the week and month from cron config
|
||||||
my ($mday, $wday) = (split (/\s/, $cron))[2, 4];
|
my ($wday) = (split (/\s/, $cron))[4];
|
||||||
|
|
||||||
# Get current time and day of the week
|
# Get current time and day of the week
|
||||||
my $cur_time = time();
|
my $cur_time = time();
|
||||||
my $cur_wday = (localtime ($cur_time))[6];
|
my $cur_wday = (localtime ($cur_time))[6];
|
||||||
|
|
||||||
# Any day of the week
|
my $nex_time = cron_next_execution_date ($cron, $cur_time, $interval);
|
||||||
if ($wday eq '*') {
|
|
||||||
my $nex_time = cron_next_execution_date ($cron, $cur_time, $interval);
|
# Check the day
|
||||||
return $nex_time - time();
|
print localtime($nex_time)->strftime('%c') . " - OUTSIDE\n";
|
||||||
}
|
while (!cron_check_interval($wday, (localtime ($nex_time))[6])) {
|
||||||
# A range?
|
# If it does not acomplish the day of the week, go to the next day.
|
||||||
else {
|
$nex_time += 86400;
|
||||||
$wday = cron_get_closest_in_range ($cur_wday, $wday);
|
$nex_time = cron_next_execution_date ($cron, $nex_time, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
# A specific day of the week
|
return $nex_time - time();
|
||||||
my $count = 0;
|
|
||||||
my $nex_time = $cur_time;
|
|
||||||
do {
|
|
||||||
$nex_time = cron_next_execution_date ($cron, $nex_time, $interval);
|
|
||||||
my $nex_time_wd = $nex_time;
|
|
||||||
my ($nex_mon, $nex_wday) = (localtime ($nex_time_wd))[4, 6];
|
|
||||||
my $nex_mon_wd;
|
|
||||||
do {
|
|
||||||
# Check the day of the week
|
|
||||||
if ($nex_wday == $wday) {
|
|
||||||
return $nex_time_wd - time();
|
|
||||||
}
|
|
||||||
|
|
||||||
# Move to the next day of the month
|
|
||||||
$nex_time_wd += 86400;
|
|
||||||
($nex_mon_wd, $nex_wday) = (localtime ($nex_time_wd))[4, 6];
|
|
||||||
} while ($mday eq '*' && $nex_mon_wd == $nex_mon);
|
|
||||||
$count++;
|
|
||||||
} while ($count < 60);
|
|
||||||
|
|
||||||
# Something went wrong, default to 5 minutes
|
|
||||||
return $interval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -2151,7 +2129,30 @@ sub cron_check_syntax ($) {
|
||||||
return 0 if !defined ($cron);
|
return 0 if !defined ($cron);
|
||||||
return ($cron =~ m/^(\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+$/);
|
return ($cron =~ m/^(\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+ (\d|\*|-)+$/);
|
||||||
}
|
}
|
||||||
|
###############################################################################
|
||||||
|
# Check if a value is inside an interval.
|
||||||
|
###############################################################################
|
||||||
|
sub cron_check_interval {
|
||||||
|
my ($elem_cron, $elem_curr_time) = @_;
|
||||||
|
|
||||||
|
# Return 1 if wildcard.
|
||||||
|
return 1 if ($elem_cron eq "*");
|
||||||
|
|
||||||
|
my ($down, $up) = cron_get_interval($elem_cron);
|
||||||
|
# Check if it is not a range
|
||||||
|
if (!defined($up)) {
|
||||||
|
return ($down == $elem_curr_time) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if it is on the range
|
||||||
|
if ($down < $up) {
|
||||||
|
return 0 if ($elem_curr_time < $down || $elem_curr_time > $up);
|
||||||
|
} else {
|
||||||
|
return 0 if ($elem_curr_time > $down || $elem_curr_time < $up);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Get the next execution date for the given cron entry in seconds since epoch.
|
# Get the next execution date for the given cron entry in seconds since epoch.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -2189,8 +2190,7 @@ sub cron_next_execution_date {
|
||||||
my @nex_time_array = @curr_time_array;
|
my @nex_time_array = @curr_time_array;
|
||||||
|
|
||||||
# Update minutes
|
# Update minutes
|
||||||
my ($min_down, undef) = cron_get_interval ($min);
|
$nex_time_array[0] = cron_get_next_time_element($min);
|
||||||
$nex_time_array[0] = ($min_down eq '*') ? 0 : $min_down;
|
|
||||||
|
|
||||||
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
||||||
if ($nex_time >= $cur_time) {
|
if ($nex_time >= $cur_time) {
|
||||||
|
@ -2224,8 +2224,7 @@ sub cron_next_execution_date {
|
||||||
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
||||||
|
|
||||||
#Update the hour if fails
|
#Update the hour if fails
|
||||||
my ($hour_down, undef) = cron_get_interval ($hour);
|
$nex_time_array[1] = cron_get_next_time_element($hour);
|
||||||
$nex_time_array[1] = ($hour_down eq '*') ? 0 : $hour_down;
|
|
||||||
|
|
||||||
# When an overflow is passed check the hour update again
|
# When an overflow is passed check the hour update again
|
||||||
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
||||||
|
@ -2253,10 +2252,9 @@ sub cron_next_execution_date {
|
||||||
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
||||||
|
|
||||||
#Update the day if fails
|
#Update the day if fails
|
||||||
my ($mday_down, undef) = cron_get_interval ($mday);
|
$nex_time_array[2] = cron_get_next_time_element($mday, 1);
|
||||||
$nex_time_array[2] = ($mday_down eq '*') ? 1 : $mday_down;
|
|
||||||
|
|
||||||
# When an overflow is passed check the day update in the next execution
|
# When an overflow is passed check the hour update in the next execution
|
||||||
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
||||||
if ($nex_time >= $cur_time) {
|
if ($nex_time >= $cur_time) {
|
||||||
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
||||||
|
@ -2276,8 +2274,7 @@ sub cron_next_execution_date {
|
||||||
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
return $nex_time if cron_is_in_cron(\@cron_array, \@nex_time_array);
|
||||||
|
|
||||||
#Update the month if fails
|
#Update the month if fails
|
||||||
my ($mon_down, undef) = cron_get_interval ($mon);
|
$nex_time_array[3] = cron_get_next_time_element($mon);
|
||||||
$nex_time_array[3] = ($mon_down eq '*') ? 0 : $mon_down;
|
|
||||||
|
|
||||||
# When an overflow is passed check the month update in the next execution
|
# When an overflow is passed check the month update in the next execution
|
||||||
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
$nex_time = cron_valid_date(@nex_time_array, $cur_year);
|
||||||
|
@ -2308,23 +2305,30 @@ sub cron_is_in_cron {
|
||||||
#If there is no elements means that is in cron
|
#If there is no elements means that is in cron
|
||||||
return 1 unless (defined($elem_cron) || defined($elem_curr_time));
|
return 1 unless (defined($elem_cron) || defined($elem_curr_time));
|
||||||
|
|
||||||
# Go to last element if current is a wild card
|
# Check the element interval
|
||||||
if ($elem_cron ne '*') {
|
return 0 unless (cron_check_interval($elem_cron, $elem_curr_time));
|
||||||
my ($down, $up) = cron_get_interval($elem_cron);
|
|
||||||
# Check if there is no a range
|
|
||||||
return 0 if (!defined($up) && ($down != $elem_curr_time));
|
|
||||||
# Check if there is on the range
|
|
||||||
if (defined($up)) {
|
|
||||||
if ($down < $up) {
|
|
||||||
return 0 if ($elem_curr_time < $down || $elem_curr_time > $up);
|
|
||||||
} else {
|
|
||||||
return 0 if ($elem_curr_time > $down || $elem_curr_time < $up);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cron_is_in_cron(\@deref_elems_cron, \@deref_elems_curr_time);
|
return cron_is_in_cron(\@deref_elems_cron, \@deref_elems_curr_time);
|
||||||
}
|
}
|
||||||
|
################################################################################
|
||||||
|
#Get the next tentative time for a cron value or interval in case of overflow.
|
||||||
|
#Floor data is the minimum localtime data for a position. Ex:
|
||||||
|
#Ex:
|
||||||
|
# * should returns floor data.
|
||||||
|
# 5 should returns 5.
|
||||||
|
# 10-55 should returns 10.
|
||||||
|
# 55-10 should retunrs floor data.
|
||||||
|
################################################################################
|
||||||
|
sub cron_get_next_time_element {
|
||||||
|
# Default floor data is 0
|
||||||
|
my ($curr_element, $floor_data) = @_;
|
||||||
|
$floor_data = 0 unless defined($floor_data);
|
||||||
|
|
||||||
|
my ($elem_down, $elem_up) = cron_get_interval ($curr_element);
|
||||||
|
return ($elem_down eq '*' || (defined($elem_up) && $elem_down > $elem_up))
|
||||||
|
? $floor_data
|
||||||
|
: $elem_down;
|
||||||
|
}
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Returns the interval of a cron element. If there is not a range,
|
# Returns the interval of a cron element. If there is not a range,
|
||||||
# returns an array with the first element in the first place of array
|
# returns an array with the first element in the first place of array
|
||||||
|
@ -2416,12 +2420,11 @@ sub check_module_cron {
|
||||||
return 1 unless ($is_first);
|
return 1 unless ($is_first);
|
||||||
|
|
||||||
# Check if current timestamp is a valid cron date
|
# Check if current timestamp is a valid cron date
|
||||||
my $next_execution = cron_next_execution_date(
|
my $next_execution = cron_next_execution(
|
||||||
$module->{'cron'},
|
$module->{'cron'},
|
||||||
$now - $interval,
|
0
|
||||||
$interval
|
|
||||||
);
|
);
|
||||||
return 1 if ($next_execution == $now);
|
return 1 if (time() + $next_execution == $now);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue