47 lines
979 B
Go
47 lines
979 B
Go
//go:build darwin
|
|
// +build darwin
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func relaunchWithAdminIfNeeded() (bool, error) {
|
|
if os.Geteuid() == 0 {
|
|
return false, nil
|
|
}
|
|
|
|
exePath, err := os.Executable()
|
|
if err != nil {
|
|
return false, fmt.Errorf("get executable path: %w", err)
|
|
}
|
|
|
|
workDir, err := os.Getwd()
|
|
if err != nil {
|
|
return false, fmt.Errorf("get working directory: %w", err)
|
|
}
|
|
|
|
args := make([]string, 0, len(os.Args))
|
|
args = append(args, shellQuote(exePath))
|
|
for _, arg := range os.Args[1:] {
|
|
args = append(args, shellQuote(arg))
|
|
}
|
|
|
|
command := fmt.Sprintf(
|
|
"cd %s && %s > /dev/null 2>&1 &",
|
|
shellQuote(workDir),
|
|
strings.Join(args, " "),
|
|
)
|
|
script := fmt.Sprintf("do shell script %s with administrator privileges", appleScriptString(command))
|
|
|
|
if out, err := exec.Command("osascript", "-e", script).CombinedOutput(); err != nil {
|
|
return false, formatCommandError("relaunch proxy as admin", err, out)
|
|
}
|
|
|
|
return true, nil
|
|
}
|