class Rcmd::DB

This class provides a middle layer for allowing a database to be queried for hosts. This is accomplished by using ActiveRecord for the middle layer and thus should support any database ActiveRecord supports. Currently however, only the following are properly configured for backend use in this class:

Backend Databases:

This is achieved in the ::db_connect method, which matches the specifed adapter with the appropriate 'require' call by use of a case statement. If you are needing/wanting to add another database to this you will need to add your require code for the db backend there. As we do this comparison, the various backends are not specified in the Gemspec file as it is the responsibilty of the user to ensure the correct gems are installed for the needed database.

This class relies on a yaml configuration file to be present and as such the 'DB.create_config' method is provided to create an example configuration which can be then edited. The options in the config file are:

Public Class Methods

create_config() click to toggle source

Create a base config file

# File lib/rcmd/db.rb, line 84
def DB.create_config
  puts "Function: #{@config_dir}"
  unless File.directory?(@config_dir)
    FileUtils.mkdir_p(@config_dir)
  end
  
  conf = [ :adapter => "sqlite3", :host => nil, :database => ':memory:', :table => 'servers', :username => nil, :password => nil, :host_field => 'hostname', :type_field => 'server_type', :os_field => 'osversion' ]
  
  File.open(@config_file, 'w') do |f|
    f.write(conf.to_yaml)
  end
end
db_connect() click to toggle source

Method for establishing a connection to the database backend according to the configuration file. This is also where we set the 'require' the need gems to interact with the chosen DB adapter and set the table_name variable of the class.

# File lib/rcmd/db.rb, line 162
def DB.db_connect
  self.load_config
  
  case @conf[:adapter].downcase
  when "sqlite3"
    require "sqlite3"
  when "mysql"
    require "mysql"
  when "frontbase"
    require "ruby-frontbase"
  when "firebird"
    require "fireruby"
  when "db2"
    require "ruby-db2"
  when "openbase"
    require "openbase"
  when "oracle"
    require "ruby-oci8"
  when "postgresql"
    require "ruby-postgres"
  end
    
  if @conf[:adapter].downcase == "sqlite3"
    ActiveRecord::Base.establish_connection(:adapter => @conf[:adapter].downcase,
                                            :database => @conf[:database])
  else
    ActiveRecord::Base.establish_connection(
                                            :adapter => @conf[:adapter].downcase,
                                            :host => @conf[:host],
                                            :username => @conf[:username],
                                            :password => @conf[:password],
                                            :database => @conf[:database] )
  end

  @table_name = @conf[:table]
end
load_config() click to toggle source

Method called by ::db_connect to load the yaml configuration file and perform some basic sanity checks and disabling of os/type queries if those fields are not in the configuration

# File lib/rcmd/db.rb, line 121
def DB.load_config
  unless File.file?(@config_file)
    raise RuntimeError, "No database configuration file found: #{@config_file}"
  end

  @conf = YAML.load_file(@config_file)[0]

  unless @conf[:adapter]
    raise RuntimeError, "No adapter specified for database backend"
  end
  
  unless @conf[:type_field]
    @db_type_queries = false
  end

  unless @conf[:os_field]
    @db_os_queries = false
  end

  unless @conf[:adapter].downcase == "sqlite3"
    if @conf[:host].nil?
      raise RuntimeError, "No database host server specified"
    end
    if @conf[:username].nil? || @conf[:password].nil?
      raise RuntimeError, "No DB credentials specified"
    end
  end

  if @conf[:database].nil?
    raise RuntimeError, "No database specified"
  end

  if @conf[:table].nil?
    raise RuntimeError, "Table not specified"
  end
end
override_config_file(path) click to toggle source

Method for overiding the location and name of the default config file

# File lib/rcmd/db.rb, line 79
def DB.override_config_file(path)
  @config_file = path
end
query_by_hostname(term) click to toggle source

Performs “LIKE” queries on the host_field (hostname)

# File lib/rcmd/db.rb, line 98
def DB.query_by_hostname(term)
  return where("#{@conf[:host_field]} LIKE ?", term ).map { |r| r[@conf[:host_field]] }
end
query_by_os(term) click to toggle source

Perform direct 'Hash style' queries on the os_field

# File lib/rcmd/db.rb, line 103
def DB.query_by_os(term)
  unless @db_os_queries
    raise RuntimeError, "OS based queries not supported in the configuration supplied"
  end
  return where(@conf[:os_field] => term).map { |r| r[@conf[:host_field]] }
end
query_by_type(term) click to toggle source

Perform direct 'Hash style' queries on the type_field

# File lib/rcmd/db.rb, line 111
def DB.query_by_type(term)
  unless @db_type_queries
    raise RuntimeError, "Type queries not supported in the configuration supplied"
  end
  return where(@conf[:type_field] => term).map { |r| r[@conf[:host_field]] }
end