func HandleTerminalReading(channel ssh.Channel, term *terminal.Terminal) { defer channel.Close() for { line, err := term.ReadLine() if err != nil { break } cmd_log := Command{Cmd: string(line)} if strings.Contains(string(line), "exit") { logfile.Println("[exit requested]") channel.Close() } if line == "passwd" { line, _ := term.ReadPassword("Enter new UNIX password: "******"[password changed]: " + line) line, _ = term.ReadPassword("Retype new UNIX password: "******"[password changed confirmation]: " + line) term.Write([]byte("passwd: password updated successfully\r\n")) cmd_log.Cmd += " " + line } else { term.Write(RunCommand(line)) } cmd_log.Save() logfile.Println(line) } }
// newStartedMongoState takes a term argument to have a context for printing func (msh *mongoStateHolder) newStartedMongoState(replicaID, backupID, mongodPath, mongoPath, mountPath string, term *terminal.Terminal, driver *strata.Driver) (*mongoState, error) { mongoState := mongoState{} var err error mongoState.dbpath, err = ioutil.TempDir("", "mongoq_") if err != nil { return &mongoState, err } if err := driver.RestoreReadOnly(replicaID, backupID, mountPath, mongoState.dbpath); err != nil { return &mongoState, err } // Try to start mongod // Look for output text to determine success // If output text indicates that port is already in use, try another port for mongoState.mongod == nil { mongoState.mongod = exec.Command(mongodPath, "--port="+strconv.Itoa(msh.nextPort), "--dbpath="+mongoState.dbpath, "--storageEngine=rocksdb", "--rocksdbConfigString=max_open_files=10") mongodOut, err := mongoState.mongod.StdoutPipe() if err != nil { return &mongoState, err } defer mongodOut.Close() if err := mongoState.mongod.Start(); err != nil { return &mongoState, err } // Wait until mongod is ready to accept a connection for { buf := make([]byte, 10000) n, _ := mongodOut.Read(buf) term.Write(buf[:n]) // If there is a problem starting mongod, the user should see it and kill process rec := string(buf[:n]) if strings.Contains(rec, "waiting for connections on port") { mongodOut.Close() break } else if strings.Contains(rec, "Address already in use for socket") { mongodOut.Close() if err := mongoState.mongod.Process.Kill(); err != nil { return &mongoState, err } mongoState.mongod = nil term.Write([]byte("MONGOQ Trying to start mongod again on another port\n")) msh.nextPort++ break } } } mongoState.mongo = exec.Command(mongoPath, "--port="+strconv.Itoa(msh.nextPort)) msh.nextPort++ mongoState.mongoPty, err = pty.Start(mongoState.mongo) return &mongoState, err }
func terminalMessage(term *terminal.Terminal, color []byte, msg string, critical bool) { line := make([]byte, len(msg)+16)[:0] line = append(line, ' ') line = append(line, color...) line = append(line, '*') line = append(line, term.Escape.Reset...) line = append(line, []byte(fmt.Sprintf(" (%s) ", time.Now().Format(time.Kitchen)))...) if critical { line = append(line, term.Escape.Red...) } line = appendTerminalEscaped(line, []byte(msg)) if critical { line = append(line, term.Escape.Reset...) } line = append(line, '\n') term.Write(line) }
func terminalMessage(term *terminal.Terminal, color []byte, msg string) { line := make([]byte, len(msg)+16)[:0] line = append(line, ' ') line = append(line, color...) line = append(line, '*') line = append(line, term.Escape.Reset...) line = append(line, []byte(fmt.Sprintf(" (%s) ", time.Now().Format(time.Kitchen)))...) for _, c := range msg { if (c < 32 || c > 126) && c != '\t' { line = append(line, '?') } else { line = append(line, byte(c)) } } line = append(line, '\n') term.Write(line) }