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