diff --git a/whm/gniza-whm/remotes.cgi b/whm/gniza-whm/remotes.cgi index a48a52e..79290fb 100644 --- a/whm/gniza-whm/remotes.cgi +++ b/whm/gniza-whm/remotes.cgi @@ -567,7 +567,7 @@ sub render_remote_form { # Key field print qq{
\n}; - _field($conf, 'REMOTE_KEY', 'SSH Private Key', 'Absolute path'); + _field($conf, 'REMOTE_KEY', 'SSH Private Key', 'Absolute path', 'Path to the private key file used for passwordless SSH authentication'); print qq{
\n}; # Password field @@ -592,7 +592,7 @@ sub render_remote_form { _field($conf, 'S3_ACCESS_KEY_ID', 'Access Key ID', 'Required'); _password_field($conf, 'S3_SECRET_ACCESS_KEY', 'Secret Access Key', 'Required'); _field($conf, 'S3_REGION', 'Region', 'Default: us-east-1'); - _field($conf, 'S3_ENDPOINT', 'Custom Endpoint', 'For MinIO, Wasabi, etc.'); + _field($conf, 'S3_ENDPOINT', 'Custom Endpoint', 'For MinIO, Wasabi, etc.', 'Only needed for S3-compatible services, leave empty for AWS'); _field($conf, 'S3_BUCKET', 'Bucket Name', 'Required'); print qq{

Requires rclone installed on this server.

\n}; print qq{\n\n}; @@ -604,8 +604,8 @@ sub render_remote_form { print qq{
\n}; print qq{
\n
\n}; print qq{

Google Drive

\n}; - _field($conf, 'GDRIVE_SERVICE_ACCOUNT_FILE', 'Service Account JSON', 'Absolute path, required'); - _field($conf, 'GDRIVE_ROOT_FOLDER_ID', 'Root Folder ID', 'Optional'); + _field($conf, 'GDRIVE_SERVICE_ACCOUNT_FILE', 'Service Account JSON', 'Absolute path, required', 'Google Cloud service account key file for API access'); + _field($conf, 'GDRIVE_ROOT_FOLDER_ID', 'Root Folder ID', 'Optional', 'Google Drive folder ID to use as the root for backups'); print qq{

Requires rclone installed on this server.

\n}; print qq{
\n
\n}; print qq{
\n}; @@ -613,22 +613,22 @@ sub render_remote_form { # ── Common fields ───────────────────────────────────────── print qq{
\n
\n}; print qq{

Storage Path

\n}; - _field($conf, 'REMOTE_BASE', 'Remote Base Dir', 'Default: /backups'); + _field($conf, 'REMOTE_BASE', 'Remote Base Dir', 'Default: /backups', 'Root directory on the remote where all backup snapshots are stored'); print qq{
\n
\n}; # Transfer print qq{
\n
\n}; print qq{

Transfer Settings

\n}; - _field($conf, 'BWLIMIT', 'Bandwidth Limit', 'KB/s, 0 = unlimited'); + _field($conf, 'BWLIMIT', 'Bandwidth Limit', 'KB/s, 0 = unlimited', 'Throttle transfer speed to avoid saturating the network'); print qq{
\n}; - _field($conf, 'RSYNC_EXTRA_OPTS', 'Extra rsync Options', 'SSH only'); + _field($conf, 'RSYNC_EXTRA_OPTS', 'Extra rsync Options', 'SSH only', 'Additional flags appended to rsync commands, e.g. --compress'); print qq{
\n}; print qq{
\n
\n}; # Retention print qq{
\n
\n}; print qq{

Retention

\n}; - _field($conf, 'RETENTION_COUNT', 'Snapshots to Keep', 'Default: 30'); + _field($conf, 'RETENTION_COUNT', 'Snapshots to Keep', 'Default: 30', 'Number of backup snapshots to retain per account before pruning old ones'); print qq{
\n
\n}; # Submit @@ -768,11 +768,12 @@ JS } sub _field { - my ($conf, $key, $label, $hint) = @_; + my ($conf, $key, $label, $hint, $tip) = @_; my $val = GnizaWHM::UI::esc($conf->{$key} // ''); my $hint_html = $hint ? qq{ $hint} : ''; + my $tip_html = $tip ? qq{ } : ''; print qq{
\n}; - print qq{ \n}; + print qq{ \n}; print qq{ \n}; print qq{ $hint_html\n} if $hint; print qq{
\n}; diff --git a/whm/gniza-whm/restore.cgi b/whm/gniza-whm/restore.cgi index f3f4f5a..b349892 100644 --- a/whm/gniza-whm/restore.cgi +++ b/whm/gniza-whm/restore.cgi @@ -240,7 +240,7 @@ sub handle_step2 { # Restore mode toggle: Full Account vs Selective print qq{
\n}; - print qq{ \n}; + print qq{ \n}; print qq{
\n}; print qq{ \n}; print qq{ \n}; @@ -249,7 +249,7 @@ sub handle_step2 { # Restore strategy (visible only for Full Account mode) print qq{
\n}; - print qq{ \n}; + print qq{ \n}; print qq{
\n}; print qq{ \n}; print qq{ \n}; diff --git a/whm/gniza-whm/settings.cgi b/whm/gniza-whm/settings.cgi index 1fa2be4..f3cd6b6 100644 --- a/whm/gniza-whm/settings.cgi +++ b/whm/gniza-whm/settings.cgi @@ -123,12 +123,13 @@ if (@errors && $method eq 'POST') { # Helper to output a text field row sub field_text { - my ($key, $label, $hint, $extra) = @_; + my ($key, $label, $hint, $extra, $tip) = @_; $extra //= ''; my $val = GnizaWHM::UI::esc($conf->{$key} // ''); my $hint_html = $hint ? qq{ $hint} : ''; + my $tip_html = $tip ? qq{ } : ''; print qq{
\n}; - print qq{ \n}; + print qq{ \n}; print qq{ \n}; print qq{ $hint_html\n} if $hint; print qq{
\n}; @@ -158,7 +159,7 @@ print GnizaWHM::UI::csrf_hidden_field(); # Section: Local Settings print qq{
\n
\n}; print qq{

Local Settings

\n}; -field_text('TEMP_DIR', 'Working Directory', 'Default: /usr/local/gniza/workdir'); +field_text('TEMP_DIR', 'Working Directory', 'Default: /usr/local/gniza/workdir', '', 'Temporary directory used for pkgacct output before transfer'); print qq{
\n
\n}; # Section: Account Filtering @@ -167,11 +168,11 @@ print qq{

