summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Helwig <jacob@puppetlabs.com>2011-02-03 19:14:23 -0800
committerJacob Helwig <jacob@puppetlabs.com>2011-02-03 19:14:23 -0800
commitec4254dec20c8cc8ab9ef3065f4325ed52b9eacd (patch)
tree1d847e457af83163dadd933632ab3af1eeedbddd
parent876d0503dd93329a73e7f335c10a47330d745293 (diff)
parente10ba1ab720cb62b39b430104a55a987f4c37f31 (diff)
downloadpuppet-ec4254dec20c8cc8ab9ef3065f4325ed52b9eacd.tar.gz
puppet-ec4254dec20c8cc8ab9ef3065f4325ed52b9eacd.tar.xz
puppet-ec4254dec20c8cc8ab9ef3065f4325ed52b9eacd.zip
Merge branch '2.6.next' into 2.6.x
* 2.6.next: (#6018) Nick F's --help text for puppet inspect. (#5823) document the not-an-API status of set_run_mode (#5823) run mode can now be set dynamically... (6114) Update the audit metaparameter for 2.6.5. Fix for #5755 -- making zaml serialization robust over projected objects (#4139) hook log autoflush into global defaults
-rw-r--r--lib/puppet/application.rb16
-rw-r--r--lib/puppet/application/inspect.rb53
-rw-r--r--lib/puppet/defaults.rb6
-rw-r--r--lib/puppet/type.rb25
-rw-r--r--lib/puppet/util/log.rb6
-rw-r--r--lib/puppet/util/log/destinations.rb2
-rw-r--r--lib/puppet/util/zaml.rb2
-rwxr-xr-xspec/unit/application_spec.rb42
-rwxr-xr-xspec/unit/util/log/destinations_spec.rb13
-rwxr-xr-xspec/unit/util/log_spec.rb5
10 files changed, 160 insertions, 10 deletions
diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
index 17ad69cee..c3d7355f6 100644
--- a/lib/puppet/application.rb
+++ b/lib/puppet/application.rb
@@ -264,9 +264,21 @@ class Application
def initialize(command_line = nil)
require 'puppet/util/command_line'
@command_line = command_line || Puppet::Util::CommandLine.new
- @run_mode = self.class.run_mode
+ set_run_mode self.class.run_mode
@options = {}
+ require 'puppet'
+ end
+
+ # WARNING: This is a totally scary, frightening, and nasty internal API. We
+ # strongly advise that you do not use this, and if you insist, we will
+ # politely allow you to keep both pieces of your broken code.
+ #
+ # We plan to provide a supported, long-term API to deliver this in a way
+ # that you can use. Please make sure that you let us know if you do require
+ # this, and this message is still present in the code. --daniel 2011-02-03
+ def set_run_mode(mode)
+ @run_mode = mode
$puppet_application_mode = @run_mode
$puppet_application_name = name
@@ -281,8 +293,6 @@ class Application
Puppet.settings.set_value(:rundir, Puppet.run_mode.run_dir, :mutable_defaults)
Puppet.settings.set_value(:run_mode, Puppet.run_mode.name.to_s, :mutable_defaults)
end
-
- require 'puppet'
end
# This is the main application entry point
diff --git a/lib/puppet/application/inspect.rb b/lib/puppet/application/inspect.rb
index 77e8476a2..52ef97530 100644
--- a/lib/puppet/application/inspect.rb
+++ b/lib/puppet/application/inspect.rb
@@ -19,6 +19,59 @@ class Puppet::Application::Inspect < Puppet::Application
end
end
+ def help
+ puts <<-HELP ; exit # XXX
+
+SYNOPSIS
+========
+
+Prepare and submit an inspection report to the puppet master.
+
+
+USAGE
+=====
+
+ puppet inspect
+
+
+DESCRIPTION
+===========
+
+This command uses the cached catalog from the previous run of 'puppet
+agent' to determine which attributes of which resources have been
+marked as auditable with the 'audit' metaparameter. It then examines
+the current state of the system, writes the state of the specified
+resource attributes to a report, and submits the report to the puppet
+master.
+
+Puppet inspect does not run as a daemon, and must be run manually or from cron.
+
+
+OPTIONS
+=======
+
+Any configuration setting which is valid in the configuration file is
+also a valid long argument, e.g. '--server=master.domain.com'. See the
+configuration file documentation at
+http://docs.puppetlabs.com/references/latest/configuration.html for
+the full list of acceptable settings.
+
+
+AUTHOR
+======
+
+Puppet Labs
+
+
+COPYRIGHT
+=========
+
+Copyright (c) 2011 Puppet Labs, LLC
+Licensed under the GNU General Public License version 2
+
+ HELP
+ end
+
def setup
exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?
diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb
index 764cbbe2b..687ac4eb0 100644
--- a/lib/puppet/defaults.rb
+++ b/lib/puppet/defaults.rb
@@ -14,7 +14,11 @@ module Puppet
setdefaults(:main,
:trace => [false, "Whether to print stack traces on some errors"],
- :autoflush => [false, "Whether log files should always flush to disk."],
+ :autoflush => {
+ :default => false,
+ :desc => "Whether log files should always flush to disk.",
+ :hook => proc { |value| Log.autoflush = value }
+ },
:syslogfacility => ["daemon", "What syslog facility to use when logging to
syslog. Syslog has a fixed list of valid facilities, and you must
choose one of those; you cannot just make one up."],
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index e03650b54..f70a3ec0b 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -957,12 +957,25 @@ class Type
end
newmetaparam(:audit) do
- desc "Audit specified attributes of resources over time, and report if any have changed.
- This attribute can be used to track changes to any resource over time, and can
- provide an audit trail of every change that happens on any given machine.
-
- Note that you cannot both audit and manage an attribute - managing it guarantees
- the value, and any changes already get logged."
+ desc "Marks a subset of this resource's unmanaged attributes for auditing. Accepts an
+ attribute name or a list of attribute names.
+
+ Auditing a resource attribute has two effects: First, whenever a catalog
+ is applied with puppet apply or puppet agent, Puppet will check whether
+ that attribute of the resource has been modified, comparing its current
+ value to the previous run; any change will be logged alongside any actions
+ performed by Puppet while applying the catalog.
+
+ Secondly, marking a resource attribute for auditing will include that
+ attribute in inspection reports generated by puppet inspect; see the
+ puppet inspect documentation for more details.
+
+ Managed attributes for a resource can also be audited, but note that
+ changes made by Puppet will be logged as additional modifications. (I.e.
+ if a user manually edits a file whose contents are audited and managed,
+ puppet agent's next two runs will both log an audit notice: the first run
+ will log the user's edit and then revert the file to the desired state,
+ and the second run will log the edit made by Puppet.)"
validate do |list|
list = Array(list).collect {|p| p.to_sym}
diff --git a/lib/puppet/util/log.rb b/lib/puppet/util/log.rb
index 3fdac3f69..ba1690078 100644
--- a/lib/puppet/util/log.rb
+++ b/lib/puppet/util/log.rb
@@ -67,6 +67,12 @@ class Puppet::Util::Log
}
end
+ def Log.autoflush=(v)
+ @destinations.each do |type, dest|
+ dest.autoflush = v if dest.respond_to?(:autoflush=)
+ end
+ end
+
# Create a new log message. The primary role of this method is to
# avoid creating log messages below the loglevel.
def Log.create(hash)
diff --git a/lib/puppet/util/log/destinations.rb b/lib/puppet/util/log/destinations.rb
index 22b3dedb2..c70edeb02 100644
--- a/lib/puppet/util/log/destinations.rb
+++ b/lib/puppet/util/log/destinations.rb
@@ -50,6 +50,8 @@ Puppet::Util::Log.newdesttype :file do
@file.flush if defined?(@file)
end
+ attr_accessor :autoflush
+
def initialize(path)
@name = path
# first make sure the directory exists
diff --git a/lib/puppet/util/zaml.rb b/lib/puppet/util/zaml.rb
index 14aa90e5f..b22dfc199 100644
--- a/lib/puppet/util/zaml.rb
+++ b/lib/puppet/util/zaml.rb
@@ -20,6 +20,7 @@ class ZAML
def self.dump(stuff, where='')
z = new
stuff.to_zaml(z)
+ Label.counter_reset
where << z.to_s
end
#
@@ -61,6 +62,7 @@ class ZAML
end
def initialize(obj)
@this_label_number = nil
+ @obj = obj # prevent garbage collection so that object id isn't reused
@@previously_emitted_object[obj.object_id] = self
end
def to_s
diff --git a/spec/unit/application_spec.rb b/spec/unit/application_spec.rb
index c0f97336c..5a52c2d54 100755
--- a/spec/unit/application_spec.rb
+++ b/spec/unit/application_spec.rb
@@ -46,6 +46,48 @@ describe Puppet::Application do
end
end
+ it "should sadly and frighteningly allow run_mode to change at runtime" do
+ class TestApp < Puppet::Application
+ run_mode :master
+ def run_command
+ # This is equivalent to calling these methods externally to the
+ # instance, but since this is what "real world" code is likely to do
+ # (and we need the class anyway) we may as well test that. --daniel 2011-02-03
+ set_run_mode self.class.run_mode "agent"
+ end
+ end
+
+ Puppet[:run_mode].should == "user"
+
+ expect {
+ app = TestApp.new
+
+ Puppet[:run_mode].should == "master"
+
+ app.run
+
+ app.class.run_mode.name.should == :agent
+ $puppet_application_mode.name.should == :agent
+ }.should_not raise_error
+
+ Puppet[:run_mode].should == "agent"
+ end
+
+ it "it should not allow run mode to be set multiple times" do
+ pending "great floods of tears, you can do this right now" # --daniel 2011-02-03
+ app = Puppet::Application.new
+ expect {
+ app.set_run_mode app.class.run_mode "master"
+ $puppet_application_mode.name.should == :master
+ app.set_run_mode app.class.run_mode "agent"
+ $puppet_application_mode.name.should == :agent
+ }.should raise_error
+ end
+
+ it "should explode when an invalid run mode is set at runtime, for great victory"
+ # ...but you can, and while it will explode, that only happens too late for
+ # us to easily test. --daniel 2011-02-03
+
it "should have a run entry-point" do
@app.should respond_to(:run)
end
diff --git a/spec/unit/util/log/destinations_spec.rb b/spec/unit/util/log/destinations_spec.rb
index 6596c0664..710a51725 100755
--- a/spec/unit/util/log/destinations_spec.rb
+++ b/spec/unit/util/log/destinations_spec.rb
@@ -22,3 +22,16 @@ describe Puppet::Util::Log.desttypes[:report] do
dest.handle "my log"
end
end
+
+
+describe Puppet::Util::Log.desttypes[:file] do
+ before do
+ File.stubs(:open) # prevent actually creating the file
+ @class = Puppet::Util::Log.desttypes[:file]
+ end
+
+ it "should default to autoflush false" do
+ @class.new('/tmp/log').autoflush.should == false
+ end
+end
+
diff --git a/spec/unit/util/log_spec.rb b/spec/unit/util/log_spec.rb
index f3fd1b051..4a30d5086 100755
--- a/spec/unit/util/log_spec.rb
+++ b/spec/unit/util/log_spec.rb
@@ -136,6 +136,11 @@ describe Puppet::Util::Log do
Puppet::Util::Log.new(:level => "notice", :message => :foo)
end
+ it "should update Log autoflush when Puppet[:autoflush] is set" do
+ Puppet::Util::Log.expects(:autoflush=).once.with(true)
+ Puppet[:autoflush] = true
+ end
+
it "should have a method for determining if a tag is present" do
Puppet::Util::Log.new(:level => "notice", :message => :foo).should respond_to(:tagged?)
end