#!/usr/bin/ruby1.8
#
# NAME
# custodian-enqueue - Parse tests from a file and enqueue to beanstalkd.
#
# SYNOPSIS
# custodian-enqueue [ -h | --help ]
# [ -m | --manual]
# [ -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 beanstalkd queue.
#
# The intention is that the tests will be pulled from the queue and
# executed by the companion program custodian-dequeue. 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 'beanstalk-client'
require 'getoptlong'
#
# Our code.
#
require 'custodian/parser'
require 'custodian/settings'
#
# Entry-point to our code.
#
if __FILE__ == $0 then
$help = false
$manual = false
#
# The beanstalkd server address.
#
settings = Custodian::Settings.instance()
$SERVER = settings.queue_server
begin
opts = GetoptLong.new(
[ "--dump", "-d", GetoptLong::NO_ARGUMENT ],
[ "--test", GetoptLong::NO_ARGUMENT ],
[ "--server", GetoptLong::REQUIRED_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 "--server" then
$SERVER = arg
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 server
#
queue = Beanstalk::Pool.new([$SERVER], "Custodian")
if ( ! queue )
puts "Failed to connect to beanstalk server: #{$SERVER}"
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.put( test.to_s )
end
end
end