将代码与测试注释改为中文以符合仓库规范;新增中文部署指南、 示例配置,并完善构建脚本对 VERSION 注入的说明。 Co-authored-by: Cursor <cursoragent@cursor.com>
83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
//go:build linux
|
|
|
|
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"mfd-monitor-agent/internal/config"
|
|
)
|
|
|
|
var currentUID = os.Geteuid
|
|
|
|
// linuxManager 通过 systemd 管理 agent 服务。
|
|
type linuxManager struct{}
|
|
|
|
// newManager 返回基于 Linux systemd 的服务管理器。
|
|
func newManager() Manager {
|
|
return linuxManager{}
|
|
}
|
|
|
|
// Install 写入 systemd unit、重载 systemd 并 enable 配置的服务。
|
|
func (linuxManager) Install(executable string, cfg config.Config, opts InstallOptions) error {
|
|
if currentUID() != 0 {
|
|
return fmt.Errorf("install requires root")
|
|
}
|
|
unit := renderSystemdUnit(executable, opts.ConfigPath, cfg)
|
|
path := "/etc/systemd/system/" + cfg.Service.Name + ".service"
|
|
if err := os.WriteFile(path, []byte(unit), 0644); err != nil {
|
|
return fmt.Errorf("write systemd unit: %w", err)
|
|
}
|
|
if err := exec.Command("systemctl", "daemon-reload").Run(); err != nil {
|
|
return fmt.Errorf("systemctl daemon-reload: %w", err)
|
|
}
|
|
if err := exec.Command("systemctl", "enable", cfg.Service.Name).Run(); err != nil {
|
|
return fmt.Errorf("systemctl enable: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// renderSystemdUnit 生成 Install 使用的 Linux systemd unit 内容。
|
|
func renderSystemdUnit(executable string, configPath string, cfg config.Config) string {
|
|
args := []string{executable, "run"}
|
|
if configPath != "" {
|
|
args = append(args, "-config", configPath)
|
|
}
|
|
return fmt.Sprintf(`[Unit]
|
|
Description=%s
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
ExecStart=%s
|
|
Restart=always
|
|
RestartSec=5s
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
`, cfg.Service.Description, strings.Join(args, " "))
|
|
}
|
|
|
|
// Uninstall 禁用服务、删除 unit 文件并重载 systemd。
|
|
func (linuxManager) Uninstall(cfg config.Config) error {
|
|
_ = exec.Command("systemctl", "disable", "--now", cfg.Service.Name).Run()
|
|
if err := os.Remove("/etc/systemd/system/" + cfg.Service.Name + ".service"); err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
return exec.Command("systemctl", "daemon-reload").Run()
|
|
}
|
|
|
|
// Start 请求 systemd 启动配置的服务。
|
|
func (linuxManager) Start(cfg config.Config) error {
|
|
return exec.Command("systemctl", "start", cfg.Service.Name).Run()
|
|
}
|
|
|
|
// Stop 请求 systemd 停止配置的服务。
|
|
func (linuxManager) Stop(cfg config.Config) error {
|
|
return exec.Command("systemctl", "stop", cfg.Service.Name).Run()
|
|
}
|