1
1
package systemctl
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
6
"github.com/pkg/errors"
6
7
"os/exec"
@@ -16,31 +17,65 @@ func RunSystemCtl(args ...string) (string, error) {
16
17
return string (output ), nil
17
18
}
18
19
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
+
19
46
func IsActive (serviceName string ) (bool , error ) {
20
47
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
23
54
}
24
- return out == " active\n " , nil
55
+ return false , fmt . Errorf ( "service %s is not active: %v " , serviceName , err )
25
56
}
26
57
27
58
func IsEnable (serviceName string ) (bool , error ) {
28
59
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
31
66
}
32
- return out == " enabled\n " , nil
67
+ return false , fmt . Errorf ( "failed to determine if service %s is enabled: %v " , serviceName , err )
33
68
}
34
69
35
70
func IsExist (serviceName string ) (bool , error ) {
36
71
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
42
77
}
43
- return true , nil
78
+ return false , nil
44
79
}
45
80
46
81
func handlerErr (out string , err error ) error {
@@ -55,10 +90,27 @@ func handlerErr(out string, err error) error {
55
90
56
91
func Restart (serviceName string ) error {
57
92
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
+ }
58
101
return handlerErr (out , err )
59
102
}
60
103
61
104
func Operate (operate , serviceName string ) error {
62
105
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
+ }
63
115
return handlerErr (out , err )
64
116
}
0 commit comments