@@ -15,7 +15,14 @@ import (
1515 "github.com/RewstApp/agent-smith-go/internal/utils"
1616)
1717
18- func runLaunchCtl (args ... string ) ([]byte , error ) {
18+ type launchCtl interface {
19+ Run (args ... string ) ([]byte , error )
20+ PlistFilePath (name string ) string
21+ }
22+
23+ type defaultLaunchCtl struct {}
24+
25+ func (d * defaultLaunchCtl ) Run (args ... string ) ([]byte , error ) {
1926 cmd := exec .Command ("launchctl" , args ... )
2027 out , err := cmd .CombinedOutput ()
2128 if err != nil {
@@ -25,39 +32,45 @@ func runLaunchCtl(args ...string) ([]byte, error) {
2532 return out , nil
2633}
2734
35+ func (d * defaultLaunchCtl ) PlistFilePath (name string ) string {
36+ return filepath .Join ("/Library/LaunchDaemons" , fmt .Sprintf ("%s.plist" , name ))
37+ }
38+
2839type darwinService struct {
29- name string
40+ name string
41+ system launchCtl
3042}
3143
3244func (svc * darwinService ) serviceFilePath () string {
33- return filepath . Join ( "/Library/LaunchDaemons" , fmt . Sprintf ( "%s.plist" , svc .name ) )
45+ return svc . system . PlistFilePath ( svc .name )
3446}
3547
3648func (svc * darwinService ) Close () error {
3749 return nil
3850}
3951
4052func (svc * darwinService ) Start () error {
41- _ , err := runLaunchCtl ("load" , svc .serviceFilePath ())
53+ _ , err := svc . system . Run ("load" , svc .serviceFilePath ())
4254 if err != nil {
4355 return err
4456 }
4557
46- _ , err = runLaunchCtl ("start" , svc .name )
58+ _ , err = svc . system . Run ("start" , svc .name )
4759 return err
4860}
4961
5062func (svc * darwinService ) Stop () error {
51- _ , err := runLaunchCtl ("stop" , svc .name )
63+ _ , err := svc . system . Run ("stop" , svc .name )
5264 if err != nil {
5365 return err
5466 }
55- _ , err = runLaunchCtl ("unload" , svc .serviceFilePath ())
67+
68+ _ , err = svc .system .Run ("unload" , svc .serviceFilePath ())
5669 return err
5770}
5871
5972func (svc * darwinService ) Delete () error {
60- _ , err := runLaunchCtl ("unload" , svc .name )
73+ _ , err := svc . system . Run ("unload" , svc .name )
6174 if err != nil {
6275 return err
6376 }
@@ -67,7 +80,7 @@ func (svc *darwinService) Delete() error {
6780}
6881
6982func (svc * darwinService ) IsActive () bool {
70- out , err := runLaunchCtl ("print" , fmt .Sprintf ("system/%s" , svc .name ))
83+ out , err := svc . system . Run ("print" , fmt .Sprintf ("system/%s" , svc .name ))
7184 if err != nil {
7285 return false
7386 }
@@ -95,61 +108,23 @@ func (svc *darwinService) IsActive() bool {
95108}
96109
97110func Create (params AgentParams ) (Service , error ) {
98- serviceConfig := strings.Builder {}
111+ return createWithLaunchCtl (params , & defaultLaunchCtl {})
112+ }
99113
100- serviceConfig .WriteString ("<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n " )
101- serviceConfig .WriteString ("<!DOCTYPE plist PUBLIC \" -//Apple//DTD PLIST 1.0//EN\" \n " )
102- serviceConfig .WriteString ("\" http://www.apple.com/DTDs/PropertyList-1.0.dtd\" >\n " )
103-
104- serviceConfig .WriteString ("<plist version=\" 1.0\" >\n " )
105- serviceConfig .WriteString ("<dict>\n " )
106-
107- serviceConfig .WriteString ("<key>Label</key>\n " )
108- serviceConfig .WriteString ("<string>" )
109- serviceConfig .WriteString (params .Name )
110- serviceConfig .WriteString ("</string>\n " )
111-
112- serviceConfig .WriteString ("<key>ProgramArguments</key>\n " )
113- serviceConfig .WriteString ("<array>\n " )
114- serviceConfig .WriteString ("<string>" )
115- serviceConfig .WriteString (params .AgentExecutablePath )
116- serviceConfig .WriteString ("</string>\n " )
117- serviceConfig .WriteString ("<string>--org-id</string>\n " )
118- serviceConfig .WriteString ("<string>" )
119- serviceConfig .WriteString (params .OrgId )
120- serviceConfig .WriteString ("</string>\n " )
121- serviceConfig .WriteString ("<string>--config-file</string>\n " )
122- serviceConfig .WriteString ("<string>" )
123- serviceConfig .WriteString (params .ConfigFilePath )
124- serviceConfig .WriteString ("</string>\n " )
125- serviceConfig .WriteString ("<string>--log-file</string>\n " )
126- serviceConfig .WriteString ("<string>" )
127- serviceConfig .WriteString (params .LogFilePath )
128- serviceConfig .WriteString ("</string>\n " )
129- serviceConfig .WriteString ("</array>\n " )
130-
131- serviceConfig .WriteString ("<key>RunAtLoad</key>\n " )
132- serviceConfig .WriteString ("<false/>\n " )
133-
134- serviceConfig .WriteString ("<key>KeepAlive</key>\n " )
135- serviceConfig .WriteString ("<dict>\n " )
136- serviceConfig .WriteString ("<key>SuccessfulExit</key>\n " )
137- serviceConfig .WriteString ("<false/>\n " )
138- serviceConfig .WriteString ("</dict>\n " )
139-
140- serviceConfig .WriteString ("<key>EnvironmentVariables</key>\n " )
141- serviceConfig .WriteString ("<dict>\n " )
142- serviceConfig .WriteString ("<key>PATH</key>\n " )
143- serviceConfig .WriteString ("<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>\n " )
144- serviceConfig .WriteString ("</dict>\n " )
145-
146- serviceConfig .WriteString ("</dict>\n " )
147- serviceConfig .WriteString ("</plist>\n " )
148-
149- svc := & darwinService {
150- name : params .Name ,
151- }
114+ func createWithLaunchCtl (params AgentParams , system launchCtl ) (Service , error ) {
115+ serviceConfig := strings.Builder {}
152116
117+ fmt .Fprintf (& serviceConfig , "<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n <!DOCTYPE plist PUBLIC \" -//Apple//DTD PLIST 1.0//EN\" \n \" http://www.apple.com/DTDs/PropertyList-1.0.dtd\" >\n " )
118+ fmt .Fprintf (& serviceConfig , "<plist version=\" 1.0\" >\n <dict>\n " )
119+ fmt .Fprintf (& serviceConfig , "<key>Label</key>\n <string>%s</string>\n " , params .Name )
120+ fmt .Fprintf (& serviceConfig , "<key>ProgramArguments</key>\n <array>\n <string>%s</string>\n <string>--org-id</string>\n <string>%s</string>\n <string>--config-file</string>\n <string>%s</string>\n <string>--log-file</string>\n <string>%s</string>\n </array>\n " ,
121+ params .AgentExecutablePath , params .OrgId , params .ConfigFilePath , params .LogFilePath )
122+ fmt .Fprintf (& serviceConfig , "<key>RunAtLoad</key>\n <false/>\n " )
123+ fmt .Fprintf (& serviceConfig , "<key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n " )
124+ fmt .Fprintf (& serviceConfig , "<key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>\n </dict>\n " )
125+ fmt .Fprintf (& serviceConfig , "</dict>\n </plist>\n " )
126+
127+ svc := & darwinService {name : params .Name , system : system }
153128 err := os .WriteFile (svc .serviceFilePath (), []byte (serviceConfig .String ()), utils .DefaultFileMod )
154129 if err != nil {
155130 return nil , err
@@ -159,13 +134,18 @@ func Create(params AgentParams) (Service, error) {
159134}
160135
161136func Open (name string ) (Service , error ) {
162- _ , err := runLaunchCtl ("print" , fmt .Sprintf ("system/%s" , name ))
137+ return openWithLaunchCtl (name , & defaultLaunchCtl {})
138+ }
139+
140+ func openWithLaunchCtl (name string , system launchCtl ) (Service , error ) {
141+ _ , err := system .Run ("print" , fmt .Sprintf ("system/%s" , name ))
163142 if err != nil {
164143 return nil , err
165144 }
166145
167146 return & darwinService {
168- name : name ,
147+ name : name ,
148+ system : system ,
169149 }, nil
170150}
171151
0 commit comments