func cliDownloadFile(c *cli.Context) { args := c.Args() if len(args) != 2 { Exit("Must specify <remote-path> <local-path-prefix>") } remotePath := args[0] localPathPrefix := args[1] command := btypes.CommandServeFile{ Path: remotePath, } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string, localPath string) { defer wg.Done() n, err := DownloadFile(Config.PrivKey, remote, command, localPath) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v success. Wrote %v bytes to %v\n", remote, n, localPath) } }(remote, Fmt("%v_%v", localPathPrefix, remoteNick(remote))) } wg.Wait() if 0 < failed { os.Exit(1) } }
func cliCloseListener(c *cli.Context) { args := c.Args() if len(args) == 0 { Exit("Must specify listenAddr to stop") } listenAddr := args[0] command := btypes.CommandCloseListener{ Addr: listenAddr, } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string) { defer wg.Done() response, err := CloseListener(Config.PrivKey, remote, command) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v success. %v\n", remote, response) } }(remote) } wg.Wait() if 0 < failed { os.Exit(1) } }
func cliOpenListener(c *cli.Context) { args := c.Args() if len(args) < 1 { Exit("Must specify <listenAddr e.g. [::]:46661>") } listenAddr := args[0] command := btypes.CommandOpenListener{ Addr: listenAddr, } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string) { defer wg.Done() response, err := OpenListener(Config.PrivKey, remote, command) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v opened %v.\n", remote, response.Addr) } }(remote) } wg.Wait() if 0 < failed { os.Exit(1) } }
func cliStopProcess(c *cli.Context) { args := c.Args() if len(args) == 0 { Exit("Must specify label to stop") } label := args[0] command := btypes.CommandStopProcess{ Label: label, Kill: true, } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string) { defer wg.Done() response, err := StopProcess(Config.PrivKey, remote, command) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v success. %v\n", remote, response) } }(remote) } wg.Wait() if 0 < failed { os.Exit(1) } }
func cliGetStatus(c *cli.Context) { args := c.Args() if len(args) != 0 { fmt.Println("BTW, status takes no arguments.") } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string) { defer wg.Done() response, err := GetStatus(remote) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v success. %v\n", remote, response) } }(remote) } wg.Wait() if 0 < failed { os.Exit(1) } }
func cliStartProcess(c *cli.Context) { args := c.Args() if len(args) < 1 { Exit("Must specify <execPath> <args...>") } execPath := args[0] args = args[1:] command := btypes.CommandStartProcess{ Wait: !c.Bool("bg"), Label: c.String("label"), ExecPath: execPath, Args: args, Input: c.String("input"), } wg := sync.WaitGroup{} failed := 0 for _, remote := range Config.Remotes { wg.Add(1) go func(remote string) { defer wg.Done() response, err := StartProcess(Config.PrivKey, remote, command) if err != nil { failed++ fmt.Printf("%v failure. %v\n", remote, err) } else { fmt.Printf("%v success.\n", remote) if response.Output != "" { fmt.Println("--------------------------------------------------------------------------------") fmt.Println(response.Output) fmt.Println("--------------------------------------------------------------------------------") } else { fmt.Println("(no output)") } } }(remote) } wg.Wait() if 0 < failed { os.Exit(1) } }