New packages: - secubox-app-backup: Unified backup for LXC containers, UCI config, services - luci-app-backup: KISS dashboard with container list and backup history - secubox-app-mailserver: Custom Postfix+Dovecot in LXC with mesh backup Enhanced dnsctl with: - generate: Auto-create subdomain A records - suggest: Name suggestions by category - mail-setup: MX, SPF, DMARC record creation - dkim-add: DKIM TXT record management Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
133 lines
3.1 KiB
Bash
133 lines
3.1 KiB
Bash
#!/bin/sh
|
|
# SecuBox Backup - Configuration Backup Functions
|
|
|
|
CONFIG_DIRS="/etc/config /etc/secubox /etc/haproxy /etc/mitmproxy"
|
|
CERT_DIRS="/srv/haproxy/certs /etc/acme"
|
|
PROFILE_DIR="/etc/secubox/profiles"
|
|
|
|
# Backup UCI and related configs
|
|
config_backup() {
|
|
local dest="$1"
|
|
local timestamp=$(date +%Y%m%d-%H%M%S)
|
|
local backup_file="${dest}/config-${timestamp}.tar.gz"
|
|
|
|
echo " Backing up UCI configs..."
|
|
|
|
# Create temp dir for staging
|
|
local staging="/tmp/backup_staging_$$"
|
|
mkdir -p "$staging"
|
|
|
|
# Copy config dirs
|
|
for dir in $CONFIG_DIRS; do
|
|
if [ -d "$dir" ]; then
|
|
local reldir=$(dirname "$dir")
|
|
mkdir -p "$staging$reldir"
|
|
cp -a "$dir" "$staging$reldir/" 2>/dev/null
|
|
fi
|
|
done
|
|
|
|
# Copy certs
|
|
for dir in $CERT_DIRS; do
|
|
if [ -d "$dir" ]; then
|
|
local reldir=$(dirname "$dir")
|
|
mkdir -p "$staging$reldir"
|
|
cp -a "$dir" "$staging$reldir/" 2>/dev/null
|
|
fi
|
|
done
|
|
|
|
# Create manifest
|
|
cat > "$staging/manifest.json" << EOF
|
|
{
|
|
"type": "config",
|
|
"timestamp": "$(date -Iseconds)",
|
|
"hostname": "$(uci -q get system.@system[0].hostname)",
|
|
"version": "$(cat /etc/secubox-version 2>/dev/null || echo 'unknown')",
|
|
"files": $(find "$staging" -type f | wc -l)
|
|
}
|
|
EOF
|
|
|
|
# Create archive
|
|
tar -czf "$backup_file" -C "$staging" .
|
|
|
|
# Cleanup
|
|
rm -rf "$staging"
|
|
|
|
local size=$(du -sh "$backup_file" 2>/dev/null | awk '{print $1}')
|
|
echo " Config backup created: $backup_file ($size)"
|
|
|
|
return 0
|
|
}
|
|
|
|
# Restore config from backup
|
|
config_restore() {
|
|
local backup_file="$1"
|
|
local dry_run="${2:-0}"
|
|
|
|
[ -f "$backup_file" ] || { echo "Backup file not found: $backup_file"; return 1; }
|
|
|
|
local staging="/tmp/restore_staging_$$"
|
|
mkdir -p "$staging"
|
|
|
|
echo " Extracting backup..."
|
|
tar -xzf "$backup_file" -C "$staging"
|
|
|
|
# Show manifest
|
|
if [ -f "$staging/manifest.json" ]; then
|
|
echo " Backup info:"
|
|
cat "$staging/manifest.json" | grep -E "timestamp|hostname|version" | sed 's/[",]//g' | sed 's/^/ /'
|
|
fi
|
|
|
|
if [ "$dry_run" = "1" ]; then
|
|
echo " [DRY RUN] Would restore:"
|
|
find "$staging" -type f ! -name "manifest.json" | while read f; do
|
|
echo " $f"
|
|
done | head -20
|
|
rm -rf "$staging"
|
|
return 0
|
|
fi
|
|
|
|
# Create safety backup
|
|
echo " Creating safety backup..."
|
|
config_backup "/tmp" >/dev/null 2>&1
|
|
|
|
# Restore files
|
|
echo " Restoring configs..."
|
|
for dir in $CONFIG_DIRS $CERT_DIRS; do
|
|
local reldir="${dir#/}"
|
|
if [ -d "$staging/$reldir" ]; then
|
|
cp -a "$staging/$reldir"/* "$dir/" 2>/dev/null
|
|
fi
|
|
done
|
|
|
|
# Cleanup
|
|
rm -rf "$staging"
|
|
|
|
# Reload services
|
|
echo " Reloading services..."
|
|
/etc/init.d/network reload 2>/dev/null &
|
|
ubus call uci reload 2>/dev/null &
|
|
|
|
echo " Config restore complete"
|
|
return 0
|
|
}
|
|
|
|
# Export specific UCI config
|
|
config_export_uci() {
|
|
local config="$1"
|
|
local dest="$2"
|
|
|
|
uci export "$config" > "${dest}/${config}.uci" 2>/dev/null
|
|
}
|
|
|
|
# List config backups
|
|
config_list_backups() {
|
|
local backup_dir="$1"
|
|
|
|
ls -lh "${backup_dir}/config-"*.tar* 2>/dev/null | while read line; do
|
|
local file=$(echo "$line" | awk '{print $NF}')
|
|
local size=$(echo "$line" | awk '{print $5}')
|
|
local date=$(echo "$line" | awk '{print $6" "$7" "$8}')
|
|
printf "%-40s %-10s %s\n" "$(basename "$file")" "$size" "$date"
|
|
done
|
|
}
|