diff options
Diffstat (limited to 'service')
-rw-r--r-- | service/errors.go | 6 | ||||
-rw-r--r-- | service/ipc_client.go | 5 | ||||
-rw-r--r-- | service/ipc_server.go | 6 | ||||
-rw-r--r-- | service/service_manager.go | 51 | ||||
-rw-r--r-- | service/service_tunnel.go | 47 |
5 files changed, 38 insertions, 77 deletions
diff --git a/service/errors.go b/service/errors.go index fd6bc6ab..02ca33dc 100644 --- a/service/errors.go +++ b/service/errors.go @@ -15,7 +15,7 @@ type Error uint32 const ( ErrorSuccess Error = iota - ErrorEventlogOpen + ErrorRingloggerOpen ErrorLoadConfiguration ErrorCreateWintun ErrorDetermineWintunName @@ -36,8 +36,8 @@ func (e Error) Error() string { switch e { case ErrorSuccess: return "No error." - case ErrorEventlogOpen: - return "Unable to open Windows event log." + case ErrorRingloggerOpen: + return "Unable to open log file." case ErrorDetermineExecutablePath: return "Unable to determine path of running executable." case ErrorLoadConfiguration: diff --git a/service/ipc_client.go b/service/ipc_client.go index e6295b91..7e260ea7 100644 --- a/service/ipc_client.go +++ b/service/ipc_client.go @@ -141,6 +141,11 @@ func IPCClientQuit(stopTunnelsOnQuit bool) (bool, error) { return alreadyQuit, rpcClient.Call("ManagerService.Quit", stopTunnelsOnQuit, &alreadyQuit) } +func IPCClientLogFilePath() (string, error) { + var path string + return path, rpcClient.Call("ManagerService.LogFilePath", uintptr(0), &path) +} + func IPCClientRegisterTunnelChange(cb func(tunnel *Tunnel, state TunnelState, err error)) *TunnelChangeCallback { s := &TunnelChangeCallback{cb} tunnelChangeCallbacks[s] = true diff --git a/service/ipc_server.go b/service/ipc_server.go index 17ea67c2..079dc85c 100644 --- a/service/ipc_server.go +++ b/service/ipc_server.go @@ -11,6 +11,7 @@ import ( "github.com/Microsoft/go-winio" "golang.org/x/sys/windows/svc" "golang.zx2c4.com/wireguard/windows/conf" + "golang.zx2c4.com/wireguard/windows/ringlogger" "io/ioutil" "net/rpc" "os" @@ -206,6 +207,11 @@ func (s *ManagerService) Quit(stopTunnelsOnQuit bool, alreadyQuit *bool) error { return nil } +func (s *ManagerService) LogFilePath(unused uintptr, filepath *string) error { + *filepath = ringlogger.Global.Filename() + return nil +} + func IPCServerListen(reader *os.File, writer *os.File, events *os.File) error { service := &ManagerService{events: events} diff --git a/service/service_manager.go b/service/service_manager.go index 5f9758ec..9fffbfe3 100644 --- a/service/service_manager.go +++ b/service/service_manager.go @@ -6,15 +6,13 @@ package service import ( - "fmt" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/eventlog" "golang.zx2c4.com/wireguard/windows/conf" + "golang.zx2c4.com/wireguard/windows/ringlogger" "log" "os" "runtime/debug" - "strconv" "sync" "syscall" "unsafe" @@ -59,21 +57,9 @@ type wellKnownSidType uint32 type managerService struct{} -type elogger struct { - *eventlog.Log -} - -func (elog elogger) Write(p []byte) (n int, err error) { - msg := string(p) - n = len(msg) - err = elog.Warning(1, msg) - return -} - func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (svcSpecificEC bool, exitCode uint32) { changes <- svc.Status{State: svc.StartPending} - var elog *eventlog.Log var err error serviceError := ErrorSuccess @@ -81,26 +67,19 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest svcSpecificEC, exitCode = determineErrorCode(err, serviceError) logErr := combineErrors(err, serviceError) if logErr != nil { - if elog != nil { - elog.Error(1, logErr.Error()) - } else { - fmt.Println(logErr.Error()) - } + log.Print(logErr) } changes <- svc.Status{State: svc.StopPending} }() - //TODO: remember to clean this up in the msi uninstaller - eventlog.InstallAsEventCreate("WireGuard", eventlog.Info|eventlog.Warning|eventlog.Error) - elog, err = eventlog.Open("WireGuard") + err = ringlogger.InitGlobalLogger("MGR") if err != nil { - serviceError = ErrorEventlogOpen + serviceError = ErrorRingloggerOpen return } - log.SetOutput(elogger{elog}) defer func() { if x := recover(); x != nil { - elog.Error(1, fmt.Sprintf("%v:\n%s", x, string(debug.Stack()))) + log.Printf("%v:\n%s", x, string(debug.Stack())) panic(x) } }() @@ -148,7 +127,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest //TODO: Isn't it better to use an impersonation token and userToken.IsMember instead? gs, err := userToken.GetTokenGroups() if err != nil { - elog.Error(1, "Unable to lookup user groups from token: "+err.Error()) + log.Printf("Unable to lookup user groups from token: %v", err) return } p := unsafe.Pointer(&gs.Groups[0]) @@ -167,12 +146,12 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest user, err := userToken.GetTokenUser() if err != nil { - elog.Error(1, "Unable to lookup user from token: "+err.Error()) + log.Printf("Unable to lookup user from token: %v", err) return } username, domain, accType, err := user.User.Sid.LookupAccount("") if err != nil { - elog.Error(1, "Unable to lookup username from sid: "+err.Error()) + log.Printf("Unable to lookup username from sid: %v", err) return } if accType != windows.SidTypeUser { @@ -181,17 +160,17 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest ourReader, theirReader, theirReaderStr, ourWriter, theirWriter, theirWriterStr, err := inheritableSocketpairEmulation() if err != nil { - elog.Error(1, "Unable to create two inheritable pipes: "+err.Error()) + log.Printf("Unable to create two inheritable pipes: %v", err) return } ourEvents, theirEvents, theirEventStr, err := inheritableEvents() err = IPCServerListen(ourReader, ourWriter, ourEvents) if err != nil { - elog.Error(1, "Unable to listen on IPC pipes: "+err.Error()) + log.Printf("Unable to listen on IPC pipes: %v", err) return } - elog.Info(1, "Starting UI process for user: "+username+", domain: "+domain) + log.Printf("Starting UI process for user: '%s@%s'", username, domain) attr := &os.ProcAttr{ Sys: &syscall.SysProcAttr{ Token: syscall.Token(userToken), @@ -203,7 +182,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest theirWriter.Close() theirEvents.Close() if err != nil { - elog.Error(1, "Unable to start manager UI process: "+err.Error()) + log.Printf("Unable to start manager UI process: %v", err) return } @@ -260,7 +239,7 @@ loop: } sessionNotification := (*wtsSessionNotification)(unsafe.Pointer(c.EventData)) if uintptr(sessionNotification.size) != unsafe.Sizeof(*sessionNotification) { - elog.Error(1, "Unexpected size of WTSSESSION_NOTIFICATION: "+strconv.Itoa(int(sessionNotification.size))) + log.Printf("Unexpected size of WTSSESSION_NOTIFICATION: %d", sessionNotification.size) continue } if c.EventType == wtsSessionLogoff { @@ -278,7 +257,7 @@ loop: } default: - elog.Info(1, fmt.Sprintf("Unexpected service control request #%d\n", c)) + log.Printf("Unexpected service control request #%d", c) } } } @@ -292,7 +271,7 @@ loop: if uninstall { err = UninstallManager() if err != nil { - elog.Error(1, "Unable to uninstaller manager when quitting: "+err.Error()) + log.Printf("Unable to uninstaller manager when quitting: %v", err) } } return diff --git a/service/service_tunnel.go b/service/service_tunnel.go index 2e615932..f8c843f6 100644 --- a/service/service_tunnel.go +++ b/service/service_tunnel.go @@ -9,36 +9,18 @@ import ( "bufio" "fmt" "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/eventlog" "golang.zx2c4.com/winipcfg" "golang.zx2c4.com/wireguard/device" "golang.zx2c4.com/wireguard/ipc" "golang.zx2c4.com/wireguard/tun" "golang.zx2c4.com/wireguard/windows/conf" + "golang.zx2c4.com/wireguard/windows/ringlogger" "log" "net" "runtime/debug" "strings" ) -type confElogger struct { - elog *eventlog.Log - conf *conf.Config - level int -} - -func (elog confElogger) Write(p []byte) (n int, err error) { - msg := elog.conf.Name + ": " + string(p) - n = len(msg) - switch elog.level { - case 1, 2: - err = elog.elog.Info(1, msg) - case 3: - err = elog.elog.Error(1, msg) - } - return -} - type tunnelService struct { path string } @@ -49,7 +31,6 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, var dev *device.Device var uapi net.Listener var routeChangeCallback *winipcfg.RouteChangeCallback - var elog *eventlog.Log var logger *device.Logger var err error serviceError := ErrorSuccess @@ -59,11 +40,9 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, logErr := combineErrors(err, serviceError) if logErr != nil { if logger != nil { - logger.Error.Println(logErr.Error()) - } else if elog != nil { - elog.Error(1, logErr.Error()) + logger.Error.Print(logErr) } else { - fmt.Println(logErr.Error()) + log.Print(logErr) } } changes <- svc.Status{State: svc.StopPending} @@ -76,22 +55,17 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, if dev != nil { dev.Close() } - if elog != nil { - elog.Info(1, "Shutting down") - } + log.Print("Shutting down") }() - //TODO: remember to clean this up in the msi uninstaller - eventlog.InstallAsEventCreate("WireGuard", eventlog.Info|eventlog.Warning|eventlog.Error) - elog, err = eventlog.Open("WireGuard") + err = ringlogger.InitGlobalLogger("TUN") if err != nil { - serviceError = ErrorEventlogOpen + serviceError = ErrorRingloggerOpen return } - log.SetOutput(elogger{elog}) defer func() { if x := recover(); x != nil { - elog.Error(1, fmt.Sprintf("%v:\n%s", x, string(debug.Stack()))) + log.Printf("%v:\n%s", x, string(debug.Stack())) panic(x) } }() @@ -102,11 +76,8 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, return } - logger = &device.Logger{ - Debug: log.New(&confElogger{elog: elog, conf: conf, level: 1}, "", 0), - Info: log.New(&confElogger{elog: elog, conf: conf, level: 2}, "", 0), - Error: log.New(&confElogger{elog: elog, conf: conf, level: 3}, "", 0), - } + stdLog := log.New(ringlogger.Global, fmt.Sprintf("[%s] ", conf.Name), 0) + logger = &device.Logger{stdLog, stdLog, stdLog} logger.Info.Println("Starting wireguard-go version", device.WireGuardGoVersion) logger.Debug.Println("Debug log enabled") |