@@ -4,9 +4,9 @@ package updatemanager
4
4
5
5
import (
6
6
"fmt"
7
- log "github.com/sirupsen/logrus"
8
7
"os"
9
8
"os/exec"
9
+ "os/user"
10
10
"runtime"
11
11
"strings"
12
12
"syscall"
@@ -27,9 +27,9 @@ func (u *UpdateManager) triggerUpdate(targetVersion string) error {
27
27
// Installed using pkg file
28
28
url := strings .ReplaceAll (pkgDownloadURL , "%version" , targetVersion )
29
29
url = strings .ReplaceAll (url , "%arch" , runtime .GOARCH )
30
- path , err := downloadFileToTemporaryDir (url )
30
+ path , err := downloadFileToTemporaryDir (u . ctx , url )
31
31
if err != nil {
32
- return err
32
+ return fmt . Errorf ( "error downloading update file: %w" , err )
33
33
}
34
34
35
35
volume := "/"
@@ -44,7 +44,7 @@ func (u *UpdateManager) triggerUpdate(targetVersion string) error {
44
44
45
45
err = cmd .Start ()
46
46
if err != nil {
47
- return err
47
+ return fmt . Errorf ( "error running pkg file: %w" , err )
48
48
}
49
49
err = cmd .Process .Release ()
50
50
@@ -56,43 +56,42 @@ func (u *UpdateManager) updateHomeBrew() error {
56
56
// To find out which user installed NetBird using HomeBrew we can check the owner of our brew tap directory
57
57
fileInfo , err := os .Stat ("/opt/homebrew/Library/Taps/netbirdio/homebrew-tap/" )
58
58
if err != nil {
59
- return err
59
+ return fmt . Errorf ( "error getting homebrew installation path info: %w" , err )
60
60
}
61
61
62
62
fileSysInfo , ok := fileInfo .Sys ().(* syscall.Stat_t )
63
63
if ! ok {
64
- return fmt .Errorf ("Error checking file owner, sysInfo type is %T not *syscall.Stat_t" , fileInfo .Sys ())
64
+ return fmt .Errorf ("error checking file owner, sysInfo type is %T not *syscall.Stat_t" , fileInfo .Sys ())
65
65
}
66
66
67
- // Get user name from UID
68
- cmd := exec .Command ("id" , "-nu" , fmt .Sprintf ("%d" , fileSysInfo .Uid ))
69
- out , err := cmd .CombinedOutput ()
67
+ // Get username from UID
68
+ installer , err := user .LookupId (fmt .Sprintf ("%d" , fileSysInfo .Uid ))
70
69
if err != nil {
71
- return err
70
+ return fmt . Errorf ( "error looking up brew installer user: %w" , err )
72
71
}
73
- userName := strings .TrimSpace (string (out ))
74
-
72
+ userName := installer .Name
75
73
// Get user HOME, required for brew to run correctly
76
74
// https://github.com/Homebrew/brew/issues/15833
77
- cmd = exec .Command ("sudo" , "-u" , userName , "sh" , "-c" , "echo $HOME" )
78
- out , err = cmd .CombinedOutput ()
79
- if err != nil {
80
- return err
81
- }
82
-
83
- homeDir := strings .TrimSpace (string (out ))
75
+ homeDir := installer .HomeDir
84
76
// Homebrew does not support installing specific versions
85
77
// Thus it will always update to latest and ignore targetVersion
86
- cmd = exec .Command ("sudo" , "-u" , userName , "/opt/homebrew/bin/brew" , "upgrade" , "netbirdio/tap/netbird" )
78
+ upgradeArgs := []string {"-u" , userName , "/opt/homebrew/bin/brew" , "upgrade" , "netbirdio/tap/netbird" }
79
+ // Check if netbird-ui is installed
80
+ cmd := exec .Command ("brew" , "info" , "--json" , "netbirdio/tap/netbird-ui" )
81
+ err = cmd .Run ()
82
+ if err == nil {
83
+ // netbird-ui is installed
84
+ upgradeArgs = append (upgradeArgs , "netbirdio/tap/netbird-ui" )
85
+ }
86
+ cmd = exec .Command ("sudo" , upgradeArgs ... )
87
87
cmd .Env = append (cmd .Env , "HOME=" + homeDir )
88
88
89
89
// Homebrew upgrade doesn't restart the client on its own
90
90
// So we have to wait for it to finish running and ensure it's done
91
91
// And then basically restart the netbird service
92
- out , err = cmd .CombinedOutput ()
92
+ err = cmd .Run ()
93
93
if err != nil {
94
- log .Errorf ("Error running brew upgrade, output: %v" , string (out ))
95
- return err
94
+ return fmt .Errorf ("error running brew upgrade: %w" , err )
96
95
}
97
96
98
97
currentPID := os .Getpid ()
@@ -101,9 +100,15 @@ func (u *UpdateManager) updateHomeBrew() error {
101
100
// This is a workaround since attempting to restart using launchctl will kill the service and die before starting
102
101
// the service again as it's a child process
103
102
// using SigTerm should ensure a clean shutdown
104
- cmd = exec .Command ("kill" , "-15" , fmt .Sprintf ("%d" , currentPID ))
105
- err = cmd .Run ()
103
+ process , err := os .FindProcess (currentPID )
104
+ if err != nil {
105
+ return fmt .Errorf ("error finding current process: %w" , err )
106
+ }
107
+ err = process .Signal (syscall .SIGTERM )
108
+ if err != nil {
109
+ return fmt .Errorf ("error sending SIGTERM to current process: %w" , err )
110
+ }
106
111
// We're dying now, which should restart us
107
112
108
- return err
113
+ return nil
109
114
}
0 commit comments