summaryrefslogtreecommitdiffstats
path: root/lib/puppet/application
diff options
context:
space:
mode:
authorDaniel Pittman <daniel@puppetlabs.com>2011-04-07 17:58:07 -0700
committerDaniel Pittman <daniel@puppetlabs.com>2011-04-07 18:01:33 -0700
commit0f24db1c3fd0aa6601ba032aedbe25be36010954 (patch)
tree08af1180a4468145af66ee429ce3a80236e08fff /lib/puppet/application
parentaf792351a62399f8bbeba0d2425f2b88eabb3dff (diff)
parent79f4774182046d2fdf392c1eb27ee78505659199 (diff)
downloadpuppet-0f24db1c3fd0aa6601ba032aedbe25be36010954.tar.gz
puppet-0f24db1c3fd0aa6601ba032aedbe25be36010954.tar.xz
puppet-0f24db1c3fd0aa6601ba032aedbe25be36010954.zip
Merge puppet-interfaces into puppet.
This joins the two repositories, including full history, into a single run, as well as landing the interfaces work on the next branch ready for release.
Diffstat (limited to 'lib/puppet/application')
-rw-r--r--lib/puppet/application/catalog.rb4
-rw-r--r--lib/puppet/application/certificate.rb18
-rw-r--r--lib/puppet/application/certificate_request.rb4
-rw-r--r--lib/puppet/application/certificate_revocation_list.rb4
-rw-r--r--lib/puppet/application/config.rb4
-rw-r--r--lib/puppet/application/configurer.rb23
-rw-r--r--lib/puppet/application/faces.rb95
-rw-r--r--lib/puppet/application/faces_base.rb150
-rw-r--r--lib/puppet/application/facts.rb4
-rw-r--r--lib/puppet/application/file.rb4
-rw-r--r--lib/puppet/application/indirection_base.rb4
-rw-r--r--lib/puppet/application/key.rb4
-rw-r--r--lib/puppet/application/node.rb4
-rw-r--r--lib/puppet/application/report.rb4
-rw-r--r--lib/puppet/application/resource_type.rb4
-rw-r--r--lib/puppet/application/status.rb4
16 files changed, 334 insertions, 0 deletions
diff --git a/lib/puppet/application/catalog.rb b/lib/puppet/application/catalog.rb
new file mode 100644
index 000000000..10ce05be7
--- /dev/null
+++ b/lib/puppet/application/catalog.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Catalog < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/certificate.rb b/lib/puppet/application/certificate.rb
new file mode 100644
index 000000000..eacb830b2
--- /dev/null
+++ b/lib/puppet/application/certificate.rb
@@ -0,0 +1,18 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Certificate < Puppet::Application::IndirectionBase
+ def setup
+ unless options[:ca_location]
+ raise ArgumentError, "You must have a CA location specified;\n" +
+ "use --ca-location to specify the location (remote, local, only)"
+ end
+
+ location = Puppet::SSL::Host.ca_location
+ if location == :local && !Puppet::SSL::CertificateAuthority.ca?
+ self.class.run_mode("master")
+ self.set_run_mode self.class.run_mode
+ end
+
+ super
+ end
+end
diff --git a/lib/puppet/application/certificate_request.rb b/lib/puppet/application/certificate_request.rb
new file mode 100644
index 000000000..1b1b0830c
--- /dev/null
+++ b/lib/puppet/application/certificate_request.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Certificate_request < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/certificate_revocation_list.rb b/lib/puppet/application/certificate_revocation_list.rb
new file mode 100644
index 000000000..60b9d97d6
--- /dev/null
+++ b/lib/puppet/application/certificate_revocation_list.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Certificate_revocation_list < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/config.rb b/lib/puppet/application/config.rb
new file mode 100644
index 000000000..41a46c339
--- /dev/null
+++ b/lib/puppet/application/config.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/faces_base'
+
+class Puppet::Application::Config < Puppet::Application::FacesBase
+end
diff --git a/lib/puppet/application/configurer.rb b/lib/puppet/application/configurer.rb
new file mode 100644
index 000000000..751e6b4d7
--- /dev/null
+++ b/lib/puppet/application/configurer.rb
@@ -0,0 +1,23 @@
+require 'puppet/application'
+require 'puppet/faces'
+
+class Puppet::Application::Configurer < Puppet::Application
+ should_parse_config
+ run_mode :agent
+
+ option("--debug", "-d")
+ option("--verbose", "-v")
+
+ def setup
+ if options[:debug] or options[:verbose]
+ Puppet::Util::Log.level = options[:debug] ? :debug : :info
+ end
+
+ Puppet::Util::Log.newdestination(:console)
+ end
+
+ def run_command
+ report = Puppet::Faces[:configurer, '0.0.1'].synchronize(Puppet[:certname])
+ Puppet::Faces[:report, '0.0.1'].submit(report)
+ end
+end
diff --git a/lib/puppet/application/faces.rb b/lib/puppet/application/faces.rb
new file mode 100644
index 000000000..904a0cccc
--- /dev/null
+++ b/lib/puppet/application/faces.rb
@@ -0,0 +1,95 @@
+require 'puppet/application'
+require 'puppet/faces'
+
+class Puppet::Application::Faces < Puppet::Application
+
+ should_parse_config
+ run_mode :agent
+
+ option("--debug", "-d") do |arg|
+ Puppet::Util::Log.level = :debug
+ end
+
+ option("--verbose", "-v") do
+ Puppet::Util::Log.level = :info
+ end
+
+ def list(*arguments)
+ if arguments.empty?
+ arguments = %w{terminuses actions}
+ end
+ faces.each do |name|
+ str = "#{name}:\n"
+ if arguments.include?("terminuses")
+ begin
+ terms = terminus_classes(name.to_sym)
+ str << "\tTerminuses: #{terms.join(", ")}\n"
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ $stderr.puts "Could not load terminuses for #{name}: #{detail}"
+ end
+ end
+
+ if arguments.include?("actions")
+ begin
+ actions = actions(name.to_sym)
+ str << "\tActions: #{actions.join(", ")}\n"
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ $stderr.puts "Could not load actions for #{name}: #{detail}"
+ end
+ end
+
+ print str
+ end
+ end
+
+ attr_accessor :verb, :name, :arguments
+
+ def main
+ # Call the method associated with the provided action (e.g., 'find').
+ send(verb, *arguments)
+ end
+
+ def setup
+ Puppet::Util::Log.newdestination :console
+
+ load_applications # Call this to load all of the apps
+
+ @verb, @arguments = command_line.args
+ @arguments ||= []
+
+ validate
+ end
+
+ def validate
+ unless verb
+ raise "You must specify 'find', 'search', 'save', or 'destroy' as a verb; 'save' probably does not work right now"
+ end
+
+ unless respond_to?(verb)
+ raise "Command '#{verb}' not found for 'faces'"
+ end
+ end
+
+ def faces
+ Puppet::Faces.faces
+ end
+
+ def terminus_classes(indirection)
+ Puppet::Indirector::Terminus.terminus_classes(indirection).collect { |t| t.to_s }.sort
+ end
+
+ def actions(indirection)
+ return [] unless faces = Puppet::Faces[indirection, '0.0.1']
+ faces.load_actions
+ return faces.actions.sort { |a, b| a.to_s <=> b.to_s }
+ end
+
+ def load_applications
+ command_line.available_subcommands.each do |app|
+ command_line.require_application app
+ end
+ end
+end
+
diff --git a/lib/puppet/application/faces_base.rb b/lib/puppet/application/faces_base.rb
new file mode 100644
index 000000000..288b50048
--- /dev/null
+++ b/lib/puppet/application/faces_base.rb
@@ -0,0 +1,150 @@
+require 'puppet/application'
+require 'puppet/faces'
+
+class Puppet::Application::FacesBase < Puppet::Application
+ should_parse_config
+ run_mode :agent
+
+ option("--debug", "-d") do |arg|
+ Puppet::Util::Log.level = :debug
+ end
+
+ option("--verbose", "-v") do
+ Puppet::Util::Log.level = :info
+ end
+
+ option("--format FORMAT") do |arg|
+ @format = arg.to_sym
+ end
+
+ option("--mode RUNMODE", "-r") do |arg|
+ raise "Invalid run mode #{arg}; supported modes are user, agent, master" unless %w{user agent master}.include?(arg)
+ self.class.run_mode(arg.to_sym)
+ set_run_mode self.class.run_mode
+ end
+
+
+ attr_accessor :face, :action, :type, :arguments, :format
+ attr_writer :exit_code
+
+ # This allows you to set the exit code if you don't want to just exit
+ # immediately but you need to indicate a failure.
+ def exit_code
+ @exit_code || 0
+ end
+
+ # Override this if you need custom rendering.
+ def render(result)
+ render_method = Puppet::Network::FormatHandler.format(format).render_method
+ if render_method == "to_pson"
+ jj result
+ exit(0)
+ else
+ result.send(render_method)
+ end
+ end
+
+ def preinit
+ super
+ Signal.trap(:INT) do
+ $stderr.puts "Cancelling Face"
+ 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.
+
+ # TODO: These should be configurable versions, through a global
+ # '--version' option, but we don't implement that yet... --daniel 2011-03-29
+ @type = self.class.name.to_s.sub(/.+:/, '').downcase.to_sym
+ @face = Puppet::Faces[@type, :current]
+ @format = @face.default_format
+
+ # 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
+ index = -1
+ until @action or (index += 1) >= command_line.args.length do
+ item = command_line.args[index]
+ if item =~ /^-/ then
+ option = @face.options.find do |name|
+ item =~ /^-+#{name.to_s.gsub(/[-_]/, '[-_]')}(?:[ =].*)?$/
+ end
+ if option then
+ option = @face.get_option(option)
+ # If we have an inline argument, just carry on. We don't need to
+ # care about optional vs mandatory in that case because we do a real
+ # parse later, and that will totally take care of raising the error
+ # when we get there. --daniel 2011-04-04
+ if option.takes_argument? and !item.index('=') then
+ index += 1 unless
+ (option.optional_argument? and command_line.args[index + 1] =~ /^-/)
+ end
+ elsif option = find_global_settings_argument(item) then
+ unless Puppet.settings.boolean? option.name then
+ # As far as I can tell, we treat non-bool options as always having
+ # a mandatory argument. --daniel 2011-04-05
+ index += 1 # ...so skip the argument.
+ end
+ else
+ raise ArgumentError, "Unknown option #{item.sub(/=.*$/, '').inspect}"
+ end
+ else
+ action = @face.get_action(item.to_sym)
+ if action.nil? then
+ raise ArgumentError, "#{@face} does not have an #{item.inspect} action!"
+ end
+ @action = action
+ end
+ end
+
+ @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 find_global_settings_argument(item)
+ Puppet.settings.each do |name, object|
+ object.optparse_args.each do |arg|
+ next unless arg =~ /^-/
+ # sadly, we have to emulate some of optparse here...
+ pattern = /^#{arg.sub('[no-]', '').sub(/[ =].*$/, '')}(?:[ =].*)?$/
+ pattern.match item and return object
+ end
+ end
+ return nil # nothing found.
+ end
+
+ def setup
+ Puppet::Util::Log.newdestination :console
+
+ @arguments = command_line.args
+
+ # Note: because of our definition of where the action is set, we end up
+ # with it *always* being the first word of the remaining set of command
+ # line arguments. So, strip that off when we construct the arguments to
+ # pass down to the face action. --daniel 2011-04-04
+ @arguments.delete_at(0)
+
+ # We copy all of the app options to the end of the call; This allows each
+ # 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
+ @arguments << options
+ end
+
+
+ def main
+ # Call the method associated with the provided action (e.g., 'find').
+ if result = @face.send(@action.name, *arguments)
+ puts render(result)
+ end
+ exit(exit_code)
+ end
+end
diff --git a/lib/puppet/application/facts.rb b/lib/puppet/application/facts.rb
new file mode 100644
index 000000000..d18b21ea7
--- /dev/null
+++ b/lib/puppet/application/facts.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Facts < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/file.rb b/lib/puppet/application/file.rb
new file mode 100644
index 000000000..32a81c7c6
--- /dev/null
+++ b/lib/puppet/application/file.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::File < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/indirection_base.rb b/lib/puppet/application/indirection_base.rb
new file mode 100644
index 000000000..7455ebedf
--- /dev/null
+++ b/lib/puppet/application/indirection_base.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/faces_base'
+
+class Puppet::Application::IndirectionBase < Puppet::Application::FacesBase
+end
diff --git a/lib/puppet/application/key.rb b/lib/puppet/application/key.rb
new file mode 100644
index 000000000..57835b627
--- /dev/null
+++ b/lib/puppet/application/key.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Key < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/node.rb b/lib/puppet/application/node.rb
new file mode 100644
index 000000000..38c1f8610
--- /dev/null
+++ b/lib/puppet/application/node.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Node < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/report.rb b/lib/puppet/application/report.rb
new file mode 100644
index 000000000..f7f961edd
--- /dev/null
+++ b/lib/puppet/application/report.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Report < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/resource_type.rb b/lib/puppet/application/resource_type.rb
new file mode 100644
index 000000000..59594262c
--- /dev/null
+++ b/lib/puppet/application/resource_type.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Resource_type < Puppet::Application::IndirectionBase
+end
diff --git a/lib/puppet/application/status.rb b/lib/puppet/application/status.rb
new file mode 100644
index 000000000..1c3ca054e
--- /dev/null
+++ b/lib/puppet/application/status.rb
@@ -0,0 +1,4 @@
+require 'puppet/application/indirection_base'
+
+class Puppet::Application::Status < Puppet::Application::IndirectionBase
+end