通过本机Unix套接字报告HTTPS监听状态,同步服务配置与安装模板,保持初始化业务就绪隔离。补充生命周期回归并修复旧CLI测试误用正式目录的问题。更新Linux原生测试证据,明确新候选尚未部署、生产验收未放行。
42 lines
1.2 KiB
Go
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
|
|
}
|