#!/bin/bash
# migrate-from-redos.sh — экспорт состояния со старой ВМ (РЕД ОС 10.10.10.22)
# для переноса на новую Astra Linux ВМ.
#
# Запускать на СТАРОЙ ВМ (РЕД ОС). Создаст архив /tmp/bj-migration-YYYY-MM-DD.tar.gz
# с:
#   - дампом БД (pg_dump на оба схема: fansy.* и m2m_core.*)
#   - содержимым ~bj/.bj/setup.json (или ~/.bj/setup.json для dev)
#   - логами /var/log/bj/ (за последние 7 дней)
#   - списком установленных пакетов (для справки)
#
# Архив надо перенести на новую ВМ (scp/rsync), там распаковать и натравить
# на install-astra.sh с флагом --import=/path/to/archive.tar.gz (TODO).

set -euo pipefail

OUT_DIR="/tmp/bj-migration-$(date +%Y-%m-%d-%H%M)"
OUT_TAR="${OUT_DIR}.tar.gz"
mkdir -p "$OUT_DIR"

log()  { echo -e "\033[1;34m[migrate-export]\033[0m $*"; }
warn() { echo -e "\033[1;33m[migrate-export WARN]\033[0m $*" >&2; }

# ---- 1. Дамп БД ----
log "1/5: дамп PostgreSQL"
DSN="${BJ_PG_DSN:-postgres://bj:bj_dev@127.0.0.1:5432/bj?sslmode=disable}"
if podman ps --format '{{.Names}}' 2>/dev/null | grep -qx bj-postgres; then
    log "  через podman exec bj-postgres"
    podman exec bj-postgres pg_dump -U bj -d bj --clean --if-exists > "$OUT_DIR/bj.sql" \
        || warn "  pg_dump упал — проверь контейнер bj-postgres"
else
    log "  напрямую pg_dump"
    pg_dump "$DSN" --clean --if-exists > "$OUT_DIR/bj.sql" \
        || warn "  pg_dump упал — проверь DSN"
fi
[ -f "$OUT_DIR/bj.sql" ] && log "  размер дампа: $(du -h "$OUT_DIR/bj.sql" | awk '{print $1}')"

# ---- 2. Конфигурация ----
log "2/5: ~/.bj/setup.json"
for candidate in /var/lib/bj/.bj/setup.json ~/.bj/setup.json /root/.bj/setup.json; do
    if [ -f "$candidate" ]; then
        cp "$candidate" "$OUT_DIR/setup.json"
        log "  скопировано из $candidate"
        break
    fi
done

# ---- 3. Логи ----
log "3/5: логи за 7 дней"
mkdir -p "$OUT_DIR/logs"
if [ -d /var/log/bj ]; then
    find /var/log/bj -type f -mtime -7 -exec cp {} "$OUT_DIR/logs/" \; 2>/dev/null || true
fi
journalctl -u bj-server --since "7 days ago" --no-pager > "$OUT_DIR/logs/journal.log" 2>/dev/null || true

# ---- 4. Пакеты, версии (для справки) ----
log "4/5: метаинформация"
{
    echo "=== ОС ==="
    cat /etc/os-release 2>/dev/null || echo "no os-release"
    echo
    echo "=== uname ==="
    uname -a
    echo
    echo "=== Установленные RPM (только наши пакеты) ==="
    rpm -qa 2>/dev/null | grep -iE "cprocsp|crypto|postgresql|podman|go" || true
    echo
    echo "=== Версия bj-server ==="
    /opt/bj/bj-server --version 2>/dev/null || echo "не определена"
    echo
    echo "=== Дата создания дампа ==="
    date
} > "$OUT_DIR/meta.txt"

# ---- 5. README ----
cat > "$OUT_DIR/README.md" <<EOF
# Миграция bj-server с РЕД ОС на Astra Linux

Дамп создан: $(date)
Источник: $(hostname) ($(hostname -I | awk '{print $1}'))

## Файлы

- \`bj.sql\` — дамп PostgreSQL базы bj (схемы fansy + m2m_core)
- \`setup.json\` — настройки bj-server (DSN, IGW URL, и т.п.)
- \`logs/\` — последние логи bj-server
- \`meta.txt\` — версии ОС, пакетов

## Восстановление на Astra Linux

\`\`\`bash
# 1. На новой ВМ — ставим bj-server
sudo bash deploy/astra/install.sh

# 2. Восстанавливаем БД
podman exec -i bj-postgres psql -U bj -d bj < bj.sql

# 3. Восстанавливаем настройки
sudo cp setup.json /var/lib/bj/.bj/setup.json
sudo chown bj:bj /var/lib/bj/.bj/setup.json
sudo chmod 0600 /var/lib/bj/.bj/setup.json

# 4. Перезапуск
sudo systemctl restart bj-server
\`\`\`

## Что НЕ переносится автоматически

- Сертификаты КриптоПро CSP (\`/var/opt/cprocsp/keys/$USER/\`)
  — это нормально, на Astra Linux будет другая СКЗИ (Валидата CSP)
- \`/opt/cprocsp/\` (КриптоПро CSP)
  — на Astra нужна Валидата вместо КриптоПро
EOF

# ---- Финал ----
log "5/5: создание архива $OUT_TAR"
tar -czf "$OUT_TAR" -C "$(dirname "$OUT_DIR")" "$(basename "$OUT_DIR")"
rm -rf "$OUT_DIR"

echo
echo "================================================================"
echo "  Экспорт готов"
echo "================================================================"
echo "  Архив:  $OUT_TAR"
echo "  Размер: $(du -h "$OUT_TAR" | awk '{print $1}')"
echo
echo "  Перенести на новую Astra Linux ВМ:"
echo "    scp $OUT_TAR user@<astra-ip>:/tmp/"
echo
echo "  На Astra Linux распаковать и читать README.md:"
echo "    cd /tmp"
echo "    tar -xzf $(basename "$OUT_TAR")"
echo "    cat $(basename "$OUT_DIR")/README.md"
echo "================================================================"
