45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
//go:build darwin
|
|
// +build darwin
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func runWithAdmin(exePath string, env []string) error {
|
|
command := shellQuote(exePath)
|
|
if len(env) > 0 {
|
|
command = strings.Join(shellEnvAssignments(env), " ") + " " + command
|
|
}
|
|
command += " >/dev/null 2>&1 &"
|
|
|
|
script := fmt.Sprintf("do shell script %s with administrator privileges", appleScriptString(command))
|
|
cmd := exec.Command("osascript", "-e", script)
|
|
return cmd.Run()
|
|
}
|
|
|
|
func shellEnvAssignments(env []string) []string {
|
|
assignments := make([]string, 0, len(env))
|
|
for _, value := range env {
|
|
key, val, ok := strings.Cut(value, "=")
|
|
if !ok || key == "" {
|
|
continue
|
|
}
|
|
assignments = append(assignments, key+"="+shellQuote(val))
|
|
}
|
|
return assignments
|
|
}
|
|
|
|
func shellQuote(value string) string {
|
|
return "'" + strings.ReplaceAll(value, "'", "'\\''") + "'"
|
|
}
|
|
|
|
func appleScriptString(value string) string {
|
|
value = strings.ReplaceAll(value, `\`, `\\`)
|
|
value = strings.ReplaceAll(value, `"`, `\"`)
|
|
return `"` + value + `"`
|
|
}
|