Class MCollective::Application
In: lib/mcollective/application.rb
Parent: Object

Methods

Included Modules

RPC

Classes and Modules

Class MCollective::Application::Facts
Class MCollective::Application::Find
Class MCollective::Application::Help
Class MCollective::Application::Inventory
Class MCollective::Application::Ping
Class MCollective::Application::Rpc

Public Class methods

[Source]

    # File lib/mcollective/application.rb, line 16
16:             def [](option)
17:                 intialize_application_options unless @application_options
18:                 @application_options[option]
19:             end

[Source]

    # File lib/mcollective/application.rb, line 11
11:             def []=(option, value)
12:                 intialize_application_options unless @application_options
13:                 @application_options[option] = value
14:             end

[Source]

   # File lib/mcollective/application.rb, line 6
6:             def application_options
7:                 intialize_application_options unless @application_options
8:                 @application_options
9:             end

[Source]

    # File lib/mcollective/application.rb, line 21
21:             def description(descr)
22:                 self[:description] = descr
23:             end

[Source]

    # File lib/mcollective/application.rb, line 42
42:             def intialize_application_options
43:                 @application_options = {:description   => nil,
44:                                         :usage         => [],
45:                                         :cli_arguments => []}
46:             end

[Source]

    # File lib/mcollective/application.rb, line 29
29:             def option(name, arguments)
30:                 opt = {:name => name,
31:                        :description => nil,
32:                        :arguments => [],
33:                        :type => String,
34:                        :required => false,
35:                        :validate => Proc.new { true }}
36: 
37:                 arguments.each_pair{|k,v| opt[k] = v}
38: 
39:                 self[:cli_arguments] << opt
40:             end

[Source]

    # File lib/mcollective/application.rb, line 25
25:             def usage(usage)
26:                 self[:usage] << usage
27:             end

Public Instance methods

[Source]

     # File lib/mcollective/application.rb, line 166
166:         def application_cli_arguments
167:             self.class.application_options[:cli_arguments]
168:         end

[Source]

     # File lib/mcollective/application.rb, line 156
156:         def application_description
157:             self.class.application_options[:description]
158:         end

[Source]

     # File lib/mcollective/application.rb, line 170
170:         def application_failure(e)
171:             STDERR.puts "#{$0} failed to run: #{e} (#{e.class})"
172: 
173:             if options
174:                 e.backtrace.each{|l| STDERR.puts "\tfrom #{l}"} if options[:verbose]
175:             else
176:                 e.backtrace.each{|l| STDERR.puts "\tfrom #{l}"}
177:             end
178: 
179:             exit! 1
180:         end

[Source]

     # File lib/mcollective/application.rb, line 67
 67:         def application_parse_options
 68:             @options = rpcoptions do |parser, options|
 69:                 parser.define_head application_description if application_description
 70:                 parser.banner = ""
 71: 
 72:                 if application_usage
 73:                     parser.separator ""
 74: 
 75:                     application_usage.each do |u|
 76:                         parser.separator "Usage: #{u}"
 77:                     end
 78: 
 79:                     parser.separator ""
 80:                 end
 81: 
 82:                 parser.define_tail ""
 83:                 parser.define_tail "The Marionette Collective #{MCollective.version}"
 84: 
 85: 
 86:                 application_cli_arguments.each do |carg|
 87:                     opts_array = []
 88: 
 89:                     opts_array << :on
 90: 
 91:                     # if a default is set from the application set it up front
 92:                     if carg.include?(:default)
 93:                         configuration[carg[:name]] = carg[:default]
 94:                     end
 95: 
 96:                     # :arguments are multiple possible ones
 97:                     if carg[:arguments].is_a?(Array)
 98:                         carg[:arguments].each {|a| opts_array << a}
 99:                     else
100:                         opts_array << carg[:arguments]
101:                     end
102: 
103:                     # type was given and its not one of our special types, just pass it onto optparse
104:                     opts_array << carg[:type] if carg[:type] and ! [:bool, :array].include?(carg[:type])
105: 
106:                     opts_array << carg[:description]
107: 
108:                     # Handle our special types else just rely on the optparser to handle the types
109:                     if carg[:type] == :bool
110:                         parser.send(*opts_array) do |v|
111:                             validate_option(carg[:validate], carg[:name], v)
112: 
113:                             configuration[carg[:name]] = true
114:                         end
115: 
116:                     elsif carg[:type] == :array
117:                         parser.send(*opts_array) do |v|
118:                             validate_option(carg[:validate], carg[:name], v)
119: 
120:                             configuration[carg[:name]] = [] unless configuration.include?(carg[:name])
121:                             configuration[carg[:name]] << v
122:                         end
123: 
124:                     else
125:                         parser.send(*opts_array) do |v|
126:                             validate_option(carg[:validate], carg[:name], v)
127: 
128:                             configuration[carg[:name]] = v
129:                         end
130:                     end
131:                 end
132:             end
133: 
134:             # Check all required parameters were set
135:             validation_passed = true
136:             application_cli_arguments.each do |carg|
137:                 # Check for required arguments
138:                 if carg[:required]
139:                     unless configuration[ carg[:name] ]
140:                         validation_passed = false
141:                         STDERR.puts "The #{carg[:name]} option is mandatory"
142:                     end
143:                 end
144:             end
145: 
146:             unless validation_passed
147:                 STDERR.puts "\nPlease run with --help for detailed help"
148:                 exit! 1
149:             end
150: 
151:             post_option_parser(configuration) if respond_to?(:post_option_parser)
152:         rescue Exception => e
153:             application_failure(e)
154:         end

[Source]

     # File lib/mcollective/application.rb, line 160
160:         def application_usage
161:             usage = self.class.application_options[:usage]
162: 
163:             usage.empty? ? false : usage
164:         end

[Source]

    # File lib/mcollective/application.rb, line 49
49:         def configuration
50:             @application_configuration ||= {}
51:             @application_configuration
52:         end

abstract

[Source]

     # File lib/mcollective/application.rb, line 193
193:         def main
194:             STDERR.puts "Applications need to supply a 'main' method"
195:             exit 1
196:         end

[Source]

    # File lib/mcollective/application.rb, line 54
54:         def options
55:             @options
56:         end

[Source]

     # File lib/mcollective/application.rb, line 182
182:         def run
183:             application_parse_options
184: 
185:             validate_configuration(configuration) if respond_to?(:validate_configuration)
186: 
187:             main
188:         rescue Exception => e
189:             application_failure(e)
190:         end

[Source]

    # File lib/mcollective/application.rb, line 58
58:         def validate_option(blk, name, value)
59:             validation_result = blk.call(value)
60: 
61:             unless validation_result == true
62:                 STDERR.puts "Validation of #{name} failed: #{validation_result}"
63:                 exit! 1
64:             end
65:         end

[Validate]