A class that handles retrieving file metadata.
# File lib/puppet/file_serving/metadata.rb, line 137 def self.from_pson(data) new(data.delete('path'), data) end
# File lib/puppet/file_serving/metadata.rb, line 95 def initialize(path,data={}) @owner = data.delete('owner') @group = data.delete('group') @mode = data.delete('mode') if checksum = data.delete('checksum') @checksum_type = checksum['type'] @checksum = checksum['value'] end @checksum_type ||= "md5" @ftype = data.delete('type') @destination = data.delete('destination') super(path,data) end
# File lib/puppet/file_serving/metadata.rb, line 19 def checksum_type=(type) raise(ArgumentError, "Unsupported checksum type #{type}") unless respond_to?("#{type}_file") @checksum_type = type end
Retrieve the attributes for this file, relative to a base directory. Note that Object#stat raises Errno::ENOENT if the file is absent and this method does not catch that exception.
# File lib/puppet/file_serving/metadata.rb, line 70 def collect real_path = full_path stat = collect_stat(real_path) @owner = stat.owner @group = stat.group @ftype = stat.ftype # We have to mask the mode, yay. @mode = stat.mode & 007777 case stat.ftype when "file" @checksum = ("{#{@checksum_type}}") + send("#{@checksum_type}_file", real_path).to_s when "directory" # Always just timestamp the directory. @checksum_type = "ctime" @checksum = ("{#{@checksum_type}}") + send("#{@checksum_type}_file", path).to_s when "link" @destination = File.readlink(real_path) @checksum = ("{#{@checksum_type}}") + send("#{@checksum_type}_file", real_path).to_s rescue nil else raise ArgumentError, "Cannot manage files of type #{stat.ftype}" end end
# File lib/puppet/file_serving/metadata.rb, line 57 def collect_stat(path) stat = stat() if Puppet.features.microsoft_windows? WindowsStat.new(stat, path) else MetaStat.new(stat) end end
# File lib/puppet/file_serving/metadata.rb, line 133 def to_pson(*args) to_pson_data_hash.to_pson(*args) end
# File lib/puppet/file_serving/metadata.rb, line 110 def to_pson_data_hash { 'document_type' => 'FileMetadata', 'data' => super['data'].update( { 'owner' => owner, 'group' => group, 'mode' => mode, 'checksum' => { 'type' => checksum_type, 'value' => checksum }, 'type' => ftype, 'destination' => destination, }), 'metadata' => { 'api_version' => 1 } } end