diff --git a/proxy/set.go b/proxy/set.go index 47a0a5a..ccf2158 100644 --- a/proxy/set.go +++ b/proxy/set.go @@ -3,18 +3,19 @@ package proxy import ( + "log" + "github.com/Baipyrus/ProxySwitcher/util" ) func Set(cfgPath string) { - stdin, closeFunc, _ := util.ReadyCmd() - proxy, _ := ReadSystemProxy() // Set system proxy, if not already if !proxy.Enabled { SetSystemProxy(true) } + var failed bool configs, _ := util.ReadConfigs(cfgPath) for _, config := range configs { configCmd := config.Name @@ -24,8 +25,11 @@ func Set(cfgPath string) { } commands := generateCommands(configCmd, config.Set, proxy.Server) - util.ExecCmds(commands, stdin) + failed = util.ExecCmds(commands) } - closeFunc() + // Additional feedback on error + if failed { + log.Printf("One or more commands failed to execute. Run command 'debug' to see more.\n") + } } diff --git a/proxy/unset.go b/proxy/unset.go index 5e1837c..1644ed2 100644 --- a/proxy/unset.go +++ b/proxy/unset.go @@ -3,18 +3,19 @@ package proxy import ( + "log" + "github.com/Baipyrus/ProxySwitcher/util" ) func Unset(cfgPath string) { - stdin, closeFunc, _ := util.ReadyCmd() - proxy, _ := ReadSystemProxy() // Unset system proxy, if not already if proxy.Enabled { SetSystemProxy(false) } + var failed bool configs, _ := util.ReadConfigs(cfgPath) for _, config := range configs { configCmd := config.Name @@ -24,8 +25,11 @@ func Unset(cfgPath string) { } commands := generateCommands(configCmd, config.Unset, "") - util.ExecCmds(commands, stdin) + failed = util.ExecCmds(commands) } - closeFunc() + // Additional feedback on error + if failed { + log.Printf("One or more commands failed to execute. Run command 'debug' to see more.\n") + } } diff --git a/util/command.go b/util/command.go index f4c3113..8eaa287 100644 --- a/util/command.go +++ b/util/command.go @@ -3,45 +3,29 @@ package util import ( - "bytes" "fmt" - "io" + "log" "os/exec" "strings" ) -// Create a single powershell process and leave closing, input and output open -func ReadyCmd() (*io.WriteCloser, func() error, error) { - cmd := exec.Command("powershell", "-NoLogo", "-NoProfile", "-Command", "-") - - var stdout bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stdout - - stdin, err := cmd.StdinPipe() - if err != nil { - return nil, nil, err - } - - err = cmd.Start() - if err != nil { - return nil, nil, err - } - - return &stdin, func() error { - // Close stdin pipe - stdin.Close() - - // Wait for command to flush - err := cmd.Wait() - return err - }, nil -} - -func ExecCmds(commands []*Command, stdin *io.WriteCloser) { +func ExecCmds(commands []*Command) bool { + var failed bool for _, command := range commands { - cmdArgs := strings.Join(command.Arguments, " ") - cmdStr := fmt.Sprintf("%s %s", command.Name, cmdArgs) - fmt.Fprintln(*stdin, cmdStr) + var cmdStr string = command.Name + + // Combine command into single string if args are given + if len(command.Arguments) > 0 { + cmdArgs := strings.Join(command.Arguments, " ") + cmdStr = fmt.Sprintf("%s %s", command.Name, cmdArgs) + } + + // Try executing command in default shell + cmd := exec.Command("powershell", "-NoLogo", "-NoProfile", "-Command", cmdStr) + if err := cmd.Run(); err != nil { + log.Printf("Command '%s' failed!\n", cmdStr) + failed = true + } } + return failed }