fix: auto-repair jobs.json with invalid control characters (#3537)
load_jobs() uses strict json.load() which rejects bare control characters (e.g. literal newlines) in JSON string values. When a cron job prompt contains such characters, the parser throws JSONDecodeError and the function silently returns an empty list — causing ALL scheduled jobs to stop firing with no error logged. Fix: on JSONDecodeError, retry with json.loads(strict=False). If jobs are recovered, auto-rewrite the file with proper escaping via save_jobs() and log a warning. Only fall back to empty list if the JSON is truly unrecoverable. Co-authored-by: Sebastian Bochna <sbochna@SB-MBP-M2-2.local>
This commit is contained in:
15
cron/jobs.py
15
cron/jobs.py
@@ -327,7 +327,20 @@ def load_jobs() -> List[Dict[str, Any]]:
|
||||
with open(JOBS_FILE, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
return data.get("jobs", [])
|
||||
except (json.JSONDecodeError, IOError):
|
||||
except json.JSONDecodeError:
|
||||
# Retry with strict=False to handle bare control chars in string values
|
||||
try:
|
||||
with open(JOBS_FILE, 'r', encoding='utf-8') as f:
|
||||
data = json.loads(f.read(), strict=False)
|
||||
jobs = data.get("jobs", [])
|
||||
if jobs:
|
||||
# Auto-repair: rewrite with proper escaping
|
||||
save_jobs(jobs)
|
||||
logger.warning("Auto-repaired jobs.json (had invalid control characters)")
|
||||
return jobs
|
||||
except Exception:
|
||||
return []
|
||||
except IOError:
|
||||
return []
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user