aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/manager/install.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-05-11 22:57:12 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-06-18 11:28:50 +0200
commit7701c82a2a2b9b756cb68152da304a65158e63af (patch)
tree4efe4a6fea4ed932d722a29b489e87c099e1fafc /manager/install.go
parentmod: bump (diff)
downloadwireguard-windows-7701c82a2a2b9b756cb68152da304a65158e63af.tar.xz
wireguard-windows-7701c82a2a2b9b756cb68152da304a65158e63af.zip
manager: rewrite service arguments when migrating configs
If a service is installed already, it's a good idea to migrate its conf argument when migrating the file name, so that these don't get out of sync. We're already doing this when migrating from the legacy config store, so this is also an opportunity to clean up that code a bit and quit using regexes. Reported-by: Станислав Мацак <smatsak@mail.ru> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'manager/install.go')
-rw-r--r--manager/install.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/manager/install.go b/manager/install.go
index bd7d23c7..f74fecf0 100644
--- a/manager/install.go
+++ b/manager/install.go
@@ -7,7 +7,9 @@ package manager
import (
"errors"
+ "log"
"os"
+ "strings"
"time"
"golang.org/x/sys/windows"
@@ -197,3 +199,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 := services.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)
+}