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>
58 lines
3 KiB
Bash
58 lines
3 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# vendor.sh - 폐쇄망 설치용 의존성 사전 다운로드
|
|
# 인터넷에 연결된 빌드/스테이징 머신에서 실행한다.
|
|
# 산출물: wheelhouse/ (pip wheel + sdist), debs/ (apt .deb) → 타깃 Pi 4 로 전송.
|
|
#
|
|
# wheel/deb 는 아키텍처에 종속된다. 기본값은 타깃(Raspberry Pi OS Bookworm 64-bit,
|
|
# aarch64, Python 3.11)에 맞춰 명시 핀하므로 x86_64 빌드 머신에서 받아도 올바른
|
|
# aarch64 wheel 을 확보한다(빌드호스트 arch 와 무관). 그래도 .deb 는 타깃 OS/arch
|
|
# 에서 받는 것이 가장 안전하다. 필요 시 환경변수로 타깃 조정:
|
|
# TARGET_PLATFORM (기본 manylinux2014_aarch64), TARGET_PYVER (기본 311), CAM
|
|
# =============================================================================
|
|
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
|
|
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 "[ERROR] 타깃 wheel 다운로드 실패 (TARGET_PLATFORM/TARGET_PYVER 확인)"; exit 1; }
|
|
python3 -m pip download -r requirements.txt -d wheelhouse --no-binary=:all: \
|
|
|| echo "[WARN] sdist 폴백 일부 실패 (바이너리 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
|
|
CAM="${CAM:-}"
|
|
if [ -z "${CAM}" ]; then
|
|
if apt-cache show rpicam-apps >/dev/null 2>&1; then CAM=rpicam-apps; else CAM=libcamera-apps; fi
|
|
fi
|
|
BASE_PKGS="python3-rpi-lgpio python3-requests python3-venv ${CAM}"
|
|
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 실행."
|