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