2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증. 1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp. 서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약. DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마. 보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS. 문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
55 lines
2.9 KiB
Bash
55 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# vendor.sh - 폐쇄망 설치용 의존성 사전 다운로드 (SHT30 2번 모듈)
|
|
# 인터넷에 연결된 빌드/스테이징 머신에서 실행한다.
|
|
# 산출물: wheelhouse/ (pip wheel + sdist), debs/ (apt .deb) → 타깃 Pi 4 로 전송.
|
|
#
|
|
# requests 는 arch 종속이 적으나 smbus2 는 순수 파이썬(py3-none-any)이라 어떤
|
|
# 빌드 머신에서 받아도 Pi 4 에서 동작한다. wheel 핀은 타깃(Bookworm 64-bit,
|
|
# aarch64, Python 3.11)에 맞춘다. .deb 는 타깃 OS/arch 에서 받는 것이 가장 안전.
|
|
# 환경변수: TARGET_PLATFORM(기본 manylinux2014_aarch64), TARGET_PYVER(기본 311)
|
|
# =============================================================================
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")"
|
|
|
|
TARGET_PLATFORM="${TARGET_PLATFORM:-manylinux2014_aarch64}"
|
|
TARGET_PYVER="${TARGET_PYVER:-311}"
|
|
TARGET_ABI="${TARGET_ABI:-cp${TARGET_PYVER}}"
|
|
|
|
echo "[vendor] (1/2) Python wheel → wheelhouse/ (platform=${TARGET_PLATFORM}, py=${TARGET_PYVER})"
|
|
mkdir -p wheelhouse
|
|
# requests 등 arch 종속 wheel: 타깃 플랫폼 명시 핀.
|
|
python3 -m pip download -r requirements.txt -d wheelhouse \
|
|
--only-binary=:all: \
|
|
--platform "${TARGET_PLATFORM}" \
|
|
--python-version "${TARGET_PYVER}" \
|
|
--implementation cp \
|
|
--abi "${TARGET_ABI}" \
|
|
|| echo "[WARN] 일부 wheel 의 타깃 플랫폼 핀 실패 — 순수파이썬(any) 폴백을 아래에서 받는다."
|
|
# smbus2(py3-none-any) 등 순수 파이썬 wheel 및 sdist 폴백.
|
|
python3 -m pip download -r requirements.txt -d wheelhouse \
|
|
|| echo "[WARN] sdist/any 폴백 일부 실패 (바이너리 wheel 이 모두 있으면 무시 가능)"
|
|
WHEEL_COUNT="$(ls -A wheelhouse 2>/dev/null | wc -l)"
|
|
echo " wheelhouse 파일 수: ${WHEEL_COUNT}"
|
|
[ "${WHEEL_COUNT}" -gt 0 ] || { echo "[ERROR] wheelhouse 비어있음"; exit 1; }
|
|
|
|
echo "[vendor] (2/2) apt .deb → debs/"
|
|
mkdir -p debs
|
|
BASE_PKGS="python3-requests python3-venv i2c-tools"
|
|
DEPS="$(apt-cache depends --recurse --no-recommends --no-suggests \
|
|
--no-conflicts --no-breaks --no-replaces --no-enhances ${BASE_PKGS} \
|
|
| awk '/^\w/{print $1}' | sort -u)"
|
|
( cd debs && apt-get download ${BASE_PKGS} ${DEPS} ) 2>/dev/null \
|
|
|| echo "[WARN] 일부 .deb 다운로드 실패 (가상패키지/전이 의존성일 수 있음 — 필수 패키지는 아래에서 검증)"
|
|
|
|
MISS=0
|
|
for p in ${BASE_PKGS}; do
|
|
if ! ls debs/"${p}"_*.deb >/dev/null 2>&1; then
|
|
echo "[ERROR] 필수 패키지 .deb 누락: ${p}"
|
|
MISS=1
|
|
fi
|
|
done
|
|
[ "${MISS}" = 0 ] || { echo "[ERROR] 필수 .deb 누락 — 반드시 타깃 arch(aarch64 Bookworm)에서 vendor.sh 를 실행하세요."; exit 1; }
|
|
echo " debs 파일 수: $(ls debs/*.deb 2>/dev/null | wc -l) (필수 패키지 모두 확인됨)"
|
|
|
|
echo "[vendor] 완료. wheelhouse/ 와 debs/ 를 타깃 Pi 4 로 전송 후 install.sh 실행."
|