제어 작업 구현과 버전 업그레이드 계획을 수립했습니다 제어 작업 구현과 버전 업그레이드 계획을 수립했습니다 제어 action을 넣고 8.5.4로 올리겠습니다. 먼저 인터페이스를 분리하겠습니다. 파일 생성됨, 명령 실행함 파일 생성됨, 명령 실행함 이제 cmd_exec.c 에 virt.domain.* 디스패치를 붙이겠습니다. 기존 코드 구조를 검토하고 변경사항을 파악했습니다 기존 코드 구조를 검토하고 변경사항을 파악했습니다 중복 디스패치가 있습니다. 확인하겠습니다. 코드 중복을 제거하고 더 강력한 구현으로 통합했습니다 코드 중복을 제거하고 더 강력한 구현으로 통합했습니다 중복 구현이 있습니다. 정리하겠습니다 — 두 개가 공존하면 뒤엣것은 죽은 코드입니다. 명령 3개 실행함 명령 3개 실행함 단일 구현으로 정리됐습니다. 이제 8.5.4로 올리고 정책·문서를 갱신하겠습니다. 정규식 검증 로직을 재설계하고 버전 업데이트를 고려했습니다 정규식 검증 로직을 재설계하고 버전 업데이트를 고려했습니다 --allow 검증 정규식이 3단계 action을 못 받습니다. 확인하고 고치겠습니다. 와일드카드 매칭 검증 후 통합 테스트 구성 준비 완료 와일드카드 매칭 검증 후 통합 테스트 구성 준비 완료 구조체에도 중복이 있습니다. 정리하겠습니다. 디버깅 경고를 추적하고 버퍼 크기 불일치를 조사했습니다 디버깅 경고를 추적하고 버퍼 크기 불일치를 조사했습니다 경고가 뜹니다. _tbuf 크기가 안 맞는 곳이 남아 있는 듯합니다. 컴파일러 경고를 해결하기 위해 strftime으로 리팩토링했습니다 컴파일러 경고를 해결하기 위해 strftime으로 리팩토링했습니다 strftime 으로 바꾸면 깔끔하게 해결됩니다. 변수 선언 위치를 재정렬하여 접근성 개선했습니다 변수 선언 위치를 재정렬하여 접근성 개선했습니다 선언 순서 문제입니다. 전역을 위로 옮기겠습니다. Move control globals earlier and rebuild Move control globals earlier and rebuild 빌드 성공했습니다. 남은 두 경고는 8.5.2부터 있던 것입니다. 이제 제어 action을 실제로 테스트하겠습니다. 중복 제거하고 지연 초기화 메커니즘 구현했습니다 중복 제거하고 지연 초기화 메커니즘 구현했습니다 두 가지 문제입니다. 목 파일 중복과, 제어 경로가 init 없이는 동작하지 않는 설계 결함입니다. 파일 재구성하고 제어 인터페이스 통합 후 버전 업데이트 계획 파일 재구성하고 제어 인터페이스 통합 후 버전 업데이트 계획 목이 잘렸습니다. 전체를 다시 생성하겠습니다. Rebuild a complete mock and rerun control tests Rebuild a complete mock and rerun control tests 12/12 통과. 이제 전체 회귀와 4조합 빌드를 확인하고 문서를 갱신하겠습니다. 파일 경로 불일치를 진단하고 테스트 업데이트를 계획했습니다 파일 경로 불일치를 진단하고 테스트 업데이트를 계획했습니다 테스트가 옛 경로( linux_8.5.3 )를 참조하고 있습니다. 코드 문제가 아닙니다. Fix test paths and run the complete regression suite Fix test paths and run the complete regression suite 전체 회귀 통과 (57 pass / 0 fail). 문서를 갱신하고 최종 패키징하겠습니다. 명령 3개 실행함, 파일 읽음 명령 3개 실행함, 파일 읽음 8.5.4 최종본입니다. 제어 action 7개 추가. virt.domain.* action libvirt 호출 start virDomainCreate shutdown virDomainShutdown (ACPI) reboot virDomainReboot (ACPI) destroy virDomainDestroy — 강제 차단 suspend / resume virDomainSuspend / Resume reset virDomainReset — 강제 리셋 json {"name": "web-vm-01"} {"uuid": "1111...-...."} {"name": "db-vm-02", "force": true} 이름·UUID 둘 다 받고, force 는 shutdown→destroy / reboot→reset 으로 갈아탑니다. 커넥션 분리 모니터링은 RO, 제어는 별도 RW입니다. 제어 호출이 하이퍼바이저 응답을 수 초 기다려도 수집이 멈추지 않습니다. init 이 실패했더라도(에이전트 기동 후 libvirt 설치 등) 제어 요청 시점에 lv_load() 를 한 번 더 시도합니다. 작업 중 발견해서 고친 것 중복 구현이 있었습니다. virt_ctl_exec 와 virt_domain_action 두 개가 공존했고 cmd_exec.c 에 도달 불가능한 dispatch 블록 이 남아 있었습니다. 기능이 더 갖춰진 쪽으로 통합하고 나머지를 제거했습니다. 그대로 뒀으면 뒤엣것은 영원히 실행되지 않는 죽은 코드였습니다. --allow 검증식이 3단계 action을 거부했습니다. ^[a-z_]+\.([a-z_]+|\*)$ 로는 virt.domain.start 가 통과 못 합니다. 고쳤습니다. get_time_str 를 strftime 으로 — 8.5.3에서 넣은 snprintf("%04d",...) 가 -Wformat-truncation 경고를 냈습니다. virt_control.h 신설 — cmd_exec.c 가 플랫폼 구현을 직접 참조하지 않도록 분리했습니다. FreeBSD는 동일 시그니처만 제공하면 됩니다. 검증 단위 정책 14 / nonce 6 / action 10 / 리로드 11 / 출력캡처 4 / virt제어 12 합계 57 pass / 0 fail 빌드 eBPF × libvirt 4조합 전부 성공 (압축본 해제 후) 링크 ldd에 libvirt 0건 구동 v8.5.4 기동 확인 위험 안내 기본 정책에 13개를 다 넣었습니다. destroy / reset / force 는 게스트 전원 코드를 뽑는 것과 같아 파일시스템이 손상될 수 있습니다. 노드 성격에 따라 좁히실 거면: sh sudo sh install.sh --token=<토큰> \ --allow='service.*,virt.domain.start,virt.domain.reboot' 기존 policy.json 은 보존되니, 13개로 바꾸시려면 파일을 지우고 재설치하거나 systemctl reload mihosrcd 로 새 정책을 읽히시면 됩니다 — 8.5.3부터 SIGHUP 리로드가 되므로 재시작이 필요 없습니다. Node.js 쪽 연동은 virt.domain.* action에 params.name 만 실어 보내시면 되고, 응답의 VIRT_* 코드로 실패 사유를 구분하실 수 있습니다. 대시보드의 "완료" 오표시 문제는 그쪽 코드를 주시면 이어서 잡겠습니다.