class Puppet::FileBucket::Dipper

Attributes

name[RW]

This is a transitional implementation that uses REST to access remote filebucket files.

Public Class Methods

new(hash = {}) click to toggle source

Create our bucket client

# File lib/puppet/file_bucket/dipper.rb, line 13
def initialize(hash = {})
  # Emulate the XMLRPC client
  server      = hash[:Server]
  port        = hash[:Port] || Puppet[:masterport]
  environment = Puppet[:environment]

  if hash.include?(:Path)
    @local_path = hash[:Path]
    @rest_path  = nil
  else
    @local_path = nil
    @rest_path = "https://#{server}:#{port}/#{environment}/file_bucket_file/"
  end
end

Public Instance Methods

backup(file) click to toggle source

Back up a file to our bucket

# File lib/puppet/file_bucket/dipper.rb, line 33
def backup(file)
  raise(ArgumentError, "File #{file} does not exist") unless ::File.exist?(file)
  contents = IO.binread(file)
  begin
    file_bucket_file = Puppet::FileBucket::File.new(contents, :bucket_path => @local_path)
    files_original_path = absolutize_path(file)
    dest_path = "#{@rest_path}#{file_bucket_file.name}/#{files_original_path}"
    file_bucket_path = "#{@rest_path}#{file_bucket_file.checksum_type}/#{file_bucket_file.checksum_data}/#{files_original_path}"

    # Make a HEAD request for the file so that we don't waste time
    # uploading it if it already exists in the bucket.
    unless Puppet::FileBucket::File.indirection.head(file_bucket_path)
      Puppet::FileBucket::File.indirection.save(file_bucket_file, dest_path)
    end

    return file_bucket_file.checksum_data
  rescue => detail
    message = "Could not back up #{file}: #{detail}"
    Puppet.log_exception(detail, message)
    raise Puppet::Error, message
  end
end
getfile(sum) click to toggle source

Retrieve a file by sum.

# File lib/puppet/file_bucket/dipper.rb, line 57
def getfile(sum)
  source_path = "#{@rest_path}md5/#{sum}"
  file_bucket_file = Puppet::FileBucket::File.indirection.find(source_path, :bucket_path => @local_path)

  raise Puppet::Error, "File not found" unless file_bucket_file
  file_bucket_file.to_s
end
local?() click to toggle source
# File lib/puppet/file_bucket/dipper.rb, line 28
def local?
  !! @local_path
end
restore(file,sum) click to toggle source

Restore the file

# File lib/puppet/file_bucket/dipper.rb, line 66
def restore(file,sum)
  restore = true
  if FileTest.exists?(file)
    cursum = Digest::MD5.hexdigest(IO.binread(file))

    # if the checksum has changed...
    # this might be extra effort
    if cursum == sum
      restore = false
    end
  end

  if restore
    if newcontents = getfile(sum)
      tmp = ""
      newsum = Digest::MD5.hexdigest(newcontents)
      changed = nil
      if FileTest.exists?(file) and ! FileTest.writable?(file)
        changed = ::File.stat(file).mode
        ::File.chmod(changed | 0200, file)
      end
      ::File.open(file, ::File::WRONLY|::File::TRUNC|::File::CREAT) { |of|
        of.binmode
        of.print(newcontents)
      }
      ::File.chmod(changed, file) if changed
    else
      Puppet.err "Could not find file with checksum #{sum}"
      return nil
    end
    return newsum
  else
    return nil
  end
end