github.com/crowdsecurity/crowdsec@v1.6.1/cmd/crowdsec/win_service_manage.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build windows 6 7 package main 8 9 import ( 10 "fmt" 11 "time" 12 13 //"time" 14 15 "golang.org/x/sys/windows/svc" 16 "golang.org/x/sys/windows/svc/mgr" 17 ) 18 19 func startService(name string) error { 20 m, err := mgr.Connect() 21 if err != nil { 22 return err 23 } 24 defer m.Disconnect() 25 s, err := m.OpenService(name) 26 if err != nil { 27 return fmt.Errorf("could not access service: %v", err) 28 } 29 defer s.Close() 30 err = s.Start("is", "manual-started") 31 if err != nil { 32 return fmt.Errorf("could not start service: %v", err) 33 } 34 return nil 35 } 36 37 func controlService(name string, c svc.Cmd, to svc.State) error { 38 m, err := mgr.Connect() 39 if err != nil { 40 return err 41 } 42 defer m.Disconnect() 43 s, err := m.OpenService(name) 44 if err != nil { 45 return fmt.Errorf("could not access service: %v", err) 46 } 47 defer s.Close() 48 status, err := s.Control(c) 49 if err != nil { 50 return fmt.Errorf("could not send control=%d: %v", c, err) 51 } 52 timeout := time.Now().Add(10 * time.Second) 53 for status.State != to { 54 if timeout.Before(time.Now()) { 55 return fmt.Errorf("timeout waiting for service to go to state=%d", to) 56 } 57 time.Sleep(300 * time.Millisecond) 58 status, err = s.Query() 59 if err != nil { 60 return fmt.Errorf("could not retrieve service status: %v", err) 61 } 62 } 63 return nil 64 }