class Vmreverter::Options

Public Class Methods

options() click to toggle source
# File lib/vmreverter/options.rb, line 4
def self.options
  return @options
end
parse_args() click to toggle source
# File lib/vmreverter/options.rb, line 9
def self.parse_args
  return @options if @options

  @no_args = ARGV.empty? ? true : false

  @defaults = {}
  @options = {}
  @options_from_file = {}

  # CLI exits cleanly, raise for library usage
  @defaults[:aborts] = true

  optparse = OptionParser.new do|opts|
    # Set a banner
    opts.banner = "Usage: #{File.basename($0)} #{::Vmreverter::VERSION} [options...]"

    @defaults[:auth] = File.join(ENV['HOME'], '.fog')
    opts.on '-a', '--auth FILE',
            'Use authentication FILE',
            "Default: #{@defaults[:auth]}" do |file|
      @options[:auth] = file
    end

    @defaults[:config] = nil
    opts.on '-c', '--config FILE',
            'Use configuration FILE',
            "Default: #{@defaults[:config]}" do |file|
      @options[:config] = file
    end

    @defaults[:options_file] = nil
    opts.on '-o', '--options-file FILE',
            'Read options from FILE',
            'This should evaluate to a ruby hash.',
            'CLI optons are given precedence.' do |file|
      @options_from_file = parse_options_file file
    end

    @defaults[:lockfile] = nil
    opts.on '-l', '--lockfile FILE',
            'Use a lockfile to prevent concurrency',
            '(default no lockfile).' do |file|
      @options[:lockfile] = file
    end

    @defaults[:quiet] = false
    opts.on '-q', '--[no-]quiet',
            'Do not log output to STDOUT',
            '(default: false)' do |bool|
      @options[:quiet] = bool
    end

    @defaults[:color] = true
    opts.on '--[no-]color',
            'Do not display color in log output',
            '(default: true)' do |bool|
      @options[:color] = bool
    end

    @defaults[:debug] = false
    opts.on '--[no-]debug',
            'Enable full debugging',
            '(default: false)' do |bool|
      @options[:debug] = bool
    end


    opts.on_tail("-h","--help","Display this screen") do
      puts opts
      exit
    end
  end

  optparse.parse!

  # We have use the @no_args var because OptParse consumes ARGV as it parses
  # so we have to check the value of ARGV at the begining of the method,
  # let the options be set, then output usage.
  puts optparse if @no_args

  # merge in the options that we read from the file
  @options = @options_from_file.merge(@options)
  # merge in defaults
  @options = @defaults.merge(@options)

  if @options[:lockfile]
    pn = Pathname.new(@options[:lockfile])
    unless pn.dirname.writable?
      raise ArgumentError, "Specified lockfile path '#{pn.dirname}' is not writable. Check permissions."
    end
  end

  @options
end
parse_options_file(options_file_path) click to toggle source
# File lib/vmreverter/options.rb, line 104
def self.parse_options_file(options_file_path)
  options_file_path = File.expand_path(options_file_path)
  unless File.exists?(options_file_path)
    raise ArgumentError, "Specified options file '#{options_file_path}' does not exist!"
  end
  # This eval will allow the specified options file to have access to our
  #  scope.  It is important that the variable 'options_file_path' is
  #  accessible, because some existing options files (e.g. puppetdb) rely on
  #  that variable to determine their own location (for use in 'require's, etc.)
  result = eval(File.read(options_file_path))
  unless result.is_a? Hash
    raise ArgumentError, "Options file '#{options_file_path}' must return a hash!"
  end

  result
end