Replace the 8-card category grid with a unified restore workflow:
- index.live.cgi: now serves as Step 1 (remote + snapshot selection)
- restore.live.cgi: Step 2 (Full Account/Selective mode toggle with
type checkboxes, exclude paths, file browser), Step 3 (multi-type
confirmation), Step 4 (multi-type execution via AdminBin)
Also update cPanel plugin icon from gniza.svg source.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AdminBin modules run as root, so $ENV{'REMOTE_USER'} is not set.
The correct way to get the authenticated cPanel user is via the
parent class method get_caller_username().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Perl's qq{} delimiter matches balanced braces, which conflicted with
JavaScript curly braces, producing empty function bodies. Converted
_print_step1_js and _print_step2_js to heredoc blocks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use $cpanel->header() and $cpanel->footer() from LiveAPI to wrap
plugin content in cPanel's standard layout with sidebar navigation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cPanel's live engine provides the HTTP headers and page chrome
(sidebar, topbar). CGI should not output its own Content-Type.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
__PACKAGE__->run() was called before my variables were declared,
so $MAIN_CONFIG and $REMOTES_DIR were undef when action methods ran.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cPanel's live engine requires .live.cgi files to create a
Cpanel::LiveAPI connection. Without it, the engine cannot
establish communication with the CGI subprocess.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cPanel's adminbin framework requires the module to be directly
executable with a shebang line, and Script::Call modules need
__PACKAGE__->run() to bootstrap.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Variables declared with 'my' inside open3() were scoped to that call,
causing 'Global symbol requires explicit package name' errors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SVG had negative coordinates that rendered off-screen in cPanel's
sprite sheet. Export to clean 48x48 PNG (2.8KB) instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Server box with data rows (navy) and circular restore arrow (copper)
matching gniza brand colors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 378KB VTracer-traced logo with a clean 1KB 48x48 SVG icon
for cPanel's icon system. Update install.json, install.sh, and
uninstall.sh to reference the new icon. Also update README with
skip-suspended flag and schedule config fields.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add fallback write when O_EXCL _safe_write fails for CSRF tokens
(ensures token is always persisted to disk)
- Update SMTP test JS to sync new CSRF token into main form hidden field
(prevents stale token after SMTP test consumes the original)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>