← 목록
기타 2026-07-24 6KB 읽기 6분

Crowny INT 장비 관제 (/equip) + 장비 레지스트리 API

개요

crowny-int2(도시 통합 긴급방송 관제)에 장비 2종(전관방송 앰프 제어반 · 지진경보 수신단말) 관제 페이지와 IP/상태 편집 API를 신설. 업체명(온품 등) 노출 없이 일반 명칭만 사용. 기관(기관.psv) ↔ 장비 IP 매핑, 미구축 기관은 점선 "구축 예정(예상 화면)" 카드로 표시. 트리맵 트랙에서 이월된 byCity awk 미반영 이슈도 함께 수리.

무엇을 했는지

서버 (INT서버.한선, 2092→2274줄)

  1. data/장비.psv 신설 — 스키마 기관아이디|장비종류|IP|상태, 구축 12기관×2장비=24행 시드
(신갈동 앰프제어반=끊김, 죽전1동 앰프제어반=점검, CLAUDE.md 데모 상태 반영).
  1. top-level 병렬배열 파싱: _장비기관/_장비종류/_장비IP/_장비상태(기관.psv 로딩과 동일 관례,
커스텀 함수 호출 없이 내장함수만).
  1. data/장비수정.psv 오버레이 — 스키마 ts|by|기관아이디|장비종류|필드|새값, latest-wins,
화이트리스트 필드(IP·상태). (기관아이디,장비종류) 쌍이 배열에 없으면 기본값 행을 만들고 필드 반영 (top-level _장비오버레이적용()이 1회 호출 — 재기동 시에도 신규 등록 장비가 복원됨).
  1. GET /api/equip — 전체 장비 배열 [{org,kind,ip,status}].
  2. 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 문자열마크()/문자열되감기()가 방금 써넣은 값을 조용히 되감아 응답별로 값이 계속 달라지는 버그가 재발함).
  1. 라우트: /equippublic/장비.html, /api/equip, /api/equip/edit.
  2. 잔여 이슈 수리(트리맵 트랙 이월): _처리기관요약의 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 구조상 정상.