lib/utils/probe_server.rb



# encoding: utf-8

require 'tins/xt'
require 'term/ansicolor'
class String
  include Term::ANSIColor
end

module Utils
  class ProbeServer
    def initialize
      @jobs    = Queue.new
      Thread.new { work_loop }
    end

    def enqueue(job)
      output_message "Job #{job.inspect} enqueued.".black.on_yellow
      @jobs.push job
    end
    alias run enqueue

    def shutdown
      output_message "Server was shutdown down – HARD!".white.on_red.blink
      exit! 23
    end

    private

    def output_message(msg)
      STDOUT.puts msg
      STDOUT.flush
    end

    def run_job(job)
      message = "Job #{job.inspect} about to run now:".black
      message = message.ask_and_send(:on_color, 166) || message.on_yellow
      output_message message
      fork do
        exec(*cmd(job))
      end
      Process.wait
      message = "Job #{job.inspect} was just run"
      if $?.success?
        message << " successfully."
        message = message.black.on_green
      else
        message << " and failed with exit status #{$?.exitstatus}!"
        message = message.white.on_red.blink
      end
      output_message message
    end

    def work_loop
      loop do
        job = @jobs.shift
        run_job job
      end
    end

    def cmd(job)
      [ $0, *job ]
    end
  end
end