#!/usr/bin/env bash # ============================================================================= # 미니 상태 표시기 설치 (Pi Zero 2 W + ST7789V) — SPI 활성 + 패키지 + venv # 대상 OS: Raspberry Pi OS Bookworm (64-bit) # # 폐쇄망: debs/ 또는 wheelhouse/ 가 있으면 자동 오프라인 모드(네트워크 0). # 번들이 불완전하면 온라인 폴백 없이 명확히 중단(폐쇄망 규칙). OFFLINE=1/0 강제 가능. # ============================================================================= set -euo pipefail cd "$(dirname "$0")" SERVICE_USER="${SERVICE_USER:-pi}" echo "==========================================" echo " 미니 상태 표시기 (ST7789V) 설치" echo "==========================================" if [ -r /proc/device-tree/model ]; then MODEL="$(tr -d '\0' < /proc/device-tree/model)" echo "[INFO] Board: ${MODEL}" case "${MODEL}" in *"Zero 2"*) : ;; *) echo "[WARN] 이 폴더는 Pi Zero 2 W 용입니다 (다른 보드도 진행은 가능)." ;; esac fi OFFLINE="${OFFLINE:-}" if [ -z "${OFFLINE}" ]; then if compgen -G "debs/*.deb" >/dev/null || [ -d wheelhouse ]; then OFFLINE=1 echo "[INFO] 오프라인 번들 감지 → 폐쇄망 설치 모드(네트워크 없음)" else OFFLINE=0 echo "[INFO] 오프라인 번들 없음 → 온라인 설치 모드(인터넷 필요)" fi fi # 1) 시스템 패키지: requests/Pillow/numpy/GPIO/spidev + 폰트 echo "[1/4] 시스템 패키지 설치..." if [ "${OFFLINE}" = "1" ]; then if ! compgen -G "debs/*.deb" >/dev/null; then echo "[ERROR] 오프라인 모드인데 debs/ 가 비어 있습니다. vendor.sh 산출물을 넣고 재실행." >&2 exit 1 fi sudo apt-get install -y --no-install-recommends --no-download ./debs/*.deb else sudo apt-get update sudo apt-get install -y python3-requests python3-venv python3-pil python3-numpy \ python3-rpi.gpio python3-spidev fonts-dejavu-core fi # 2) SPI 활성화 (dtparam + 그룹) echo "[2/4] SPI 활성화..." BOOT_CFG="" for c in /boot/firmware/config.txt /boot/config.txt; do if [ -f "$c" ]; then BOOT_CFG="$c"; break; fi done if [ -n "${BOOT_CFG}" ]; then if ! grep -q "^dtparam=spi=on" "${BOOT_CFG}"; then echo " dtparam=spi=on 추가 (${BOOT_CFG}) — 재부팅 후 적용" echo "dtparam=spi=on" | sudo tee -a "${BOOT_CFG}" >/dev/null NEED_REBOOT=1 else echo " dtparam=spi=on 이미 설정됨" fi else echo "[WARN] config.txt 를 찾지 못함 — raspi-config 로 SPI 수동 활성화 필요" fi for grp in spi gpio; do if getent group "$grp" >/dev/null 2>&1; then sudo usermod -aG "$grp" "${SERVICE_USER}" || echo "[WARN] usermod $grp 실패" fi done # 3) venv (+시스템 패키지 상속) + requests echo "[3/4] Python venv..." if [ ! -d venv ]; then python3 -m venv --system-site-packages venv fi # shellcheck disable=SC1091 source venv/bin/activate if [ "${OFFLINE}" = "1" ]; then if [ ! -d wheelhouse ]; then echo "[ERROR] 오프라인 모드인데 wheelhouse/ 가 없습니다. vendor.sh 산출물을 넣고 재실행." >&2 exit 1 fi pip install --no-index --find-links=wheelhouse -r requirements.txt else pip install -r requirements.txt fi # 4) 로그 파일 + 설정 잠금 echo "[4/4] 로그·권한..." sudo touch /var/log/display_dashboard.log sudo chown "${SERVICE_USER}:${SERVICE_USER}" /var/log/display_dashboard.log || true sudo chmod 640 /var/log/display_dashboard.log if [ -f config_local.py ]; then chmod 600 config_local.py sudo chown "${SERVICE_USER}:${SERVICE_USER}" config_local.py 2>/dev/null || true fi if [ ! -f config_local.py ]; then echo "" echo "[!] config_local.py 가 없습니다: cp config_local.example.py config_local.py 후 실값 입력" fi echo "" echo "==========================================" echo " 설치 완료 (OFFLINE=${OFFLINE})" echo "==========================================" if [ "${NEED_REBOOT:-0}" = "1" ]; then echo " ⚠️ SPI 방금 활성화 → 'sudo reboot' 후 화면이 동작합니다." fi echo " 단독 실행: source venv/bin/activate && python3 display_dashboard.py" echo " 서비스 등록: README.md systemd 절 참고"