diff --git a/src/ansibleguy-webui/aw/api_endpoints/job_util.py b/src/ansibleguy-webui/aw/api_endpoints/job_util.py index 8c9f661..ec75c4a 100644 --- a/src/ansibleguy-webui/aw/api_endpoints/job_util.py +++ b/src/ansibleguy-webui/aw/api_endpoints/job_util.py @@ -93,7 +93,7 @@ def get_viewable_jobs_serialized( job_serialized['next_run'] = None try: - if job.schedule is not None and job.enabled: + if is_set(job.schedule) and job.enabled: job_serialized['next_run'] = get_next_cron_execution_str(job.schedule) + f" {config['timezone']}" except ValueError: diff --git a/src/ansibleguy-webui/aw/execute/threader.py b/src/ansibleguy-webui/aw/execute/threader.py index 1a39b38..7806698 100644 --- a/src/ansibleguy-webui/aw/execute/threader.py +++ b/src/ansibleguy-webui/aw/execute/threader.py @@ -81,7 +81,14 @@ def run(self, error: bool = False) -> None: return while not self.state_stop.is_set(): + if not is_set(self.job.schedule): + return + wait_sec = get_next_cron_execution_sec(self.job.schedule) + + if wait_sec == -1: + return + self.next_execution_time = get_next_cron_execution_str(schedule=self.job.schedule, wait_sec=wait_sec) log( f"Next execution of job {self.log_name_debug} at " @@ -96,6 +103,7 @@ def run(self, error: bool = False) -> None: log(f"Starting job {self.log_name_debug}", level=5) self.run_playbook() + break except (AnsibleConfigError, AnsibleRepositoryError, OSError) as err: diff --git a/src/ansibleguy-webui/aw/utils/util.py b/src/ansibleguy-webui/aw/utils/util.py index a55a41f..b93040f 100644 --- a/src/ansibleguy-webui/aw/utils/util.py +++ b/src/ansibleguy-webui/aw/utils/util.py @@ -46,20 +46,30 @@ def datetime_from_db_str(dt: (datetime, None), fmt: str = SHORT_TIME_FORMAT) -> def get_next_cron_execution_sec(schedule: str) -> float: - cron = CronTab(schedule) - set_timezone(str(config.timezone)) - return cron.next(now=datetime_w_tz()) + try: + cron = CronTab(schedule) + set_timezone(str(config.timezone)) + return cron.next(now=datetime_w_tz()) + except ValueError: + return -1 -def get_next_cron_execution(schedule: str, wait_sec: (int, float) = None) -> datetime: + +def get_next_cron_execution(schedule: str, wait_sec: (int, float) = None) -> (datetime, None): if wait_sec is None: wait_sec = get_next_cron_execution_sec(schedule) + if wait_sec == -1: + return None return datetime.fromtimestamp(time() + wait_sec) def get_next_cron_execution_str(schedule: str, wait_sec: (int, float) = None) -> str: - return get_next_cron_execution(schedule, wait_sec).strftime(SHORT_TIME_FORMAT) + next_exec_dt = get_next_cron_execution(schedule, wait_sec) + if next_exec_dt is None: + return '' + + return next_exec_dt.strftime(SHORT_TIME_FORMAT) def _open_file_0600(path: (str, Path), flags):