in main_windows.go [32:107]
func (m *windowsService) Execute(_ []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) {
// start the service
changes <- svc.Status{State: svc.StartPending}
// set up the log file
exePath, err := os.Executable()
if err != nil {
changes <- svc.Status{State: svc.StopPending}
return true, 101 // service specific exit code=101
}
logFolder := filepath.Join(filepath.Dir(exePath), "logs")
os.Mkdir(logFolder, 0644) // ignore all errors
logFile := &lumberjack.Logger{
Filename: filepath.Join(logFolder, "cloud-sql-proxy.log"),
MaxSize: 50, // megabytes
MaxBackups: 10,
MaxAge: 30, //days
}
logger := log.NewStdLogger(logFile, logFile)
logger.Infof("Starting...")
// start the main command
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
app := cmd.NewCommand(cmd.WithLogger(logger))
cmdErrCh := make(chan error, 1)
go func() {
cmdErrCh <- app.ExecuteContext(ctx)
}()
// now running
changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown}
var cmdErr error
loop:
for {
select {
case err := <-cmdErrCh:
cmdErr = err
break loop
case c := <-r:
switch c.Cmd {
case svc.Interrogate:
changes <- c.CurrentStatus
// testing deadlock from https://code.google.com/archive/p/winsvc/issues/4
time.Sleep(100 * time.Millisecond)
changes <- c.CurrentStatus
case svc.Stop, svc.Shutdown:
cancel()
default:
logger.Errorf("unexpected control request #%d", c)
}
}
}
// start shutting down
logger.Infof("Stopping...")
changes <- svc.Status{State: svc.StopPending}
if cmdErr != nil && errors.Is(cmdErr, context.Canceled) {
logger.Errorf("Unexpected error: %v", cmdErr)
return true, 2
}
return false, 0
}