File: //proc/self/root/usr/lib/ruby/site_ruby/1.8/puppet/type/filebucket.rb
module Puppet
require 'puppet/file_bucket/dipper'
newtype(:filebucket) do
@doc = <<-EOT
A repository for storing and retrieving file content by MD5 checksum. Can
be local to each agent node, or centralized on a puppet master server. All
puppet masters provide a filebucket service that agent nodes can access
via HTTP, but you must declare a filebucket resource before any agents
will do so.
Filebuckets are used for the following features:
- **Content backups.** If the `file` type's `backup` attribute is set to
the name of a filebucket, Puppet will back up the _old_ content whenever
it rewrites a file; see the documentation for the `file` type for more
details. These backups can be used for manual recovery of content, but
are more commonly used to display changes and differences in a tool like
Puppet Dashboard.
- **Content distribution.** The optional static compiler populates the
puppet master's filebucket with the _desired_ content for each file,
then instructs the agent to retrieve the content for a specific
checksum. For more details,
[see the `static_compiler` section in the catalog indirection docs](http://docs.puppetlabs.com/references/latest/indirection.html#catalog).
To use a central filebucket for backups, you will usually want to declare
a filebucket resource and a resource default for the `backup` attribute
in site.pp:
# /etc/puppet/manifests/site.pp
filebucket { 'main':
path => false, # This is required for remote filebuckets.
server => 'puppet.example.com', # Optional; defaults to the configured puppet master.
}
File { backup => main, }
Puppet master servers automatically provide the filebucket service, so
this will work in a default configuration. If you have a heavily
restricted `auth.conf` file, you may need to allow access to the
`file_bucket_file` endpoint.
EOT
newparam(:name) do
desc "The name of the filebucket."
isnamevar
end
newparam(:server) do
desc "The server providing the remote filebucket service. Defaults to the
value of the `server` setting (that is, the currently configured
puppet master server).
This setting is _only_ consulted if the `path` attribute is set to `false`."
defaultto { Puppet[:server] }
end
newparam(:port) do
desc "The port on which the remote server is listening. Defaults to the
value of the `masterport` setting, which is usually %s." % Puppet[:masterport]
defaultto { Puppet[:masterport] }
end
newparam(:path) do
desc "The path to the _local_ filebucket; defaults to the value of the
`clientbucketdir` setting. To use a remote filebucket, you _must_ set
this attribute to `false`."
defaultto { Puppet[:clientbucketdir] }
validate do |value|
if value.is_a? Array
raise ArgumentError, "You can only have one filebucket path"
end
if value.is_a? String and not Puppet::Util.absolute_path?(value)
raise ArgumentError, "Filebucket paths must be absolute"
end
true
end
end
# Create a default filebucket.
def self.mkdefaultbucket
new(:name => "puppet", :path => Puppet[:clientbucketdir])
end
def bucket
mkbucket unless defined?(@bucket)
@bucket
end
private
def mkbucket
# Default is a local filebucket, if no server is given.
# If the default path has been removed, too, then
# the puppetmaster is used as default server
type = "local"
args = {}
if self[:path]
args[:Path] = self[:path]
else
args[:Server] = self[:server]
args[:Port] = self[:port]
end
begin
@bucket = Puppet::FileBucket::Dipper.new(args)
rescue => detail
message = "Could not create #{type} filebucket: #{detail}"
self.log_exception(detail, message)
self.fail(message)
end
@bucket.name = self.name
end
end
end