#!/usr/bin/env bash
#═══════════════════════════════════════════════════════════════════════════════
# collect-logs.sh — збір логів і діагностики Conduit + mautrix-telegram + nginx в один архів
#
# Збирає у conduit-diag-YYYYMMDD-HHMMSS.tar.gz:
#   - логи systemd (conduit, mautrix-telegram, nginx), Conduit за останню годину
#   - конфіги із ЗАМАСКОВАНИМИ секретами (токени, api_hash, api_id, паролі → ***MASKED***)
#   - статус служб, порти, iptables, DNS, сертифікат, .well-known, розміри даних, версії
#
# Використання:
#   chmod +x collect-logs.sh
#   sudo ./collect-logs.sh            # архів у поточному каталозі
#   sudo ./collect-logs.sh /tmp       # або в указаному
#
# Далі: scp ubuntu@203.0.113.10:~/conduit-diag-*.tar.gz .  і надішліть архів разом із промптом-помічником
# у Claude / ChatGPT / DeepSeek. Перед відправкою третім особам перегляньте архів самі.
#
# Версія: 2026-10-12
#═══════════════════════════════════════════════════════════════════════════════
set -euo pipefail

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'
log_info() { echo -e "${GREEN}[+]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[!]${NC} $*"; }

if [[ $EUID -ne 0 ]]; then
    echo "Запускайте від root: sudo ./collect-logs.sh"
    exit 1
fi

TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
DIAG_DIR="/tmp/conduit-diag-${TIMESTAMP}"
ARCHIVE_NAME="conduit-diag-${TIMESTAMP}.tar.gz"
OUTPUT_DIR="${1:-.}"
BRIDGE_DIR="/opt/mautrix-telegram"

mkdir -p "${DIAG_DIR}"/{logs,configs,network,system}

# Маскування секретів у конфігах (toml і yaml, з лапками і без)
mask_secrets() {
    local file="$1"
    if [[ ! -f "$file" ]]; then
        echo "(файлу немає)"
        return
    fi
    sed -E \
        -e 's/^(\s*registration_token\s*=\s*).*/\1"***MASKED***"/' \
        -e 's/^(\s*(as_token|hs_token|api_hash|bot_token|password|secret|turn_secret|shared_secret)\s*[:=]\s*).*/\1***MASKED***/' \
        -e 's/^(\s*api_id\s*[:=]\s*).*/\1***MASKED***/' \
        -e 's/(postgres:\/\/[^:]+:)[^@]+@/\1***MASKED***@/g' \
        "$file"
}

echo ""
echo -e "${CYAN}${BOLD}  Збір діагностики Conduit + міст${NC}"
echo -e "${CYAN}  Каталог: ${DIAG_DIR}${NC}"
echo ""

# ─── 1. Система ───────────────────────────────────────────────────────────────
log_info "Системна інформація…"
{
    echo "=== Дата (UTC) ==="; date -u; echo
    echo "=== ОС ==="; cat /etc/os-release 2>/dev/null || echo "(немає даних)"; echo
    echo "=== Ядро ==="; uname -a; echo
    echo "=== CPU ==="; lscpu 2>/dev/null | grep -E "^(Architecture|CPU\(s\)|Model name)" || nproc; echo
    echo "=== RAM ==="; free -h; echo
    echo "=== Диск ==="; df -h /var/lib/matrix-conduit 2>/dev/null || df -h /; echo
    echo "=== Uptime ==="; uptime
} > "${DIAG_DIR}/system/sysinfo.txt" 2>&1

# ─── 2. Служби ────────────────────────────────────────────────────────────────
log_info "Статус служб…"
for svc in conduit mautrix-telegram nginx; do
    {
        echo "=== systemctl status ${svc} ==="
        systemctl status "$svc" --no-pager 2>&1 || echo "(службу не знайдено)"
        echo; echo "=== is-enabled ==="
        systemctl is-enabled "$svc" 2>&1 || echo "(ні)"
    } > "${DIAG_DIR}/system/service-${svc}.txt" 2>&1
done

