From 076bce8727d3f02cc3cbf6cdfb560a758185aaf3 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 20 Mar 2019 02:18:05 -0600 Subject: ringlogger: introduce basic file ring logging Signed-off-by: Jason A. Donenfeld --- service/service_manager.go | 51 ++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 36 deletions(-) (limited to 'service/service_manager.go') 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 -- cgit v1.2.3-59-g8ed1b