#!/bin/bash
# 실습 #4 ⑥ — 계단식 CPU 부하 + 시계열 그래프 도구 모음
# 1코어 → 2코어 → 4코어 → 전체 코어 → 0 (휴식) 단계별 부하를 주면서
# 어떤 도구가 시계열 그래프를 보여주는지 비교 학습.
#
# 사용:
#   터미널 A: bash setup_06_step_load_graph.sh           # 부하 + 안내
#   터미널 B: btop / glances / netdata 등 골라서 동시 관찰
set -e

ACTION="${1:-load}"
WORK=/tmp/lab04_step
mkdir -p "$WORK"
PIDFILE="$WORK/load.pids"

stop_all() {
    [ -f "$PIDFILE" ] && while read -r p; do kill "$p" 2>/dev/null || true; done < "$PIDFILE"
    rm -f "$PIDFILE"
    pkill -f "yes > /dev/null" 2>/dev/null || true
}
trap stop_all INT TERM EXIT

# ─── 계단식 부하: STEPS 배열의 (코어수 초) 페어 ───────
load_steps() {
    CORES_TOTAL=$(nproc)
    HALF=$(( CORES_TOTAL / 2 ))
    QUARTER=$(( CORES_TOTAL / 4 ))
    [ $QUARTER -lt 1 ] && QUARTER=1
    [ $HALF -lt 2 ] && HALF=2

    # 단계: (사용할 코어 수, 초) — 30 초마다 계단처럼 상승 → 정점 → 휴식
    STEPS=(
        "$QUARTER       30"     # 1/4 코어
        "$HALF          30"     # 1/2 코어
        "$CORES_TOTAL   30"     # 전체 코어
        "0              30"     # 휴식
        "$HALF          20"     # 다시 절반
        "$CORES_TOTAL   20"     # 전체
        "0              30"     # 마무리 휴식
    )

    echo "🪜 계단식 CPU 부하 시작 (총 ${CORES_TOTAL} 코어)"
    echo "→ 옆 터미널에서 btop / glances / netdata 으로 그래프 관찰"
    echo

    >"$PIDFILE"
    for step in "${STEPS[@]}"; do
        cores=$(echo $step | awk '{print $1}')
        dur=$(echo $step | awk '{print $2}')

        # 이전 부하 모두 정리 (계단 단계 변경)
        stop_all
        >"$PIDFILE"

        if [ "$cores" -gt 0 ]; then
            echo "🔥 ${cores} 코어 부하 — ${dur} 초"
            for c in $(seq 1 $cores); do
                ( yes > /dev/null ) &
                echo $! >> "$PIDFILE"
            done
        else
            echo "💤 휴식 — ${dur} 초"
        fi
        sleep "$dur"
    done
    stop_all
    echo "✓ 계단식 부하 완료"
}

# ─── 도구 안내 + 자동 설치(옵션) ──────────────────────
show_tools() {
    cat <<'TBL'
═════════════════════════════════════════════════════════════════
시계열 그래프 도구 비교
═════════════════════════════════════════════════════════════════

[1] btop           — 터미널 ASCII 시계열 (가장 추천)
    sudo apt install -y btop && btop

[2] glances 웹뷰   — 브라우저로 보기
    sudo apt install -y glances
    glances -w                      # 그 다음 http://localhost:61208

[3] netdata        — 1초 해상도 웹 그래프 (가장 화려)
    bash <(curl -SsL https://my-netdata.io/kickstart.sh)
    # 설치 후 http://localhost:19999

[4] dstat → CSV → gnuplot   — 정적 보고서용 그래프
    sudo apt install -y dstat gnuplot
    dstat --time --cpu --output /tmp/stat.csv 1 60   # 60초 수집
    # 그 다음 gnuplot 으로 그래프 그리기 (setup_06 plot 옵션 참고)

[5] sar 누적 + sadf -g     — 30일 history 보관 + SVG 출력
    sudo apt install -y sysstat
    sudo sed -i 's/^ENABLED.*/ENABLED="true"/' /etc/default/sysstat
    sudo systemctl enable --now sysstat
    sadf -g -- -u                    # CPU 그래프 SVG 출력

[6] Prometheus + Grafana   — 운영 표준 (lab19 에서 본격적으로)
TBL
}

# ─── dstat 수집 + gnuplot 자동 그래프 ────────────────
plot_graph() {
    sudo apt install -y dstat gnuplot >/dev/null
    DUR=${1:-180}     # 기본 180초
    CSV="$WORK/cpu.csv"
    PNG="$WORK/cpu.png"

    echo "📊 dstat CPU 시계열 ${DUR}초 수집 중..."
    echo "→ 별 터미널에서 동시에:  bash $0 load   (계단식 부하)"
    dstat --time --cpu --output "$CSV" 1 "$DUR" >/dev/null 2>&1 &
    DSTAT=$!
    sleep "$DUR"
    kill $DSTAT 2>/dev/null || true
    sleep 1

    # CSV 의 라벨 행 건너뛰고 시간·user·system 3 컬럼 → gnuplot
    awk -F',' 'NR>7 && NF>=4 {print NR-7" "$2+0" "$3+0}' "$CSV" > "$WORK/cpu.dat"
    gnuplot <<EOF
set terminal png size 1200,400
set output "$PNG"
set title "CPU 사용률 시계열 — 계단식 부하 관찰"
set xlabel "초"
set ylabel "%"
set grid
set key bottom right
plot "$WORK/cpu.dat" using 1:2 with lines lw 2 title "user", \
     "$WORK/cpu.dat" using 1:3 with lines lw 2 title "system"
EOF
    echo
    echo "✓ 그래프: $PNG"
    echo "  보기: xdg-open $PNG"
}

case "$ACTION" in
    load)  show_tools; echo; load_steps ;;
    plot)  plot_graph "${2:-180}" ;;
    tools) show_tools ;;
    *)
        echo "사용법:"
        echo "  bash $0 load              # 계단식 CPU 부하 + 도구 안내"
        echo "  bash $0 plot 180          # dstat 180초 수집 + gnuplot PNG 그래프"
        echo "  bash $0 tools             # 도구 비교표만"
        exit 1 ;;
esac
