summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/dsl.rb88
-rw-r--r--lib/puppet/file_serving/file_base.rb18
-rw-r--r--lib/puppet/file_serving/metadata.rb40
-rw-r--r--lib/puppet/metatype/evaluation.rb19
-rw-r--r--lib/puppet/network/client.rb7
-rwxr-xr-xlib/puppet/network/handler/fileserver.rb67
-rw-r--r--lib/puppet/network/http_server/webrick.rb3
-rw-r--r--lib/puppet/node/catalog.rb9
-rwxr-xr-xlib/puppet/provider/package/gem.rb6
-rw-r--r--lib/puppet/type.rb13
-rw-r--r--lib/puppet/type/file.rb13
-rwxr-xr-xlib/puppet/type/file/content.rb18
-rwxr-xr-xlib/puppet/type/file/ensure.rb4
-rwxr-xr-xlib/puppet/type/file/source.rb30
-rwxr-xr-xlib/puppet/util/filetype.rb2
-rw-r--r--lib/puppet/util/settings.rb2
16 files changed, 162 insertions, 177 deletions
diff --git a/lib/puppet/dsl.rb b/lib/puppet/dsl.rb
index 4fbce556c..966feaf9b 100644
--- a/lib/puppet/dsl.rb
+++ b/lib/puppet/dsl.rb
@@ -46,58 +46,56 @@
#
# apply
-module Puppet
- # Provide the actual commands for acting like a language.
- module DSL
- def aspect(name, options = {}, &block)
- Puppet::Aspect.new(name, options, &block)
- end
+require 'puppet'
- def acquire(*names)
- names.each do |name|
- if aspect = Puppet::Aspect[name]
- unless aspect.evaluated?
- aspect.evaluate
- end
- else
- raise "Could not find aspect %s" % name
+# Provide the actual commands for acting like a language.
+module Puppet::DSL
+ def aspect(name, options = {}, &block)
+ Puppet::DSL::Aspect.new(name, options, &block)
+ end
+
+ def acquire(*names)
+ names.each do |name|
+ if aspect = Puppet::DSL::Aspect[name]
+ unless aspect.evaluated?
+ aspect.evaluate
end
+ else
+ raise "Could not find aspect %s" % name
end
end
+ end
- def apply
- bucket = export()
- catalog = bucket.to_catalog
- catalog.apply
- end
+ def apply
+ bucket = export()
+ catalog = bucket.to_catalog
+ catalog.apply
+ end
- def export
- objects = Puppet::Aspect.collect do |name, aspect|
- if aspect.evaluated?
- aspect.export
- end
- end.reject { |a| a.nil? }.flatten.collect do |obj|
- obj.to_trans
+ def export
+ objects = Puppet::DSL::Aspect.collect do |name, aspect|
+ if aspect.evaluated?
+ aspect.export
end
- bucket = Puppet::TransBucket.new(objects)
- bucket.name = "top"
- bucket.type = "class"
-
- return bucket
+ end.reject { |a| a.nil? }.flatten.collect do |obj|
+ obj.to_trans
end
+ bucket = Puppet::TransBucket.new(objects)
+ bucket.name = "top"
+ bucket.type = "class"
- def init
- unless Process.uid == 0
- Puppet[:confdir] = File.expand_path("~/.puppet")
- Puppet[:vardir] = File.expand_path("~/.puppet/var")
- end
- Puppet[:user] = Process.uid
- Puppet[:group] = Process.gid
- Puppet::Util::Log.newdestination(:console)
- Puppet::Util::Log.level = :info
- end
+ return bucket
+ end
- private
+ def init
+ unless Process.uid == 0
+ Puppet[:confdir] = File.expand_path("~/.puppet")
+ Puppet[:vardir] = File.expand_path("~/.puppet/var")
+ end
+ Puppet[:user] = Process.uid
+ Puppet[:group] = Process.gid
+ Puppet::Util::Log.newdestination(:console)
+ Puppet::Util::Log.level = :info
end
class Aspect
@@ -224,10 +222,10 @@ module Puppet
end
def newresource(type, name, params = {})
- if self.is_a?(Puppet::Aspect)
+ if self.is_a?(Puppet::DSL::Aspect)
source = self
else
- source = Puppet::Aspect[:main]
+ source = Puppet::DSL::Aspect[:main]
end
unless obj = @@objects[type][name]
obj = Resource.new :title => name, :type => type.name,
@@ -262,7 +260,7 @@ module Puppet
env = nil
end
@node.parameters = Facter.to_hash
- @compile = Puppet::Parser::Compile.new(@node, @interp.send(:parser, env))
+ @compile = Puppet::Parser::Compiler.new(@node, @interp.send(:parser, env))
@scope = @compile.topscope
end
@scope
diff --git a/lib/puppet/file_serving/file_base.rb b/lib/puppet/file_serving/file_base.rb
index 7f169d1ea..06b3ad9ef 100644
--- a/lib/puppet/file_serving/file_base.rb
+++ b/lib/puppet/file_serving/file_base.rb
@@ -9,16 +9,28 @@ require 'puppet/file_serving'
class Puppet::FileServing::FileBase
attr_accessor :key
+ # Does our file exist?
+ def exist?
+ begin
+ stat
+ return true
+ rescue => detail
+ return false
+ end
+ end
+
# Return the full path to our file. Fails if there's no path set.
def full_path
raise(ArgumentError, "You must set a path to get a file's path") unless self.path
- relative_path ? File.join(path, relative_path) : path
+ if relative_path.nil? or relative_path == ""
+ path
+ else
+ File.join(path, relative_path)
+ end
end
def initialize(key, options = {})
- raise ArgumentError.new("Files must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/
-
@key = key
@links = :manage
diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb
index e26e75844..56712122c 100644
--- a/lib/puppet/file_serving/metadata.rb
+++ b/lib/puppet/file_serving/metadata.rb
@@ -28,6 +28,25 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination
+ PARAM_ORDER = [:mode, :ftype, :owner, :group]
+
+ def attributes_with_tabs
+ desc = []
+ PARAM_ORDER.each { |check|
+ check = :ftype if check == :type
+ desc << send(check)
+ }
+
+ case ftype
+ when "file", "directory": desc << checksum
+ when "link": desc << @destination
+ else
+ raise ArgumentError, "Cannot manage files of type %s" % ftype
+ end
+
+ return desc.join("\t")
+ end
+
def checksum_type=(type)
raise(ArgumentError, "Unsupported checksum type %s" % type) unless respond_to?("%s_file" % type)
@@ -45,13 +64,19 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
@ftype = stat.ftype
- # Set the octal mode, but as a string.
- @mode = "%o" % (stat.mode & 007777)
+ # We have to mask the mode, yay.
+ @mode = stat.mode & 007777
- if stat.ftype == "symlink"
+ case stat.ftype
+ when "file":
+ @checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, real_path)
+ when "directory": # Always just timestamp the directory.
+ sumtype = @checksum_type.to_s =~ /time/ ? @checksum_type : "ctime"
+ @checksum = ("{%s}" % sumtype) + send("%s_file" % sumtype, path).to_s
+ when "link":
@destination = File.readlink(real_path)
else
- @checksum = get_checksum(real_path)
+ raise ArgumentError, "Cannot manage files of type %s" % stat.ftype
end
end
@@ -59,11 +84,4 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
@checksum_type = "md5"
super
end
-
- private
-
- # Retrieve our checksum.
- def get_checksum(path)
- ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path)
- end
end
diff --git a/lib/puppet/metatype/evaluation.rb b/lib/puppet/metatype/evaluation.rb
index b3b6570b2..08756e988 100644
--- a/lib/puppet/metatype/evaluation.rb
+++ b/lib/puppet/metatype/evaluation.rb
@@ -125,26 +125,14 @@ class Puppet::Type
raise Puppet::DevError, "Parameter ensure defined but missing from current values"
end
if @parameters.include?(:ensure) and ! ensureparam.insync?(currentvalues[ensureparam])
-# self.info "ensuring %s from %s" %
-# [@parameters[:ensure].should, @parameters[:ensure].is]
changes << Puppet::PropertyChange.new(ensureparam, currentvalues[ensureparam])
# Else, if the 'ensure' property is correctly absent, then do
# nothing
elsif @parameters.include?(:ensure) and currentvalues[ensureparam] == :absent
- # self.info "Object is correctly absent"
return []
else
-# if @parameters.include?(:ensure)
-# self.info "ensure: Is: %s, Should: %s" %
-# [@parameters[:ensure].is, @parameters[:ensure].should]
-# else
-# self.info "no ensure property"
-# end
changes = properties().find_all { |property|
- unless currentvalues.include?(property)
- raise Puppet::DevError, "Property %s does not have a current value",
- [property.name]
- end
+ currentvalues[property] ||= :absent
! property.insync?(currentvalues[property])
}.collect { |property|
Puppet::PropertyChange.new(property, currentvalues[property])
@@ -152,10 +140,7 @@ class Puppet::Type
end
if Puppet[:debug] and changes.length > 0
- self.debug("Changing " + changes.collect { |ch|
- ch.property.name
- }.join(",")
- )
+ self.debug("Changing " + changes.collect { |ch| ch.property.name }.join(","))
end
changes
diff --git a/lib/puppet/network/client.rb b/lib/puppet/network/client.rb
index 283436e95..0a0a72345 100644
--- a/lib/puppet/network/client.rb
+++ b/lib/puppet/network/client.rb
@@ -95,9 +95,7 @@ class Puppet::Network::Client
# We have to start the HTTP connection manually before we start
# sending it requests or keep-alive won't work.
- if @driver.respond_to? :start
- @driver.start
- end
+ @driver.start if @driver.respond_to? :start
@local = false
elsif hash.include?(driverparam)
@@ -107,8 +105,7 @@ class Puppet::Network::Client
end
@local = true
else
- raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
- [self.class, driverparam]
+ raise Puppet::Network::ClientError, "%s must be passed a Server or %s" % [self.class, driverparam]
end
end
diff --git a/lib/puppet/network/handler/fileserver.rb b/lib/puppet/network/handler/fileserver.rb
index e6378bf01..a9a95bcfe 100755
--- a/lib/puppet/network/handler/fileserver.rb
+++ b/lib/puppet/network/handler/fileserver.rb
@@ -5,6 +5,9 @@ require 'cgi'
require 'delegate'
require 'sync'
+require 'puppet/file_serving'
+require 'puppet/file_serving/metadata'
+
class Puppet::Network::Handler
AuthStoreError = Puppet::AuthStoreError
class FileServerError < Puppet::Error; end
@@ -59,40 +62,27 @@ class Puppet::Network::Handler
# Describe a given file. This returns all of the manageable aspects
# of that file.
- def describe(url, links = :ignore, client = nil, clientip = nil)
+ def describe(url, links = :follow, client = nil, clientip = nil)
links = links.intern if links.is_a? String
- if links == :manage
- raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
- end
-
mount, path = convert(url, client, clientip)
- if client
- mount.debug "Describing %s for %s" % [url, client]
- end
+ mount.debug("Describing %s for %s" % [url, client]) if client
+
+ # Remove any leading slashes, since Metadata doesn't like them, yo.
+ metadata = Puppet::FileServing::Metadata.new(url, :path => mount.path(client), :relative_path => path.sub(/^\//, ''), :links => links)
- obj = nil
- unless obj = mount.getfileobject(path, links, client)
+ return "" unless metadata.exist?
+
+ begin
+ metadata.collect_attributes
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ Puppet.err detail
return ""
end
- currentvalues = mount.check(obj)
-
- desc = []
- CHECKPARAMS.each { |check|
- if value = currentvalues[check]
- desc << value
- else
- if check == "checksum" and currentvalues[:type] == "file"
- mount.notice "File %s does not have data for %s" %
- [obj.name, check]
- end
- desc << nil
- end
- }
-
- return desc.join("\t")
+ return metadata.attributes_with_tabs
end
# Create a new fileserving module.
@@ -140,26 +130,18 @@ class Puppet::Network::Handler
def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
mount, path = convert(url, client, clientip)
- if client
- mount.debug "Listing %s for %s" % [url, client]
- end
+ mount.debug "Listing %s for %s" % [url, client] if client
- obj = nil
- unless mount.path_exists?(path, client)
- return ""
- end
+ return "" unless mount.path_exists?(path, client)
desc = mount.list(path, recurse, ignore, client)
if desc.length == 0
- mount.notice "Got no information on //%s/%s" %
- [mount, path]
+ mount.notice "Got no information on //%s/%s" % [mount, path]
return ""
end
-
- desc.collect { |sub|
- sub.join("\t")
- }.join("\n")
+
+ desc.collect { |sub| sub.join("\t") }.join("\n")
end
def local?
@@ -213,12 +195,7 @@ class Puppet::Network::Handler
return ""
end
- str = nil
- if links == :manage
- raise Puppet::Error, "Cannot copy links yet."
- else
- str = mount.read_file(path, client)
- end
+ str = mount.read_file(path, client)
if @local
return str
diff --git a/lib/puppet/network/http_server/webrick.rb b/lib/puppet/network/http_server/webrick.rb
index e4f00dd73..568b4e798 100644
--- a/lib/puppet/network/http_server/webrick.rb
+++ b/lib/puppet/network/http_server/webrick.rb
@@ -8,6 +8,7 @@ require 'puppet/sslcertificates/support'
require 'puppet/network/xmlrpc/webrick_servlet'
require 'puppet/network/http_server'
require 'puppet/network/client'
+require 'puppet/network/handler'
module Puppet
class ServerError < RuntimeError; end
@@ -133,7 +134,7 @@ module Puppet
handlers.collect { |handler, args|
hclass = nil
- unless hclass = Handler.handler(handler)
+ unless hclass = Puppet::Network::Handler.handler(handler)
raise ServerError, "Invalid handler %s" % handler
end
hclass.new(args)
diff --git a/lib/puppet/node/catalog.rb b/lib/puppet/node/catalog.rb
index ee4cedd4b..d680de9a0 100644
--- a/lib/puppet/node/catalog.rb
+++ b/lib/puppet/node/catalog.rb
@@ -1,4 +1,6 @@
require 'puppet/indirector'
+require 'puppet/pgraph'
+require 'puppet/transaction'
require 'puppet/util/tagging'
@@ -69,7 +71,10 @@ class Puppet::Node::Catalog < Puppet::PGraph
@resource_table[ref] = resource
# If the name and title differ, set up an alias
- self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+ #self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+ if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+ self.alias(resource, resource.name) if resource.class.isomorphic?
+ end
resource.catalog = self if resource.respond_to?(:catalog=) and ! is_relationship_graph
@@ -499,7 +504,7 @@ class Puppet::Node::Catalog < Puppet::PGraph
map.clear
- result.add_class *self.classes
+ result.add_class(*self.classes)
result.tag(*self.tags)
return result
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index f73694779..bb09bc5b0 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -78,7 +78,11 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
command << @resource[:name]
end
- gemcmd(*command)
+ output = gemcmd(*command)
+ # Apparently some stupid gem versions don't exit non-0 on failure
+ if output.include?("ERROR")
+ self.fail "Could not install: %s" % output.chomp
+ end
end
def latest
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index c4e154d47..09003e8f5 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -257,10 +257,7 @@ class Type
rescue ArgumentError, Puppet::Error, TypeError
raise
rescue => detail
- error = Puppet::DevError.new(
- "Could not set %s on %s: %s" %
- [attr, self.class.name, detail]
- )
+ error = Puppet::DevError.new( "Could not set %s on %s: %s" % [attr, self.class.name, detail])
error.set_backtrace(detail.backtrace)
raise error
end
@@ -422,10 +419,6 @@ end
require 'puppet/propertychange'
require 'puppet/provider'
-require 'puppet/type/component'
-require 'puppet/type/file'
-require 'puppet/type/filebucket'
-require 'puppet/type/tidy'
-
-
+# Always load these types.
+require 'puppet/type/component'
diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb
index f093543d7..3518e8bb3 100644
--- a/lib/puppet/type/file.rb
+++ b/lib/puppet/type/file.rb
@@ -175,11 +175,9 @@ module Puppet
recursion), and ``follow`` will manage the file to which the
link points."
- newvalues(:follow, :manage, :ignore)
+ newvalues(:follow, :manage)
- # :ignore and :manage behave equivalently on local files,
- # but don't copy remote links
- defaultto :ignore
+ defaultto :manage
end
newparam(:purge, :boolean => true) do
@@ -781,9 +779,7 @@ module Puppet
def remove_existing(should)
return unless s = stat(true)
- unless handlebackup
- self.fail "Could not back up; will not replace"
- end
+ self.fail "Could not back up; will not replace" unless handlebackup
unless should.to_s == "link"
return if s.ftype.to_s == should.to_s
@@ -792,8 +788,7 @@ module Puppet
case s.ftype
when "directory":
if self[:force] == :true
- debug "Removing existing directory for replacement with %s" %
- should
+ debug "Removing existing directory for replacement with %s" % should
FileUtils.rmtree(self[:path])
else
notice "Not removing directory; use 'force' to override"
diff --git a/lib/puppet/type/file/content.rb b/lib/puppet/type/file/content.rb
index 687a83f14..1eb1423aa 100755
--- a/lib/puppet/type/file/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -1,5 +1,5 @@
module Puppet
- Puppet.type(:file).newproperty(:content) do
+ Puppet::Type.type(:file).newproperty(:content) do
include Puppet::Util::Diff
desc "Specify the contents of a file as a string. Newlines, tabs, and
@@ -47,23 +47,13 @@ module Puppet
return result
end
- # We should probably take advantage of existing md5 sums if they're there,
- # but I really don't feel like dealing with the complexity right now.
def retrieve
- stat = nil
- unless stat = @resource.stat
- return :absent
- end
+ return :absent unless stat = @resource.stat
- if stat.ftype == "link" and @resource[:links] == :ignore
- return self.should
- end
+ return self.should if stat.ftype == "link" and @resource[:links] == :ignore
# Don't even try to manage the content on directories
- if stat.ftype == "directory" and @resource[:links] == :ignore
- @resource.delete(:content)
- return nil
- end
+ return nil if stat.ftype == "directory"
begin
currentvalue = File.read(@resource[:path])
diff --git a/lib/puppet/type/file/ensure.rb b/lib/puppet/type/file/ensure.rb
index 028a7083d..0d2171216 100755
--- a/lib/puppet/type/file/ensure.rb
+++ b/lib/puppet/type/file/ensure.rb
@@ -99,9 +99,13 @@ module Puppet
munge do |value|
value = super(value)
+ # It doesn't make sense to try to manage links unless, well,
+ # we're managing links.
+ resource[:links] = :manage if value == :link
return value if value.is_a? Symbol
@resource[:target] = value
+ resource[:links] = :manage
return :link
end
diff --git a/lib/puppet/type/file/source.rb b/lib/puppet/type/file/source.rb
index 7fa5eb1a9..1b0dd3141 100755
--- a/lib/puppet/type/file/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -105,10 +105,13 @@ module Puppet
return nil
end
+ return nil if desc == ""
+
+ # Collect everything except the checksum
+ values = desc.split("\t")
+ other = values.pop
args = {}
- pinparams.zip(
- desc.split("\t")
- ).each { |param, value|
+ pinparams.zip(values).each { |param, value|
if value =~ /^[0-9]+$/
value = value.to_i
end
@@ -117,16 +120,19 @@ module Puppet
end
}
- # we can't manage ownership as root, so don't even try
- unless Puppet::Util::SUIDManager.uid == 0
- args.delete(:owner)
+ # Now decide whether we're doing checksums or symlinks
+ if args[:type] == "link"
+ args[:target] = other
+ else
+ args[:checksum] = other
end
- if args.empty? or (args[:type] == "link" and @resource[:links] == :ignore)
- return nil
- else
- return args
+ # we can't manage ownership unless we're root, so don't even try
+ unless Puppet::Util::SUIDManager.uid == 0
+ args.delete(:owner)
end
+
+ return args
end
# Have we successfully described the remote source?
@@ -172,7 +178,7 @@ module Puppet
end
def pinparams
- Puppet::Network::Handler.handler(:fileserver).params
+ [:mode, :type, :owner, :group]
end
# This basically calls describe() on our file, and then sets all
@@ -201,7 +207,7 @@ module Puppet
end
case @stats[:type]
- when "directory", "file":
+ when "directory", "file", "link":
@resource[:ensure] = @stats[:type] unless @resource.deleting?
else
self.info @stats.inspect
diff --git a/lib/puppet/util/filetype.rb b/lib/puppet/util/filetype.rb
index 1c7734cc4..bbc837e75 100755
--- a/lib/puppet/util/filetype.rb
+++ b/lib/puppet/util/filetype.rb
@@ -165,7 +165,7 @@ class Puppet::Util::FileType
# Remove a specific @path's cron tab.
def remove
- if Facter.value("operatingsystem") == "FreeBSD"
+ if %w{Darwin FreeBSD}.include?(Facter.value("operatingsystem"))
%x{/bin/echo yes | #{cmdbase()} -r 2>/dev/null}
else
%x{#{cmdbase()} -r 2>/dev/null}
diff --git a/lib/puppet/util/settings.rb b/lib/puppet/util/settings.rb
index cf15d3194..a91b0d6b1 100644
--- a/lib/puppet/util/settings.rb
+++ b/lib/puppet/util/settings.rb
@@ -1158,7 +1158,7 @@ Generated on #{Time.now}.
return nil unless path.is_a?(String)
return nil if path =~ /^\/dev/
- return nil if Puppet::Type::File[path] # skip files that are in our global resource list.
+ return nil if Puppet::Type.type(:file)[path] # skip files that are in our global resource list.
objects = []