class ServerBackup::BackupExport

Constants

COMPONENTS
LOAD_TRIES

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/backup_export.rb, line 56
def run
  validate!
  components = name_args.empty? ? COMPONENTS : name_args
  Array(components).each { |component| self.send(component) }
end

Private Instance Methods

backup_standard(component, klass) click to toggle source
# File lib/chef/knife/backup_export.rb, line 129
def backup_standard(component, klass)
  ui.msg "Backing up #{component}"
  dir = File.join(config[:backup_dir], component)
  FileUtils.mkdir_p(dir)
  klass.list.each do |component_name, url|
    next if component == "environments" && component_name == "_default"
    ui.msg "Backing up #{component} #{component_name}"
    component_obj = load_object(klass, component_name).to_hash
    unless component_obj
      ui.error "Could not load #{klass} #{component_name}."
      next
    end
    File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
      component_file.print(JSON.pretty_generate(component_obj))
    end
  end
end
clients() click to toggle source
# File lib/chef/knife/backup_export.rb, line 93
def clients
  backup_standard("clients", Chef::ApiClient)
end
cookbooks() click to toggle source
# File lib/chef/knife/backup_export.rb, line 164
def cookbooks
  ui.msg "Backing up cookbooks"
  dir = File.join(config[:backup_dir], "cookbooks")
  FileUtils.mkdir_p(dir)
  if config[:latest]
    cookbooks = rest.get_rest("/cookbooks?latest")
  else
    cookbooks = rest.get_rest("/cookbooks?num_versions=all")
  end
  cookbooks.keys.each do |cb|
    ui.msg "Backing up cookbook #{cb}"
    dld = Chef::Knife::CookbookDownload.new
    cookbooks[cb]['versions'].each do |ver|
      dld.name_args = [cb, ver['version']]
      dld.config[:download_directory] = dir
      dld.config[:force] = true
      begin
        dld.run
      rescue
        ui.msg "Failed to download cookbook #{cb} version #{ver['version']}... Skipping"
        FileUtils.rm_r(File.join(dir, cb + "-" + ver['version']))
      end
    end
  end
end
data_bags() click to toggle source
# File lib/chef/knife/backup_export.rb, line 113
def data_bags
  ui.msg "Backing up data bags"
  dir = File.join(config[:backup_dir], "data_bags")
  FileUtils.mkdir_p(dir)
  Chef::DataBag.list.each do |bag_name, url|
    FileUtils.mkdir_p(File.join(dir, bag_name))
    Chef::DataBag.load(bag_name).each do |item_name, url|
      ui.msg "Backing up data bag #{bag_name} item #{item_name}"
      item = Chef::DataBagItem.load(bag_name, item_name)
      File.open(File.join(dir, bag_name, "#{item_name}.json"), "w") do |dbag_file|
        dbag_file.print(JSON.pretty_generate(item.raw_data))
      end
    end
  end
end
environments() click to toggle source
# File lib/chef/knife/backup_export.rb, line 109
def environments
  backup_standard("environments", Chef::Environment)
end
load_object(klass, name, try = 1) click to toggle source
# File lib/chef/knife/backup_export.rb, line 147
def load_object(klass, name, try = 1)
  klass.load(name)
rescue NoMethodError
  ui.warn "Problem loading #{klass} #{name}. Try #{try}/#{LOAD_TRIES}"
  if try < LOAD_TRIES
    try += 1
    load_object(klass, name, try)
  end
rescue Net::HTTPServerException => e
  if config[:ignore_perm]
    ui.warn "Problem loading #{name} #{e.message}."
    ui.warn "Possibly an issue with permissions on the chef server... Skipping"
  else
    raise
  end
end
nodes() click to toggle source
# File lib/chef/knife/backup_export.rb, line 74
def nodes
  component = "nodes"
  ui.msg "Backing up #{component}"
  dir = File.join(config[:backup_dir], component)
  FileUtils.mkdir_p(dir)
  Chef::Node.list.each do |component_name, url|
    next if component == "environments" && component_name == "_default"
    ui.msg "Backing up #{component} #{component_name}"
    component_obj = Chef::Node.load(component_name).for_json
    unless component_obj
      ui.error "Could not load #{klass} #{component_name}."
      next
    end
    File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
      component_file.print(JSON.pretty_generate(component_obj))
    end
  end
end
roles() click to toggle source
# File lib/chef/knife/backup_export.rb, line 105
def roles
  backup_standard("roles", Chef::Role)
end
users() click to toggle source
# File lib/chef/knife/backup_export.rb, line 97
def users
  if Chef::VERSION =~ /^1[1]\./
    backup_standard("users", Chef::User)
  else
    ui.warn "users export only supported on chef == 11"
  end
end
validate!() click to toggle source
# File lib/chef/knife/backup_export.rb, line 66
def validate!
  bad_names = name_args - COMPONENTS
  unless bad_names.empty?
    ui.error "Component types #{bad_names.join(",")} are not valid."
    exit 1
  end
end