# ─── 3. Логи ──────────────────────────────────────────────────────────────────
log_info "Логи служб (останні 500 рядків)…"
for svc in conduit mautrix-telegram nginx; do
    journalctl -u "$svc" -n 500 --no-pager > "${DIAG_DIR}/logs/${svc}.log" 2>&1 || echo "(логів немає)" > "${DIAG_DIR}/logs/${svc}.log"
done
log_info "Conduit за останню годину…"
journalctl -u conduit --since "1 hour ago" --no-pager > "${DIAG_DIR}/logs/conduit-1h.log" 2>&1 || true
[[ -f /var/log/nginx/error.log ]] && tail -100 /var/log/nginx/error.log > "${DIAG_DIR}/logs/nginx-error.log" 2>/dev/null || true

# ─── 4. Конфіги ───────────────────────────────────────────────────────────────
log_info "Конфіги (секрети замасковано)…"
mask_secrets /etc/matrix-conduit/conduit.toml > "${DIAG_DIR}/configs/conduit.toml"
mask_secrets "${BRIDGE_DIR}/config.yaml" > "${DIAG_DIR}/configs/mautrix-telegram-config.yaml"
mask_secrets "${BRIDGE_DIR}/registration.yaml" > "${DIAG_DIR}/configs/mautrix-telegram-registration.yaml"
[[ -f /etc/nginx/sites-available/matrix ]] && cp /etc/nginx/sites-available/matrix "${DIAG_DIR}/configs/nginx-matrix.conf"
for unit in conduit mautrix-telegram; do
    [[ -f "/etc/systemd/system/${unit}.service" ]] && cp "/etc/systemd/system/${unit}.service" "${DIAG_DIR}/configs/"
done

# ─── 5. Мережа ────────────────────────────────────────────────────────────────
log_info "Мережева діагностика…"
BRIDGE_PORT=$(grep -E '^\s*port:' "${BRIDGE_DIR}/config.yaml" 2>/dev/null | head -1 | awk '{print $2}')
{
    echo "=== Порти, що слухають (ss) ==="; ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null || echo "(немає даних)"; echo
    echo "=== Conduit API ==="; curl -sf http://127.0.0.1:6167/_matrix/client/versions 2>&1 || echo "(не відповідає)"; echo
    echo "=== Порт моста (${BRIDGE_PORT:-?}) ==="
    if [[ -n "${BRIDGE_PORT:-}" ]]; then curl -s --max-time 3 -o /dev/null -w "HTTP %{http_code}\n" "http://127.0.0.1:${BRIDGE_PORT}/_matrix/app/v1/ping" 2>&1 || echo "(не відповідає)"; fi
    echo; echo "=== iptables INPUT ==="; iptables -L INPUT -n --line-numbers 2>/dev/null || echo "(немає доступу)"
    echo; echo "=== ufw ==="; ufw status 2>/dev/null || echo "(ufw не встановлено — на Oracle так і має бути)"
} > "${DIAG_DIR}/network/ports.txt" 2>&1

{
    local_domain=""
    if [[ -f /etc/matrix-conduit/.install-params ]]; then
        local_domain=$(grep '^DOMAIN=' /etc/matrix-conduit/.install-params 2>/dev/null | cut -d'"' -f2)
    fi
    if [[ -z "$local_domain" ]]; then
        local_domain=$(grep '^server_name' /etc/matrix-conduit/conduit.toml 2>/dev/null | head -1 | sed 's/.*= *"\(.*\)"/\1/')
    fi
    echo "=== Домен: ${local_domain:-НЕВІДОМО} ==="; echo
    if [[ -n "$local_domain" ]] && command -v dig &>/dev/null; then
        echo "=== dig A ==="; dig "$local_domain" A +short 2>&1; echo
        echo "=== Зовнішній IP сервера ==="; curl -sf --max-time 10 https://ifconfig.me 2>&1 || echo "(не визначено)"; echo
        echo "=== .well-known/matrix/client ==="; curl -sf "https://${local_domain}/.well-known/matrix/client" 2>&1 || curl -sf "http://${local_domain}/.well-known/matrix/client" 2>&1 || echo "(не відповідає)"; echo
        echo "=== .well-known/matrix/server ==="; curl -sf "https://${local_domain}/.well-known/matrix/server" 2>&1 || echo "(не відповідає)"; echo
        echo "=== Сертифікат ==="; echo | openssl s_client -connect "${local_domain}:443" -servername "$local_domain" 2>/dev/null | openssl x509 -noout -subject -dates -issuer 2>&1 || echo "(немає TLS)"; echo
        echo "=== HTTPS API ==="; curl -sf "https://${local_domain}/_matrix/client/versions" 2>&1 || echo "(не відповідає)"
    else
        echo "(домен не визначено або dig не встановлено)"
    fi
} > "${DIAG_DIR}/network/dns-ssl.txt" 2>&1

