69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
//go:build darwin
|
|
// +build darwin
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func parseNetworkServices(out string) []string {
|
|
lines := strings.Split(out, "\n")
|
|
var result []string
|
|
|
|
for _, line := range lines {
|
|
if strings.Contains(line, "(Hardware Port:") {
|
|
start := strings.Index(line, "Hardware Port: ") + len("Hardware Port: ")
|
|
end := strings.Index(line[start:], ",")
|
|
if end > 0 {
|
|
result = append(result, line[start:start+end])
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func contains(arr []string, v string) bool {
|
|
for _, x := range arr {
|
|
if x == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func setProxy(enable bool, host string, port string) error {
|
|
out, err := exec.Command("networksetup", "-listnetworkserviceorder").CombinedOutput()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
services := parseNetworkServices(string(out))
|
|
active := ""
|
|
|
|
if contains(services, "Wi-Fi") {
|
|
active = "Wi-Fi"
|
|
} else if contains(services, "Ethernet") {
|
|
active = "Ethernet"
|
|
} else {
|
|
if len(services) == 0 {
|
|
return fmt.Errorf("no network services found")
|
|
}
|
|
active = services[0]
|
|
}
|
|
|
|
if enable {
|
|
exec.Command("networksetup", "-setwebproxy", active, host, port).Run()
|
|
exec.Command("networksetup", "-setsecurewebproxy", active, host, port).Run()
|
|
exec.Command("networksetup", "-setwebproxystate", active, "on").Run()
|
|
exec.Command("networksetup", "-setsecurewebproxystate", active, "on").Run()
|
|
} else {
|
|
exec.Command("networksetup", "-setwebproxystate", active, "off").Run()
|
|
exec.Command("networksetup", "-setsecurewebproxystate", active, "off").Run()
|
|
}
|
|
|
|
return nil
|
|
}
|