Smail/backend/services/restart/service.go
smail f60d3b0880
Some checks are pending
Security Checks / security (push) Waiting to run
整理前后端与测试构建目录并完善配置和安全引导
统一 frontend、backend、test、test-log 和 out 目录,更新构建、部署及测试入口;纳入配置管理兼容与首次安全引导修复;排除本机配置、密钥和测试产物。
2026-09-05 19:19:52 +08:00

58 lines
1.4 KiB
Go

package restart
import (
"context"
"errors"
)
var (
ErrUnavailable = errors.New("restart service unavailable")
ErrCanceled = errors.New("restart request canceled")
)
// Trigger 接收固定的 Smail 重启动作,不接受服务名、命令或参数。
type Trigger interface {
Request(context.Context) error
}
// Preview 描述固定的 Smail 重启目标,但不执行重启动作。
type Preview struct {
Target string `json:"target"`
Action string `json:"action"`
ActiveGeneration uint64 `json:"activeGeneration"`
PendingServices []string `json:"pendingServices,omitempty"`
ServiceManager string `json:"serviceManager"`
TriggerAvailable bool `json:"triggerAvailable"`
}
func BuildPreview(activeGeneration uint64, pendingServices []string, triggerAvailable bool) Preview {
return Preview{
Target: "smail",
Action: "restart",
ActiveGeneration: activeGeneration,
PendingServices: append([]string(nil), pendingServices...),
ServiceManager: "固定服务管理器",
TriggerAvailable: triggerAvailable,
}
}
type SignalTrigger struct {
channel chan<- bool
}
func NewSignalTrigger(channel chan<- bool) *SignalTrigger {
return &SignalTrigger{channel: channel}
}
func (t *SignalTrigger) Request(ctx context.Context) error {
if t == nil || t.channel == nil {
return ErrUnavailable
}
select {
case t.channel <- true:
return nil
case <-ctx.Done():
return ErrCanceled
}
}