summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/application.rb11
-rw-r--r--lib/puppet/application/doc.rb5
-rw-r--r--lib/puppet/defaults.rb4
-rw-r--r--lib/puppet/indirector/resource/ral.rb9
-rw-r--r--lib/puppet/parser/compiler.rb21
-rw-r--r--lib/puppet/parser/functions/defined.rb34
-rw-r--r--lib/puppet/parser/functions/fqdn_rand.rb9
-rw-r--r--lib/puppet/property.rb17
-rw-r--r--lib/puppet/property/keyvalue.rb2
-rw-r--r--lib/puppet/property/list.rb2
-rw-r--r--lib/puppet/provider/file/posix.rb4
-rw-r--r--lib/puppet/provider/file/win32.rb4
-rw-r--r--lib/puppet/provider/mount.rb2
-rw-r--r--lib/puppet/provider/nameservice/directoryservice.rb4
-rwxr-xr-xlib/puppet/provider/package/freebsd.rb4
-rw-r--r--lib/puppet/provider/zone/solaris.rb2
-rw-r--r--lib/puppet/reference/configuration.rb4
-rw-r--r--lib/puppet/reference/function.rb4
-rw-r--r--lib/puppet/resource.rb9
-rw-r--r--lib/puppet/resource/type.rb40
-rw-r--r--lib/puppet/transaction/resource_harness.rb22
-rw-r--r--lib/puppet/type.rb4
-rwxr-xr-xlib/puppet/type/cron.rb6
-rwxr-xr-xlib/puppet/type/exec.rb38
-rw-r--r--lib/puppet/type/file.rb40
-rwxr-xr-xlib/puppet/type/file/checksum.rb2
-rwxr-xr-xlib/puppet/type/file/content.rb3
-rwxr-xr-xlib/puppet/type/file/owner.rb2
-rwxr-xr-xlib/puppet/type/file/source.rb1
-rw-r--r--lib/puppet/type/file/target.rb2
-rwxr-xr-xlib/puppet/type/host.rb2
-rwxr-xr-xlib/puppet/type/mount.rb4
-rw-r--r--lib/puppet/type/package.rb2
-rw-r--r--lib/puppet/type/service.rb16
-rwxr-xr-xlib/puppet/type/user.rb6
-rw-r--r--lib/puppet/type/yumrepo.rb4
-rwxr-xr-xlib/puppet/type/zpool.rb4
-rw-r--r--lib/puppet/util/checksums.rb14
-rwxr-xr-xlib/puppet/util/command_line/puppetca4
-rwxr-xr-xlib/puppet/util/command_line/puppetd14
-rwxr-xr-xlib/puppet/util/command_line/puppetdoc4
-rwxr-xr-xlib/puppet/util/command_line/puppetmasterd9
-rw-r--r--lib/puppet/util/reference.rb11
-rw-r--r--lib/puppet/util/settings.rb2
-rw-r--r--lib/puppet/util/zaml.rb59
45 files changed, 244 insertions, 222 deletions
diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
index f0159a65d..17ad69cee 100644
--- a/lib/puppet/application.rb
+++ b/lib/puppet/application.rb
@@ -212,10 +212,17 @@ class Application
end
def find(name)
- self.const_get(name.to_s.capitalize)
- rescue
+ klass = name.to_s.capitalize
+
+ # const_defined? is used before const_get since const_defined? will only
+ # check within our namespace, whereas const_get will check ancestor
+ # trees as well, resulting in unexpected behaviour.
+ if !self.const_defined?(klass)
puts "Unable to find application '#{name.to_s}'."
Kernel::exit(1)
+ end
+
+ self.const_get(klass)
end
def [](name)
diff --git a/lib/puppet/application/doc.rb b/lib/puppet/application/doc.rb
index 1f6c63286..aaefd6e75 100644
--- a/lib/puppet/application/doc.rb
+++ b/lib/puppet/application/doc.rb
@@ -8,7 +8,7 @@ class Puppet::Application::Doc < Puppet::Application
attr_accessor :unknown_args, :manifest
def preinit
- {:references => [], :mode => :text, :format => :to_rest }.each do |name,value|
+ {:references => [], :mode => :text, :format => :to_markdown }.each do |name,value|
options[name] = value
end
@unknown_args = []
@@ -113,9 +113,6 @@ class Puppet::Application::Doc < Puppet::Application
text += Puppet::Util::Reference.footer unless with_contents # We've only got one reference
- # Replace the trac links, since they're invalid everywhere else
- text.gsub!(/`\w+\s+([^`]+)`:trac:/) { |m| $1 }
-
if options[:mode] == :pdf
Puppet::Util::Reference.pdf(text)
else
diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb
index 400d59f15..764cbbe2b 100644
--- a/lib/puppet/defaults.rb
+++ b/lib/puppet/defaults.rb
@@ -2,8 +2,8 @@
module Puppet
setdefaults(:main,
:confdir => [Puppet.run_mode.conf_dir, "The main Puppet configuration directory. The default for this parameter is calculated based on the user. If the process
- is running as root or the user that `puppet master` is supposed to run as, it defaults to a system directory, but if it's running as any other user,
- it defaults to being in `~`."],
+ is running as root or the user that Puppet is supposed to run as, it defaults to a system directory, but if it's running as any other user,
+ it defaults to being in the user's home directory."],
:vardir => [Puppet.run_mode.var_dir, "Where Puppet stores dynamic and growing data. The default for this parameter is calculated specially, like `confdir`_."],
:name => [Puppet.application_name.to_s, "The name of the application, if we are running as one. The
default is essentially $0 without the path or `.rb`."],
diff --git a/lib/puppet/indirector/resource/ral.rb b/lib/puppet/indirector/resource/ral.rb
index 1c2ab14ae..bc41d14ae 100644
--- a/lib/puppet/indirector/resource/ral.rb
+++ b/lib/puppet/indirector/resource/ral.rb
@@ -34,12 +34,17 @@ class Puppet::Resource::Ral < Puppet::Indirector::Code
private
+ # {type,resource}_name: the resource name may contain slashes:
+ # File["/etc/hosts"]. To handle, assume the type name does
+ # _not_ have any slashes in it, and split only on the first.
+
def type_name( request )
- request.key.split('/')[0]
+ request.key.split('/', 2)[0]
end
def resource_name( request )
- request.key.split('/')[1]
+ name = request.key.split('/', 2)[1]
+ name unless name == ""
end
def type( request )
diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb
index c60e1d4fb..fdabd05c9 100644
--- a/lib/puppet/parser/compiler.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -139,12 +139,23 @@ class Puppet::Parser::Compiler
def evaluate_classes(classes, scope, lazy_evaluate = true)
raise Puppet::DevError, "No source for scope passed to evaluate_classes" unless scope.source
found = []
+ param_classes = nil
+ # if we are a param class, save the classes hash
+ # and transform classes to be the keys
+ if classes.class == Hash
+ param_classes = classes
+ classes = classes.keys
+ end
classes.each do |name|
# If we can find the class, then make a resource that will evaluate it.
if klass = scope.find_hostclass(name)
- found << name and next if scope.class_scope(klass)
- resource = klass.ensure_in_catalog(scope)
+ if param_classes
+ resource = klass.ensure_in_catalog(scope, param_classes[name] || {})
+ else
+ found << name and next if scope.class_scope(klass)
+ resource = klass.ensure_in_catalog(scope)
+ end
# If they've disabled lazy evaluation (which the :include function does),
# then evaluate our resource immediately.
@@ -432,7 +443,11 @@ class Puppet::Parser::Compiler
@resources = []
# Make sure any external node classes are in our class list
- @catalog.add_class(*@node.classes)
+ if @node.classes.class == Hash
+ @catalog.add_class(*@node.classes.keys)
+ else
+ @catalog.add_class(*@node.classes)
+ end
end
# Set the node's parameters into the top-scope as variables.
diff --git a/lib/puppet/parser/functions/defined.rb b/lib/puppet/parser/functions/defined.rb
index 90632af2f..2aeaa9ba0 100644
--- a/lib/puppet/parser/functions/defined.rb
+++ b/lib/puppet/parser/functions/defined.rb
@@ -1,10 +1,32 @@
# Test whether a given class or definition is defined
-Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :doc => "Determine whether a given
- type is defined, either as a native type or a defined type, or whether a class is defined.
- This is useful for checking whether a class is defined and only including it if it is.
- This function can also test whether a resource has been defined, using resource references
- (e.g., `if defined(File['/tmp/myfile']) { ... }`). This function is unfortunately
- dependent on the parse order of the configuration when testing whether a resource is defined.") do |vals|
+Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :doc => "Determine whether
+ a given class or resource type is defined. This function can also determine whether a
+ specific resource has been declared. Returns true or false. Accepts class names,
+ type names, and resource references.
+
+ The `defined` function checks both native and defined types, including types
+ provided as plugins via modules. Types and classes are both checked using their names:
+
+ defined(\"file\")
+ defined(\"customtype\")
+ defined(\"foo\")
+ defined(\"foo::bar\")
+
+ Resource declarations are checked using resource references, e.g.
+ `defined( File['/tmp/myfile'] )`. Checking whether a given resource
+ has been declared is, unfortunately, dependent on the parse order of
+ the configuration, and the following code will not work:
+
+ if defined(File['/tmp/foo']) {
+ notify(\"This configuration includes the /tmp/foo file.\")
+ }
+ file {\"/tmp/foo\":
+ ensure => present,
+ }
+
+ However, this order requirement refers to parse order only, and ordering of
+ resources in the configuration graph (e.g. with `before` or `require`) does not
+ affect the behavior of `defined`.") do |vals|
result = false
vals = [vals] unless vals.is_a?(Array)
vals.each do |val|
diff --git a/lib/puppet/parser/functions/fqdn_rand.rb b/lib/puppet/parser/functions/fqdn_rand.rb
index 3e7018ac4..52946f2c1 100644
--- a/lib/puppet/parser/functions/fqdn_rand.rb
+++ b/lib/puppet/parser/functions/fqdn_rand.rb
@@ -1,7 +1,10 @@
Puppet::Parser::Functions::newfunction(:fqdn_rand, :type => :rvalue, :doc =>
- "Generates random numbers based on the node's fqdn. The first argument
- sets the range. Additional (optional) arguments may be used to further
- distinguish the seed.") do |args|
+ "Generates random numbers based on the node's fqdn. Generated random values
+ will be a range from 0 up to and excluding n, where n is the first parameter.
+ The second argument specifies a number to add to the seed and is optional, for example:
+
+ $random_number = fqdn_rand(30)
+ $random_number_seed = fqdn_rand(30,30)") do |args|
require 'md5'
max = args.shift
srand MD5.new([lookupvar('fqdn'),args].join(':')).to_s.hex
diff --git a/lib/puppet/property.rb b/lib/puppet/property.rb
index 84e1a0360..12f496a6e 100644
--- a/lib/puppet/property.rb
+++ b/lib/puppet/property.rb
@@ -152,9 +152,24 @@ class Puppet::Property < Puppet::Parameter
# since we cannot fix it. Otherwise, we expect our should value
# to be an array, and if @is matches any of those values, then
# we consider it to be in-sync.
- def insync?(is)
+ #
+ # Don't override this method.
+ def safe_insync?(is)
+ # If there is no @should value, consider the property to be in sync.
return true unless @should
+ # Otherwise delegate to the (possibly derived) insync? method.
+ insync?(is)
+ end
+
+ def self.method_added(sym)
+ raise "Puppet::Property#safe_insync? shouldn't be overridden; please override insync? instead" if sym == :safe_insync?
+ end
+
+ # This method should be overridden by derived classes if necessary
+ # to provide extra logic to determine whether the property is in
+ # sync.
+ def insync?(is)
self.devfail "#{self.class.name}'s should is not array" unless @should.is_a?(Array)
# an empty array is analogous to no should values
diff --git a/lib/puppet/property/keyvalue.rb b/lib/puppet/property/keyvalue.rb
index 0181708f9..57d0ea2d9 100644
--- a/lib/puppet/property/keyvalue.rb
+++ b/lib/puppet/property/keyvalue.rb
@@ -77,8 +77,6 @@ module Puppet
end
def insync?(is)
- return true unless @should
-
return true unless is
(is == self.should)
diff --git a/lib/puppet/property/list.rb b/lib/puppet/property/list.rb
index dcee85db7..b86dc87f2 100644
--- a/lib/puppet/property/list.rb
+++ b/lib/puppet/property/list.rb
@@ -66,8 +66,6 @@ module Puppet
end
def insync?(is)
- return true unless @should
-
return true unless is
(prepare_is_for_comparison(is) == self.should)
diff --git a/lib/puppet/provider/file/posix.rb b/lib/puppet/provider/file/posix.rb
index 6cbf98e9a..f7b8c9797 100644
--- a/lib/puppet/provider/file/posix.rb
+++ b/lib/puppet/provider/file/posix.rb
@@ -27,9 +27,7 @@ Puppet::Type.type(:file).provide :posix do
end
end
- def insync?(current, should)
- return true unless should
-
+ def is_owner_insync?(current, should)
should.each do |value|
if value =~ /^\d+$/
uid = Integer(value)
diff --git a/lib/puppet/provider/file/win32.rb b/lib/puppet/provider/file/win32.rb
index 8ead69a89..21e7ca974 100644
--- a/lib/puppet/provider/file/win32.rb
+++ b/lib/puppet/provider/file/win32.rb
@@ -14,9 +14,7 @@ Puppet::Type.type(:file).provide :microsoft_windows do
id
end
- def insync?(current, should)
- return true unless should
-
+ def is_owner_insync?(current, should)
should.each do |value|
if value =~ /^\d+$/
uid = Integer(value)
diff --git a/lib/puppet/provider/mount.rb b/lib/puppet/provider/mount.rb
index 8c7b24bd4..c979f742f 100644
--- a/lib/puppet/provider/mount.rb
+++ b/lib/puppet/provider/mount.rb
@@ -43,6 +43,8 @@ module Puppet::Provider::Mount
line =~ / on #{name} / or line =~ %r{ on /private/var/automount#{name}}
when "Solaris", "HP-UX"
line =~ /^#{name} on /
+ when "AIX"
+ line.split(/\s+/)[1] == name
else
line =~ / on #{name} /
end
diff --git a/lib/puppet/provider/nameservice/directoryservice.rb b/lib/puppet/provider/nameservice/directoryservice.rb
index 965a2aa60..b01880360 100644
--- a/lib/puppet/provider/nameservice/directoryservice.rb
+++ b/lib/puppet/provider/nameservice/directoryservice.rb
@@ -442,7 +442,7 @@ class DirectoryService < Puppet::Provider::NameService
def remove_unwanted_members(current_members, new_members)
current_members.each do |member|
- if not new_members.include?(member)
+ if not new_members.flatten.include?(member)
cmd = [:dseditgroup, "-o", "edit", "-n", ".", "-d", member, @resource[:name]]
begin
execute(cmd)
@@ -454,7 +454,7 @@ class DirectoryService < Puppet::Provider::NameService
end
def add_members(current_members, new_members)
- new_members.each do |new_member|
+ new_members.flatten.each do |new_member|
if current_members.nil? or not current_members.include?(new_member)
cmd = [:dseditgroup, "-o", "edit", "-n", ".", "-a", new_member, @resource[:name]]
begin
diff --git a/lib/puppet/provider/package/freebsd.rb b/lib/puppet/provider/package/freebsd.rb
index 2f012a4ed..e10a20b04 100755
--- a/lib/puppet/provider/package/freebsd.rb
+++ b/lib/puppet/provider/package/freebsd.rb
@@ -20,11 +20,11 @@ Puppet::Type.type(:package).provide :freebsd, :parent => :openbsd do
if @resource[:source] =~ /\/$/
if @resource[:source] =~ /^(ftp|https?):/
- withenv :PACKAGESITE => @resource[:source] do
+ Puppet::Util::Execution::withenv :PACKAGESITE => @resource[:source] do
pkgadd "-r", @resource[:name]
end
else
- withenv :PKG_PATH => @resource[:source] do
+ Puppet::Util::Execution::withenv :PKG_PATH => @resource[:source] do
pkgadd @resource[:name]
end
end
diff --git a/lib/puppet/provider/zone/solaris.rb b/lib/puppet/provider/zone/solaris.rb
index c11444993..f46337b14 100644
--- a/lib/puppet/provider/zone/solaris.rb
+++ b/lib/puppet/provider/zone/solaris.rb
@@ -40,7 +40,7 @@ Puppet::Type.type(:zone).provide(:solaris) do
# Then perform all of our configuration steps. It's annoying
# that we need this much internal info on the resource.
@resource.send(:properties).each do |property|
- str += property.configtext + "\n" if property.is_a? ZoneConfigProperty and ! property.insync?(properties[property.name])
+ str += property.configtext + "\n" if property.is_a? ZoneConfigProperty and ! property.safe_insync?(properties[property.name])
end
str += "commit\n"
diff --git a/lib/puppet/reference/configuration.rb b/lib/puppet/reference/configuration.rb
index e6a8dc20f..c8ff145ba 100644
--- a/lib/puppet/reference/configuration.rb
+++ b/lib/puppet/reference/configuration.rb
@@ -94,11 +94,11 @@ The file follows INI-style formatting. Here is an example of a very simple
Note that boolean parameters must be explicitly specified as `true` or
`false` as seen above.
-If you need to change file parameters (e.g., reset the mode or owner), do
+If you need to change file or directory parameters (e.g., reset the mode or owner), do
so within curly braces on the same line:
[main]
- myfile = /tmp/whatever {owner = root, mode = 644}
+ vardir = /new/vardir {owner = root, mode = 644}
If you're starting out with a fresh configuration, you may wish to let
the executable generate a template configuration file for you by invoking
diff --git a/lib/puppet/reference/function.rb b/lib/puppet/reference/function.rb
index 1333e0d26..7d39bebd5 100644
--- a/lib/puppet/reference/function.rb
+++ b/lib/puppet/reference/function.rb
@@ -8,6 +8,10 @@ performing stand-alone work like importing. Rvalues return values and can
only be used in a statement requiring a value, such as an assignment or a case
statement.
+Functions execute on the Puppet master. They do not execute on the Puppet agent.
+Hence they only have access to the commands and data available on the Puppet master
+host.
+
Here are the functions available in Puppet:
"
diff --git a/lib/puppet/resource.rb b/lib/puppet/resource.rb
index b0a3ecee6..e832804f5 100644
--- a/lib/puppet/resource.rb
+++ b/lib/puppet/resource.rb
@@ -205,8 +205,13 @@ class Puppet::Resource
tag(self.title) if valid_tag?(self.title)
@reference = Reference.new(@type,@title) # for serialization compatibility with 0.25.x
-
- raise ArgumentError, "Invalid resource type #{type}" if strict? and ! resource_type
+ if strict? and ! resource_type
+ if @type == 'Class'
+ raise ArgumentError, "Could not find declared class #{title}"
+ else
+ raise ArgumentError, "Invalid resource type #{type}"
+ end
+ end
end
def ref
diff --git a/lib/puppet/resource/type.rb b/lib/puppet/resource/type.rb
index d40adc145..34fddf135 100644
--- a/lib/puppet/resource/type.rb
+++ b/lib/puppet/resource/type.rb
@@ -143,18 +143,26 @@ class Puppet::Resource::Type
# classes and nodes. No parameters are be supplied--if this is a
# parameterized class, then all parameters take on their default
# values.
- def ensure_in_catalog(scope)
+ def ensure_in_catalog(scope, parameters=nil)
type == :definition and raise ArgumentError, "Cannot create resources for defined resource types"
resource_type = type == :hostclass ? :class : :node
# Do nothing if the resource already exists; this makes sure we don't
# get multiple copies of the class resource, which helps provide the
# singleton nature of classes.
- if resource = scope.catalog.resource(resource_type, name)
+ # we should not do this for classes with parameters
+ # if parameters are passed, we should still try to create the resource
+ # even if it exists so that we can fail
+ # this prevents us from being able to combine param classes with include
+ if resource = scope.catalog.resource(resource_type, name) and !parameters
return resource
end
-
resource = Puppet::Parser::Resource.new(resource_type, name, :scope => scope, :source => self)
+ if parameters
+ parameters.each do |k,v|
+ resource.set_parameter(k,v)
+ end
+ end
instantiate_resource(scope, resource)
scope.compiler.add_resource(scope, resource)
resource
@@ -222,6 +230,19 @@ class Puppet::Resource::Type
set[param] = true
end
+ if @type == :hostclass
+ scope.setvar("title", resource.title.to_s.downcase) unless set.include? :title
+ scope.setvar("name", resource.name.to_s.downcase ) unless set.include? :name
+ else
+ scope.setvar("title", resource.title ) unless set.include? :title
+ scope.setvar("name", resource.name ) unless set.include? :name
+ end
+ scope.setvar("module_name", module_name) if module_name and ! set.include? :module_name
+
+ if caller_name = scope.parent_module_name and ! set.include?(:caller_module_name)
+ scope.setvar("caller_module_name", caller_name)
+ end
+ scope.class_set(self.name,scope) if hostclass? or node?
# Verify that all required arguments are either present or
# have been provided with defaults.
arguments.each do |param, default|
@@ -238,19 +259,6 @@ class Puppet::Resource::Type
resource[param] = value
end
- if @type == :hostclass
- scope.setvar("title", resource.title.to_s.downcase) unless set.include? :title
- scope.setvar("name", resource.name.to_s.downcase ) unless set.include? :name
- else
- scope.setvar("title", resource.title ) unless set.include? :title
- scope.setvar("name", resource.name ) unless set.include? :name
- end
- scope.setvar("module_name", module_name) if module_name and ! set.include? :module_name
-
- if caller_name = scope.parent_module_name and ! set.include?(:caller_module_name)
- scope.setvar("caller_module_name", caller_name)
- end
- scope.class_set(self.name,scope) if hostclass? or node?
end
# Create a new subscope in which to evaluate our code.
diff --git a/lib/puppet/transaction/resource_harness.rb b/lib/puppet/transaction/resource_harness.rb
index c1b980632..4a3d35e0d 100644
--- a/lib/puppet/transaction/resource_harness.rb
+++ b/lib/puppet/transaction/resource_harness.rb
@@ -52,13 +52,13 @@ class Puppet::Transaction::ResourceHarness
# Update the machine state & create logs/events
events = []
ensure_param = resource.parameter(:ensure)
- if desired_values[:ensure] && !ensure_param.insync?(current_values[:ensure])
+ if desired_values[:ensure] && !ensure_param.safe_insync?(current_values[:ensure])
events << apply_parameter(ensure_param, current_values[:ensure], audited_params.include?(:ensure), historical_values[:ensure])
synced_params << :ensure
elsif current_values[:ensure] != :absent
work_order = resource.properties # Note: only the resource knows what order to apply changes in
work_order.each do |param|
- if desired_values[param.name] && !param.insync?(current_values[param.name])
+ if desired_values[param.name] && !param.safe_insync?(current_values[param.name])
events << apply_parameter(param, current_values[param.name], audited_params.include?(param.name), historical_values[param.name])
synced_params << param.name
end
@@ -175,22 +175,4 @@ class Puppet::Transaction::ResourceHarness
return nil unless name = resource[:schedule]
resource.catalog.resource(:schedule, name) || resource.fail("Could not find schedule #{name}")
end
-
- private
-
- def absent_and_not_being_created?(current, param)
- current[:ensure] == :absent and param.should.nil?
- end
-
- def ensure_is_insync?(current, param)
- param.insync?(current[:ensure])
- end
-
- def ensure_should_be_absent?(current, param)
- param.should == :absent
- end
-
- def param_is_insync?(current, param)
- param.insync?(current[param.name])
- end
end
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index ea3944b4e..e03650b54 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -648,7 +648,7 @@ class Type
"The is value is not in the is array for '#{property.name}'"
end
ensureis = is[property]
- if property.insync?(ensureis) and property.should == :absent
+ if property.safe_insync?(ensureis) and property.should == :absent
return true
end
end
@@ -660,7 +660,7 @@ class Type
end
propis = is[property]
- unless property.insync?(propis)
+ unless property.safe_insync?(propis)
property.debug("Not in sync: #{propis.inspect} vs #{property.should.inspect}")
insync = false
#else
diff --git a/lib/puppet/type/cron.rb b/lib/puppet/type/cron.rb
index 76399d693..4b18e71f9 100755
--- a/lib/puppet/type/cron.rb
+++ b/lib/puppet/type/cron.rb
@@ -54,11 +54,7 @@ Puppet::Type.newtype(:cron) do
# We have to override the parent method, because we consume the entire
# "should" array
def insync?(is)
- if @should
- self.is_to_s(is) == self.should_to_s
- else
- true
- end
+ self.is_to_s(is) == self.should_to_s
end
# A method used to do parameter input handling. Converts integers
diff --git a/lib/puppet/type/exec.rb b/lib/puppet/type/exec.rb
index 606888c75..daa49e223 100755
--- a/lib/puppet/type/exec.rb
+++ b/lib/puppet/type/exec.rb
@@ -9,41 +9,11 @@ module Puppet
commands is to use the checks like `creates` to avoid running the
command unless some condition is met.
- Note also that you can restrict an `exec` to only run when it receives
+ Note that you can restrict an `exec` to only run when it receives
events by using the `refreshonly` parameter; this is a useful way to
have your configuration respond to events with arbitrary commands.
- It is worth noting that `exec` is special, in that it is not
- currently considered an error to have multiple `exec` instances
- with the same name. This was done purely because it had to be this
- way in order to get certain functionality, but it complicates things.
- In particular, you will not be able to use `exec` instances that
- share their commands with other instances as a dependency, since
- Puppet has no way of knowing which instance you mean.
-
- For example:
-
- # defined in the production class
- exec { \"make\":
- cwd => \"/prod/build/dir\",
- path => \"/usr/bin:/usr/sbin:/bin\"
- }
-
- . etc. .
-
- # defined in the test class
- exec { \"make\":
- cwd => \"/test/build/dir\",
- path => \"/usr/bin:/usr/sbin:/bin\"
- }
-
- Any other type would throw an error, complaining that you had
- the same instance being managed in multiple places, but these are
- obviously different images, so `exec` had to be treated specially.
-
- It is recommended to avoid duplicate names whenever possible.
-
- Note that if an `exec` receives an event from another resource,
+ Note also that if an `exec` receives an event from another resource,
it will get executed again (or execute the command specified in `refresh`, if there is one).
There is a strong tendency to use `exec` to do whatever work Puppet
@@ -335,7 +305,7 @@ module Puppet
# Pull down the main aliases file
file { \"/etc/aliases\":
source => \"puppet://server/module/aliases\"
- }
+ }
# Rebuild the database, but only when the file changes
exec { newaliases:
@@ -664,7 +634,7 @@ module Puppet
def validatecmd(cmd)
exe = extractexe(cmd)
# if we're not fully qualified, require a path
- self.fail "'#{cmd}' is both unqualifed and specified no search path" if File.expand_path(exe) != exe and self[:path].nil?
+ self.fail "'#{cmd}' is not qualified and no path was specified. Please qualify the command or specify a path." if File.expand_path(exe) != exe and self[:path].nil?
end
def extractexe(cmd)
diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb
index eee948cd5..cbb51bbed 100644
--- a/lib/puppet/type/file.rb
+++ b/lib/puppet/type/file.rb
@@ -34,7 +34,7 @@ Puppet::Type.newtype(:file) do
validate do |value|
# accept various path syntaxes: lone slash, posix, win32, unc
- unless (Puppet.features.posix? and (value =~ /^\/$/ or value =~ /^\/[^\/]/)) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/))
+ unless (Puppet.features.posix? and value =~ /^\//) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/))
fail Puppet::Error, "File paths must be fully qualified, not '#{value}'"
end
end
@@ -271,17 +271,24 @@ Puppet::Type.newtype(:file) do
end
CREATORS = [:content, :source, :target]
+ SOURCE_ONLY_CHECKSUMS = [:none, :ctime, :mtime]
validate do
- count = 0
+ creator_count = 0
CREATORS.each do |param|
- count += 1 if self.should(param)
+ creator_count += 1 if self.should(param)
end
- count += 1 if @parameters.include?(:source)
- self.fail "You cannot specify more than one of #{CREATORS.collect { |p| p.to_s}.join(", ")}" if count > 1
+ creator_count += 1 if @parameters.include?(:source)
+ self.fail "You cannot specify more than one of #{CREATORS.collect { |p| p.to_s}.join(", ")}" if creator_count > 1
self.fail "You cannot specify a remote recursion without a source" if !self[:source] and self[:recurse] == :remote
+ self.fail "You cannot specify source when using checksum 'none'" if self[:checksum] == :none && !self[:source].nil?
+
+ SOURCE_ONLY_CHECKSUMS.each do |checksum_type|
+ self.fail "You cannot specify content when using checksum '#{checksum_type}'" if self[:checksum] == checksum_type && !self[:content].nil?
+ end
+
self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] and self[:recurselimit]
end
@@ -290,25 +297,8 @@ Puppet::Type.newtype(:file) do
super(path.gsub(/\/+/, '/').sub(/\/$/, ''))
end
- # List files, but only one level deep.
- def self.instances(base = "/")
- return [] unless FileTest.directory?(base)
-
- files = []
- Dir.entries(base).reject { |e|
- e == "." or e == ".."
- }.each do |name|
- path = File.join(base, name)
- if obj = self[path]
- obj[:audit] = :all
- files << obj
- else
- files << self.new(
- :name => path, :audit => :all
- )
- end
- end
- files
+ def self.instances(base = '/')
+ return self.new(:name => base, :recurse => true, :recurselimit => 1, :audit => :all).recurse_local.values
end
@depthfirst = false
@@ -779,7 +769,7 @@ Puppet::Type.newtype(:file) do
# Make sure we get a new stat objct
expire
currentvalue = thing.retrieve
- thing.sync unless thing.insync?(currentvalue)
+ thing.sync unless thing.safe_insync?(currentvalue)
end
end
end
diff --git a/lib/puppet/type/file/checksum.rb b/lib/puppet/type/file/checksum.rb
index 732460738..5586b1383 100755
--- a/lib/puppet/type/file/checksum.rb
+++ b/lib/puppet/type/file/checksum.rb
@@ -9,7 +9,7 @@ Puppet::Type.type(:file).newparam(:checksum) do
The default checksum parameter, if checksums are enabled, is md5."
- newvalues "md5", "md5lite", "timestamp", "mtime", "time", "none"
+ newvalues "md5", "md5lite", "mtime", "ctime", "none"
defaultto :md5
diff --git a/lib/puppet/type/file/content.rb b/lib/puppet/type/file/content.rb
index b8f30a9c7..cf924f371 100755
--- a/lib/puppet/type/file/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -96,7 +96,6 @@ module Puppet
end
return true if ! @resource.replace?
- return true unless self.should
result = super
@@ -168,6 +167,8 @@ module Puppet
def each_chunk_from(source_or_content)
if source_or_content.is_a?(String)
yield source_or_content
+ elsif source_or_content.nil? && resource.parameter(:ensure) && [:present, :file].include?(resource.parameter(:ensure).value)
+ yield ''
elsif source_or_content.nil?
yield read_file_from_filebucket
elsif self.class.standalone?
diff --git a/lib/puppet/type/file/owner.rb b/lib/puppet/type/file/owner.rb
index d473da20e..483cc7fce 100755
--- a/lib/puppet/type/file/owner.rb
+++ b/lib/puppet/type/file/owner.rb
@@ -6,7 +6,7 @@ module Puppet
@event = :file_changed
def insync?(current)
- provider.insync?(current, @should)
+ provider.is_owner_insync?(current, @should)
end
# We want to print names, not numbers
diff --git a/lib/puppet/type/file/source.rb b/lib/puppet/type/file/source.rb
index 7d03de2b0..bc464e1c3 100755
--- a/lib/puppet/type/file/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -169,7 +169,6 @@ module Puppet
checks.delete(:checksum)
resource[:audit] = checks
- resource[:checksum] = :md5 unless resource.property(:checksum)
end
def local?
diff --git a/lib/puppet/type/file/target.rb b/lib/puppet/type/file/target.rb
index 9e7229dda..b9fe9213b 100644
--- a/lib/puppet/type/file/target.rb
+++ b/lib/puppet/type/file/target.rb
@@ -14,7 +14,7 @@ module Puppet
# Only call mklink if ensure didn't call us in the first place.
currentensure = @resource.property(:ensure).retrieve
- mklink if @resource.property(:ensure).insync?(currentensure)
+ mklink if @resource.property(:ensure).safe_insync?(currentensure)
end
# Create our link.
diff --git a/lib/puppet/type/host.rb b/lib/puppet/type/host.rb
index 8ab750459..2666e50ae 100755
--- a/lib/puppet/type/host.rb
+++ b/lib/puppet/type/host.rb
@@ -66,7 +66,7 @@ module Puppet
newproperty(:target) do
desc "The file in which to store service information. Only used by
- those providers that write to disk."
+ those providers that write to disk. On most systems this defaults to `/etc/hosts`."
defaultto { if @resource.class.defaultprovider.ancestors.include?(Puppet::Provider::ParsedFile)
@resource.class.defaultprovider.default_target
diff --git a/lib/puppet/type/mount.rb b/lib/puppet/type/mount.rb
index d048c90f1..da9a70bdf 100755
--- a/lib/puppet/type/mount.rb
+++ b/lib/puppet/type/mount.rb
@@ -89,7 +89,7 @@ module Puppet
if prop.name == :ensure
false
else
- ! prop.insync?(currentvalues[prop])
+ ! prop.safe_insync?(currentvalues[prop])
end
end.each { |prop| prop.sync }.length
@resource.flush if oos > 0
@@ -200,7 +200,7 @@ module Puppet
newvalues(:true, :false)
defaultto do
case Facter.value(:operatingsystem)
- when "FreeBSD", "Darwin"
+ when "FreeBSD", "Darwin", "AIX"
false
else
true
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 51a866332..d73d90dff 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -109,8 +109,6 @@ module Puppet
# Override the parent method, because we've got all kinds of
# funky definitions of 'in sync'.
def insync?(is)
- @should ||= []
-
@latest ||= nil
@lateststamp ||= (Time.now.to_i - 1000)
# Iterate across all of the should values, and see how they
diff --git a/lib/puppet/type/service.rb b/lib/puppet/type/service.rb
index c00f02789..0d09c3d5d 100644
--- a/lib/puppet/type/service.rb
+++ b/lib/puppet/type/service.rb
@@ -73,7 +73,7 @@ module Puppet
if property = @resource.property(:enable)
val = property.retrieve
- property.sync unless property.insync?(val)
+ property.sync unless property.safe_insync?(val)
end
event
@@ -144,10 +144,16 @@ module Puppet
specified."
end
newparam(:status) do
- desc "Specify a *status* command manually. If left
- unspecified, the status method will be determined
- automatically, usually by looking for the service in the
- process table."
+ desc "Specify a *status* command manually. This command must
+ return 0 if the service is running and a nonzero value otherwise.
+ Ideally, these return codes should conform to
+ [the LSB's specification for init script status actions](http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptact.html),
+ but puppet only considers the difference between 0 and nonzero
+ to be relevant.
+
+ If left unspecified, the status method will be determined
+ automatically, usually by looking for the service in the process
+ table."
end
newparam(:stop) do
diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb
index 761d5d71b..e7389a0d1 100755
--- a/lib/puppet/type/user.rb
+++ b/lib/puppet/type/user.rb
@@ -112,8 +112,6 @@ module Puppet
end
def insync?(is)
- return true unless self.should
-
# We know the 'is' is a number, so we need to convert the 'should' to a number,
# too.
@should.each do |value|
@@ -177,7 +175,7 @@ module Puppet
end
validate do |value|
- if value.to_s !~ /^\d+$/
+ if value.to_s !~ /^-?\d+$/
raise ArgumentError, "Password minimum age must be provided as a number"
end
end
@@ -196,7 +194,7 @@ module Puppet
end
validate do |value|
- if value.to_s !~ /^\d+$/
+ if value.to_s !~ /^-?\d+$/
raise ArgumentError, "Password maximum age must be provided as a number"
end
end
diff --git a/lib/puppet/type/yumrepo.rb b/lib/puppet/type/yumrepo.rb
index 160b2164d..9b4c79428 100644
--- a/lib/puppet/type/yumrepo.rb
+++ b/lib/puppet/type/yumrepo.rb
@@ -7,14 +7,14 @@ module Puppet
class IniProperty < Puppet::Property
def insync?(is)
# A should property of :absent is the same as nil
- if is.nil? && (should.nil? || should == :absent)
+ if is.nil? && should == :absent
return true
end
super(is)
end
def sync
- if insync?(retrieve)
+ if safe_insync?(retrieve)
result = nil
else
result = set(self.should)
diff --git a/lib/puppet/type/zpool.rb b/lib/puppet/type/zpool.rb
index 49cce552a..df06522e8 100755
--- a/lib/puppet/type/zpool.rb
+++ b/lib/puppet/type/zpool.rb
@@ -8,8 +8,6 @@ module Puppet
end
def insync?(is)
- return true unless self.should
-
return @should == [:absent] if is == :absent
flatten_and_sort(is) == flatten_and_sort(@should)
@@ -18,8 +16,6 @@ module Puppet
class MultiVDev < VDev
def insync?(is)
- return true unless self.should
-
return @should == [:absent] if is == :absent
return false unless is.length == @should.length
diff --git a/lib/puppet/util/checksums.rb b/lib/puppet/util/checksums.rb
index 6fdf14ecf..e129301e6 100644
--- a/lib/puppet/util/checksums.rb
+++ b/lib/puppet/util/checksums.rb
@@ -68,7 +68,9 @@ module Puppet::Util::Checksums
nil
end
- alias :ctime_stream :mtime_stream
+ def mtime(content)
+ ""
+ end
# Calculate a checksum using Digest::SHA1.
def sha1(content)
@@ -108,6 +110,12 @@ module Puppet::Util::Checksums
File.stat(filename).send(:ctime)
end
+ alias :ctime_stream :mtime_stream
+
+ def ctime(content)
+ ""
+ end
+
# Return a "no checksum"
def none_file(filename)
""
@@ -119,6 +127,10 @@ module Puppet::Util::Checksums
""
end
+ def none(content)
+ ""
+ end
+
private
# Perform an incremental checksum on a file.
diff --git a/lib/puppet/util/command_line/puppetca b/lib/puppet/util/command_line/puppetca
index 9aa7e907c..317d99881 100755
--- a/lib/puppet/util/command_line/puppetca
+++ b/lib/puppet/util/command_line/puppetca
@@ -27,7 +27,7 @@
# parameter, so you can specify '--ssldir <directory>' as an argument.
#
# See the configuration file documentation at
-# http://reductivelabs.com/projects/puppet/reference/configref.html for
+# http://docs.puppetlabs.com/references/stable/configuration.html for
# the full list of acceptable parameters. A commented list of all
# configuration options can also be generated by running puppet cert with
# '--genconfig'.
@@ -45,7 +45,7 @@
# Remove all files related to a host from puppet cert's storage. This is
# useful when rebuilding hosts, since new certificate signing requests
# will only be honored if puppet cert does not have a copy of a signed
-# certificate for that host. The certificate of the host remains valid.
+# certificate for that host. The certificate of the host is also revoked.
# If '--all' is specified then all host certificates, both signed and
# unsigned, will be removed.
#
diff --git a/lib/puppet/util/command_line/puppetd b/lib/puppet/util/command_line/puppetd
index cb8589c5f..71b28429b 100755
--- a/lib/puppet/util/command_line/puppetd
+++ b/lib/puppet/util/command_line/puppetd
@@ -11,7 +11,7 @@
#
# puppet agent [-D|--daemonize|--no-daemonize] [-d|--debug]
# [--detailed-exitcodes] [--disable] [--enable]
-# [-h|--help] [--fqdn <host name>] [-l|--logdest syslog|<file>|console]
+# [-h|--help] [--certname <host name>] [-l|--logdest syslog|<file>|console]
# [-o|--onetime] [--serve <handler>] [-t|--test] [--noop]
# [--digest <digest>] [--fingerprint] [-V|--version]
# [-v|--verbose] [-w|--waitforcert <seconds>]
@@ -113,10 +113,11 @@
#
# +puppet agent+ exits after executing this.
#
-# fqdn::
-# Set the fully-qualified domain name of the client. This is only used for
-# certificate purposes, but can be used to override the discovered hostname.
-# If you need to use this flag, it is generally an indication of a setup problem.
+# certname::
+# Set the certname (unique ID) of the client. The master reads this unique
+# identifying string, which is usually set to the node's fully-qualified domain
+# name, to determine which configurations the node will receive. Use this option
+# to debug setup problems or implement unusual node identification schemes.
#
# help::
# Print this help message
@@ -150,7 +151,8 @@
#
# test::
# Enable the most common options used for testing. These are +onetime+,
-# +verbose+, +ignorecache, +no-daemonize+, and +no-usecacheonfailure+.
+# +verbose+, +ignorecache, +no-daemonize+, +no-usecacheonfailure+,
+# +detailed-exit-codes+, +no-splay+, and +show_diff+.
#
# noop::
# Use +noop+ mode where the daemon runs in a no-op or dry-run mode. This is useful
diff --git a/lib/puppet/util/command_line/puppetdoc b/lib/puppet/util/command_line/puppetdoc
index 8f24ea5ef..45a9c6518 100755
--- a/lib/puppet/util/command_line/puppetdoc
+++ b/lib/puppet/util/command_line/puppetdoc
@@ -37,7 +37,7 @@
# Specifies the directory where to output the rdoc documentation in 'rdoc' mode.
#
# mode::
-# Determine the output mode. Valid modes are 'text', 'trac', 'pdf' and 'rdoc'. The 'pdf' mode creates PDF formatted files in the /tmp directory. The default mode is 'text'. In 'rdoc' mode you must provide 'manifests-path'
+# Determine the output mode. Valid modes are 'text', 'pdf' and 'rdoc'. The 'pdf' mode creates PDF formatted files in the /tmp directory. The default mode is 'text'. In 'rdoc' mode you must provide 'manifests-path'
#
# reference::
# Build a particular reference. Get a list of references by running +puppet doc --list+.
@@ -47,7 +47,7 @@
#
# = Example
#
-# $ puppet doc -r type > /tmp/type_reference.rst
+# $ puppet doc -r type > /tmp/type_reference.markdown
# or
# $ puppet doc --outputdir /tmp/rdoc --mode rdoc /path/to/manifests
# or
diff --git a/lib/puppet/util/command_line/puppetmasterd b/lib/puppet/util/command_line/puppetmasterd
index baf8a7581..445169820 100755
--- a/lib/puppet/util/command_line/puppetmasterd
+++ b/lib/puppet/util/command_line/puppetmasterd
@@ -9,6 +9,7 @@
#
# puppet master [-D|--daemonize|--no-daemonize] [-d|--debug] [-h|--help]
# [-l|--logdest <file>|console|syslog] [-v|--verbose] [-V|--version]
+# [--compile <nodename>] [--apply <catalog>]
#
# = Description
#
@@ -49,6 +50,14 @@
# version::
# Print the puppet version number and exit.
#
+# compile::
+# Capability to compile a catalogue and output it in JSON from the Puppet master. Uses
+# facts contained in the $vardir/yaml/ directory to compile the catalog.
+#
+# apply::
+# Capability to apply JSON catalog (such as one generated with --compile). You can either specify
+# a JSON file or pipe in JSON from standard input.
+#
# = Example
#
# puppet master
diff --git a/lib/puppet/util/reference.rb b/lib/puppet/util/reference.rb
index 95efeb1c1..a4921ed2a 100644
--- a/lib/puppet/util/reference.rb
+++ b/lib/puppet/util/reference.rb
@@ -120,16 +120,11 @@ class Puppet::Util::Reference
str += "\n\n"
end
- # Remove all trac links.
- def strip_trac(text)
- text.gsub(/`\w+\s+([^`]+)`:trac:/) { |m| $1 }
- end
-
def text
puts output
end
- def to_rest(withcontents = true)
+ def to_markdown(withcontents = true)
# First the header
text = h(@title, 1)
text += "\n\n**This page is autogenerated; any changes will get overwritten** *(last generated on #{Time.now.to_s})*\n\n"
@@ -142,8 +137,4 @@ class Puppet::Util::Reference
text
end
-
- def to_text(withcontents = true)
- strip_trac(to_rest(withcontents))
- end
end
diff --git a/lib/puppet/util/settings.rb b/lib/puppet/util/settings.rb
index ca4ecda35..626ed20eb 100644
--- a/lib/puppet/util/settings.rb
+++ b/lib/puppet/util/settings.rb
@@ -593,7 +593,7 @@ if @config.include?(:run_mode)
end
eachsection do |section|
persection(section) do |obj|
- str += obj.to_config + "\n" unless ReadOnly.include? obj.name
+ str += obj.to_config + "\n" unless ReadOnly.include? obj.name or obj.name == :genconfig
end
end
diff --git a/lib/puppet/util/zaml.rb b/lib/puppet/util/zaml.rb
index 9fda5ae3b..14aa90e5f 100644
--- a/lib/puppet/util/zaml.rb
+++ b/lib/puppet/util/zaml.rb
@@ -59,13 +59,12 @@ class ZAML
@@previously_emitted_object = {}
@@next_free_label_number = 0
end
- def initialize(obj,indent)
- @indent = indent
+ def initialize(obj)
@this_label_number = nil
@@previously_emitted_object[obj.object_id] = self
end
def to_s
- @this_label_number ? ('&id%03d%s' % [@this_label_number, @indent]) : ''
+ @this_label_number ? ('&id%03d ' % @this_label_number) : ''
end
def reference
@this_label_number ||= (@@next_free_label_number += 1)
@@ -76,7 +75,7 @@ class ZAML
end
end
def new_label_for(obj)
- Label.new(obj,(Hash === obj || Array === obj) ? "#{@indent || "\n"} " : ' ')
+ Label.new(obj)
end
def first_time_only(obj)
if label = Label.for(obj)
@@ -92,7 +91,7 @@ class ZAML
end
def emit(s)
@result << s
- @recent_nl = false unless s.kind_of?(Label)
+ @recent_nl = false
end
def nl(s='')
emit(@indent || "\n") unless @recent_nl
@@ -224,32 +223,30 @@ class String
gsub( /([\x80-\xFF])/ ) { |x| "\\x#{x.unpack("C")[0].to_s(16)}" }
end
def to_zaml(z)
- z.first_time_only(self) {
- num = '[-+]?(0x)?\d+\.?\d*'
- case
- when self == ''
- z.emit('""')
- # when self =~ /[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/
- # z.emit("!binary |\n")
- # z.emit([self].pack("m*"))
- when (
- (self =~ /\A(true|false|yes|no|on|null|off|#{num}(:#{num})*|!|=|~)$/i) or
- (self =~ /\A\n* /) or
- (self =~ /[\s:]$/) or
- (self =~ /^[>|][-+\d]*\s/i) or
- (self[-1..-1] =~ /\s/) or
- (self =~ /[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/) or
- (self =~ /[,\[\]\{\}\r\t]|:\s|\s#/) or
- (self =~ /\A([-:?!#&*'"]|<<|%.+:.)/)
- )
- z.emit("\"#{escaped_for_zaml}\"")
- when self =~ /\n/
- if self[-1..-1] == "\n" then z.emit('|+') else z.emit('|-') end
- z.nested { split("\n",-1).each { |line| z.nl; z.emit(line.chomp("\n")) } }
- else
- z.emit(self)
- end
- }
+ num = '[-+]?(0x)?\d+\.?\d*'
+ case
+ when self == ''
+ z.emit('""')
+ # when self =~ /[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/
+ # z.emit("!binary |\n")
+ # z.emit([self].pack("m*"))
+ when (
+ (self =~ /\A(true|false|yes|no|on|null|off|#{num}(:#{num})*|!|=|~)$/i) or
+ (self =~ /\A\n* /) or
+ (self =~ /[\s:]$/) or
+ (self =~ /^[>|][-+\d]*\s/i) or
+ (self[-1..-1] =~ /\s/) or
+ (self =~ /[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/) or
+ (self =~ /[,\[\]\{\}\r\t]|:\s|\s#/) or
+ (self =~ /\A([-:?!#&*'"]|<<|%.+:.)/)
+ )
+ z.emit("\"#{escaped_for_zaml}\"")
+ when self =~ /\n/
+ if self[-1..-1] == "\n" then z.emit('|+') else z.emit('|-') end
+ z.nested { split("\n",-1).each { |line| z.nl; z.emit(line.chomp("\n")) } }
+ else
+ z.emit(self)
+ end
end
end