diff --git a/agent/utils/controller/controller.go b/agent/utils/controller/controller.go index c913d892e..605adbee3 100644 --- a/agent/utils/controller/controller.go +++ b/agent/utils/controller/controller.go @@ -23,17 +23,17 @@ type Controller interface { } func New() (Controller, error) { - managerOptions := []string{"systemd", "openrc", "sysvinit"} + managerOptions := []string{"systemctl", "rc-service", "service"} for _, item := range managerOptions { if _, err := exec.LookPath(item); err != nil { continue } switch item { - case "systemd": + case "systemctl": return manager.NewSystemd(), nil - case "openrc": + case "rc-service": return manager.NewOpenrc(), nil - case "sysvinit": + case "service": return manager.NewSysvinit(), nil } } @@ -182,8 +182,8 @@ func loadFromPredefined(mgr Controller, keyword string) string { "fail2ban": {"fail2ban.service", "fail2ban"}, "supervisor": {"supervisord.service", "supervisor.service", "supervisord", "supervisor"}, "ssh": {"sshd.service", "ssh.service", "sshd", "ssh"}, - "1panel-core": {"1panel-core.service", "1panel-cored"}, - "1panel-agent": {"1panel-agent.service", "1panel-agentd"}, + "1panel-core": {"1panel-core.service"}, + "1panel-agent": {"1panel-agent.service"}, "docker": {"docker.service", "dockerd"}, } if val, ok := predefinedMap[keyword]; ok { diff --git a/core/utils/controller/controller.go b/core/utils/controller/controller.go index 137bacade..e38ea7946 100644 --- a/core/utils/controller/controller.go +++ b/core/utils/controller/controller.go @@ -8,6 +8,7 @@ import ( "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/utils/controller/manager" + "github.com/1Panel-dev/1Panel/core/utils/ssh" ) type Controller interface { @@ -23,23 +24,48 @@ type Controller interface { } func New() (Controller, error) { - managerOptions := []string{"systemd", "openrc", "sysvinit"} + managerOptions := []string{"systemctl", "rc-service", "service"} for _, item := range managerOptions { if _, err := exec.LookPath(item); err != nil { continue } switch item { - case "systemd": + case "systemctl": return manager.NewSystemd(), nil - case "openrc": + case "rc-service": return manager.NewOpenrc(), nil - case "sysvinit": + case "service": return manager.NewSysvinit(), nil } } return nil, errors.New("not support such manager initializatio") } +func NewWithClient(client *ssh.SSHClient) (Controller, error) { + managerOptions := []string{"systemctl", "rc-service", "service"} + for _, item := range managerOptions { + stdout, err := client.Runf("which %s", item) + if err != nil || (len(strings.ReplaceAll(stdout, "\n", "")) == 0) { + continue + } + switch item { + case "systemctl": + mgr := manager.NewSystemd() + mgr.Client = client + return mgr, nil + case "rc-service": + mgr := manager.NewOpenrc() + mgr.Client = client + return mgr, nil + case "service": + mgr := manager.NewSysvinit() + mgr.Client = client + return mgr, nil + } + } + return nil, errors.New("not support such manager initializatio") +} + func Handle(operate, serviceName string) error { service, err := LoadServiceName(serviceName) if err != nil { @@ -149,7 +175,7 @@ func LoadServiceName(keyword string) (string, error) { } processedName := loadProcessedName(client.Name(), keyword) - exist, err := client.IsExist(processedName) + exist, _ := client.IsExist(processedName) if exist { return processedName, nil } @@ -182,8 +208,8 @@ func loadFromPredefined(mgr Controller, keyword string) string { "fail2ban": {"fail2ban.service", "fail2ban"}, "supervisor": {"supervisord.service", "supervisor.service", "supervisord", "supervisor"}, "ssh": {"sshd.service", "ssh.service", "sshd", "ssh"}, - "1panel-core": {"1panel-core.service", "1panel-cored"}, - "1panel-agent": {"1panel-agent.service", "1panel-agentd"}, + "1panel-core": {"1panel-core.service"}, + "1panel-agent": {"1panel-agent.service"}, "docker": {"docker.service", "dockerd"}, } if val, ok := predefinedMap[keyword]; ok { diff --git a/core/utils/controller/manager/common.go b/core/utils/controller/manager/common.go index 487a966a6..12dd16ea2 100644 --- a/core/utils/controller/manager/common.go +++ b/core/utils/controller/manager/common.go @@ -7,6 +7,7 @@ import ( "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/ssh" ) func handlerErr(out string, err error) error { @@ -19,7 +20,10 @@ func handlerErr(out string, err error) error { return nil } -func run(name string, args ...string) (string, error) { +func run(client *ssh.SSHClient, name string, args ...string) (string, error) { global.LOG.Debugf("handle with controller `%s %s`", name, strings.Join(args, " ")) - return cmd.NewCommandMgr(cmd.WithTimeout(10*time.Second)).RunWithStdoutBashCf("LANGUAGE=en_US:en %s %s", name, strings.Join(args, " ")) + if client == nil { + return cmd.NewCommandMgr(cmd.WithTimeout(10*time.Second)).RunWithStdoutBashCf("LANGUAGE=en_US:en %s %s", name, strings.Join(args, " ")) + } + return client.Runf("LANGUAGE=en_US:en %s %s", name, strings.Join(args, " ")) } diff --git a/core/utils/controller/manager/openrc.go b/core/utils/controller/manager/openrc.go index 8f4492287..ceb5b1fba 100644 --- a/core/utils/controller/manager/openrc.go +++ b/core/utils/controller/manager/openrc.go @@ -6,9 +6,13 @@ import ( "path/filepath" "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/ssh" ) -type Openrc struct{ toolCmd string } +type Openrc struct { + toolCmd string + Client *ssh.SSHClient +} func NewOpenrc() *Openrc { return &Openrc{toolCmd: "rc-service"} @@ -32,8 +36,7 @@ func (s *Openrc) IsEnable(serviceName string) (bool, error) { return out == "enabled\n", nil } func (s *Openrc) IsExist(serviceName string) (bool, error) { - _, err := os.Stat(filepath.Join("/etc/init.d", serviceName)) - if err != nil { + if _, err := os.Stat(filepath.Join("/etc/init.d", serviceName)); err != nil { if os.IsNotExist(err) { return false, nil } @@ -42,17 +45,17 @@ func (s *Openrc) IsExist(serviceName string) (bool, error) { return true, nil } func (s *Openrc) Status(serviceName string) (string, error) { - return run(s.toolCmd, serviceName, "status") + return run(s.Client, s.toolCmd, serviceName, "status") } func (s *Openrc) Operate(operate, serviceName string) error { switch operate { case "enable": - return handlerErr(run("rc-update", "add", serviceName, "default")) + return handlerErr(run(s.Client, "rc-update", "add", serviceName, "default")) case "disable": - return handlerErr(run("rc-update", "del", serviceName, "default")) + return handlerErr(run(s.Client, "rc-update", "del", serviceName, "default")) default: - return handlerErr(run(s.toolCmd, serviceName, operate)) + return handlerErr(run(s.Client, s.toolCmd, serviceName, operate)) } } diff --git a/core/utils/controller/manager/snap.go b/core/utils/controller/manager/snap.go index a4410ee9f..435345e6d 100644 --- a/core/utils/controller/manager/snap.go +++ b/core/utils/controller/manager/snap.go @@ -11,7 +11,7 @@ func NewSnap() *Snap { } func (s *Snap) IsExist(serviceName string) bool { - out, err := run(s.toolCmd, "services") + out, err := run(nil, s.toolCmd, "services") if err != nil { return false } @@ -19,7 +19,7 @@ func (s *Snap) IsExist(serviceName string) bool { } func (s *Snap) IsActive(serviceName string) bool { - out, err := run(s.toolCmd, "services") + out, err := run(nil, s.toolCmd, "services") if err != nil { return false } @@ -33,7 +33,7 @@ func (s *Snap) IsActive(serviceName string) bool { } func (s *Snap) IsEnable(serviceName string) bool { - out, err := run(s.toolCmd, "services") + out, err := run(nil, s.toolCmd, "services") if err != nil { return false } @@ -48,7 +48,7 @@ func (s *Snap) IsEnable(serviceName string) bool { func (s *Snap) Operate(operate, serviceName string) error { if s.IsExist(serviceName) { - return handlerErr(run(s.toolCmd, operate, serviceName)) + return handlerErr(run(nil, s.toolCmd, operate, serviceName)) } return nil } diff --git a/core/utils/controller/manager/systemd.go b/core/utils/controller/manager/systemd.go index 8d6a2ecf7..d8d8fe308 100644 --- a/core/utils/controller/manager/systemd.go +++ b/core/utils/controller/manager/systemd.go @@ -2,9 +2,14 @@ package manager import ( "strings" + + "github.com/1Panel-dev/1Panel/core/utils/ssh" ) -type Systemd struct{ toolCmd string } +type Systemd struct { + toolCmd string + Client *ssh.SSHClient +} func NewSystemd() *Systemd { return &Systemd{toolCmd: "systemctl"} @@ -14,7 +19,7 @@ func (s *Systemd) Name() string { return "systemd" } func (s *Systemd) IsActive(serviceName string) (bool, error) { - out, err := run(s.toolCmd, "is-active", serviceName) + out, err := run(s.Client, s.toolCmd, "is-active", serviceName) if err != nil && out != "inactive\n" { if NewSnap().IsActive(serviceName) { return true, nil @@ -25,7 +30,7 @@ func (s *Systemd) IsActive(serviceName string) (bool, error) { } func (s *Systemd) IsEnable(serviceName string) (bool, error) { - out, err := run(s.toolCmd, "is-enabled", serviceName) + out, err := run(s.Client, s.toolCmd, "is-enabled", serviceName) if err != nil && out != "disabled\n" { if serviceName == "sshd" && out == "alias\n" { return s.IsEnable("ssh") @@ -39,7 +44,7 @@ func (s *Systemd) IsEnable(serviceName string) (bool, error) { } func (s *Systemd) IsExist(serviceName string) (bool, error) { - out, err := run(s.toolCmd, "is-enabled", serviceName) + out, err := run(s.Client, s.toolCmd, "is-enabled", serviceName) if err != nil && out != "enabled\n" { if strings.Contains(out, "disabled") { return true, err @@ -53,10 +58,10 @@ func (s *Systemd) IsExist(serviceName string) (bool, error) { } func (s *Systemd) Status(serviceName string) (string, error) { - return run(s.toolCmd, "status", serviceName) + return run(s.Client, s.toolCmd, "status", serviceName) } func (s *Systemd) Operate(operate, serviceName string) error { - out, err := run(s.toolCmd, operate, serviceName) + out, err := run(s.Client, s.toolCmd, operate, serviceName) if err != nil { if serviceName == "sshd" && strings.Contains(out, "alias name or linked unit file") { return s.Operate(operate, "ssh") @@ -64,12 +69,12 @@ func (s *Systemd) Operate(operate, serviceName string) error { if err := NewSnap().Operate(operate, serviceName); err == nil { return nil } - return handlerErr(run(s.toolCmd, operate, serviceName)) + return handlerErr(run(s.Client, s.toolCmd, operate, serviceName)) } return nil } func (s *Systemd) Reload() error { - out, err := run(s.toolCmd, "daemon-reload") + out, err := run(s.Client, s.toolCmd, "daemon-reload") return handlerErr(out, err) } diff --git a/core/utils/controller/manager/sysvinit.go b/core/utils/controller/manager/sysvinit.go index 2840911d3..74274a5ef 100644 --- a/core/utils/controller/manager/sysvinit.go +++ b/core/utils/controller/manager/sysvinit.go @@ -6,9 +6,13 @@ import ( "path/filepath" "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/ssh" ) -type Sysvinit struct{ toolCmd string } +type Sysvinit struct { + toolCmd string + Client *ssh.SSHClient +} func NewSysvinit() *Sysvinit { return &Sysvinit{toolCmd: "service"} @@ -32,8 +36,7 @@ func (s *Sysvinit) IsEnable(serviceName string) (bool, error) { return out == "enabled\n", nil } func (s *Sysvinit) IsExist(serviceName string) (bool, error) { - _, err := os.Stat(filepath.Join("/etc/init.d", serviceName)) - if err != nil { + if _, err := os.Stat(filepath.Join("/etc/init.d", serviceName)); err != nil { if os.IsNotExist(err) { return false, nil } @@ -42,11 +45,11 @@ func (s *Sysvinit) IsExist(serviceName string) (bool, error) { return true, nil } func (s *Sysvinit) Status(serviceName string) (string, error) { - return run(s.toolCmd, serviceName, "status") + return run(s.Client, s.toolCmd, serviceName, "status") } func (s *Sysvinit) Operate(operate, serviceName string) error { - return handlerErr(run(s.toolCmd, serviceName, operate)) + return handlerErr(run(s.Client, s.toolCmd, serviceName, operate)) } func (s *Sysvinit) Reload() error {