Files
gniza4cp/lib/accounts.sh
shuki 0eb480489e Add per-schedule toggle to skip suspended cPanel accounts
Adds SKIP_SUSPENDED config key and --skip-suspended CLI flag that
excludes suspended accounts (detected via /var/cpanel/suspended/)
from backups. Follows the same pattern as the existing SYSBACKUP
toggle across all layers: config, schedule loader, cron builder,
CLI flag parsing, and WHM UI (table toggle, AJAX handler, form card).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 19:10:18 +02:00

81 lines
2.2 KiB
Bash

#!/usr/bin/env bash
# gniza/lib/accounts.sh — cPanel account discovery, include/exclude filtering
get_all_accounts() {
if [[ -f /etc/trueuserdomains ]]; then
awk '{print $2}' /etc/trueuserdomains | sort -u
elif command -v whmapi1 &>/dev/null; then
whmapi1 listaccts --output=jsonpretty 2>/dev/null \
| grep -oP '"user"\s*:\s*"\K[^"]+' | sort -u
else
die "Cannot discover cPanel accounts: /etc/trueuserdomains not found and whmapi1 unavailable"
fi
}
filter_accounts() {
local all_accounts="$1"
local filtered=()
# Build exclude list
local -A excludes
if [[ -n "$EXCLUDE_ACCOUNTS" ]]; then
IFS=',' read -ra exc_arr <<< "$EXCLUDE_ACCOUNTS"
for acc in "${exc_arr[@]}"; do
acc=$(echo "$acc" | xargs) # trim whitespace
[[ -n "$acc" ]] && excludes["$acc"]=1
done
fi
# If INCLUDE_ACCOUNTS is set, only include those
if [[ -n "$INCLUDE_ACCOUNTS" ]]; then
IFS=',' read -ra inc_arr <<< "$INCLUDE_ACCOUNTS"
for acc in "${inc_arr[@]}"; do
acc=$(echo "$acc" | xargs)
[[ -n "$acc" && -z "${excludes[$acc]:-}" ]] && filtered+=("$acc")
done
else
while IFS= read -r acc; do
[[ -n "$acc" && -z "${excludes[$acc]:-}" ]] && filtered+=("$acc")
done <<< "$all_accounts"
fi
printf '%s\n' "${filtered[@]}"
}
is_suspended() {
local user="$1"
[[ -e "/var/cpanel/suspended/$user" ]]
}
get_backup_accounts() {
local skip_suspended="${1:-false}"
local all; all=$(get_all_accounts)
local filtered; filtered=$(filter_accounts "$all")
if [[ "$skip_suspended" == "true" ]]; then
while IFS= read -r acc; do
[[ -z "$acc" ]] && continue
if is_suspended "$acc"; then
log_info "Skipping suspended account: $acc"
continue
fi
echo "$acc"
done <<< "$filtered"
else
echo "$filtered"
fi
}
get_account_homedir() {
local user="$1"
if [[ -f /etc/passwd ]]; then
getent passwd "$user" | cut -d: -f6
else
echo "/home/$user"
fi
}
account_exists() {
local user="$1"
id "$user" &>/dev/null
}