Adds a "Sys Backup" column with an AJAX toggle in the schedules
table. Toggling it updates SYSBACKUP in the schedule config and
reinstalls the cron entry to include/remove --sysbackup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Runs a schedule's backup immediately with the correct --remote and
--sysbackup flags from the schedule config. Also fixes WHM Run Now
button to include --sysbackup when enabled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cron.pm's install_schedule() had its own cron line builder that
didn't include --sysbackup. Now it checks SYSBACKUP=yes in the
schedule config and appends --sysbackup to the cron command.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously the cron was only updated if it was already active.
Now every save reinstalls the cron entry so changes (like enabling
--sysbackup) take effect immediately.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add lib/sysbackup.sh and lib/sysrestore.sh for system-level
backup and restore of WHM/cPanel config, packages, and cron jobs
- Wire cmd_sysbackup and cmd_sysrestore into bin/gniza
- Add --sysbackup flag to cmd_backup: runs system backup after all
account backups complete
- Add SYSBACKUP schedule config key so cron jobs can include
--sysbackup automatically via build_cron_line()
- Add "Include system backup" toggle to WHM schedule form
- Revert sysbackup toggle from remotes.cgi (belongs in schedules)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sysbackup toggle is now available for both add and edit flows,
so users can trigger a system backup against any existing remote.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When adding a new remote, a toggle lets the user immediately run
gniza sysbackup against the new remote. The backup forks to
background with output logged to /var/log/gniza/sysbackup-<name>.log.
Toggle is hidden on edit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clicking any column header sorts the table rows. Supports text and
numeric sorting with ascending/descending toggle and arrow indicators.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WHM styles override <a> tag padding, making anchor-based buttons
larger than native buttons. Using <button> elements everywhere
ensures uniform button sizing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Custom DaisyUI theme using the provided color palette:
- Primary: dark blue rgb(5,61,142)
- Secondary/Error: orange rgb(238,118,45)
- Accent/Warning: yellow rgb(254,204,0)
- Info: teal rgb(90,168,189)
- Neutral: darker blue rgb(2,44,105)
- Base: white/gray
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace raw cron entries with descriptions like "Every hour, to rasp"
or "Daily at 02:00, all remotes". Add cron_to_human() to Cron.pm.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WHM CSS adds margin to checked radio inputs, causing the active
button in join groups to shift down. Added m-0 class to all
join-item radio buttons to override.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace inline style with Tailwind inline-flex items-stretch classes
on join button groups. Rebuild CSS with new safelist entries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WHM CSS causes the active/checked button in DaisyUI join groups
to shift down. Added inline display:inline-flex;align-items:stretch
to all join containers in remotes.cgi and restore.cgi.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The forked child stayed in the CGI's process group and got killed
when Apache cleaned up the CGI process. Now uses double-fork with
POSIX::setsid() to fully daemonize the backup process.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
REMOTE_HOST, REMOTE_PORT, REMOTE_USER, REMOTE_BASE, BWLIMIT,
RETENTION_COUNT, and RSYNC_EXTRA_OPTS were referenced without
defaults in _save_remote_globals(), causing "unbound variable"
errors under set -u when called before any remote was loaded
(e.g., gniza remote list).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
gniza backup requires /etc/gniza/gniza.conf to exist. The WHM plugin
only created remote configs in remotes.d/ but not the main config,
causing "Config file not found" errors. Now creates it with defaults
when adding a remote if it doesn't exist.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>