class Backsum::Project

Constants

Public Class Methods

dsl(*args, &block) click to toggle source
# File lib/backsum/project_dsl.rb, line 7
def self.dsl(*args, &block)
  Dsl.new(*args, &block).instance
end
new(*args) click to toggle source
Calls superclass method
# File lib/backsum/project.rb, line 20
def initialize(*args)
  self.keep_days = 3
  self.keep_weeks = 4
  self.name = "default"
  self.backup_to = Proc.new { "./backups/#{name}" }
  self.servers = []
  super
end

Public Instance Methods

backup_names() click to toggle source
# File lib/backsum/project.rb, line 73
def backup_names
  Dir[File.join(self.backup_to, "*")].map do |backup_path|
    next if File.basename(backup_path) == LATEST_LINK_NAME
    File.basename(backup_path)
  end.compact
end
backup_to() click to toggle source
# File lib/backsum/project.rb, line 29
def backup_to
  @backup_to.respond_to?(:call) ? instance_eval(&@backup_to) :  @backup_to.to_s
end
backups() click to toggle source
# File lib/backsum/project.rb, line 69
def backups
  self.backup_names.map { |backup_name| Backup.new(name: backup_name, base_dir: self.backup_to) }
end
build_target_backup_folder() click to toggle source
# File lib/backsum/project.rb, line 39
def build_target_backup_folder
  FileUtils.mkdir_p(self.backup_to)
  FileUtils.mkdir_p(self.current_backup.path) if !self.latest_backup
end
cleanup_outdate_backups() click to toggle source
# File lib/backsum/project.rb, line 84
def cleanup_outdate_backups
  backups = self.backups
  
  backups.each { |b| b.outdated = true }
  
  # keep weekly backups
  cweeks_mapping = backups.group_by(&:cweek)
  cweeks_mapping.keys.sort.reverse.slice(0, self.keep_weeks).each do |cweek|
    cweeks_mapping[cweek].sort.last.outdated = false
  end
  
  # keep daily backups
  days_mapping = backups.group_by(&:day)
  days_mapping.keys.sort.reverse.slice(0, self.keep_days).each do |day|
    days_mapping[day].sort.last.outdated = false
  end
  
  # keep latest backup
  # skip, already keep by daily
  
  backups.each do |backup|
    FileUtils.rm_rf(backup.path) if backup.outdated?
  end
end
current_backup() click to toggle source
# File lib/backsum/project.rb, line 57
def current_backup
  @current_backup ||= Backup.new(backup_at: DateTime.now, base_dir: self.backup_to)
end
latest_backup() click to toggle source
# File lib/backsum/project.rb, line 61
def latest_backup
  path = File.join(self.backup_to, LATEST_LINK_NAME)
  if File.exists?(path)
    real_path = File.readlink(path)
    Backup.new(name: File.basename(real_path), base_dir: self.backup_to)
  end
end
perform() click to toggle source
# File lib/backsum/project.rb, line 33
def perform
  build_target_backup_folder # prepare
  sync_servers_data # execute
  cleanup_outdate_backups # cleanup
end
sync_servers_data() click to toggle source
# File lib/backsum/project.rb, line 44
def sync_servers_data
  lastest_backup_path = self.latest_backup.path  if self.latest_backup
  
  self.servers.each do |server|
    server.sync self.current_backup.path, lastest_backup_path
  end
  
  Dir.chdir self.backup_to do
    FileUtils.rm_rf LATEST_LINK_NAME
    FileUtils.ln_sf self.current_backup.name, LATEST_LINK_NAME
  end
end