#!/bin/bash
# 실습 #8 ④ — 운영 보고서 자동 생성 (mtr --report --report-cycles)
# /etc/cron.hourly 에 두고 손실율 임계치 넘으면 Slack 알림
set -e

echo "=== 0) 도구 설치 ==="
sudo apt install -y mtr-tiny curl >/dev/null

WORK=/tmp/lab08_mtr_report
mkdir -p "$WORK"

# ────────────────────────────────────────────────────────────────
# 1) 단일 대상 보고서 생성
# ────────────────────────────────────────────────────────────────
TARGET=${TARGET:-8.8.8.8}
DATE=$(date +%Y%m%d_%H%M%S)
OUT="$WORK/mtr_${DATE}.txt"

echo "▶ [1] mtr -r -c 30 -T -P 443 $TARGET → $OUT"
sudo mtr -r -c 30 -T -P 443 -n "$TARGET" > "$OUT" 2>&1
cat "$OUT"

# ────────────────────────────────────────────────────────────────
# 2) 다중 대상 일괄 보고서
# ────────────────────────────────────────────────────────────────
cat > "$WORK/targets.txt" <<'EOF'
8.8.8.8
1.1.1.1
www.google.com
EOF

MULTI="$WORK/multi_${DATE}.txt"
echo
echo "▶ [2] 다중 대상 보고서 → $MULTI"
{
    echo "=== Network MTR Report  $(date) ==="
    while read -r host; do
        echo
        echo "--- $host"
        sudo mtr -r -c 10 -T -P 443 -n "$host" 2>&1
    done < "$WORK/targets.txt"
} > "$MULTI"
head -40 "$MULTI"

# ────────────────────────────────────────────────────────────────
# 3) 손실율 임계치 알림 스크립트 (cron 등록용)
# ────────────────────────────────────────────────────────────────
ALERT="$WORK/check_loss.sh"
cat > "$ALERT" <<'EOF'
#!/bin/bash
# /etc/cron.hourly/network-mtr-check.sh
# 손실율 > THRESHOLD% 면 Slack 알림
set -e

SLACK_HOOK="${SLACK_HOOK:-}"             # 환경변수로 받기
THRESHOLD=5                              # %
TARGETS=(8.8.8.8 1.1.1.1)

for t in "${TARGETS[@]}"; do
    # 마지막 hop 의 Loss% 추출 (3번째 컬럼)
    LOSS=$(sudo mtr -r -c 30 -T -P 443 -n "$t" 2>/dev/null \
           | awk '/^ *[0-9]+\.\|/ {l=$3} END{print l+0}' )
    LOSS_INT=${LOSS%.*}
    LOSS_INT=${LOSS_INT:-0}

    echo "[$(date +%H:%M)] $t  loss=${LOSS}%"

    if (( LOSS_INT > THRESHOLD )); then
        MSG=":rotating_light: MTR loss ${LOSS}% to ${t}"
        if [ -n "$SLACK_HOOK" ]; then
            curl -s -X POST -H 'Content-Type: application/json' \
                 -d "{\"text\":\"${MSG}\"}" "$SLACK_HOOK"
        else
            echo "(SLACK_HOOK 미설정 — 알림 스킵) $MSG"
        fi
    fi
done
EOF
chmod +x "$ALERT"

echo
echo "▶ [3] 임계치 체크 스크립트 → $ALERT"
echo "   사용: SLACK_HOOK='https://hooks.slack.com/...' $ALERT"
echo "   cron: sudo cp $ALERT /etc/cron.hourly/network-mtr-check"

# ────────────────────────────────────────────────────────────────
# 4) 보고서 보관 정책
# ────────────────────────────────────────────────────────────────
cat <<'POLICY'

  ▶ 권장 보관 정책
    /var/log/mtr/YYYYMMDD.txt   매일 1회 (cron.daily)
    /var/log/mtr/HHMM/*.txt     시간별 (cron.hourly)
    14 일 후 자동 삭제          find /var/log/mtr -mtime +14 -delete

POLICY

echo
echo "=== 정리: rm -rf $WORK ==="
