// local command line interface, wrapping readline func cliLocal() { goreadline.FilenameCompleter = iomCompleter prompt := "minimega$ " for { line, err := goreadline.Rlwrap(prompt, true) if err != nil { break // EOF } command := string(line) log.Debug("got from stdin:", command) cmd, err := minicli.Compile(command) if err != nil { log.Error("%v", err) //fmt.Printf("closest match: TODO\n") continue } // No command was returned, must have been a blank line or a comment // line. Either way, don't try to run a nil command. if cmd == nil { continue } // HAX: Don't record the read command if hasCommand(cmd, "read") { cmd.Record = false } for resp := range runCommand(cmd) { // print the responses miniclient.Pager(resp.String()) errs := resp.Error() if errs != "" { fmt.Fprintln(os.Stderr, errs) } } } }
func pageOutput(output string) { if output == "" { return } size := termSize() if size == nil { fmt.Println(output) return } log.Debug("term height: %d", size.Row) prompt := "-- press [ENTER] to show more, EOF to discard --" scanner := bufio.NewScanner(strings.NewReader(output)) outer: for { for i := uint16(0); i < size.Row-1; i++ { if scanner.Scan() { fmt.Println(scanner.Text()) // Println will add back the final '\n' } else { break outer // finished consuming from scanner } } _, err := goreadline.Rlwrap(prompt, false) if err != nil { fmt.Println() break outer // EOF } } if err := scanner.Err(); err != nil { log.Error("problem paging: %s", err) } }
func cliAttach() { // try to connect to the local minimega mm, err := DialMinimega() if err != nil { log.Fatalln(err) } // set up signal handling sig := make(chan os.Signal, 1024) signal.Notify(sig, os.Interrupt, syscall.SIGTERM) go func() { <-sig if *f_panic { panic("teardown") } log.Debug("caught signal, disconnecting") goreadline.Rlcleanup() os.Exit(0) }() // start our own rlwrap fmt.Println("CAUTION: calling 'quit' will cause the minimega daemon to exit") fmt.Println("use 'disconnect' or ^d to exit just the minimega command line") fmt.Println() defer goreadline.Rlcleanup() var exitNext bool for { prompt := fmt.Sprintf("minimega:%v$ ", mm.url) line, err := goreadline.Rlwrap(prompt, true) if err != nil { return } command := string(line) log.Debug("got from stdin: `%s`", line) // HAX: Shortcut some commands without using minicli if command == "disconnect" { log.Debugln("disconnecting") return } else if command == "quit" { if !exitNext { fmt.Println("CAUTION: calling 'quit' will cause the minimega daemon to exit") fmt.Println("If you really want to stop the minimega daemon, enter 'quit' again") exitNext = true continue } } exitNext = false cmd, err := minicli.CompileCommand(command) if err != nil { log.Error("%v", err) //fmt.Println("closest match: TODO") continue } // No command was returned, must have been a blank line or a comment // line. Either way, don't try to run a nil command. if cmd == nil { continue } for resp := range mm.runCommand(cmd) { pageOutput(resp.Rendered) errs := resp.Resp.Error() if errs != "" { fmt.Fprintln(os.Stderr, errs) } } if command == "quit" { return } } }