94 lines
2.4 KiB
Ruby
94 lines
2.4 KiB
Ruby
|
libs = %W(
|
||
|
#{File.dirname(__FILE__)}/mrsh_settings.rb
|
||
|
#{File.dirname(__FILE__)}/mrsh_reporter.rb
|
||
|
)
|
||
|
|
||
|
libs.each {|lib| require lib}
|
||
|
|
||
|
require 'resolv'
|
||
|
|
||
|
class Machine
|
||
|
def initialize(host,config)
|
||
|
@host = host
|
||
|
@config = config
|
||
|
|
||
|
@host.hostname = @host.hostname.gsub(/\..*$/,'') # This might not make sense in the general use case
|
||
|
end
|
||
|
def ==(b)
|
||
|
return @host.hostname == b.hostname
|
||
|
end
|
||
|
def <=>(b)
|
||
|
return @host.hostname <=> b.hostname
|
||
|
end
|
||
|
def process
|
||
|
resolve or return
|
||
|
|
||
|
ping? or return
|
||
|
|
||
|
execute if rpc?
|
||
|
end
|
||
|
def resolve
|
||
|
@host.ip = Resolv.getaddress @host.hostname
|
||
|
rescue Resolv::ResolvError => e
|
||
|
@host.ip = nil
|
||
|
@host.status = :nodns
|
||
|
ensure
|
||
|
@host.resolved = @host.ip.nil? ? false : true
|
||
|
end
|
||
|
def ping?
|
||
|
@host.online = false
|
||
|
@host.status = :offline
|
||
|
|
||
|
command = sprintf @config.ping, @host.hostname
|
||
|
output = %x( #{command} ).chomp
|
||
|
status = ($?.exitstatus == 0)
|
||
|
|
||
|
if (status)
|
||
|
@host.online = true
|
||
|
@host.status = :online
|
||
|
elsif (output.match(/no answer from/) or output.match(/ 0( packets)? received,/))
|
||
|
# Handled by default values
|
||
|
elsif (output.match(/unknown host/)
|
||
|
@host.resolved = false
|
||
|
@host.status = :nodns
|
||
|
else
|
||
|
@host.ping_output = output.split.chomp
|
||
|
end
|
||
|
|
||
|
return @host.online
|
||
|
end
|
||
|
def execute
|
||
|
@host.output = Array.new
|
||
|
flags = '-T -o BatchMode=yes -nq'
|
||
|
|
||
|
return unless @config.command
|
||
|
|
||
|
begin
|
||
|
Timeout::timeout(@config.timeout) do
|
||
|
IO.popen(%Q{ssh #{flags} #{@host.hostname} "#{config.command}" 2>&1, "r") do |pipe|
|
||
|
while (line = pipe.gets) do
|
||
|
@host.output.push [ Time.now, line.chomp ]
|
||
|
end
|
||
|
pipe.close
|
||
|
@host.returncode = $?.exitstatus
|
||
|
end
|
||
|
end
|
||
|
rescue Timeout::Error
|
||
|
@host.returncode = 999
|
||
|
@host.output.push [ Time.now, "-- Timeout encountered, command did not return within #{@config.timeout} seconds -- " ]
|
||
|
rescue Exception => e
|
||
|
@host.returncode = 998
|
||
|
@host.output.push [ Time.now, " Exception: #{ e }" ]
|
||
|
e.backtrace.each do |line|
|
||
|
@host.output.push [ Time.now, line ]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
def rpc?
|
||
|
not @host.os.match(/Windows/Firmware/ESXi/i)
|
||
|
end
|
||
|
def method_missing(func,*args,&block)
|
||
|
@host.send(func,*args,&block)
|
||
|
end
|
||
|
end
|