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