From b36da66f1067c58ea829ba436f770c7bd62085bd Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 29 Sep 2015 07:10:05 +0100 Subject: use a class --- rubyfy.rb | 165 +++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 88 insertions(+), 77 deletions(-) (limited to 'rubyfy.rb') diff --git a/rubyfy.rb b/rubyfy.rb index 2199249..0548dd0 100755 --- a/rubyfy.rb +++ b/rubyfy.rb @@ -9,46 +9,100 @@ require "net/ssh" require "pp" require "thread" -$ARGS = Hash.new -$LOG_MUTEX = Mutex.new +class Rubyfy + def initialize(opts) + @args = Hash.new + @log_mutex = Mutex.new -def log(severity, message) - return if severity == :VERBOSE and not $ARGS["--verbose"] - $LOG_MUTEX.synchronize do - puts "#{severity}::#{message}" + opts.each do |opt, arg| + @args[opt] = arg + end + + log(:DEBUG, @args) if @args["--debug"] end -end -def run_command(server, command="uptime", root=false, user=ENV["USER"]) - log(:VERBOSE,"#{server}::Connecting") - sudo = root ? "sudo " : "" - Net::SSH.start(server, user) do |session| - log(:VERBOSE, "#{server}::Executing #{sudo}#{command}") - session.exec!("#{sudo}#{command}") do |channel, stream, data| - log(:OUT, "#{server}::#{data}") unless $ARGS["--silent"] + def run + servers, jobs = [], [] + STDIN.read.split("\n").each { |s| servers << s } + + work_q = Queue.new + servers.each do |server| + job = { + :SERVER => server, + :COMMAND => @args["--command"], + :ROOT => @args["--root"], + :STATUS => :NONE, + } + jobs << job + work_q.push(job) + end + + parallel = @args["--parallel"].to_i + + threads = (1..parallel).map do + Thread.new do + begin + while job = work_q.pop(true) + run_job(job) + end + rescue ThreadError => e + rescue => e + log(:ERROR, "#{job[:SERVER]}::#{e.message}") + log(:ERROR, "#{job[:SERVER]}::#{e.inspect}") + end + end + end + + threads.map(&:join) + log(:INFO, "-::Done processing all servers") + + jobs.each do |job| + if job[:STATUS] != :OK + log(:WARN,"#{job[:SERVER]}::No job result") + end end end -end -def run_job(job) - server = job[:SERVER] - command = job[:COMMAND] - root = job[:ROOT] - log(:VERBOSE, "#{server}::Running job #{job}") - if File.exists?("#{server}.ignore") - log(:INFO, "#{server}::Ignoring this server") - else - run_command server, command, root +private + + def log(severity, message) + return if severity == :VERBOSE and not @args["--verbose"] + @log_mutex.synchronize do + puts "#{severity}::#{message}" + end + end + + def run_command(server, command="uptime", root=false, user=ENV["USER"]) + log(:VERBOSE,"#{server}::Connecting") + sudo = root ? "sudo " : "" + Net::SSH.start(server, user) do |session| + log(:VERBOSE, "#{server}::Executing #{sudo}#{command}") + session.exec!("#{sudo}#{command}") do |channel, stream, data| + log(:OUT, "#{server}::#{data}") unless @args["--silent"] + end + end end - job[:STATUS] = :OK -end -def http_get(uri_str, content_type="application/json") - uri = URI.parse(uri_str) - req = Net::HTTP::Get.new(uri.path) - req.[]=("Accept", content_type) - http = Net::HTTP.new(uri.host, uri.port) - http.request(req).body + def run_job(job) + server = job[:SERVER] + command = job[:COMMAND] + root = job[:ROOT] + log(:VERBOSE, "#{server}::Running job #{job}") + if File.exists?("#{server}.ignore") + log(:INFO, "#{server}::Ignoring this server") + else + run_command server, command, root + end + job[:STATUS] = :OK + end + + def http_get(uri_str, content_type="application/json") + uri = URI.parse(uri_str) + req = Net::HTTP::Get.new(uri.path) + req.[]=("Accept", content_type) + http = Net::HTTP.new(uri.host, uri.port) + http.request(req).body + end end begin @@ -61,49 +115,6 @@ begin [ "--verbose", "-v", GetoptLong::OPTIONAL_ARGUMENT ], ) - opts.each do |opt, arg| - $ARGS[opt] = arg - end - - log(:DEBUG, $ARGS) if $ARGS["--debug"] - - servers, jobs = [], [] - STDIN.read.split("\n").each { |s| servers << s } - - work_q = Queue.new - servers.each do |server| - job = { - :SERVER => server, - :COMMAND => $ARGS["--command"], - :ROOT => $ARGS["--root"], - :STATUS => :NONE, - } - jobs << job - work_q.push(job) - end - - parallel = $ARGS["--parallel"].to_i - - threads = (1..parallel).map do - Thread.new do - begin - while job = work_q.pop(true) - run_job(job) - end - rescue ThreadError => e - rescue => e - log(:ERROR, "#{job[:SERVER]}::#{e.message}") - log(:ERROR, "#{job[:SERVER]}::#{e.inspect}") - end - end - end - - threads.map(&:join) - log(:INFO, "-::Done processing all servers") - - jobs.each do |job| - if job[:STATUS] != :OK - log(:WARN,"#{job[:SERVER]}::No job result") - end - end + rubyfy = Rubyfy.new(opts) + rubyfy.run end -- cgit v1.2.3