Adding the mrsh_machine.rb library
This commit is contained in:
parent
dee99e5e96
commit
35365f6a67
93
mrsh/lib/mrsh_machine.rb
Normal file
93
mrsh/lib/mrsh_machine.rb
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
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
|
Loading…
Reference in New Issue
Block a user