class Utils::ProbeServer
def clear_jobs
def clear_jobs queue_synchronize do unless @jobs_queue.empty? @jobs_queue.clear output_message "Cleared all queued jobs.", :type => :warn true else false end end end
def cmd(job)
def cmd(job) call = [] if ENV.key?('BUNDLE_GEMFILE') and bundle = `which bundle`.full?(:chomp) call << bundle << 'exec' end call.push($0, *job) output_message "Executing #{call.inspect} now.", :type => :info call end
def continue
def continue @pid and Process.kill :CONT, @pid end
def enqueue(job_args)
def enqueue(job_args) job = Job.new(self, job_args) output_message "#{job.inspect} enqueued." @jobs_queue.push job end
def initialize
def initialize @jobs_queue = Queue.new @current_job_id = 0 Thread.new { work_loop } end
def list_jobs
def list_jobs @jobs_queue.instance_variable_get(:@que) end
def next_job_id
def next_job_id @current_job_id += 1 end
def output_message(msg, opts = { :type => :info })
def output_message(msg, opts = { :type => :info }) msg = case opts[:type] when :success msg.on_green.black when :info, nil msg.on_color(118).black when :warn msg.on_color(166).black when :failure msg.on_red.blink.white end STDOUT.puts msg STDOUT.flush end
def queue_synchronize(&block)
def queue_synchronize(&block) @jobs_queue.instance_variable_get(:@mutex).synchronize(&block) end
def run_job(job)
def run_job(job) output_message "#{job.inspect} about to run now.", :type => :info @pid = fork { exec(*cmd(job.args)) } output_message "#{job.inspect} now running with pid #@pid.", :type => :info Process.wait @pid message = "#{job.inspect} was just run" if $?.success? message << " successfully." output_message message, :type => :success else message << " and failed with exit status #{$?.exitstatus}!" output_message message, :type => :failure end end
def shutdown
def shutdown output_message "Server was shutdown down – HARD!", :type => :warn exit! 23 end
def stop
def stop @pid and Process.kill :STOP, @pid end
def work_loop
def work_loop loop do job = @jobs_queue.shift run_job job end end