mirror of https://github.com/status-im/consul.git
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package checks
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
|
|
"golang.org/x/sys/windows"
|
|
"golang.org/x/sys/windows/svc"
|
|
"golang.org/x/sys/windows/svc/mgr"
|
|
)
|
|
|
|
type OSServiceClient struct {
|
|
scHandle windows.Handle
|
|
}
|
|
|
|
func NewOSServiceClient() (*OSServiceClient, error) {
|
|
var s *uint16
|
|
scHandle, err := windows.OpenSCManager(s, nil, windows.SC_MANAGER_CONNECT)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error connecting to service manager: %w", err)
|
|
}
|
|
|
|
return &OSServiceClient{
|
|
scHandle: scHandle,
|
|
}, nil
|
|
}
|
|
|
|
func (client *OSServiceClient) Check(serviceName string) error {
|
|
m := &mgr.Mgr{Handle: client.scHandle}
|
|
defer m.Disconnect()
|
|
svcHandle, err := windows.OpenService(m.Handle, syscall.StringToUTF16Ptr(serviceName), windows.SC_MANAGER_ENUMERATE_SERVICE)
|
|
if err != nil {
|
|
return fmt.Errorf("error accessing service: %w", err)
|
|
}
|
|
service := &mgr.Service{Name: serviceName, Handle: svcHandle}
|
|
defer service.Close()
|
|
status, err := service.Query()
|
|
if err != nil {
|
|
return fmt.Errorf("error querying service status: %w", err)
|
|
}
|
|
|
|
switch status.State {
|
|
case svc.Running:
|
|
return nil
|
|
case svc.Stopped:
|
|
return ErrOSServiceStatusCritical
|
|
default:
|
|
return fmt.Errorf("service status: %v", status.State)
|
|
}
|
|
}
|