인증서 CN 추출 함수 구현하여 uuid 등록 문제 해결 계획 인증서 CN 추출 함수 구현하여 uuid 등록 문제 해결 계획 I've now traced both problems to their roots. Let me implement the fixes. First, the UUID issue in enroll.c — the enroll-skip path (valid cert reuse) never repopulates the server UUID: 프로세스 누적과 UUID 등록 문제를 해결하기 위해 설계했습니다 프로세스 누적과 UUID 등록 문제를 해결하기 위해 설계했습니다 Now the process-accumulation fix in main.c . First, add a dedicated single-instance lock that works in both foreground and daemon modes: 2개 파일 수정됨 2개 파일 수정됨 Now replace the flock-on-pidfile singleton inside daemonize() with a plain pidfile write, and add the dedicated lock function: 코드 삽입 위치를 파악하기 위해 검토했습니다 코드 삽입 위치를 파악하기 위해 검토했습니다 Now add the acquire_singleton_lock() function right after daemonize() : UUID 등록과 프로세스 누적 문제를 해결했습니다 UUID 등록과 프로세스 누적 문제를 해결했습니다 Now fix the rc.d script — this is the heart of the process-accumulation bug. The binary self-daemonizes (double-fork) while being run under daemon -r , so daemon(8) sees its child exit immediately and restarts forever. Run the agent in foreground so daemon -r supervises the real process: 프로세스 정리 메커니즘과 서비스 시작 스크립트 검증을 검토했습니다 프로세스 정리 메커니즘과 서비스 시작 스크립트 검증을 검토했습니다 Now let me syntax-check the modified C files. Let me install the needed dev headers: FreeBSD 빌드 성공 여부 검증 중입니다 FreeBSD 빌드 성공 여부 검증 중입니다 Both files compile clean. Let me verify how AGENT_VERSION is set and confirm the diagnosis note in the code about multiple instances spawning dtrace: CMakeLists.txt 버전 설정 검증 및 main.c 편집 검토 중 CMakeLists.txt 버전 설정 검증 및 main.c 편집 검토 중 Let me review the edited regions in main.c to confirm coherence: 락 파일 권한 문제를 진단하고 수정안을 준비했습니다 락 파일 권한 문제를 진단하고 수정안을 준비했습니다 Both compile clean. Let me generate a diff against the original so the changes are reviewable, then write a fixes note and repackage: 문서화 작성 후 패키지 재구성 준비 중 문서화 작성 후 패키지 재구성 준비 중 Now let me write the fixes note and repackage the corrected tarball: Korean fixes changelog for this release Korean fixes changelog for this release 두 문제를 추적해 원인을 찾고 수정까지 마쳤습니다. 두 증상은 하나의 뿌리 에서 나옵니다 — 에이전트가 rc.d 아래에서 중복·재기동되며 각 인스턴스가 자기 sender·명령채널·dtrace 자식을 띄운 것입니다. ① 프로세스 누적 원인 : mihosrcd.rc.d 가 daemon -f -r ... "$MIHO_BIN" 으로 띄우는데, 바이너리에 -f 가 없어 에이전트가 스스로 이중 fork 데몬화 합니다. 그러면 daemon(8) 의 직속 자식이 즉시 종료 → -r 이 "죽었다"고 오판 → 1초마다 무한 재기동 . 게다가 옛 단일-인스턴스 락이 daemon -P 가 쓰는 같은 PID 파일에 걸려 있어 inode 경합으로 중복을 못 막았습니다. (main.c 옛 주석의 "인스턴스마다 dtrace 를 띄워 폭주"가 바로 이 증상입니다.) 수정 2곳 rc.d : 바이너리에 -f 를 붙여 foreground로 → daemon -r 이 진짜 에이전트를 직접 감독. PID 파일은 daemon(8) 이 -P 로 단독 소유. main.c : 전용 락 파일 /var/run/mihosrcd.lock 에 대한 acquire_singleton_lock() 을 추가하고 foreground/daemon 양쪽에서 기동 즉시 호출. PID 파일 flock 단일화는 제거(경합 제거). ② UUID 등록 실패 원인 : 서버는 enroll 발급 UUID를 client.crt의 CN 으로 강제하고, ingest는 g_agent_uuid 로 나갑니다. 둘이 같아야 한 노드로 잡히는데, enroll.c 의 enroll 생략 경로 (유효 인증서 재사용)가 out->uuid 를 비운 채 반환 → main.c가 서버 UUID로 갱신 못 하고 agent.conf 의 로컬 랜덤 UUID로 ingest → relay(CN)와 ingest(로컬)가 어긋난 유령 노드 발생. 수정 : enroll.c 에 read_cert_cn() 을 추가해, enroll을 건너뛰어도 인증서 CN을 out->uuid 로 복원. 매 부팅마다 g_agent_uuid 가 CN(=서버 UUID)으로 재동기화되어 항상 일치 + 자가 치유 됩니다. 검증 enroll.c , main.c 모두 gcc -fsyntax-only -Wall -Wextra 경고 0, RC=0 확인. 변경은 diff로 리뷰 가능(rc.d 1줄+주석, main.c 락 함수/호출/pidfile, enroll.c CN 복원). 수정본 전체 트리와 상세 changelog( FIXES-8.5.3-processleak-uuid.md , 배포·검증 절차 포함)를 준비했는데, 마지막 단계에서 재패키징( .tgz 생성)과 파일 전달 직전에 도구 사용 한도에 걸렸습니다. **다음 메시지에서 "패키징 계속"**이라고만 주시면 곧바로 완성된 freebsd_8.5.3 타르볼로 묶어 다운로드 링크로 드리겠습니다. 참고(별건·미포함): update_manager.c 에 #ifdef __FREEBSD__ 오타(표준은 __FreeBSD__ )가 있어 FreeBSD self-update 경로가 안 타는 잠재 버그가 있습니다. 이번 두 증상과 무관해 손대지 않았고, 원하시면 함께 정리하겠습니다. 계속 계속 진행할 준비를 마쳤습니다 계속 진행할 준비를 마쳤습니다 Diffs are clean. Now let me repackage into the corrected tarball with the original top-level structure: 계속 진행하기 위해 접근 방식을 재구성했습니다 계속 진행하기 위해 접근 방식을 재구성했습니다 All three fixes are confirmed inside the packaged tarball. Presented 3 files Presented 3 files 완성했습니다. 세 파일 모두 전달했습니다. freebsd_8_5_3_fixed.tgz — 수정본 전체 트리 (원본과 동일하게 freebsd_8.5.3/ 최상위). 배포 절차는 안에 든 FIXES-...md 참고. FIXES-8.5.3-processleak-uuid.md — 원인·수정·배포/검증 절차. CHANGES-8.5.3.diff — 세 파일의 통합 diff (리뷰용). 수정 요약 ① 프로세스 누적 — rc.d 가 daemon -f -r 로 띄우는데 바이너리에 -f 가 없어 에이전트가 스스로 이중 fork → daemon(8) 의 직속 자식이 즉시 종료 → -r 이 오판해 1초마다 무한 재기동, 옛 단일화 락은 daemon -P PID 파일과 inode 경합으로 무력화. 두 곳을 고쳤습니다: rc.d에서 바이너리에 -f 를 붙여 foreground 감독으로 전환, main.c에 전용 락( /var/run/mihosrcd.lock ) 기반 acquire_singleton_lock() 을 양 모드 공통으로 추가. ② UUID 등록 실패 — enroll.c 의 enroll 생략 경로가 out->uuid 를 비운 채 반환 → ingest가 로컬 UUID로 나가 relay(CN=서버 UUID)와 어긋난 유령 노드 발생. read_cert_cn() 을 추가해 인증서 CN(=서버 UUID)을 항상 복원 → 매 부팅 재동기화·자가 치유. 검증 main.c · enroll.c 모두 gcc -fsyntax-only -Wall -Wextra 경고 0. 패키징된 타르볼에서 세 수정이 실제로 들어있음을 재확인.