feat: complete daemon operations and recovery tooling

This commit is contained in:
2026-08-22 15:34:09 +08:00
parent a0a4a7556a
commit 1abe8df6ee
19 changed files with 1421 additions and 171 deletions
+42
View File
@@ -55,6 +55,48 @@ func Restart(ctx context.Context, socketPath string, service string, progress fu
return submit(ctx, socketPath, request, progress)
}
// Status 向守护进程查询后端当前状态,返回结构化诊断结果。
// socketPath 守护进程 Unix Socket 的绝对路径,service 是目标服务名。
// 当路径非法、连接失败或守护进程返回错误时返回 error。
func Status(ctx context.Context, socketPath string, service string) (daemonapi.Diagnosis, error) {
if !filepath.IsAbs(socketPath) {
return daemonapi.Diagnosis{}, errors.New("daemon socket path must be absolute")
}
return submitDiagnosis(ctx, socketPath, daemonapi.Request{Operation: daemonapi.OperationStatus, Service: service})
}
// Doctor 向守护进程提交一次只读诊断请求,返回全部漂移项与建议动作。
// socketPath 守护进程 Unix Socket 的绝对路径,service 是目标服务名。
// 当路径非法、连接失败或守护进程返回错误时返回 error。
func Doctor(ctx context.Context, socketPath string, service string) (daemonapi.Diagnosis, error) {
if !filepath.IsAbs(socketPath) {
return daemonapi.Diagnosis{}, errors.New("daemon socket path must be absolute")
}
return submitDiagnosis(ctx, socketPath, daemonapi.Request{Operation: daemonapi.OperationDoctor, Service: service})
}
// Reconcile 向守护进程提交对账请求,apply 为 true 时执行自动修复,否则只生成修复计划。
// socketPath 守护进程 Unix Socket 的绝对路径,service 是目标服务名。
// 当路径非法、连接失败或守护进程返回错误时返回 error。
func Reconcile(ctx context.Context, socketPath string, service string, apply bool) (daemonapi.Diagnosis, error) {
if !filepath.IsAbs(socketPath) {
return daemonapi.Diagnosis{}, errors.New("daemon socket path must be absolute")
}
return submitDiagnosis(ctx, socketPath, daemonapi.Request{Operation: daemonapi.OperationReconcile, Service: service, Apply: apply})
}
// submitDiagnosis 提交一次诊断类请求并解析结果中的诊断结构,供 status/doctor/reconcile 复用。
func submitDiagnosis(ctx context.Context, socketPath string, request daemonapi.Request) (daemonapi.Diagnosis, error) {
response, err := submit(ctx, socketPath, request, nil)
if err != nil {
return daemonapi.Diagnosis{}, err
}
if response.Diagnosis == nil {
return daemonapi.Diagnosis{}, errors.New("daemon returned no diagnosis result")
}
return *response.Diagnosis, nil
}
// submit 通过 Unix Socket 把 request 发送给守护进程并读取响应流,供本包各公开函数复用。
// 它会以换行分隔的 JSON 编码请求,写完后关闭写端以向对端发送结束信号,
// 随后循环解码响应:进度事件通过 progress 回调透传,最终结果则返回给调用方。