aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service/service_manager.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-03-20 02:18:05 -0600
committerJason A. Donenfeld <Jason@zx2c4.com>2019-03-21 03:24:11 -0600
commit076bce8727d3f02cc3cbf6cdfb560a758185aaf3 (patch)
tree036751633485acaa313a5b4c758d06f276202e7f /service/service_manager.go
parentconf: expose configuration root directory (diff)
downloadwireguard-windows-076bce8727d3f02cc3cbf6cdfb560a758185aaf3.tar.xz
wireguard-windows-076bce8727d3f02cc3cbf6cdfb560a758185aaf3.zip
ringlogger: introduce basic file ring logging
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'service/service_manager.go')
-rw-r--r--service/service_manager.go51
1 files changed, 15 insertions, 36 deletions
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