mirror of
https://github.com/coredns/coredns.git
synced 2026-04-09 21:45:32 -04:00
feat: add support for running CoreDNS as a Windows service (#7962)
* feat: add support for running CoreDNS as a Windows service Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * Use non-deprecated service check function. Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * refactor: remove deprecated build tags and clean up imports in service files Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * ci: add Windows test workflow and fix log field access in service_windows.go Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * test: implement cross-platform file permission restriction for Windows compatibility in run_test.go Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * refactor: remove Windows-specific icacls test logic and restrict unreadable file test to non-Windows platforms Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> * docs: add documentation for -windows-service flag in man page Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com> --------- Signed-off-by: John-Michael Mulesa <jmulesa@gmail.com>
This commit is contained in:
committed by
GitHub
parent
12131b7455
commit
1c15569168
63
coremain/service_windows.go
Normal file
63
coremain/service_windows.go
Normal file
@@ -0,0 +1,63 @@
|
||||
//go:build windows
|
||||
|
||||
package coremain
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"log"
|
||||
|
||||
"github.com/coredns/caddy"
|
||||
|
||||
"golang.org/x/sys/windows/svc"
|
||||
)
|
||||
|
||||
var windowsService bool
|
||||
|
||||
func init() {
|
||||
flag.BoolVar(&windowsService, "windows-service", false, "Run as a Windows service")
|
||||
}
|
||||
|
||||
type corednsService struct {
|
||||
instance *caddy.Instance
|
||||
}
|
||||
|
||||
func (s *corednsService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (svcSpecificEC bool, exitCode uint32) {
|
||||
changes <- svc.Status{State: svc.StartPending}
|
||||
changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown}
|
||||
|
||||
for req := range r {
|
||||
switch req.Cmd {
|
||||
case svc.Interrogate:
|
||||
changes <- req.CurrentStatus
|
||||
case svc.Stop, svc.Shutdown:
|
||||
changes <- svc.Status{State: svc.StopPending}
|
||||
if s.instance != nil {
|
||||
s.instance.Stop()
|
||||
}
|
||||
return false, 0
|
||||
default:
|
||||
log.Printf("unexpected control request #%d", req.Cmd)
|
||||
}
|
||||
}
|
||||
|
||||
return false, 0
|
||||
}
|
||||
|
||||
func runService(instance *caddy.Instance) {
|
||||
if windowsService {
|
||||
isService, err := svc.IsWindowsService()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to determine if running as service: %v", err)
|
||||
}
|
||||
if isService {
|
||||
err = svc.Run("CoreDNS", &corednsService{instance: instance})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to start service: %v", err)
|
||||
}
|
||||
return
|
||||
} else {
|
||||
log.Printf("Windows service flag provided, but not running as a Windows service.")
|
||||
}
|
||||
}
|
||||
instance.Wait()
|
||||
}
|
||||
Reference in New Issue
Block a user