diff options
Diffstat (limited to 'ringlogger/dump.go')
-rw-r--r-- | ringlogger/dump.go | 62 |
1 files changed, 27 insertions, 35 deletions
diff --git a/ringlogger/dump.go b/ringlogger/dump.go index 05a9b27f..3c089751 100644 --- a/ringlogger/dump.go +++ b/ringlogger/dump.go @@ -1,53 +1,28 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved. */ package ringlogger import ( + "errors" + "fmt" "io" "os" - "path/filepath" + "time" "golang.org/x/sys/windows" - "golang.org/x/sys/windows/registry" - - "golang.zx2c4.com/wireguard/windows/conf" ) -func DumpTo(out io.Writer, localSystem bool) error { - var path string - if !localSystem { - root, err := conf.RootDirectory() - if err != nil { - return err - } - path = filepath.Join(root, "log.bin") - } else { - k, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\S-1-5-18", registry.QUERY_VALUE) - if err != nil { - return err - } - defer k.Close() - - systemprofile, _, err := k.GetStringValue("ProfileImagePath") - if err != nil { - return err - } - systemprofile, err = registry.ExpandString(systemprofile) - if err != nil { - return err - } - path = filepath.Join(systemprofile, "AppData", "Local", "WireGuard", "log.bin") - } - file, err := os.Open(path) +func DumpTo(inPath string, out io.Writer, continuous bool) error { + file, err := os.Open(inPath) if err != nil { return err } defer file.Close() mapping, err := windows.CreateFileMapping(windows.Handle(file.Fd()), nil, windows.PAGE_READONLY, 0, 0, nil) - if err != nil { + if err != nil && err != windows.ERROR_ALREADY_EXISTS { return err } rl, err := newRingloggerFromMappingHandle(mapping, "DMP", windows.FILE_MAP_READ) @@ -56,9 +31,26 @@ func DumpTo(out io.Writer, localSystem bool) error { return err } defer rl.Close() - _, err = rl.WriteTo(out) - if err != nil { - return err + if !continuous { + _, err = rl.WriteTo(out) + if err != nil { + return err + } + } else { + cursor := CursorAll + for { + var items []FollowLine + items, cursor = rl.FollowFromCursor(cursor) + for _, item := range items { + _, err = fmt.Fprintf(out, "%s: %s\n", item.Stamp.Format("2006-01-02 15:04:05.000000"), item.Line) + if errors.Is(err, io.EOF) { + return nil + } else if err != nil { + return err + } + } + time.Sleep(time.Millisecond * 100) + } } return nil } |