summaryrefslogtreecommitdiffstats
path: root/lib/puppet/application/string_base.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/application/string_base.rb')
-rw-r--r--lib/puppet/application/string_base.rb90
1 files changed, 49 insertions, 41 deletions
diff --git a/lib/puppet/application/string_base.rb b/lib/puppet/application/string_base.rb
index ffd49e8c0..1169a45a4 100644
--- a/lib/puppet/application/string_base.rb
+++ b/lib/puppet/application/string_base.rb
@@ -5,14 +5,6 @@ class Puppet::Application::StringBase < Puppet::Application
should_parse_config
run_mode :agent
- def preinit
- super
- trap(:INT) do
- $stderr.puts "Cancelling String"
- exit(0)
- end
- end
-
option("--debug", "-d") do |arg|
Puppet::Util::Log.level = :debug
end
@@ -32,7 +24,7 @@ class Puppet::Application::StringBase < Puppet::Application
end
- attr_accessor :string, :type, :verb, :arguments, :format
+ attr_accessor :string, :action, :type, :arguments, :format
attr_writer :exit_code
# This allows you to set the exit code if you don't want to just exit
@@ -41,14 +33,6 @@ class Puppet::Application::StringBase < Puppet::Application
@exit_code || 0
end
- def main
- # Call the method associated with the provided action (e.g., 'find').
- if result = string.send(verb, *arguments)
- puts render(result)
- end
- exit(exit_code)
- end
-
# Override this if you need custom rendering.
def render(result)
render_method = Puppet::Network::FormatHandler.format(format).render_method
@@ -61,16 +45,14 @@ class Puppet::Application::StringBase < Puppet::Application
end
def preinit
+ super
+ trap(:INT) do
+ $stderr.puts "Cancelling String"
+ exit(0)
+ end
+
# We need to parse enough of the command line out early, to identify what
# the action is, so that we can obtain the full set of options to parse.
- #
- # This requires a partial parse first, and removing the options that we
- # understood, then identification of the next item, then another round of
- # the same until we have the string and action all set. --daniel 2011-03-29
- #
- # NOTE: We can't use the Puppet::Application implementation of option
- # parsing because it is (*ahem*) going to puts on $stderr and exit when it
- # hits a parse problem, not actually let us reuse stuff. --daniel 2011-03-29
# TODO: These should be configurable versions, through a global
# '--version' option, but we don't implement that yet... --daniel 2011-03-29
@@ -78,19 +60,42 @@ class Puppet::Application::StringBase < Puppet::Application
@string = Puppet::String[@type, :current]
@format = @string.default_format
- # Now, collect the global and string options and parse the command line.
- begin
- @string.options.inject OptionParser.new do |options, option|
- option = @string.get_option option # turn it into the object, bleh
- options.on(*option.to_optparse) do |value|
- puts "REVISIT: do something with #{value.inspect}"
+ # Now, walk the command line and identify the action. We skip over
+ # arguments based on introspecting the action and all, and find the first
+ # non-option word to use as the action.
+ action = nil
+ cli = command_line.args.dup # we destroy this copy, but...
+ while @action.nil? and not cli.empty? do
+ item = cli.shift
+ if item =~ /^-/ then
+ option = @string.options.find { |a| item =~ /^-+#{a}\b/ }
+ if option then
+ if @string.get_option(option).takes_argument? then
+ # We don't validate if the argument is optional or mandatory,
+ # because it doesn't matter here. We just assume that errors will
+ # be caught later. --daniel 2011-03-30
+ cli.shift unless cli.first =~ /^-/
+ end
+ else
+ raise ArgumentError, "Unknown option #{item.sub(/=.*$/, '').inspect}"
end
- end.parse! command_line.args.dup
- rescue OptionParser::InvalidOption => e
- puts e.inspect # ...and ignore??
+ else
+ action = @string.get_action(item.to_sym)
+ if action.nil? then
+ raise ArgumentError, "#{@string} does not have an #{item.inspect} action!"
+ end
+ @action = action
+ end
end
- fail "REVISIT: Finish this code, eh..."
+ @action or raise ArgumentError, "No action given on the command line!"
+
+ # Finally, we can interact with the default option code to build behaviour
+ # around the full set of options we now know we support.
+ @action.options.each do |option|
+ option = @action.get_option(option) # make it the object.
+ self.class.option(*option.optparse) # ...and make the CLI parse it.
+ end
end
def setup
@@ -100,18 +105,21 @@ class Puppet::Application::StringBase < Puppet::Application
# action to read in the options. This replaces the older model where we
# would invoke the action with options set as global state in the
# interface object. --daniel 2011-03-28
- @verb = command_line.args.shift
@arguments = Array(command_line.args) << options
validate
end
+
+ def main
+ # Call the method associated with the provided action (e.g., 'find').
+ if result = @string.send(@action.name, *arguments)
+ puts render(result)
+ end
+ exit(exit_code)
+ end
def validate
- unless verb
+ unless @action
raise "You must specify #{string.actions.join(", ")} as a verb; 'save' probably does not work right now"
end
-
- unless string.action?(verb)
- raise "Command '#{verb}' not found for #{type}"
- end
end
end