2
0
mirror of https://github.com/acepanel/helper.git synced 2026-02-04 04:07:16 +08:00
Files
helper/internal/system/systemd.go
2026-01-17 22:58:56 +08:00

123 lines
3.3 KiB
Go

package system
import (
"context"
"fmt"
"os"
"strings"
"github.com/acepanel/helper/pkg/i18n"
)
// Systemd systemd服务管理接口
type Systemd interface {
// Start 启动服务
Start(ctx context.Context, service string) error
// Stop 停止服务
Stop(ctx context.Context, service string) error
// Enable 启用服务
Enable(ctx context.Context, service string) error
// Disable 禁用服务
Disable(ctx context.Context, service string) error
// Restart 重启服务
Restart(ctx context.Context, service string) error
// IsActive 检查服务是否运行
IsActive(ctx context.Context, service string) bool
// DaemonReload 重载systemd配置
DaemonReload(ctx context.Context) error
// WriteServiceFile 写入服务文件
WriteServiceFile(name string, content string) error
// RemoveServiceFile 删除服务文件
RemoveServiceFile(name string) error
}
type systemd struct {
executor Executor
}
// NewSystemd 创建systemd管理器
func NewSystemd(executor Executor) Systemd {
return &systemd{executor: executor}
}
func (s *systemd) Start(ctx context.Context, service string) error {
result, err := s.executor.Run(ctx, "systemctl", "start", service)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T().Get("Failed to start"), service, result.Stderr)
}
return nil
}
func (s *systemd) Stop(ctx context.Context, service string) error {
result, err := s.executor.Run(ctx, "systemctl", "stop", service)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T().Get("Failed to stop"), service, result.Stderr)
}
return nil
}
func (s *systemd) Enable(ctx context.Context, service string) error {
result, err := s.executor.Run(ctx, "systemctl", "enable", "--now", service)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T().Get("Failed to enable"), service, result.Stderr)
}
return nil
}
func (s *systemd) Disable(ctx context.Context, service string) error {
result, err := s.executor.Run(ctx, "systemctl", "disable", service)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T().Get("Failed to disable"), service, result.Stderr)
}
return nil
}
func (s *systemd) Restart(ctx context.Context, service string) error {
result, err := s.executor.Run(ctx, "systemctl", "restart", service)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T().Get("Failed to restart"), service, result.Stderr)
}
return nil
}
func (s *systemd) IsActive(ctx context.Context, service string) bool {
result, _ := s.executor.Run(ctx, "systemctl", "is-active", service)
return result != nil && strings.TrimSpace(result.Stdout) == "active"
}
func (s *systemd) DaemonReload(ctx context.Context) error {
result, err := s.executor.Run(ctx, "systemctl", "daemon-reload")
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s: %s", i18n.T().Get("Failed to daemon-reload"), result.Stderr)
}
return nil
}
func (s *systemd) WriteServiceFile(name string, content string) error {
path := fmt.Sprintf("/etc/systemd/system/%s.service", name)
return os.WriteFile(path, []byte(content), 0644)
}
func (s *systemd) RemoveServiceFile(name string) error {
path := fmt.Sprintf("/etc/systemd/system/%s.service", name)
return os.Remove(path)
}