Files
mfd-monitor-agent/internal/service/service_linux.go
codex 877e4cf41d docs(agent): 统一中文注释并补充部署文档
将代码与测试注释改为中文以符合仓库规范;新增中文部署指南、
示例配置,并完善构建脚本对 VERSION 注入的说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 02:30:49 +00:00

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()
}