Fix cPanel plugin install: copy install.json to target dir and use tar.gz archive
install_plugin requires a tar.gz archive, not a raw JSON file. Also copies install.json to the plugin directory so uninstall_plugin can reference it. Includes CLAUDE.md documentation updates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,13 +16,13 @@ gniza is a Bash CLI tool for cPanel server backup and disaster recovery. It runs
|
|||||||
bin/gniza # CLI entrypoint — command routing, argument parsing
|
bin/gniza # CLI entrypoint — command routing, argument parsing
|
||||||
lib/
|
lib/
|
||||||
├── constants.sh # Version, exit codes, color codes, default values
|
├── constants.sh # Version, exit codes, color codes, default values
|
||||||
├── utils.sh # die(), require_root(), timestamp(), human_size/duration()
|
├── utils.sh # die(), require_root(), timestamp(), human_size/duration(), validate_timestamp/account_name()
|
||||||
├── logging.sh # Per-run log files (LOG_FILE), log_info/warn/error/debug
|
├── logging.sh # Per-run log files (LOG_FILE), log_info/warn/error/debug
|
||||||
├── config.sh # load_config(), validate_config()
|
├── config.sh # _safe_source_config(), load_config(), validate_config()
|
||||||
├── locking.sh # flock-based acquire_lock(), release_lock()
|
├── locking.sh # flock-based acquire_lock(), release_lock()
|
||||||
├── ssh.sh # build_ssh_opts(), remote_exec(), test_ssh_connection()
|
├── ssh.sh # build_ssh_opts(), remote_exec(), test_ssh_connection()
|
||||||
├── rclone.sh # Rclone transport layer for S3/GDrive remotes
|
├── rclone.sh # Rclone transport layer for S3/GDrive remotes
|
||||||
├── accounts.sh # get_all_accounts(), filter_accounts(), account_exists()
|
├── accounts.sh # get_all_accounts(), filter_accounts(), is_suspended(), get_backup_accounts(), account_exists()
|
||||||
├── pkgacct.sh # run_pkgacct(), gzip_sql_files(), cleanup_pkgacct()
|
├── pkgacct.sh # run_pkgacct(), gzip_sql_files(), cleanup_pkgacct()
|
||||||
├── snapshot.sh # get_snapshot_dir(), list_remote_snapshots(), finalize
|
├── snapshot.sh # get_snapshot_dir(), list_remote_snapshots(), finalize
|
||||||
├── transfer.sh # rsync_to_remote(), transfer_pkgacct/homedir(), finalize_snapshot()
|
├── transfer.sh # rsync_to_remote(), transfer_pkgacct/homedir(), finalize_snapshot()
|
||||||
@@ -107,6 +107,7 @@ _restore_remote_globals
|
|||||||
|
|
||||||
```
|
```
|
||||||
cmd_backup()
|
cmd_backup()
|
||||||
|
├── require_cmd(rsync, ssh, hostname, gzip)
|
||||||
├── load_config() + validate_config() + init_logging()
|
├── load_config() + validate_config() + init_logging()
|
||||||
├── get_target_remotes(--remote flag)
|
├── get_target_remotes(--remote flag)
|
||||||
├── _save_remote_globals()
|
├── _save_remote_globals()
|
||||||
@@ -377,6 +378,8 @@ Schedules are decoupled from remotes. Each schedule targets one or more remotes.
|
|||||||
| `SCHEDULE_DAY` | Conditional | — | Hours interval (1-23) for hourly, day-of-week (0-6) for weekly, day-of-month (1-28) for monthly |
|
| `SCHEDULE_DAY` | Conditional | — | Hours interval (1-23) for hourly, day-of-week (0-6) for weekly, day-of-month (1-28) for monthly |
|
||||||
| `SCHEDULE_CRON` | Conditional | — | Full 5-field cron expr (for `custom` only) |
|
| `SCHEDULE_CRON` | Conditional | — | Full 5-field cron expr (for `custom` only) |
|
||||||
| `REMOTES` | No | (all) | Comma-separated remote names to target |
|
| `REMOTES` | No | (all) | Comma-separated remote names to target |
|
||||||
|
| `SYSBACKUP` | No | (empty) | `yes` to include system backup (`/scripts/pkgacct`) |
|
||||||
|
| `SKIP_SUSPENDED` | No | (empty) | `yes` to skip cPanel suspended accounts |
|
||||||
|
|
||||||
## Key Functions Reference
|
## Key Functions Reference
|
||||||
|
|
||||||
|
|||||||
@@ -105,14 +105,19 @@ if [[ -d "$CPANEL_BASE" ]]; then
|
|||||||
cp "$SOURCE_DIR/cpanel/gniza/lib/GnizaCPanel/UI.pm" "$CPANEL_BASE/gniza/lib/GnizaCPanel/"
|
cp "$SOURCE_DIR/cpanel/gniza/lib/GnizaCPanel/UI.pm" "$CPANEL_BASE/gniza/lib/GnizaCPanel/"
|
||||||
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-whm.css" "$CPANEL_BASE/gniza/assets/"
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-whm.css" "$CPANEL_BASE/gniza/assets/"
|
||||||
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-logo.svg" "$CPANEL_BASE/gniza/assets/"
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-logo.svg" "$CPANEL_BASE/gniza/assets/"
|
||||||
|
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$CPANEL_BASE/gniza/"
|
||||||
# Install AdminBin module (runs as root)
|
# Install AdminBin module (runs as root)
|
||||||
mkdir -p "$ADMINBIN_DIR"
|
mkdir -p "$ADMINBIN_DIR"
|
||||||
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore" "$ADMINBIN_DIR/"
|
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore" "$ADMINBIN_DIR/"
|
||||||
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore.conf" "$ADMINBIN_DIR/"
|
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore.conf" "$ADMINBIN_DIR/"
|
||||||
chmod 0700 "$ADMINBIN_DIR/Restore"
|
chmod 0700 "$ADMINBIN_DIR/Restore"
|
||||||
chmod 0600 "$ADMINBIN_DIR/Restore.conf"
|
chmod 0600 "$ADMINBIN_DIR/Restore.conf"
|
||||||
# Register plugin in cPanel interface
|
# Register plugin in cPanel interface (install_plugin expects a tar.gz archive)
|
||||||
/usr/local/cpanel/scripts/install_plugin "$SOURCE_DIR/cpanel/gniza/install.json" 2>/dev/null || true
|
PLUGIN_TMPDIR="$(mktemp -d)"
|
||||||
|
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$PLUGIN_TMPDIR/"
|
||||||
|
tar -czf "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" -C "$PLUGIN_TMPDIR" install.json
|
||||||
|
/usr/local/cpanel/scripts/install_plugin "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" 2>/dev/null || true
|
||||||
|
rm -rf "$PLUGIN_TMPDIR"
|
||||||
echo "cPanel user plugin installed — users will see gniza Restore in Files section"
|
echo "cPanel user plugin installed — users will see gniza Restore in Files section"
|
||||||
else
|
else
|
||||||
echo "cPanel not detected, skipping cPanel user plugin installation."
|
echo "cPanel not detected, skipping cPanel user plugin installation."
|
||||||
|
|||||||
Reference in New Issue
Block a user