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