From 8bdd3390b3c9649334759bfe2bfbcde64dcda235 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 29 Aug 2019 12:30:00 -0600 Subject: manager: adjust for wintun api changes Also get rid of the "Local Area Connection" hack and "/wintun /deleteall". --- main.go | 29 --------------------- manager/adaptercleanup.go | 63 --------------------------------------------- manager/interfacecleanup.go | 58 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 92 deletions(-) delete mode 100644 manager/adaptercleanup.go create mode 100644 manager/interfacecleanup.go diff --git a/main.go b/main.go index d32ea7f7..8d33b09f 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,6 @@ import ( "time" "golang.org/x/sys/windows" - "golang.zx2c4.com/wireguard/tun/wintun" "golang.zx2c4.com/wireguard/windows/elevate" "golang.zx2c4.com/wireguard/windows/manager" @@ -32,7 +31,6 @@ var flags = [...]string{ "/tunnelservice CONFIG_PATH", "/ui CMD_READ_HANDLE CMD_WRITE_HANDLE CMD_EVENT_HANDLE LOG_MAPPING_HANDLE", "/dumplog OUTPUT_PATH", - "/wintun /deleteall", } func fatal(v ...interface{}) { @@ -229,33 +227,6 @@ func main() { fatal(err) } return - case "/wintun": - if len(os.Args) < 3 { - usage() - } - switch os.Args[2] { - case "/deleteall": - if len(os.Args) != 3 { - usage() - } - deleted, rebootRequired, errors := wintun.DeleteAllInterfaces() - interfaceString := "no interfaces" - if len(deleted) > 0 { - interfaceString = fmt.Sprintf("interfaces %v", deleted) - } - errorString := "" - if len(errors) > 0 { - errorString = fmt.Sprintf(", encountering errors %v", errors) - } - rebootString := "" - if rebootRequired { - rebootString = " A reboot is required." - } - info("Wintun Cleanup", "Deleted %s%s.%s", interfaceString, errorString, rebootString) - return - default: - usage() - } } usage() } diff --git a/manager/adaptercleanup.go b/manager/adaptercleanup.go deleted file mode 100644 index 779e4b80..00000000 --- a/manager/adaptercleanup.go +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: MIT - * - * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. - */ - -package manager - -import ( - "log" - "strings" - - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" - - "golang.zx2c4.com/wireguard/tun/wintun" - "golang.zx2c4.com/wireguard/windows/services" -) - -const unnamedWintunInterface = "Local Area Connection" - -func cleanupStaleAdapters() { - defer printPanic() - - m, err := mgr.Connect() - if err != nil { - return - } - defer m.Disconnect() - - wintun.DeleteMatchingInterfaces(func(wintun *wintun.Wintun) bool { - interfaceName, err := wintun.InterfaceName() - if err != nil { - log.Printf("Removing Wintun interface %s because determining interface name failed: %v", wintun.GUID().String(), err) - return true - } - if strings.HasPrefix(interfaceName, unnamedWintunInterface) { - return false - } - serviceName, err := services.ServiceNameOfTunnel(interfaceName) - if err != nil { - log.Printf("Removing Wintun interface ‘%s’ because determining tunnel service name failed: %v", interfaceName, err) - return true - } - service, err := m.OpenService(serviceName) - if err == windows.ERROR_SERVICE_DOES_NOT_EXIST { - log.Printf("Removing Wintun interface ‘%s’ because no service for it exists", interfaceName) - return true - } else if err != nil { - return false - } - defer service.Close() - status, err := service.Query() - if err != nil { - return false - } - if status.State == svc.Stopped { - log.Printf("Removing Wintun interface ‘%s’ because its service is stopped", interfaceName) - return true - } - return false - }) -} diff --git a/manager/interfacecleanup.go b/manager/interfacecleanup.go new file mode 100644 index 00000000..7b13b10c --- /dev/null +++ b/manager/interfacecleanup.go @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package manager + +import ( + "log" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" + "golang.zx2c4.com/wireguard/tun/wintun" + + "golang.zx2c4.com/wireguard/tun" + "golang.zx2c4.com/wireguard/windows/services" +) + +func cleanupStaleAdapters() { + defer printPanic() + + m, err := mgr.Connect() + if err != nil { + return + } + defer m.Disconnect() + + tun.WintunPool.DeleteMatchingInterfaces(func(wintun *wintun.Interface) bool { + interfaceName, err := wintun.Name() + if err != nil { + log.Printf("Removing Wintun interface %s because determining interface name failed: %v", wintun.GUID().String(), err) + return true + } + serviceName, err := services.ServiceNameOfTunnel(interfaceName) + if err != nil { + log.Printf("Removing Wintun interface ‘%s’ because determining tunnel service name failed: %v", interfaceName, err) + return true + } + service, err := m.OpenService(serviceName) + if err == windows.ERROR_SERVICE_DOES_NOT_EXIST { + log.Printf("Removing Wintun interface ‘%s’ because no service for it exists", interfaceName) + return true + } else if err != nil { + return false + } + defer service.Close() + status, err := service.Query() + if err != nil { + return false + } + if status.State == svc.Stopped { + log.Printf("Removing Wintun interface ‘%s’ because its service is stopped", interfaceName) + return true + } + return false + }) +} -- cgit v1.2.3-59-g8ed1b