scripts¶
Generated: 2026-07-21 19:53
Total scripts: 78 (44 shell, 34 Python)
Cron-attached: 30 of 78
Location: /root/.hermes/scripts/
Backup: Live sync (every 15m) + Full daily backup → Wasabi S3
Backup & DR¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
unms-backup-sync.sh |
unms-backup-sync.sh -- Daily UISP/UNMS backup sync to Wasabi S3. | shell | 2.6KB | {'kind': 'cron', 'expr': '0 6 * * ', 'display': '0 6 * * '} | unms-backup-sync ✅ |
gitea-backup.sh |
gitea-backup.sh — Daily Gitea backup to Wasabi S3. | shell | 2.5KB | {'kind': 'cron', 'expr': '0 8 * * ', 'display': '0 8 * * '} | gitea-backup ✅ |
snapshot-hetzner.py |
Create a snapshot of ALL running servers in the Hetzner account. | python | 1.8KB | {'kind': 'cron', 'expr': '0 5 * * 1', 'display': '0 5 * * 1'} | hetzner-weekly-snapshots ✅ |
hudu-backup.sh |
hudu-backup.sh — Daily Hudu PostgreSQL backup to Wasabi S3. | shell | 1.6KB | {'kind': 'cron', 'expr': '0 7 * * ', 'display': '0 7 * * '} | hudu-backup ✅ |
hermes-live-sync.sh |
hermes-live-sync.sh — Full Hermes sync to S3 every 15 min | shell | 1.1KB | {'kind': 'interval', 'minutes': 15, 'display': 'every 15m'} | hermes-live-sync ✅ |
run-wisp-backup.sh |
run-wisp-backup.sh — Wrapper for cron: sets up env and runs CCR backup via VPN | shell | 776B | {'kind': 'cron', 'expr': '0 6 * * ', 'display': '0 6 * * '} | home-router-daily-backup ✅ |
sync_ringlogix.py |
Sync RingLogix subscriber data to local cache | python | 27.0KB | Manual | — |
backup_portal.py |
Backup portal data for web hosting services | python | 17.1KB | Manual | — |
wisp-backup.py |
Call home-router-vpn.sh up/down/status. | python | 13.1KB | Manual | — |
hermes-backup.sh |
hermes-backup.sh — Full Hermes backup to Wasabi S3 | shell | 7.9KB | Manual | — |
core-services-backup.sh |
Supplemental Core service backups (services not covered by existing Core backups) | shell | 3.8KB | Manual | — |
hermes-standby-restore.sh |
hermes-standby-restore.sh — Warm standby restore from S3 | shell | 2.7KB | Manual | — |
app1-backup.sh |
Backup app1 AI stack services to S3 | shell | 2.6KB | Manual | — |
hermes-system-config-sync.sh |
hermes-system-config-sync.sh — Sync system-level configs to Wasabi | shell | 2.4KB | Manual | — |
backup-uisp.sh |
Backup UISP/UNMS network management system | shell | 2.3KB | Manual | — |
app3-backup.sh |
Backup app3 web hosting services to S3 | shell | 2.1KB | Manual | — |
root-essentials-backup.sh |
root-essentials-backup.sh — Daily backup of Hermes config/core to S3 | shell | 1.8KB | Manual | — |
hermes-docker-sync.sh |
hermes-docker-sync.sh — Sync Docker volumes to Wasabi | shell | 1.7KB | Manual | — |
unifi-backup-sync.sh |
unifi-backup-sync.sh Daily UniFi backup sync from app2 Docker volume to Wasabi S3. | shell | 1.7KB | Manual | — |
home-router-backup.sh |
Backup home MikroTik router config to S3 | shell | 1.7KB | Manual | — |
app2-backup.sh |
Backup app2 services to S3 | shell | 1.7KB | Manual | — |
backup-audit-check.sh |
backup-audit-check.sh — Daily check: was yesterday's full backup successful? | shell | 1.3KB | Manual | — |
send-backup-email.py |
Send home router backup archive via SMTP. | python | 1.1KB | Manual | — |
send-backup-readme.py |
Send home router backup README via SMTP. | python | 1.1KB | Manual | — |
run-portal-backup.sh |
Portal backup cron wrapper — runs backup_portal.py, silent on success | shell | 782B | Manual | — |
system-config-sync.sh |
Sync system config files to S3 | shell | 669B | Manual | — |
docker-volume-sync.sh |
Sync Docker volumes to S3 | shell | 597B | Manual | — |
Monitoring¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
vps-threshold-check.sh |
VPS Resource Threshold Alert Checker | shell | 6.1KB | {'kind': 'interval', 'minutes': 15, 'display': 'every 15m'} | vps-threshold-check ✅ |
bounce-check.py |
Check email bounce rates and flag delivery issues | python | 3.3KB | {'kind': 'interval', 'minutes': 60, 'display': 'every 60m'} | bounce-check ✅ |
service-health-check.sh |
service-health-check.sh — Check all critical services and report failures | shell | 2.3KB | {'kind': 'interval', 'minutes': 5, 'display': 'every 5m'} | service-health-check ✅ |
imap_triage_watchdog.sh |
Watchdog for the email triage cron job (5929c5f1deff). | shell | 2.1KB | {'kind': 'interval', 'minutes': 10, 'display': 'every 10m'} | IMAP-triage-watchdog ✅ |
spend-monitor-collect.sh |
spend-monitor-collect.sh — Collect LLM spend data for daily monitor | shell | 1.9KB | {'kind': 'cron', 'expr': '0 7 * * ', 'display': '0 7 * * '} | daily-spend-monitor ✅ |
apex-mail-watchdog.sh |
apex-mail-watchdog.sh — Check Apex WPForms email delivery every 5 min | shell | 1.9KB | {'kind': 'cron', 'expr': '/5 * * * ', 'display': '/5 * * * '} | apex-mail-watchdog ✅ |
home-router-watchdog.sh |
home-router-watchdog.sh — Check home router via WireGuard tunnel | shell | 553B | {'kind': 'interval', 'minutes': 5, 'display': 'every 5m'} | Home-Router-Watchdog ✅ |
home-router-watchdog.sh |
home-router-watchdog.sh — Check home router via WireGuard tunnel | shell | 553B | {'kind': 'interval', 'minutes': 5, 'display': 'every 5m'} | Home-Router-Watchdog ✅ |
boys-mail-monitor.py |
Monitor Tony's email inbox for important messages | python | 18.5KB | Manual | — |
hermes-standby-watchdog.sh |
hermes-standby-watchdog.sh — Periodic health check for warm standby | shell | 4.2KB | Manual | — |
apex-mail-watchdog.py |
Try sending a test email to the admin address. | python | 2.9KB | Manual | — |
reboot-with-check.sh |
reboot-with-check.sh — Reboot a server and wait for it + key services to come back. | shell | 2.7KB | Manual | — |
Email¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
shonuff-email-responder.py |
Collect new emails from the Master | python | 9.7KB | {'kind': 'interval', 'minutes': 5, 'display': 'every 5m'} | shonuff-email-reply ✅ |
dre-mail-poller.py |
── Configuration ────────────────────────────────────────────────────────────── | python | 9.6KB | {'kind': 'interval', 'minutes': 1, 'display': 'every 1m'} | dre-mail-poller ✅ |
boxpilot-triage.py |
Free/personal email domains — if sender is from these AND claims another company, it's sus | python | 5.8KB | {'kind': 'interval', 'minutes': 10, 'display': 'every 10m'} | boxpilot-triage ✅ |
shonuff-inbox-collect.py |
Extract plain text from email, favoring text/plain. | python | 3.3KB | {'kind': 'interval', 'minutes': 15, 'display': 'every 15m'} | shonuff-inbox-agent ✅ |
imap_triage_autorun.py |
User-blocked marketing/loan domains are spam/promotional. | python | 2.9KB | {'kind': 'interval', 'minutes': 60, 'display': 'every 60m'} | IMAP-email-triage ✅ |
imap_triage.py |
Core IMAP email triage and classification engine | python | 14.6KB | Manual | — |
send-dr-audit-email.py |
Send DR Backup Audit email to Germaine. | python | 5.5KB | Manual | — |
send-shonuff.py |
Send email from Sho'Nuff Brown with signature + BCC to Germaine + IMAP Sent copy. | python | 2.3KB | Manual | — |
watch-shonuff-inbox.py |
Monitor Sho'Nuff inbox for new messages | python | 2.2KB | Manual | — |
send-recovery.py |
Email the recovery bundle to g@germainebrown.com. | python | 1.5KB | Manual | — |
_fetch_body.py |
Fetch body of email sequence number 2 from shonuff inbox. | python | 1.1KB | Manual | — |
send-reset-notifications.sh |
Called BEFORE suggesting the user type /reset | shell | 914B | Manual | — |
send-back-online.sh |
Called by the NEW session after /reset to notify Germaine and Anita | shell | 832B | Manual | — |
Ops Portal¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
ops-data-collector.py |
─── Configuration ───────────────────── | python | 47.6KB | {'kind': 'cron', 'expr': '/5 * * * ', 'display': '/5 * * * '} | ops-data-collector ✅ |
status-page-refresh.sh |
Status page heartbeat JSON generator | shell | 762B | {'kind': 'interval', 'minutes': 1, 'display': 'every 1m'} | status-page-refresh ✅ |
Network¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
home-router-vpn.sh |
wisp-vpn.sh — Connect/disconnect L2TP/IPsec VPN to MicroTik gateway | shell | 8.1KB | Manual | — |
home-router-keepalive.sh |
wisp-vpn-keepalive.sh — Check VPN status and reconnect if down | shell | 877B | Manual | — |
FleetTracker¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
ft360-export.py |
Cron runs scripts with system Python. The FT360 MCP uses the shared | python | 5.2KB | {'kind': 'interval', 'minutes': 1, 'display': 'every 1m'} | ft360-dashboard-export ✅ |
ft360-route-export.py |
Export today's FT360 device positions as GeoJSON for the dashboard map overlay. | python | 3.8KB | Manual | — |
ft360-daily-stats.py |
Compute daily stats from the Traccar H2 DB for the FT360 dashboard export. | python | 3.2KB | Manual | — |
AI & Models¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
track-firecrawl.py |
Track Firecrawl API credit usage for portal dashboard. | python | 2.7KB | {'kind': 'cron', 'expr': '0 9 * * ', 'display': '0 9 * * '} | firecrawl-usage-check ✅ |
model-usage-tracker.sh |
Model health check -- test all 5 fallback chain providers | shell | 2.2KB | {'kind': 'cron', 'expr': '0 8 * * ', 'display': '0 8 * * '} | model-usage-check ✅ |
Security¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
lynis-scan.sh |
Nightly security audit via Lynis | shell | 723B | {'kind': 'cron', 'expr': '0 3 * * ', 'display': '0 3 * * '} | lynis-scan ✅ |
audit-server.sh |
Comprehensive server audit script | shell | 3.1KB | Manual | — |
DRE¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
dre-approval-reminder.sh |
dre-approval-reminder.sh — Check for pending claim approvals | shell | 854B | {'kind': 'cron', 'expr': '0 * * * ', 'display': '0 * * * '} | dre-pending-approval-reminder ✅ |
Shark Game¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
shark-scraper.sh |
Shark scraper wrapper — silent on success, only outputs on failure | shell | 307B | {'kind': 'interval', 'minutes': 60, 'display': 'every 60m'} | shark-scraper ✅ |
shark-draft-reminder.sh |
shark-draft-reminder.sh — Send 24h and 1h draft reminder emails to league members | shell | 13.1KB | Manual | — |
Hermes Internal¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
hermes-consolidate.sh |
hermes-consolidate.sh — Auto-consolidate Hermes memory every 10 min. | shell | 2.8KB | {'kind': 'interval', 'minutes': 10, 'display': 'every 10m'} | hermes-memory-consolidate ✅ |
hermes-consolidate.py |
Consolidate and archive Hermes backup files | python | 4.6KB | Manual | — |
mcp-mysql.py |
Simple MySQL MCP server for Hermes - with async stdin handling. | python | 3.0KB | Manual | — |
Infrastructure¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
snmp-collect.sh |
Collect SNMP metrics from MikroTik network devices | shell | 926B | Manual | — |
snmp-http-server.py |
Serve SNMP textfile metrics via HTTP for Prometheus | python | 620B | Manual | — |
list-hetzner-servers.py |
List Hetzner servers via API. | python | 500B | Manual | — |
Utilities¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
build-recovery.py |
Build the full Hermes recovery bundle markdown file. | python | 6.9KB | Manual | — |
generate-script-contents.py |
Find a script file by name in known script directories. | python | 2.4KB | Manual | — |
changelog.sh |
changelog.sh — Append an entry to the Hermes changelog | shell | 877B | Manual | — |
Personal¶
| Script | Purpose | Type | Size | Schedule | Cron Job |
|---|---|---|---|---|---|
daily-feed-summary.py |
Collect RSS feeds and generate daily digest summary | python | 9.3KB | {'kind': 'cron', 'expr': '0 11 * * ', 'display': '0 11 * * '} | daily-tech-digest ✅ |
unsubscribe-scanner.py |
── Config ── | python | 4.8KB | {'kind': 'cron', 'expr': '0 7 * * ', 'display': '0 7 * * '} | Unsubscribe Daily Digest ✅ |
icloud_bills_calendar.py |
Sync iCloud calendar with billing reminders | python | 12.0KB | Manual | — |