code: func (w *wizard) readIPAddress() string {
  	for {
  		// Read the IP address from the user
  		fmt.Printf("> ")
  		text, err := w.in.ReadString('\n')
  		if err != nil {
  			log.Crit("Failed to read user input", "err", err)
  		}
  		if text = strings.TrimSpace(text); text == "" {
  			return ""
  		}
  		// Make sure it looks ok and return it if so
  		if ip := net.ParseIP(text); ip == nil {
  			log.Error("Invalid IP address, please retry")
  			continue
  		}
  		return text
  	}
  }
docs: // readIPAddress reads a single line from stdin, trimming if from spaces and
  // returning it if it's convertible to an IP address. The reason for keeping
  // the user input format instead of returning a Go net.IP is to match with
  // weird formats used by ethstats, which compares IPs textually, not by value.