secubox-openwrt/package/secubox/secubox-app-backup/files/usr/lib/backup/config.sh
CyberMind-FR c6fb79ed3b feat: Add unified backup manager, custom mail server, DNS subdomain generator
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>
2026-02-05 10:40:32 +01:00

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
}