class NoradServerspecRunner::Task

Class to run serverspec tests

Constants

SSH_TIMEOUT

Attributes

host[RW]
ssh_port[RW]
sshkey[RW]
username[RW]

Public Class Methods

new(tests, sub_tests, results_file) click to toggle source
# File lib/norad_serverspec_runner/task.rb, line 15
def initialize(tests, sub_tests, results_file)
  @obj = RSpec::Core::RakeTask.new(@host) do |_|
    true
  end

  @obj.pattern = tests
  @obj.rspec_opts = "-e #{sub_tests} --format json -o #{results_file}"
  @results_file = results_file
end

Public Instance Methods

run() click to toggle source
# File lib/norad_serverspec_runner/task.rb, line 38
def run
  pstderr = STDERR.dup
  ftmp = Tempfile.open('eout')
  FileUtils.touch @results_file
  return if unable_to_ssh?

  # Run the rspec tests
  if defined?(@host) and defined?(@username) and defined?(@sshkey)
    ENV['AUDIT_HOST'] = @host
    ENV['AUDIT_USERNAME'] = @username
    ENV['AUDIT_SSHKEY'] = @sshkey
    ENV['AUDIT_SSH_PORT'] = @ssh_port
  end

  # Capture STDERR for SSH related errors
  STDERR.reopen(ftmp)
  @obj.run_task(true)
rescue SystemExit => e
  ftmp.rewind
  err = ftmp.read
  ftmp.close
  p err
  # We land here even on successful run (SystemExit exception), only report error if stderr is not empty
  if err =~ /Please set sudo password to Specinfra.configuration.sudo_password|set :request_pty, true/
    write_error_to_results_file "SSH user #{@username} requires SUDO permission with NOPASSWD: option set."
  elsif not err.empty?
    write_error_to_results_file err
  end
rescue Exception => e
  # Unknown exception!
  write_error_to_results_file e.message
ensure
  STDERR.reopen pstderr
end
unable_to_ssh?() click to toggle source

Check if given host/ip is reachable and we can ssh as root If not, then create empty log file for that host and return false.

# File lib/norad_serverspec_runner/task.rb, line 27
def unable_to_ssh?
  session = Net::SSH.start( @host, @username, :port => @ssh_port, :timeout => SSH_TIMEOUT, :auth_methods => ['publickey'], :keys => [@sshkey] )
  session.exec('ls')
  session.close()
  false
rescue Net::SSH::AuthenticationFailed, Net::SSH::ConnectionTimeout, Net::SSH::Timeout, Net::SSH::Exception, Errno::ECONNREFUSED, Errno::EHOSTUNREACH => e
  p e
  write_error_to_results_file e.message
  true
end

Private Instance Methods

write_error_to_results_file(error) click to toggle source
# File lib/norad_serverspec_runner/task.rb, line 75
def write_error_to_results_file(error)
  File.open(@results_file, "w") do |f|
    f.write "!! NORAD SPECS SSH ERROR !!\nError: #{error}\n"
  end
end