Account Filtering

\n}; my $inc_val = GnizaWHM::UI::esc($conf->{INCLUDE_ACCOUNTS} // ''); my $exc_val = GnizaWHM::UI::esc($conf->{EXCLUDE_ACCOUNTS} // ''); print qq{
\n}; -print qq{ \n}; +print qq{ \n}; print qq{ \n}; print qq{
\n}; print qq{
\n}; -print qq{ \n}; +print qq{ \n}; print qq{ \n}; print qq{
\n}; @@ -188,7 +189,7 @@ print qq{
\n
Logging\n}; field_text('LOG_DIR', 'Log Directory', 'Default: /var/log/gniza'); field_select('LOG_LEVEL', 'Log Level', ['debug', 'info', 'warn', 'error']); -field_text('LOG_RETAIN', 'Log Retention (days)', 'Default: 90'); +field_text('LOG_RETAIN', 'Log Retention (days)', 'Default: 90', '', 'Log files older than this are automatically deleted'); print qq{
\n
\n}; # Section: Notifications @@ -225,10 +226,10 @@ print qq{
\n
\n}; # Section: Advanced print qq{
\n
\n}; print qq{

Advanced

\n}; -field_text('LOCK_FILE', 'Lock File', 'Default: /var/run/gniza.lock'); -field_text('SSH_TIMEOUT', 'SSH Timeout (seconds)', 'Default: 30'); -field_text('SSH_RETRIES', 'SSH Retries', 'Default: 3'); -field_text('RSYNC_EXTRA_OPTS', 'Extra rsync Options', 'Additional flags for rsync'); +field_text('LOCK_FILE', 'Lock File', 'Default: /var/run/gniza.lock', '', 'Prevents multiple backup processes from running simultaneously'); +field_text('SSH_TIMEOUT', 'SSH Timeout (seconds)', 'Default: 30', '', 'How long to wait for an SSH connection before giving up'); +field_text('SSH_RETRIES', 'SSH Retries', 'Default: 3', '', 'Number of rsync retry attempts with exponential backoff on failure'); +field_text('RSYNC_EXTRA_OPTS', 'Extra rsync Options', 'Additional flags for rsync', '', 'Global extra flags appended to all rsync commands, e.g. --compress'); print qq{
\n
\n}; # Submit