Class MCollective::Optionparser
In: lib/mcollective/optionparser.rb
Parent: Object

A simple helper to build cli tools that supports a uniform command line layout.

Methods

Public Class methods

Creates a new instance of the parser, you can supply defaults and include named groups of options.

Starts a parser that defaults to verbose and that includs the filter options:

 oparser = MCollective::Optionparser.new({:verbose => true}, "filter")

Stats a parser in non verbose mode that does support discovery

 oparser = MCollective::Optionparser.new()

[Source]

    # File lib/mcollective/optionparser.rb, line 14
14:         def initialize(defaults = {}, include = nil)
15:             @parser = OptionParser.new
16:             @include = include
17: 
18:             timeout = ENV["MCOLLECTIVE_TIMEOUT"] || 5
19:             dtimeout = ENV["MCOLLECTIVE_DTIMEOUT"] || 2
20: 
21:             # expand_path is pretty lame, it relies on HOME environment
22:             # which isnt't always there so just handling all exceptions
23:             # here as cant find reverting to default
24:             begin
25:                 config = File.expand_path("~/.mcollective")
26: 
27:                  unless File.readable?(config) && File.file?(config)
28:                     config = "/etc/mcollective/client.cfg"
29:                 end
30:             rescue Exception => e
31:                 config = "/etc/mcollective/client.cfg"
32:             end
33: 
34:             @options = {:disctimeout => dtimeout.to_i,
35:                         :timeout     => timeout.to_i,
36:                         :verbose     => false,
37:                         :filter      => Util.empty_filter,
38:                         :config      => config}
39: 
40:             @options.merge!(defaults)
41:         end

Public Instance methods

These options will be added to all cli tools

[Source]

     # File lib/mcollective/optionparser.rb, line 106
106:         def add_common_options
107:             @parser.separator ""
108:             @parser.separator "Common Options"
109: 
110:             @parser.on('-c', '--config FILE', 'Load configuratuion from file rather than default') do |f|
111:                 @options[:config] = f
112:             end
113: 
114:             @parser.on('--dt', '--discovery-timeout SECONDS', Integer, 'Timeout for doing discovery') do |t|
115:                 @options[:disctimeout] = t
116:             end
117: 
118:             @parser.on('-t', '--timeout SECONDS', Integer, 'Timeout for calling remote agents') do |t|
119:                 @options[:timeout] = t
120:             end
121: 
122:             @parser.on('-q', '--quiet', 'Do not be verbose') do |v|
123:                 @options[:verbose] = false
124:             end
125: 
126:             @parser.on('-v', '--verbose', 'Be verbose') do |v|
127:                 @options[:verbose] = v
128:             end
129: 
130:             @parser.on('-h', '--help', 'Display this screen') do
131:                 puts @parser
132:                 exit! 1
133:             end
134:         end

These options will be added if you pass ‘filter’ into the include list of the constructor.

[Source]

     # File lib/mcollective/optionparser.rb, line 74
 74:         def add_filter_options
 75:             @parser.separator ""
 76:             @parser.separator "Host Filters"
 77: 
 78:             @parser.on('-W', '--with FILTER', 'Combined classes and facts filter') do |f|
 79:                 f.split(" ").each do |filter|
 80:                     if filter =~ /^(.+?)=(.+)/
 81:                         @options[:filter]["fact"] << {:fact => $1, :value => $2}
 82:                     else
 83:                         @options[:filter]["cf_class"] << filter
 84:                     end
 85:                 end
 86:             end
 87: 
 88:             @parser.on('-F', '--wf', '--with-fact fact=val', 'Match hosts with a certain fact') do |f|
 89:                 @options[:filter]["fact"] << {:fact => $1, :value => $2} if f =~ /^(.+?)=(.+)/
 90:             end
 91: 
 92:             @parser.on('-C', '--wc', '--with-class CLASS', 'Match hosts with a certain config management class') do |f|
 93:                 @options[:filter]["cf_class"] << f
 94:             end
 95: 
 96:             @parser.on('-A', '--wa', '--with-agent AGENT', 'Match hosts with a certain agent') do |a|
 97:                 @options[:filter]["agent"] << a
 98:             end
 99: 
100:             @parser.on('-I', '--wi', '--with-identity IDENT', 'Match hosts with a certain configured identity') do |a|
101:                 @options[:filter]["identity"] << a
102:             end
103:         end

Parse the options returning the options, you can pass a block that adds additional options to the Optionparser.

The sample below starts a parser that also prompts for —arguments in addition to the defaults. It also sets the description and shows a usage message specific to this app.

 options = oparser.parse{|parser, options|
      parser.define_head "Control the mcollective controller daemon"
      parser.banner = "Usage: sh-mcollective [options] command"

      parser.on('--arg', '--argument ARGUMENT', 'Argument to pass to agent') do |v|
          options[:argument] = v
      end
 }

[Source]

    # File lib/mcollective/optionparser.rb, line 57
57:         def parse(&block)
58:             yield(@parser, @options) if block_given?
59: 
60:             add_common_options
61: 
62:             [@include].flatten.compact.each do |i|
63:                 options_name = "add_#{i}_options"
64:                 send(options_name)  if respond_to?(options_name)
65:             end
66: 
67:             @parser.parse!
68: 
69:             @options
70:         end

[Validate]