Skip to content

Commit 692c77e

Browse files
authored
fix: Service status acquisition compatible with snap (#9169)
1 parent 0778e3e commit 692c77e

File tree

1 file changed

+64
-12
lines changed

1 file changed

+64
-12
lines changed

agent/utils/systemctl/systemctl.go

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package systemctl
22

33
import (
4+
"bytes"
45
"fmt"
56
"github.com/pkg/errors"
67
"os/exec"
@@ -16,31 +17,65 @@ func RunSystemCtl(args ...string) (string, error) {
1617
return string(output), nil
1718
}
1819

20+
func isSnapService(serviceName string) bool {
21+
cmd := exec.Command("snap", "services")
22+
var out bytes.Buffer
23+
cmd.Stdout = &out
24+
if err := cmd.Run(); err != nil {
25+
return false
26+
}
27+
return strings.Contains(out.String(), serviceName)
28+
}
29+
30+
func isSnapServiceActive(serviceName string) bool {
31+
cmd := exec.Command("snap", "services")
32+
var out bytes.Buffer
33+
cmd.Stdout = &out
34+
if err := cmd.Run(); err != nil {
35+
return false
36+
}
37+
lines := strings.Split(out.String(), "\n")
38+
for _, line := range lines {
39+
if strings.Contains(line, serviceName) && strings.Contains(line, "active") {
40+
return true
41+
}
42+
}
43+
return false
44+
}
45+
1946
func IsActive(serviceName string) (bool, error) {
2047
out, err := RunSystemCtl("is-active", serviceName)
21-
if err != nil {
22-
return false, err
48+
if err == nil {
49+
return strings.TrimSpace(out) == "active", nil
50+
}
51+
52+
if isSnapServiceActive(serviceName) {
53+
return true, nil
2354
}
24-
return out == "active\n", nil
55+
return false, fmt.Errorf("service %s is not active: %v", serviceName, err)
2556
}
2657

2758
func IsEnable(serviceName string) (bool, error) {
2859
out, err := RunSystemCtl("is-enabled", serviceName)
29-
if err != nil {
30-
return false, err
60+
if err == nil {
61+
return strings.TrimSpace(out) == "enabled", nil
62+
}
63+
64+
if isSnapServiceActive(serviceName) {
65+
return true, nil
3166
}
32-
return out == "enabled\n", nil
67+
return false, fmt.Errorf("failed to determine if service %s is enabled: %v", serviceName, err)
3368
}
3469

3570
func IsExist(serviceName string) (bool, error) {
3671
out, err := RunSystemCtl("is-enabled", serviceName)
37-
if err != nil {
38-
if strings.Contains(out, "disabled") {
39-
return true, nil
40-
}
41-
return false, nil
72+
if err == nil || strings.Contains(out, "disabled") {
73+
return true, nil
74+
}
75+
if isSnapService(serviceName) {
76+
return true, nil
4277
}
43-
return true, nil
78+
return false, nil
4479
}
4580

4681
func handlerErr(out string, err error) error {
@@ -55,10 +90,27 @@ func handlerErr(out string, err error) error {
5590

5691
func Restart(serviceName string) error {
5792
out, err := RunSystemCtl("restart", serviceName)
93+
if err == nil {
94+
return nil
95+
}
96+
if isSnapService(serviceName) {
97+
cmd := exec.Command("snap", "restart", serviceName)
98+
output, snapErr := cmd.CombinedOutput()
99+
return handlerErr(string(output), snapErr)
100+
}
58101
return handlerErr(out, err)
59102
}
60103

61104
func Operate(operate, serviceName string) error {
62105
out, err := RunSystemCtl(operate, serviceName)
106+
if err == nil {
107+
return nil
108+
}
109+
110+
if isSnapService(serviceName) && (operate == "start" || operate == "stop" || operate == "restart") {
111+
cmd := exec.Command("snap", operate, serviceName)
112+
output, snapErr := cmd.CombinedOutput()
113+
return handlerErr(string(output), snapErr)
114+
}
63115
return handlerErr(out, err)
64116
}

0 commit comments

Comments
 (0)