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// Example service program that beeps.
9//
10// The program demonstrates how to create Windows service and
11// install / remove it on a computer. It also shows how to
12// stop / start / pause / continue any service, and how to
13// write to event log. It also shows how to use debug
14// facilities available in debug package.
15//
16package main
17
18import (
19	"fmt"
20	"log"
21	"os"
22	"strings"
23
24	"golang.org/x/sys/windows/svc"
25)
26
27func usage(errmsg string) {
28	fmt.Fprintf(os.Stderr,
29		"%s\n\n"+
30			"usage: %s <command>\n"+
31			"       where <command> is one of\n"+
32			"       install, remove, debug, start, stop, pause or continue.\n",
33		errmsg, os.Args[0])
34	os.Exit(2)
35}
36
37func main() {
38	const svcName = "myservice"
39
40	inService, err := svc.IsWindowsService()
41	if err != nil {
42		log.Fatalf("failed to determine if we are running in service: %v", err)
43	}
44	if inService {
45		runService(svcName, false)
46		return
47	}
48
49	if len(os.Args) < 2 {
50		usage("no command specified")
51	}
52
53	cmd := strings.ToLower(os.Args[1])
54	switch cmd {
55	case "debug":
56		runService(svcName, true)
57		return
58	case "install":
59		err = installService(svcName, "my service")
60	case "remove":
61		err = removeService(svcName)
62	case "start":
63		err = startService(svcName)
64	case "stop":
65		err = controlService(svcName, svc.Stop, svc.Stopped)
66	case "pause":
67		err = controlService(svcName, svc.Pause, svc.Paused)
68	case "continue":
69		err = controlService(svcName, svc.Continue, svc.Running)
70	default:
71		usage(fmt.Sprintf("invalid command %s", cmd))
72	}
73	if err != nil {
74		log.Fatalf("failed to %s %s: %v", cmd, svcName, err)
75	}
76	return
77}
78