class Chef::Util::Backup

Attributes

new_resource[R]
path[RW]

Public Class Methods

new(new_resource, path = nil) click to toggle source
# File lib/chef/util/backup.rb, line 27
def initialize(new_resource, path = nil)
  @new_resource = new_resource
  @path = path.nil? ? new_resource.path : path
end

Public Instance Methods

backup!() click to toggle source
# File lib/chef/util/backup.rb, line 32
def backup!
  if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(path)
    do_backup
    # Clean up after the number of backups
    slice_number = @new_resource.backup
    backup_files = sorted_backup_files
    if backup_files.length >= @new_resource.backup
      remainder = backup_files.slice(slice_number..)
      remainder.each do |backup_to_delete|
        delete_backup(backup_to_delete)
      end
    end
  end
end

Private Instance Methods

backup_filename() click to toggle source
# File lib/chef/util/backup.rb, line 49
def backup_filename
  @backup_filename ||= begin
    time = Time.now
    nanoseconds = sprintf("%6f", time.to_f).split(".")[1]
    savetime = time.strftime("%Y%m%d%H%M%S.#{nanoseconds}")
    backup_filename = "#{path}.chef-#{savetime}"
    backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") # strip drive letter on Windows
  end
end
backup_path() click to toggle source
# File lib/chef/util/backup.rb, line 66
def backup_path
  @backup_path ||= ::File.join(prefix, backup_filename)
end
delete_backup(backup_file) click to toggle source
# File lib/chef/util/backup.rb, line 76
def delete_backup(backup_file)
  FileUtils.rm(backup_file)
  Chef::Log.info("#{@new_resource} removed backup at #{backup_file}")
end
do_backup() click to toggle source
# File lib/chef/util/backup.rb, line 70
def do_backup
  FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
  FileUtils.cp(path, backup_path, preserve: true)
  Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
end
prefix() click to toggle source
# File lib/chef/util/backup.rb, line 59
def prefix
  # if :file_backup_path is nil, we fallback to the old behavior of
  # keeping the backup in the same directory. We also need to to_s it
  # so we don't get a type error around implicit to_str conversions.
  @prefix ||= Chef::Config[:file_backup_path].to_s
end
sorted_backup_files() click to toggle source
# File lib/chef/util/backup.rb, line 89
def sorted_backup_files
  unsorted_backup_files.sort.reverse # faster than sort { |a, b| b <=> a }
end
unsorted_backup_files() click to toggle source
# File lib/chef/util/backup.rb, line 81
def unsorted_backup_files
  # If you replace this with Dir[], you will probably break Windows.
  fn = Regexp.escape(::File.basename(path))
  Dir.entries(::File.dirname(backup_path)).select do |f|
    !!(f =~ /\A#{fn}.chef-[0-9.]*\B/)
  end.map { |f| ::File.join(::File.dirname(backup_path), f) }
end