Files
coredns/coremain/service_windows.go
John-Michael Mulesa 1c15569168 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>
2026-03-26 21:10:53 +02:00

64 lines
1.4 KiB
Go

//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()
}