class Parachute::Backup

Public Class Methods

new(filename='parachute.yml') click to toggle source
# File lib/parachute/backup.rb, line 9
def initialize filename='parachute.yml'
    @servers = ::YAML::load_file(filename)
    $path = '/share/MD0_DATA/backup'
end

Public Instance Methods

rotate(server) click to toggle source
# File lib/parachute/backup.rb, line 37
def rotate(server)
    #puts $path + "/" + server
    print "rotating #{server} backups..."
    today = Date.today
    Dir.entries($path + "/" + server).each do |f|
        if f =~ /(\d\d\d\d\-\d\d\-\d\d)/
            d = Date.strptime $1, "%Y-%m-%d"
            if d > today - 30 or (d.day < 10 and d.wday == 2 and d > today-120)
                #puts "lo tengo"
            else
                #print "#{f} from date #{d}..."
                FileUtils.rm_rf($path + "/" + server + "/" + f)
                #puts "deleted !"
                print "#"
            end
        end
    end
    puts " done"
end
run() click to toggle source
# File lib/parachute/backup.rb, line 57
def run
    servers.each do |hostname,server|
        server['folders'].each do |folder|
            run_backup(hostname, server['fqdn'], folder)
        end
        rotate(hostname)
    end
end
run_backup(server, fqdn, folder) click to toggle source
# File lib/parachute/backup.rb, line 14
def run_backup(server, fqdn, folder)
    print "running backup of folder #{folder} on #{server}[#{fqdn}]..."
    t = Time.now
    date = t.strftime("%Y-%m-%d_%H.%M")

    cmd1 = "rsync --archive --one-file-system --hard-links --human-readable --inplace --numeric-ids --delete --verbose --compress --link-dest=#{$path}/#{server}/_#{folder}_#{server}.current root@#{fqdn}:/#{folder}/ #{$path}/#{server}/_#{folder}_#{server}.#{date}/"
    cmd2 = "rm #{$path}/#{server}/_#{folder}_#{server}.current"
    cmd3 = "ln -s #{$path}/#{server}/_#{folder}_#{server}.#{date} #{$path}/#{server}/_#{folder}_#{server}.current"

    start = Time.now
    out = `#{cmd1}`
    out =~ /total size is ([\d|\.|B|G|M|K|T]+)/
    disk_usage = $1
    out =~ /received ([\d|\.|B|G|M|K|T]+)/
    received = $1
    stop = Time.now

    out = `#{cmd2}`
    out = `#{cmd3}`

    puts " done in #{(stop-start).round(1).to_s}s - disk usage = #{disk_usage}, received data = #{received}"
end