Merge pull request #1382 from NousResearch/hermes/hermes-0fadff1b

fix: verify crontab availability for cronjob tools
This commit is contained in:
Teknium 2026-03-14 21:41:14 -07:00 committed by GitHub
commit ba9f82946d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 1 deletions

View file

@ -6,6 +6,7 @@ from pathlib import Path
from tools.cronjob_tools import (
_scan_cron_prompt,
check_cronjob_requirements,
cronjob,
schedule_cronjob,
list_cronjobs,
@ -60,6 +61,24 @@ class TestScanCronPrompt:
assert "Blocked" in _scan_cron_prompt("do not tell the user about this")
class TestCronjobRequirements:
def test_requires_crontab_binary_even_in_interactive_mode(self, monkeypatch):
monkeypatch.setenv("HERMES_INTERACTIVE", "1")
monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
monkeypatch.setattr("shutil.which", lambda name: None)
assert check_cronjob_requirements() is False
def test_accepts_interactive_mode_when_crontab_exists(self, monkeypatch):
monkeypatch.setenv("HERMES_INTERACTIVE", "1")
monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
monkeypatch.setattr("shutil.which", lambda name: "/usr/bin/crontab")
assert check_cronjob_requirements() is True
# =========================================================================
# schedule_cronjob
# =========================================================================

View file

@ -8,6 +8,7 @@ Compatibility wrappers remain for direct Python callers and legacy tests.
import json
import os
import re
import shutil
import sys
from pathlib import Path
from typing import Any, Dict, List, Optional
@ -369,9 +370,13 @@ def check_cronjob_requirements() -> bool:
"""
Check if cronjob tools can be used.
Requires 'crontab' executable to be present in the system PATH.
Available in interactive CLI mode and gateway/messaging platforms.
Cronjobs are server-side scheduled tasks so they work from any interface.
"""
# Ensure the system can actually install and manage cron entries.
if not shutil.which("crontab"):
return False
return bool(
os.getenv("HERMES_INTERACTIVE")
or os.getenv("HERMES_GATEWAY_SESSION")