Crowny INT 장비 관제 (/equip) + 장비 레지스트리 API
개요
crowny-int2(도시 통합 긴급방송 관제)에 장비 2종(전관방송 앰프 제어반 · 지진경보 수신단말) 관제 페이지와
IP/상태 편집 API를 신설. 업체명(온품 등) 노출 없이 일반 명칭만 사용. 기관(기관.psv) ↔ 장비 IP 매핑,
미구축 기관은 점선 "구축 예정(예상 화면)" 카드로 표시. 트리맵 트랙에서 이월된 byCity awk 미반영 이슈도 함께 수리.
무엇을 했는지
서버 (INT서버.한선, 2092→2274줄)
data/장비.psv 신설 — 스키마 기관아이디|장비종류|IP|상태, 구축 12기관×2장비=24행 시드
(신갈동 앰프제어반=끊김, 죽전1동 앰프제어반=점검, CLAUDE.md 데모 상태 반영).
- top-level 병렬배열 파싱:
_장비기관/_장비종류/_장비IP/_장비상태(기관.psv 로딩과 동일 관례,
커스텀 함수 호출 없이 내장함수만).
data/장비수정.psv 오버레이 — 스키마 ts|by|기관아이디|장비종류|필드|새값, latest-wins,
화이트리스트 필드(IP·상태). (기관아이디,장비종류) 쌍이 배열에 없으면 기본값 행을 만들고 필드 반영
(top-level
_장비오버레이적용()이 1회 호출 — 재기동 시에도 신규 등록 장비가 복원됨).
GET /api/equip — 전체 장비 배열 [{org,kind,ip,status}].
POST /api/equip/edit — {token,org,kind,field,value}. 절차: 401(세션)→403(role≠dev, 단순화상
dev만 편집 허용)→403(scope, 대상 org의 기관레지스트리 시 기준,
_처리기관수정과 동일 게이트 미러)→
400(field 화이트리스트 IP·상태)→400(IP
[0-9.] 문자클래스)→404(org가 기관레지스트리 자체에 없음)→
장비행 없으면 신규 등록(미구축 기관 장비 등록 경로), 있으면 갱신. append 후
문자열보호()를
전역 배열 설정() 직후 호출(가드레일 2026-07-24 "문자열되감기 vs 설정() 전역배열 갱신 함정" 준수 —
미호출 시 per-request
문자열마크()/
문자열되감기()가 방금 써넣은 값을 조용히 되감아 응답별로
값이 계속 달라지는 버그가 재발함).
- 라우트:
/equip→public/장비.html, /api/equip, /api/equip/edit.
- 잔여 이슈 수리(트리맵 트랙 이월):
_처리기관요약의 byCity/byType이 매 요청마다 awk로
기관.psv를 직독해 런타임 오버레이(
/api/orgs/edit로 반영된 값)를 반영 못 하던 문제 수리.
awk 호출 2개(체계() 2회) 완전 제거 → top-level 1회 계산한
_시카테고리/
_유형카테고리 목록을
요청 핸들러 안에서는
읽기 전용 순회 + 스칼라 카운팅만으로 집계(가드레일 "함수 재호출 배열
지역변수 함정" 회피 — 핸들러 함수 내부에
변수 x=[] 지역 배열을 전혀 선언하지 않도록 설계).
클라이언트 (public/장비.html 신규)
- 트리맵.html의 로그인 모달·세션(sessionStorage, 동일 키
intMapToken 등 재사용 — 같은 탭 안에서
/map과 /equip 로그인 공유)·편집폼 패턴 재사용.
- asof 배너 + 구축 12/총 104 요약, 시/구/장비종류/구축상태 필터 바.
- 카드 그리드(기관별, 앰프+지진 패널 2개). 미구축 기관 = dashed 보더 + 대각 워터마크
"구축 예정 (예상 화면)" + 값 opacity 흐림 + IP "—". 구축 기관은 실선·실데이터.
- 상태등: 정상=그린 ciPulse 2.4s(호흡)·점검=옐로우 ciPulse .9s(빠른 pulse)·끊김=레드 static
(pc.html LC/GLOW 관용구 미러).
- dev 로그인 시 scope 내 기관 카드에 ✎(IP/상태 편집, 미구축 기관은 신규 등록), scope 밖 숨김,
403/401 토스트. user 로그인 시 자기 기관 카드 하이라이트 + 상단 정렬.
동반 판정 (public/장비-판정.한선 신규)
장비.psv 로드 미러 + IP 문자클래스 검증 + 상태 3값(정상/점검/끊김)→4상 판정(1/0/-1/-2)
+ 오버레이 latest-wins 미러 + scope×기관시 편집허용 판정. 셀프테스트 20건 전체 PASS.
검증 결과 (전부 실측)
CROWNY_STRICT=1 hanseonc_high INT서버.한선 — 경고 0.
장비-판정.한선 컴파일+실행 — 20/20 PASS.
- toau 교체 +
launchctl unload/load ~/Library/LaunchAgents/org.crowny.int2.plist 재기동 성공
(43327→45524 큐브).
/equip 200, /api/equip 24행(등록 테스트 후 25행).
- edit 게이트: bogus 토큰→401 / 고양 기관 편집(용인개발자)→403 scope / field="구축"→400 field /
IP 문자클래스 위반("...;rm")→400 ip_format / 존재하지 않는 org(scope=전체 "개발자" 계정)→404
org_not_found / 미구축 기관(영덕1동) 신규 장비 등록(scope=전체)→200 ok, 조회로 확인.
- 용인 기관(신갈동) IP 수정 → 10회 연속
/api/equip 조회 값 안정(문자열되감기 함정 미재현 확인) →
재기동 후 값 persist(25행, 신갈동 IP·영덕1동 등록 모두 유지).
/api/orgs/summary byCity가 오버레이 반영값(용인시 49/구축10, 고양시 54/구축1) 정확 + asof 유지.
- 회귀:
/map / /health /orgs /pc /tablet /mobile /bar /guide /demo /api/orgs
전부 200.
- 시험 수정값 원복: 신갈동 앰프제어반 IP를
10.45.4.11로 되돌리는 오버레이 라인 1줄 append
(append-only 구조상 완전 삭제 불가 — 기존
기관수정.psv도 동일 관례). 영덕1동 신규 등록 행은
"미구축 기관 장비 등록 경로" 기능의 라이브 증거로 유지.
관련 파일
/Users/ef/crowny-int2/INT서버.한선 (서버, 백업 INT서버.한선.bak-장비전)
/Users/ef/crowny-int2/INT서버.toau (백업 INT서버.toau.bak-장비전)
/Users/ef/crowny-int2/data/장비.psv (신설, 시드 24행)
/Users/ef/crowny-int2/data/장비수정.psv (신설, append-only 오버레이)
/Users/ef/crowny-int2/public/장비.html (신설)
/Users/ef/crowny-int2/public/장비-판정.한선 (신설, 동반 판정)
잔여 이슈
- admin 역할의 장비 편집은 후속(현재 dev만 허용, 사용자 사양대로 단순화).
- VPS 배포(
배포.sh)는 지시대로 미실행 — 메인 세션이 수행 예정.
- 장비수정.psv에 시험 데이터(영덕1동 신규 등록, 신갈동 원복 라인) 존재 — append-only 구조상 정상.