// Query returns current status of service s. func (s *Service) Query() (svc.Status, error) { var t windows.SERVICE_STATUS err := windows.QueryServiceStatus(s.Handle, &t) if err != nil { return svc.Status{}, err } return svc.Status{ State: svc.State(t.CurrentState), Accepts: svc.Accepted(t.ControlsAccepted), }, nil }
// Control sends state change request c to the servce s. func (s *Service) Control(c svc.Cmd) (svc.Status, error) { var t windows.SERVICE_STATUS err := windows.ControlService(s.Handle, uint32(c), &t) if err != nil { return svc.Status{}, err } return svc.Status{ State: svc.State(t.CurrentState), Accepts: svc.Accepted(t.ControlsAccepted), }, nil }
func (h *handler) Execute(_ []string, r <-chan svc.ChangeRequest, s chan<- svc.Status) (bool, uint32) { s <- svc.Status{State: svc.StartPending, Accepts: 0} // Unblock initService() h.fromsvc <- nil // Wait for initialization to complete. failed := <-h.tosvc if failed { logrus.Debug("Aborting service start due to failure during initialization") return true, 1 } s <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown | svc.Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE)} logrus.Debug("Service running") Loop: for { select { case failed = <-h.tosvc: break Loop case c := <-r: switch c.Cmd { case svc.Cmd(windows.SERVICE_CONTROL_PARAMCHANGE): h.daemonCli.reloadConfig() case svc.Interrogate: s <- c.CurrentStatus case svc.Stop, svc.Shutdown: s <- svc.Status{State: svc.StopPending, Accepts: 0} h.daemonCli.stop() } } } removePanicFile() if failed { return true, 1 } return false, 0 }