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