func (c *MonitorCommand) Run(args []string, ui cli.Ui) int { var logLevel string cmdFlags := flag.NewFlagSet("monitor", flag.ContinueOnError) cmdFlags.Usage = func() { ui.Output(c.Help()) } cmdFlags.StringVar(&logLevel, "log-level", "INFO", "log level") rpcAddr := RPCAddrFlag(cmdFlags) if err := cmdFlags.Parse(args); err != nil { return 1 } client, err := RPCClient(*rpcAddr) if err != nil { ui.Error(fmt.Sprintf("Error connecting to Serf agent: %s", err)) return 1 } defer client.Close() eventCh := make(chan string) doneCh := make(chan struct{}) if err := client.Monitor(logutils.LogLevel(logLevel), eventCh, doneCh); err != nil { ui.Error(fmt.Sprintf("Error starting monitor: %s", err)) return 1 } eventDoneCh := make(chan struct{}) go func() { defer close(eventDoneCh) for e := range eventCh { ui.Info(e) } c.lock.Lock() defer c.lock.Unlock() if !c.quitting { ui.Info("") ui.Output("Remote side ended the monitor! This usually means that the\n" + "remote side has exited or crashed.") } }() select { case <-eventDoneCh: return 1 case <-c.ShutdownCh: c.lock.Lock() c.quitting = true c.lock.Unlock() } close(doneCh) return 0 }