Scert/backend/internal/serviceready/notify_linux.go
xuans 0b74886c45 修复Linux启动就绪通知并隔离命令行测试目录
通过本机Unix套接字报告HTTPS监听状态,同步服务配置与安装模板,保持初始化业务就绪隔离。补充生命周期回归并修复旧CLI测试误用正式目录的问题。更新Linux原生测试证据,明确新候选尚未部署、生产验收未放行。
2026-10-02 12:20:47 +08:00

42 lines
1.2 KiB
Go

package serviceready
import (
"errors"
"fmt"
"net"
"os"
"strings"
"time"
)
// Ready 仅通过服务管理器提供的本机套接字报告监听状态,不代表业务健康检查通过。
func Ready(status string) error {
address := os.Getenv("NOTIFY_SOCKET")
if address == "" {
return nil
}
if len(address) < 2 || (address[0] != '/' && address[0] != '@') || strings.ContainsAny(address, "\r\n\x00") {
return errors.New("服务就绪通知地址必须是本机套接字")
}
if strings.ContainsAny(status, "\r\n\x00") {
return errors.New("服务就绪状态包含非法控制字符")
}
connection, err := net.DialTimeout("unixgram", address, time.Second)
if err != nil {
return fmt.Errorf("连接本机服务管理器失败:%w", err)
}
defer connection.Close()
if err := connection.SetWriteDeadline(time.Now().Add(time.Second)); err != nil {
return fmt.Errorf("设置服务就绪通知超时失败:%w", err)
}
message := "READY=1\nSTATUS=" + status
written, err := connection.Write([]byte(message))
if err != nil {
return fmt.Errorf("发送服务就绪通知失败:%w", err)
}
if written != len(message) {
return errors.New("服务就绪通知发送不完整")
}
return nil
}