@@ -23,9 +23,13 @@ import (
2323 "io"
2424 "net/http"
2525 "os"
26+ "os/exec"
2627 "path/filepath"
2728 "runtime"
2829 "strings"
30+ "syscall"
31+
32+ "golang.org/x/sys/windows"
2933
3034 log "github.com/sirupsen/logrus"
3135)
@@ -83,9 +87,11 @@ func fetch(url string) (io.ReadCloser, error) {
8387
8488// addTempSuffixToPath adds the "-temp" suffix to the path to an executable file (a ".exe" extension is replaced with "-temp.exe")
8589func addTempSuffixToPath (path string ) string {
86- if filepath .Ext (path ) == "exe" {
90+ if filepath .Ext (path ) == ".exe" {
91+ // Windows
8792 path = strings .Replace (path , ".exe" , "-temp.exe" , - 1 )
8893 } else {
94+ // Unix
8995 path = path + "-temp"
9096 }
9197
@@ -110,3 +116,51 @@ func copyExe(from, to string) error {
110116 }
111117 return nil
112118}
119+
120+ // requestElevation requests this program to rerun as administrator, for when we don't have permission over the update files
121+ func requestElevation () {
122+ log .Println ("Permission denied. Requesting elevated privileges..." )
123+ var err error
124+ if runtime .GOOS == "windows" {
125+ err = elevateWindows ()
126+ } else {
127+ err = elevateUnix ()
128+ }
129+
130+ if err != nil {
131+ log .Println ("Failed to request elevation:" , err )
132+ return
133+ }
134+ }
135+
136+ func elevateWindows () error {
137+ verb := "runas"
138+ exe , _ := os .Executable ()
139+ cwd , _ := os .Getwd ()
140+ args := strings .Join (os .Args [1 :], " " )
141+
142+ verbPtr , err := syscall .UTF16PtrFromString (verb )
143+ if err != nil {
144+ return err
145+ }
146+ exePtr , err := syscall .UTF16PtrFromString (exe )
147+ if err != nil {
148+ return err
149+ }
150+ cwdPtr , err := syscall .UTF16PtrFromString (cwd )
151+ if err != nil {
152+ return err
153+ }
154+ argPtr , _ := syscall .UTF16PtrFromString (args )
155+ var showCmd int32 = 1
156+ return windows .ShellExecute (0 , verbPtr , exePtr , argPtr , cwdPtr , showCmd )
157+ }
158+
159+ func elevateUnix () error {
160+ args := append ([]string {os .Args [0 ]}, os .Args [1 :]... )
161+ cmd := exec .Command ("sudo" , args ... )
162+ cmd .Stdin = os .Stdin
163+ cmd .Stdout = os .Stdout
164+ cmd .Stderr = os .Stderr
165+ return cmd .Run ()
166+ }
0 commit comments