Initial resurrection kit — 81 scripts, 62 references, configs, systemd units, crons, Docker compose files, Caddy config, master README
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
generate-script-contents.py — Generate script-contents.json from known cron job scripts.
|
||||
|
||||
Reads the ops-status.json to find all referenced scripts, reads their content
|
||||
from the filesystem, and writes script-contents.json to the ops data directory.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
OUTPUT_PATH = Path("/var/www/ops/data/script-contents.json")
|
||||
STATUS_PATH = Path("/var/www/ops/data/ops-status.json")
|
||||
SCRIPT_DIRS = [
|
||||
Path("/root/.hermes/scripts"),
|
||||
Path("/root/.hermes/cron"),
|
||||
Path("/root"),
|
||||
]
|
||||
|
||||
def find_script(name: str) -> Path | None:
|
||||
"""Find a script file by name in known script directories."""
|
||||
if not name:
|
||||
return None
|
||||
for d in SCRIPT_DIRS:
|
||||
p = d / name
|
||||
if p.exists() and p.is_file():
|
||||
return p
|
||||
# Try without leading path components
|
||||
basename = Path(name).name
|
||||
for d in SCRIPT_DIRS:
|
||||
p = d / basename
|
||||
if p.exists() and p.is_file():
|
||||
return p
|
||||
return None
|
||||
|
||||
def read_script_content(path: Path) -> str | None:
|
||||
"""Read a script file, returning first 5000 chars or None."""
|
||||
try:
|
||||
content = path.read_text(encoding="utf-8", errors="replace")
|
||||
if len(content) > 5000:
|
||||
content = content[:5000] + "\n\n# ... (truncated, full file is larger)"
|
||||
return content
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def main():
|
||||
if not STATUS_PATH.exists():
|
||||
print(f"Status file not found: {STATUS_PATH}", file=sys.stderr)
|
||||
return
|
||||
|
||||
try:
|
||||
data = json.loads(STATUS_PATH.read_text())
|
||||
except (json.JSONDecodeError, OSError) as e:
|
||||
print(f"Failed to read status: {e}", file=sys.stderr)
|
||||
return
|
||||
|
||||
cron_jobs = data.get("cron_jobs", [])
|
||||
result = {}
|
||||
|
||||
for job in cron_jobs:
|
||||
script_name = job.get("script", "")
|
||||
if not script_name:
|
||||
continue
|
||||
script_path = find_script(script_name)
|
||||
if script_path:
|
||||
content = read_script_content(script_path)
|
||||
if content:
|
||||
result[script_name] = {
|
||||
"full_path": str(script_path),
|
||||
"content": content,
|
||||
}
|
||||
|
||||
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
||||
OUTPUT_PATH.write_text(json.dumps(result, indent=2))
|
||||
print(f"Wrote {len(result)} script contents to {OUTPUT_PATH}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user