#!/usr/bin/ruby -Ilib/ -I../lib/ -rubygems
#
# NAME
#  custodian-enqueue - Parse tests from a file and enqueue them.
#
# SYNOPSIS
#  custodian-enqueue  [ -h | --help ]
#                     [ -m | --manual]
#                     [ -q | --queue NAME]
#                     [ -f | --file FILE]
#                     [ -d | --dump ]
#                     [    | --test ]
#
# OPTIONS
#
#  -h, --help          Show a help message, and exit.
#
#  -m, --manual        Show this manual, and exit.
#
#  -d, --dump          Dump the parsed tests to the console; don't insert in the queue.
#
#  --test              Test the parsing of the given file, alert on errors.
#
#  -f, --file FILE     Parse the given configuration file.
#
#
#
# ABOUT
#
# This tool reads a single configuration file and parses it into a
# series of network & protocol tests.   These tests are then stored in
# a queue from which workers can retrieve and execute them.
#
# The dequeing process may occur up numerous other hosts.
#
# CONFIGURATION FILE
#
# The configuration file is 99% compatible with that used in the tool
# custodian replaces.
#
#
# AUTHOR
#
#  Steve Kemp  <steve@bytemark.co.uk>
#



#
# Standard modules
#
require 'getoptlong'

#
# Our code.
#
require 'custodian/parser'
require 'custodian/queue'
require 'custodian/settings'



#
#  Entry-point to our code.
#
if __FILE__ == $0 then

  $help   = false
  $manual = false

  begin
    opts = GetoptLong.new(
                          [ "--dump",  "-d", GetoptLong::NO_ARGUMENT ],
                          [ "--test",   GetoptLong::NO_ARGUMENT ],
                          [ "--file",  "-f", GetoptLong::REQUIRED_ARGUMENT ],
                          [ "--help",  "-h", GetoptLong::NO_ARGUMENT ],
                          [ "--manual","-m", GetoptLong::NO_ARGUMENT ]
                          )
    opts.each do |opt, arg|
      case opt
      when "--dump" then
          ENV["DUMP"] = "1"
      when "--test" then
          ENV["TEST"] = "1"
       when "--file" then
          ENV["FILE"] = arg
      when "--help" then
          $help = true
      when "--manual" then
          $manual = true
      end
    end
  rescue StandardError => ex
    puts "Option parsing failed: #{ex.to_s}"
    exit
  end


  #
  # CAUTION! Here be quality kode.
  #
  if $manual or $help

    # Open the file, stripping the shebang line
    lines = File.open(__FILE__){|fh| fh.readlines}[1..-1]

    found_synopsis = false

    lines.each do |line|

      line.chomp!
      break if line.empty?

      if $help and !found_synopsis
        found_synopsis = (line =~ /^#\s+SYNOPSIS\s*$/)
        next
      end

      puts line[2..-1].to_s

      break if $help and found_synopsis and line =~ /^#\s*$/

    end

    exit 0
  end


  #
  # Connected to the queue - be it redis or beanstalkd
  #
  settings = Custodian::Settings.instance()
  queue = Custodian::QueueType.create( settings.queue_type() )
  if ( ! queue )
    puts "Failed to connect to the #{settings.queue_type()} queue"
    exit 1
  end


  #
  # Create the parser object.
  #
  mon = Custodian::Parser.new()


  #
  # Parse our configuration file.  If there are errors then we'll
  # exit this script.
  #
  begin
    mon.parse_file( ENV['FILE'] )
  rescue => e
    puts "Failure in parsing the configuration file : #{ENV['FILE']}"
    puts e.to_s
    exit( 1 )
  end

  mon.jobs.each do |test|

    if ( ENV['TEST'] )
      # nop
    elsif ( ENV['DUMP'] )
      puts test
    else
      queue.add( test.to_s )
    end
  end

end