# ─── 6. Дані ──────────────────────────────────────────────────────────────────
log_info "Розміри даних…"
{
    echo "=== Conduit ==="; du -sh /var/lib/matrix-conduit/ 2>/dev/null || echo "(немає)"; du -sh /var/lib/matrix-conduit/*/ 2>/dev/null || true; echo
    echo "=== Міст ==="; du -sh "${BRIDGE_DIR}/" 2>/dev/null || echo "(немає)"; ls -la "${BRIDGE_DIR}/" 2>/dev/null || true; echo
    echo "=== Certbot ==="; ls -la /etc/letsencrypt/live/ 2>/dev/null || echo "(сертифікатів немає)"; echo
    echo "=== Бінарник Conduit ==="; file /usr/local/bin/matrix-conduit 2>/dev/null || echo "(не знайдено)"
} > "${DIAG_DIR}/system/data-sizes.txt" 2>&1

# ─── 7. Версії ────────────────────────────────────────────────────────────────
log_info "Версії…"
{
    echo "=== Conduit (unsupported versions у відповіді API = версія спеки, не сервера) ==="; curl -sf http://127.0.0.1:6167/_matrix/client/versions 2>&1 | head -c 400; echo; echo
    echo "=== mautrix-telegram ==="; "${BRIDGE_DIR}/mautrix-telegram" --version 2>&1 || echo "(не встановлено)"; echo
    echo "=== nginx ==="; nginx -v 2>&1 || echo "(не встановлено)"; echo
    echo "=== certbot ==="; certbot --version 2>&1 || echo "(не встановлено)"; echo
    echo "=== openssl ==="; openssl version 2>&1
} > "${DIAG_DIR}/system/versions.txt" 2>&1

# ─── 8. README ────────────────────────────────────────────────────────────────
{
    echo "Conduit diagnostic archive — $(date -u)"
    echo
    echo "system/   sysinfo.txt, service-*.txt, data-sizes.txt, versions.txt"
    echo "logs/     conduit.log, conduit-1h.log, mautrix-telegram.log, nginx.log, nginx-error.log"
    echo "configs/  conduit.toml, mautrix-telegram-config.yaml, mautrix-telegram-registration.yaml, nginx-matrix.conf, *.service"
    echo "network/  ports.txt (порти, iptables, API), dns-ssl.txt (DNS, сертифікат, .well-known)"
    echo
    echo "Секрети (registration_token, as_token, hs_token, api_id, api_hash, паролі) замасковано як ***MASKED***."
    echo "Перед відправкою третім особам перегляньте архів самі."
} > "${DIAG_DIR}/README.txt"

# ─── Пакування ────────────────────────────────────────────────────────────────
log_info "Пакую архів…"
tar -C /tmp -czf "${OUTPUT_DIR}/${ARCHIVE_NAME}" "$(basename "$DIAG_DIR")"
rm -rf "$DIAG_DIR"

ARCHIVE_PATH="$(cd "$OUTPUT_DIR" && pwd)/${ARCHIVE_NAME}"
echo ""
echo -e "${GREEN}${BOLD}✅ Архів створено:${NC} ${ARCHIVE_PATH} ($(du -h "$ARCHIVE_PATH" | cut -f1))"
echo ""
echo -e "${BOLD}Далі:${NC}"
echo "  1. На своєму комп’ютері:  scp ubuntu@<IP сервера>:${ARCHIVE_PATH} ."
echo "  2. Розпакуйте й перегляньте:  tar xzf ${ARCHIVE_NAME}"
echo "  3. Надішліть архів (або потрібні файли з нього) разом із промптом-помічником у Claude / ChatGPT / DeepSeek"
echo ""
log_warn "Секрети замасковано, але перегляньте архів перед відправкою."
