github.com/crowdsecurity/crowdsec@v1.6.1/cmd/crowdsec/win_service_install.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 "os" 12 "path/filepath" 13 14 "golang.org/x/sys/windows/svc/mgr" 15 ) 16 17 func exePath() (string, error) { 18 var err error 19 prog := os.Args[0] 20 p, err := filepath.Abs(prog) 21 if err != nil { 22 return "", err 23 } 24 fi, err := os.Stat(p) 25 if err == nil { 26 if !fi.Mode().IsDir() { 27 return p, nil 28 } 29 err = fmt.Errorf("%s is directory", p) 30 } 31 if filepath.Ext(p) == "" { 32 var fi os.FileInfo 33 34 p += ".exe" 35 fi, err = os.Stat(p) 36 if err == nil { 37 if !fi.Mode().IsDir() { 38 return p, nil 39 } 40 err = fmt.Errorf("%s is directory", p) 41 } 42 } 43 return "", err 44 } 45 46 func installService(name, desc string) error { 47 exepath, err := exePath() 48 if err != nil { 49 return err 50 } 51 m, err := mgr.Connect() 52 if err != nil { 53 return err 54 } 55 defer m.Disconnect() 56 s, err := m.OpenService(name) 57 if err == nil { 58 s.Close() 59 return fmt.Errorf("service %s already exists", name) 60 } 61 s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: desc}, "is", "auto-started") 62 if err != nil { 63 return err 64 } 65 defer s.Close() 66 /*err = eventlog.InstallAsEventCreate(name, eventlog.Error|eventlog.Warning|eventlog.Info) 67 if err != nil { 68 s.Delete() 69 return fmt.Errorf("SetupEventLogSource() failed: %s", err) 70 }*/ 71 return nil 72 } 73 74 func removeService(name string) error { 75 m, err := mgr.Connect() 76 if err != nil { 77 return err 78 } 79 defer m.Disconnect() 80 s, err := m.OpenService(name) 81 if err != nil { 82 return fmt.Errorf("service %s is not installed", name) 83 } 84 defer s.Close() 85 err = s.Delete() 86 if err != nil { 87 return err 88 } 89 /*err = eventlog.Remove(name) 90 if err != nil { 91 return fmt.Errorf("RemoveEventLogSource() failed: %s", err) 92 }*/ 93 return nil 94 }