class OpenvasCli::VasConnection

Public Class Methods

new(config={}) click to toggle source

Initializes the client, connectes to the OpenVas Managment service specified by host & port, and unless auto_login is set to false, loggs in using username and password.

# File lib/openvas-cli/vas_connection.rb, line 14
def initialize(config={})
  @logger = OpenvasCli.logger
  @config = OpenvasCli.configuration 
  
  connect
  if @config.auto_login == true
    login
  end
end

Public Instance Methods

close() click to toggle source

Closes the active connection and sets it up for re-connection.

# File lib/openvas-cli/vas_connection.rb, line 25
def close
  @socket.close if @socket
  @socket = nil
end
config() click to toggle source
# File lib/openvas-cli/vas_connection.rb, line 30
def config
  @config ||= {}
end
login() click to toggle source

Logs into the OpenVAS Management service using the specified username and passoword. By default, this method is called by new unless auto_login is set to false.

# File lib/openvas-cli/vas_connection.rb, line 37
def login
  log_message("Logging in: :user => #{@config.username}", :info)
  areq = Nokogiri::XML::Builder.new { |xml|
    xml.authenticate {
      xml.credentials {
        xml.username { xml.text(@config.username) }
        xml.password { xml.text(@config.password) }
      }
    }
  }
  
  send_receive(areq.doc)
end
send_receive(request) click to toggle source
# File lib/openvas-cli/vas_connection.rb, line 55
def send_receive(request)
  if request.kind_of? String
    tosend = request
  else
    tosend = request.to_xml
  end
  
  tries = 0

  begin  
    unless @socket && @socket.state =~ /sslok/i
      log_message("Socket closed, Reconnecting", :info)
      connect
      login
    end
    log_message("Sending: #{tosend}", :debug)

    @socket.puts(tosend)

    rbuf=''
    size=0
    begin
      timeout(@config.time_out) {
          a    = @socket.sysread(@config.buffer_size)
          size = a.length
          rbuf << a
      }
    end while size >= @config.buffer_size
  rescue Timeout::Error
    msg = "Command Timed Out [#{tries}] (#{$!})\nCommand: #{tosend}"
    log_message msg, :error
    tries += 1
    @socket = nil
    retry if tries < @config.max_tries
    raise VasExceptions::CommunicationException.new(msg)
  rescue EOFError
    msg = "EOFError [#{tries}] (#{$!})\nReceived: #{rbuf}\nCommand: #{tosend}"
    log_message msg, :error
    tries += 1
    @socket = nil
    retry if tries < @config.max_tries
    raise VasExceptions::CommunicationException.new(msg)
  end
  
  response = Nokogiri::XML(rbuf)
  
  log_message "RECEIVED: #{response.to_xml}", :debug
  
  unless VasConnection.extract_value_from("//@status", response) =~ /20\d/
    msg = "Command Failed: #{VasConnection.extract_value_from("//@status_text", response)}\n" +
          "Command Status: #{VasConnection.extract_value_from("//@status", response)}\n" +
          "Command: #{tosend}\n" +
          "Response: #{response.to_xml}"
    log_message msg, :error
    raise VasExceptions::CommandException.new(msg)
  end
  
  response
end
state() click to toggle source
# File lib/openvas-cli/vas_connection.rb, line 51
def state
  @socket ? @socket.state : "closed"
end

Private Instance Methods

connect() click to toggle source
# File lib/openvas-cli/vas_connection.rb, line 132
def connect
  log_message("Connecting: :host => #{@config.host}, :port => #{@config.port}", :info)
  plain_socket       = TCPSocket.open(@config.host, @config.port)
  ssl_context        = OpenSSL::SSL::SSLContext.new
  @socket            = OpenSSL::SSL::SSLSocket.new(plain_socket, ssl_context)
  @socket.sync_close = true
  @socket.connect
end
log_message(msg, level) click to toggle source
# File lib/openvas-cli/vas_connection.rb, line 115
def log_message(msg, level)
  if @logger
    case level
    when :debug
      @logger.debug msg
    when :info
      @logger.info msg
    when :warn
      @logger.warn msg
    when :error
      @logger.error msg
    when :fatal
      @logger.fatal msg
    end
  end
end