sundry/mrsh/mrsh
Orien Vandenbergh dee99e5e96 Implementation of mrsh in ruby
concept stolen from a friends homework of ~20 years ago
2014-12-23 09:35:06 -07:00

87 lines
1.7 KiB
Ruby

#!/usr/bin/env ruby
libs = %W(
#{File.dirname(__FILE__)}/lib/mrsh/mrsh_machine.rb
#{File.dirname(__FILE__)}/../lib/mrsh_machine.rb
)
libs.each do |lib|
if File.exists?(lib) then
require lib
break
end
end
require 'thread'
require 'getoptlong'
require 'ostruct'
settings = Settings.new
hosts = settings.loadSystems
maxthreads = [settings.max_threads,hosts.length].min
threads = Array.new
orig_hosts = hosts
puts "\n"
if hosts.empty?
puts "No systems match requirements"
exit
end
Signal.trap("QUIT") do
puts
puts "Thread Report:"
t = Time.now
threads.each_with_index do |thr,i|
printf(" Thread: %d - Host: %-15s - %0.2f seconds\n", i, thr[:hosts].hostname, (t - thr[:start]))
end
puts
end
reporter = Reporter.new(settings)
loop do
while (hosts.size > 0 or threads.size > 0) do
if (hosts.size > 0 and (threads.size < maxthreads)) then
host = hosts.shift
thread = Thread.new(host) do |host|
Thread.current[:start] = Time.now
Thread.current[:host] = host
machine = Machine.new(host,settings)
machine.process
Thread.current[:end] = Time.now
Thread.current[:duration] = Thread.current[:end] - Thread.current[:start]
end
threads.push(thread)
end
threads.each do |thr|
if (thr.status = false) or (thr.status.nil?)
host = thr[:host]
host.duration = thr[:duration]
threads.delete(thr)
reporter.report(host)
end
if (threads.size == maxthreads) then
sleep(0.05)
end
end
end
if (settings.repeat)
hosts = orig_hosts
reporter.loop
else
break
end
end
exit(0)