Method: Net::Telnet#waitfor
- Defined in:
- lib/net/telnet.rb
#waitfor(options) ⇒ Object
Read data from the host until a certain sequence is matched.
If a block is given, the received data will be yielded as it is read in (not necessarily all in one go), or nil if EOF occurs before any data is received. Whether a block is given or not, all data read will be returned in a single string, or again nil if EOF occurs before any data is received. Note that received data includes the matched sequence we were looking for.
options can be either a regular expression or a hash of options. If a regular expression, this specifies the data to wait for. If a hash, this can specify the following options:
- Match
-
a regular expression, specifying the data to wait for.
- Prompt
-
as for Match; used only if Match is not specified.
- String
-
as for Match, except a string that will be converted into a regular expression. Used only if Match and Prompt are not specified.
- Timeout
-
the number of seconds to wait for data from the host before raising a TimeoutError. If set to false, no timeout will occur. If not specified, the Timeout option value specified when this instance was created will be used, or, failing that, the default value of 10 seconds.
- Waittime
-
the number of seconds to wait after matching against the input data to see if more data arrives. If more data arrives within this time, we will judge ourselves not to have matched successfully, and will continue trying to match. If not specified, the Waittime option value specified when this instance was created will be used, or, failing that, the default value of 0 seconds, which means not to wait for more input.
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 |
# File 'lib/net/telnet.rb', line 524 def waitfor() # :yield: recvdata time_out = ["Timeout"] waittime = ["Waittime"] if .kind_of?(Hash) prompt = if .has_key?("Match") ["Match"] elsif .has_key?("Prompt") ["Prompt"] elsif .has_key?("String") Regexp.new( Regexp.quote(["String"]) ) end time_out = ["Timeout"] if .has_key?("Timeout") waittime = ["Waittime"] if .has_key?("Waittime") else prompt = end if time_out == false time_out = nil end line = '' buf = '' rest = '' until(prompt === line and not IO::select([@sock], nil, nil, waittime)) unless IO::select([@sock], nil, nil, time_out) raise TimeoutError, "timed out while waiting for more data" end begin c = @sock.readpartial(1024 * 1024) @dumplog.log_dump('<', c) if .has_key?("Dump_log") if ["Telnetmode"] c = rest + c if Integer(c.rindex(/#{IAC}#{SE}/no)) < Integer(c.rindex(/#{IAC}#{SB}/no)) buf = preprocess(c[0 ... c.rindex(/#{IAC}#{SB}/no)]) rest = c[c.rindex(/#{IAC}#{SB}/no) .. -1] elsif pt = c.rindex(/#{IAC}[^#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]?\z/no) buf = preprocess(c[0 ... pt]) rest = c[pt .. -1] else buf = preprocess(c) rest = '' end else # Not Telnetmode. # # We cannot use preprocess() on this data, because that # method makes some Telnetmode-specific assumptions. buf = c buf.gsub!(/#{EOL}/no, "\n") unless ["Binmode"] rest = '' end @log.print(buf) if .has_key?("Output_log") line += buf yield buf if block_given? rescue EOFError # End of file reached if line == '' line = nil yield nil if block_given? end break end end line end |