// doCommand() sends a request and expects a response object func doCommand(server string, conn io.ReadWriteCloser, command *cmd.ControlMessage) (response *cmd.ControlMessage, err error) { buf := make([]byte, 4) // serialize the commend data, err := proto.Marshal(command) if err != nil { return nil, fmt.Errorf("marshaling command error: %v", err) } // send the command if err = util.WriteData(conn, buf, []byte("CMD "), data); err != nil { return nil, fmt.Errorf("failed to write command to %s: %v", server, err) } // println("command sent") // read response replyBytes, err := ioutil.ReadAll(conn) if err != nil { return nil, fmt.Errorf("cmd response: %v", err) } // unmarshal the bytes response = &cmd.ControlMessage{} err = proto.Unmarshal(replyBytes, response) if err != nil { return nil, fmt.Errorf("unmarshaling error: %v", err) } return response, err }
// doExecute() sends a request and expects the output from the connection func doExecute(server string, conn io.ReadWriteCloser, command *cmd.ControlMessage) error { buf := make([]byte, 4) // serialize the commend data, err := proto.Marshal(command) if err != nil { return fmt.Errorf("marshaling execute request error: %v", err) } // send the command if err = util.WriteData(conn, buf, []byte("CMD "), data); err != nil { return fmt.Errorf("failed to write to %s: %v", server, err) } // println("command sent") // read output and print it to stdout scanner := bufio.NewScanner(conn) for scanner.Scan() { fmt.Printf("%s>%s\n", server, scanner.Text()) } if err := scanner.Err(); err != nil { return fmt.Errorf("Failed to scan output: %v", err) } return err }
func doExecute(conn net.Conn, command *cmd.ControlMessage) error { buf := make([]byte, 4) // serialize the commend data, err := proto.Marshal(command) if err != nil { log.Fatal("marshaling error: ", err) } remoteAddress := conn.RemoteAddr().String() // send the command if err = util.WriteData(conn, buf, []byte("CMD "), data); err != nil { println("failed to write to", remoteAddress, ":", err.Error()) return err } // println("command sent") // read output and print it to stdout scanner := bufio.NewScanner(conn) for scanner.Scan() { fmt.Printf("%s>%s\n", remoteAddress, scanner.Text()) } if err := scanner.Err(); err != nil { return fmt.Errorf("Failed to scan output: %v", err) } return err }