#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=lib.sh . "${SCRIPT_DIR}/lib.sh" qipai_backup_status() { local policy_template runbook policy_template="${SCRIPT_DIR}/../../deploy/backup/backup-policy.template.json" runbook="${SCRIPT_DIR}/../../deploy/backup/backup-restore-runbook.md" qipai_info "backup root: ${APP_ROOT}/backups" qipai_info "mysql backup dir: ${APP_ROOT}/backups/mysql" qipai_info "emqx backup dir: ${APP_ROOT}/backups/emqx" qipai_info "files backup dir: ${APP_ROOT}/backups/files" qipai_info "policy template: ${policy_template}" qipai_info "runbook: ${runbook}" [ -f "$policy_template" ] && qipai_pass "backup policy template exists" || qipai_warn "backup policy template not found" [ -f "$runbook" ] && qipai_pass "backup/restore runbook exists" || qipai_warn "backup/restore runbook not found" qipai_command_status mysqldump qipai_command_status mysql qipai_command_status tar qipai_command_status gzip if command -v emqx >/dev/null 2>&1; then qipai_pass "emqx export command available" else qipai_warn "emqx command not found; EMQX export unavailable" fi for dir in "${APP_ROOT}/backups/mysql" "${APP_ROOT}/backups/emqx" "${APP_ROOT}/backups/files" "${APP_ROOT}/backups/manual"; do [ -d "$dir" ] && qipai_pass "backup directory exists: $dir" || qipai_warn "backup directory not found: $dir" done } qipai_backup() { qipai_require_root_for_write local backup_dir manifest backup_dir="${APP_ROOT}/backups/manual/$(date +%Y%m%d%H%M%S)" mkdir -p "$backup_dir" manifest="${backup_dir}/backup.json" cat >"$manifest" <