Laurence Horrocks-Barlow
5c2da48c64
feat(gui): group menu under a shared 'Backups' category with a per-plugin icon
...
Move the admin and site menu entries into a shared 'Backups' sidebar category
(created idempotently by each sibling plugin) with a distinct icon per engine,
instead of a top-level link. Each plugin tags its category+link lines with an
apiscp-borg marker so its uninstaller removes only its own, leaving the shared
category for any other backup plugin still installed.
2026-07-26 05:15:15 +01:00
Laurence Horrocks-Barlow
02403b72c0
feat(borg): Layer 2 panel integration (module + two GUIs + hooks + installers)
...
Native ApisCP integration, adapted from apiscp-kopia's Layer 2 against the real
borg Layer 1 subcommands:
- Borg_Module_Surrogate: admin + PRIVILEGE_SITE verbs, sudo boundary, config
whitelist (now enforced), site-owner verbs derive the site from the auth
context only, ownsDatabase gate, confirm-guarded destructive import.
- Admin GUI (apps/borg, "Borg Backups"): repository (BORG_REPO/passphrase/
encryption/RSH, check-access, init, one-time recovery-key panel + download +
irrecoverable tick), backup selection, retention + excludes + prune-now,
schedule, maintenance (compact) + verify (check), notifications, tabbed layout,
running overlay, double-submit guard, consolidated Restore workflow.
- Site-owner GUI (apps/myborgbackups, "My Borg Backups"): restore files / whole
account / databases, run own backup, scoped to the caller's own site.
- Account hooks, install-layer2.sh, uninstall.sh (safe default, --purge).
Borg differences vs kopia are handled: no backend types/sftp/server, no browse/
subpath or point-in-time (restores newest archive; archive dates shown for info),
retention via config + `borg prune` (no global policy), import-db takes no
dumpfile. All PHP lints clean; controller verb calls all resolve to the module.
2026-07-24 23:18:35 +01:00