#!/usr/bin/ruby # Created by Alvise Susmel on 9/8/08. # Copyright 2008 GecoSoftware.com(alvise@gecosoftware.com). All rights reserved. # NAME="geco" TO_BACKUP_DIRECTORIES = [] TO_BACKUP_LABELS = [] STORE_DIRECTORIES = [] TO_BACKUP_LABELS << "Logs" TO_BACKUP_DIRECTORIES << "/var/log/" STORE_DIRECTORIES << "/tmp/" ## backup dirs format name_label_yyyy-mm-dd/ def main_process TO_BACKUP_DIRECTORIES.each do |dir| index = TO_BACKUP_DIRECTORIES.index(dir) label = TO_BACKUP_LABELS.at(index) store_dir = STORE_DIRECTORIES.at(index) process(label,dir,store_dir) end end def process(label,to_backup_dir, store_dir) old_backups = find_old_backups(store_dir) ##cerco i vecchi backup if old_backups.size == 0 #backup da zero start_rsync(label,to_backup_dir,"#{store_dir}/#{NAME}_#{label}_#{date}") else #faccio una HARD_LINK COPY del vecchio backup hard_link_copy_from_last_backup(old_backups,label,to_backup_dir,store_dir) end end #fa una copia in hard link di una directory def hard_link_dir(from_dir,to_dir) system("mkdir -p #{to_dir}") #crea le directory necessarie fdir = Dir.open(from_dir) fdir.each do |filename| fullpath = "#{from_dir}/#{filename}" to_fullpath = "#{to_dir}/#{filename}" if(filename == "." or filename == "..") next elsif File.directory?(fullpath) hard_link_dir(fullpath,to_fullpath) else command = "ln #{fullpath} #{to_fullpath}" #puts command system(command) end end fdir.close end #fa un hard link del vecchio backup def hard_link_copy_from_last_backup(old_backups,label,to_backup_dir,store_dir) last_backup = "#{store_dir}/#{old_backups.pop}/" dst_dir = "#{store_dir}/#{NAME}_#{label}_#{date}/" #faccio tutti gli hard link puts "hard_link_dir: #{last_backup} -> #{dst_dir}" hard_link_dir(last_backup,dst_dir) puts "start updating" start_rsync(label,to_backup_dir,dst_dir) end #label: label di riconoscimento del backup #to_backup_dir: directory da backuppare #sync_dir: la directory dove verra` salvato il backup def start_rsync(label,to_backup_dir, sync_dir) command = "rsync -a --backup #{to_backup_dir} #{sync_dir}" puts command system(command) end def date return Time.new.strftime("%Y-%m-%d_%H_%M") end #restituisce l' elenco dei vecchi backup def find_old_backups(store_dir) old_backups = [] store = Dir.open(store_dir) store.each do |filename| if filename.include?(NAME) old_backups << filename end end store.close #ordino i backup old_backups.sort! {|a,b| a <=> b} return old_backups end main_process