Skip to content
Snippets Groups Projects
windows_service.go 1.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • // Copyright 2012 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    
    package helper
    
    import (
    	"fmt"
    
    
    	"golang.org/x/sys/windows/svc"
    	"golang.org/x/sys/windows/svc/debug"
    	"golang.org/x/sys/windows/svc/eventlog"
    )
    
    var elog debug.Log
    
    type myservice struct{}
    
    func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
    	const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue
    	changes <- svc.Status{State: svc.StartPending}
    	changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
    
    
    	// defined in helper.go
    
    	// TODO should have a better way to stop it --
    
    	go serveHTTP(httpServerConf.BindAddr)
    
    loop:
    	for {
    		select {
    		case c := <-r:
    			switch c.Cmd {
    			case svc.Interrogate:
    				changes <- c.CurrentStatus
    			case svc.Stop, svc.Shutdown:
    				elog.Info(1, "shutting down service")
    				break loop
    			default:
    				elog.Error(1, fmt.Sprintf("unexpected control request #%d", c))
    			}
    		}
    	}
    	changes <- svc.Status{State: svc.StopPending}
    	return
    }
    
    func runService(name string, isDebug bool) {
    
    
    	log.Println("Running service...")
    
    
    	var err error
    	if isDebug {
    		elog = debug.New(name)
    	} else {
    		elog, err = eventlog.Open(name)
    		if err != nil {
    			return
    		}
    	}
    	defer elog.Close()
    
    	elog.Info(1, fmt.Sprintf("starting %s service", name))
    	run := svc.Run
    	if isDebug {
    		run = debug.Run
    	}
    	err = run(name, &myservice{})
    	if err != nil {
    		elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err))
    		return
    	}
    	elog.Info(1, fmt.Sprintf("%s service stopped", name))
    }