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  }