87 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			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)
 |