diff options
Diffstat (limited to 'manager/install.go')
-rw-r--r-- | manager/install.go | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/manager/install.go b/manager/install.go index bd7d23c7..44a744cf 100644 --- a/manager/install.go +++ b/manager/install.go @@ -1,13 +1,15 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved. + * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved. */ package manager import ( "errors" + "log" "os" + "strings" "time" "golang.org/x/sys/windows" @@ -15,7 +17,6 @@ import ( "golang.org/x/sys/windows/svc/mgr" "golang.zx2c4.com/wireguard/windows/conf" - "golang.zx2c4.com/wireguard/windows/services" ) var cachedServiceManager *mgr.Mgr @@ -128,7 +129,7 @@ func InstallTunnel(configPath string) error { return err } - serviceName, err := services.ServiceNameOfTunnel(name) + serviceName, err := conf.ServiceNameOfTunnel(name) if err != nil { return err } @@ -181,7 +182,7 @@ func UninstallTunnel(name string) error { if err != nil { return err } - serviceName, err := services.ServiceNameOfTunnel(name) + serviceName, err := conf.ServiceNameOfTunnel(name) if err != nil { return err } @@ -197,3 +198,45 @@ func UninstallTunnel(name string) error { } return err2 } + +func changeTunnelServiceConfigFilePath(name, oldPath, newPath string) { + var err error + defer func() { + if err != nil { + log.Printf("Unable to change tunnel service command line argument from %#q to %#q: %v", oldPath, newPath, err) + } + }() + m, err := serviceManager() + if err != nil { + return + } + serviceName, err := conf.ServiceNameOfTunnel(name) + if err != nil { + return + } + service, err := m.OpenService(serviceName) + if err == windows.ERROR_SERVICE_DOES_NOT_EXIST { + err = nil + return + } else if err != nil { + return + } + defer service.Close() + config, err := service.Config() + if err != nil { + return + } + exePath, err := os.Executable() + if err != nil { + return + } + args, err := windows.DecomposeCommandLine(config.BinaryPathName) + if err != nil || len(args) != 3 || + !strings.EqualFold(args[0], exePath) || args[1] != "/tunnelservice" || !strings.EqualFold(args[2], oldPath) { + err = nil + return + } + args[2] = newPath + config.BinaryPathName = windows.ComposeCommandLine(args) + err = service.UpdateConfig(config) +} |