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>
52 lines
2 KiB
Bash
52 lines
2 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# run_tests.sh - 전체 회귀 테스트 러너 (CI / 수동)
|
|
#
|
|
# 실행 대상:
|
|
# 1) PHP 단위/회귀 테스트 3종 (tests/*.php)
|
|
# 2) 펌웨어 호스트 패리티 (firmware/test/host/parity_test.py)
|
|
# - C↔Python↔PHP 서명 패리티(gcc/clang + php 가용 시 C 포함)
|
|
#
|
|
# php / python3 / gcc 가 없으면 해당 묶음을 SKIP 으로 *명확히* 보고한다(무성 스킵 금지).
|
|
# 하나라도 FAIL 이면 종료코드 1.
|
|
# =============================================================================
|
|
set -u
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
fail=0; ran=0; skipped=0
|
|
|
|
have() { command -v "$1" >/dev/null 2>&1; }
|
|
|
|
run_php() { # test_file
|
|
local f="$1"
|
|
if ! have php; then echo "SKIP (php 없음): ${f}"; skipped=$((skipped+1)); return; fi
|
|
echo "── php ${f}"
|
|
if php "${ROOT}/${f}"; then ran=$((ran+1)); else echo " FAIL: ${f}"; fail=1; fi
|
|
}
|
|
|
|
echo "=== 1) PHP 회귀 테스트 ==="
|
|
run_php tests/raw_body_signature_test.php
|
|
run_php tests/security_hardening_test.php
|
|
run_php tests/threshold_sms_test.php
|
|
run_php tests/chaos_drill.php # SMS 실패 주입 경로 드릴
|
|
|
|
echo ""
|
|
echo "=== 2) 펌웨어 호스트 패리티 (C↔Python↔PHP) ==="
|
|
if have python3 && have php; then
|
|
echo "── python3 firmware/test/host/parity_test.py"
|
|
if ( cd "${ROOT}/firmware/test/host" && python3 parity_test.py ); then
|
|
ran=$((ran+1))
|
|
else
|
|
echo " FAIL: parity_test.py"; fail=1
|
|
fi
|
|
if ! have gcc && ! have cc && ! have clang; then
|
|
echo " NOTE: C 컴파일러 없음 — 위 패리티는 Python↔PHP 만 검증(C 서명 미컴파일)."
|
|
fi
|
|
else
|
|
echo "SKIP (python3/php 없음): firmware/test/host/parity_test.py"; skipped=$((skipped+1))
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== 요약: 실행 ${ran}, 스킵 ${skipped} ==="
|
|
if [ "${fail}" -ne 0 ]; then echo "결과: FAIL"; exit 1; fi
|
|
if [ "${ran}" -eq 0 ]; then echo "결과: NO-OP (실행된 테스트 없음 — php/python3 설치 필요)"; exit 0; fi
|
|
echo "결과: PASS"
|