In Files

  • openssl/lib/net/telnets.rb

Class/Module Index [+]

Quicksearch

Net::Telnet

Attributes

ssl[R]

Public Instance Methods

preprocess(string) click to toggle source
 
               # File openssl/lib/net/telnets.rb, line 70
def preprocess(string)
  # combine CR+NULL into CR
  string = string.gsub(/#{CR}#{NULL}/no, CR) if @options["Telnetmode"]

  # combine EOL into "\n"
  string = string.gsub(/#{EOL}/no, "\n") unless @options["Binmode"]

  string.gsub(/#{IAC}(
               [#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]|
               [#{DO}#{DONT}#{WILL}#{WONT}][#{OPT_BINARY}-#{OPT_EXOPL}]|
               #{SB}[#{OPT_BINARY}-#{OPT_EXOPL}]
                 (#{IAC}#{IAC}|[^#{IAC}])+#{IAC}#{SE}
             )/xno) do
    if    IAC == $1  # handle escaped IAC characters
      IAC
    elsif AYT == $1  # respond to "IAC AYT" (are you there)
      self.write("nobody here but us pigeons" + EOL)
      ''
    elsif DO[0] == $1[0]  # respond to "IAC DO x"
      if    OPT_BINARY[0] == $1[1]
        @telnet_option["BINARY"] = true
        self.write(IAC + WILL + OPT_BINARY)
      elsif OPT_STARTTLS[0] == $1[1]
        self.write(IAC + WILL + OPT_STARTTLS)
        self.write(IAC + SB + OPT_STARTTLS + TLS_FOLLOWS + IAC + SE)
      else
        self.write(IAC + WONT + $1[1..1])
      end
      ''
    elsif DONT[0] == $1[0]  # respond to "IAC DON'T x" with "IAC WON'T x"
      self.write(IAC + WONT + $1[1..1])
      ''
    elsif WILL[0] == $1[0]  # respond to "IAC WILL x"
      if    OPT_BINARY[0] == $1[1]
        self.write(IAC + DO + OPT_BINARY)
      elsif OPT_ECHO[0] == $1[1]
        self.write(IAC + DO + OPT_ECHO)
      elsif OPT_SGA[0]  == $1[1]
        @telnet_option["SGA"] = true
        self.write(IAC + DO + OPT_SGA)
      else
        self.write(IAC + DONT + $1[1..1])
      end
      ''
    elsif WONT[0] == $1[0]  # respond to "IAC WON'T x"
      if    OPT_ECHO[0] == $1[1]
        self.write(IAC + DONT + OPT_ECHO)
      elsif OPT_SGA[0]  == $1[1]
        @telnet_option["SGA"] = false
        self.write(IAC + DONT + OPT_SGA)
      else
        self.write(IAC + DONT + $1[1..1])
      end
      ''
    elsif SB[0] == $1[0]    # respond to "IAC SB xxx IAC SE"
      if    OPT_STARTTLS[0] == $1[1] && TLS_FOLLOWS[0] == $2[0]
        @sock = OpenSSL::SSL::SSLSocket.new(@sock)
        @sock.cert            = @options['Cert'] unless @sock.cert
        @sock.key             = @options['Key'] unless @sock.key
        @sock.ca_cert         = @options['CACert']
        @sock.ca_file         = @options['CAFile']
        @sock.ca_path         = @options['CAPath']
        @sock.timeout         = @options['Timeout']
        @sock.verify_mode     = @options['VerifyMode']
        @sock.verify_callback = @options['VerifyCallback']
        @sock.verify_depth    = @options['VerifyDepth']
        @sock.connect
        if @options['VerifyMode'] != OpenSSL::SSL::VERIFY_NONE
          @sock.post_connection_check(@options['Host'])
        end
        @ssl = true
      end
      ''
    else
      ''
    end
  end
end
            
Also aliased as: preprocess_orig
preprocess_orig(string) click to toggle source
Alias for: preprocess
ssl?() click to toggle source
 
               # File openssl/lib/net/telnets.rb, line 68
def ssl?; @ssl; end
            
waitfor(options) click to toggle source
 
               # File openssl/lib/net/telnets.rb, line 151
def waitfor(options)
  time_out = @options["Timeout"]
  waittime = @options["Waittime"]

  if options.kind_of?(Hash)
    prompt   = if options.has_key?("Match")
                 options["Match"]
               elsif options.has_key?("Prompt")
                 options["Prompt"]
               elsif options.has_key?("String")
                 Regexp.new( Regexp.quote(options["String"]) )
               end
    time_out = options["Timeout"]  if options.has_key?("Timeout")
    waittime = options["Waittime"] if options.has_key?("Waittime")
  else
    prompt = options
  end

  if time_out == false
    time_out = nil
  end

  line = ''
  buf = ''
  @rest = '' unless @rest

  until(prompt === line and not IO::select([@sock], nil, nil, waittime))
    unless IO::select([@sock], nil, nil, time_out)
      raise TimeoutError, "timed-out; wait for the next data"
    end
    begin
      c = @rest + @sock.sysread(1024 * 1024)
      @dumplog.log_dump('<', c) if @options.has_key?("Dump_log")
      if @options["Telnetmode"]   
        pos = 0
        catch(:next){
          while true
            case c[pos]
            when IAC[0]
              case c[pos+1]
              when DO[0], DONT[0], WILL[0], WONT[0]
                throw :next unless c[pos+2]
                pos += 3
              when SB[0]
                ret = detect_sub_negotiation(c, pos)
                throw :next unless ret
                pos = ret
              when nil
                throw :next
              else
                pos += 2
              end
            when nil
              throw :next
            else
              pos += 1
            end
          end
        }

        buf = preprocess(c[0...pos])
        @rest = c[pos..-1]
      end
      @log.print(buf) if @options.has_key?("Output_log")
      line.concat(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
            
Also aliased as: waitfor_org
waitfor_org(options) click to toggle source
Alias for: waitfor