aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service
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
commit4e58a239c084d673b1376167318ede11eded15c2 (patch)
tree036751633485acaa313a5b4c758d06f276202e7f /service
parentconf: expose configuration root directory (diff)
downloadwireguard-windows-4e58a239c084d673b1376167318ede11eded15c2.tar.xz
wireguard-windows-4e58a239c084d673b1376167318ede11eded15c2.zip
ringlogger: introduce basic file ring logging
Diffstat (limited to 'service')
-rw-r--r--service/errors.go6
-rw-r--r--service/ipc_client.go5
-rw-r--r--service/ipc_server.go6
-rw-r--r--service/service_manager.go51
-rw-r--r--service/service_tunnel.go47
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")