http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Ruby Yedekleme Sistemi Detayları

18.05.2007, yazan Tankut ŞENTÜRK

Merhabalar arkadaşlar,

Bir önceki yazımda Ruby ile gerçekleştirdiğim yedekleme sisteminden bahsetmiş ve tanımlarının nasıl yapılması gerektiğini anlatmıştım. Bu yazımda ise kod bloğunu sizlerle paylaşarak bazı ipuçları vermek istiyorum. Böylece eğer isterseniz, uygulamayı kendinize göre değiştirmeniz daha kolay hale gelecektir.

Diğer tüm yazılarımda olduğu gibi hemen konumuza geçelim. Rackup.rb dosyasını parça parça işleyeceğiz.

$stdout.sync = true
require 'yaml'
begin
    require "zip/zip"
rescue Exception => err
    puts "Error: You should execute 'gem install rubyzip --include-dependencies' command, before run this program.."
    puts err.message
    exit
end

Bu bölümde, eğer 'rubyzip' kütüphanesi yok ise, oluşan hata program tarafından yakalanır ve kullanıcıya sorunu nasıl giderebileceği belirtilir.

begin
    config = YAML::load(IO.read(ARGV[0] || "rackup_config.yaml"))
rescue Exception => err
    puts "Error: Configuration file can not be found.."
    puts err.message
    exit
end

Bu bölümde ayar dosyası disk üzerinden okunmaya çalışılır.

IO.read(ARGV[0] || "rackup_config.yaml")

ARGV[0]: Gelen ilk parametre anlamındadır.
Eğer gelen bir parametre var ise onu, eğer gelen herhangi bir parametre yok ise "rackup_config.yaml"yi yani standart ayar dosyasını kullanmasını söyler.

source_folder = config["source"]
source_include_sub_folders = (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
source_file_extension = config["file_extension"] || "*"

target_folder = config["target"]
target_prefix = config["prefix"]
target_postfix = config["postfix"]

bu bölümde ise 'yaml' içersinden yedekleme işlemi ile ilgili bilgiler okunur.

# Tüm evet anlamına gelen ifadeler kullanılmıştır..
(["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)

config["include_subfolders"] bilgisine "true", "yes", "evet", "yeah", "y", "e", "1" bilgilerinden herhangi birinin yazılsının 'true' olacağını ifade eder.

source_files = nil
if source_file_extension.include?(",")
    source_files = File.join("**", "*.{#{source_file_extension}}")
else
    source_files = File.join("**", "*.#{source_file_extension}")
end

puts "Source dir is #{source_folder}"
puts "Target dir is #{target_folder}"
puts "File type is #{source_files.to_s}"

if File.directory?(source_folder) == false || File.directory?(target_folder) == false
    puts "Error: Source or target folder can not be found..!"
    exit
end

Bu bölümde ise birden fazla dosya uzantısı (file_extension) tanımlandı ise farklı bir takım işlemler yapar. Hedef ve kaynak dizin ile dosya uzantılarını ekrana yazar. Hedef ve kaynak dizinlerin varlığını kontrol eder.

Dir.chdir(source_folder)
zipFileName = target_folder + "\\" + target_prefix + Time.now.strftime("%Y%m%d-%H%M") + target_postfix + ".zip"
puts "#{zipFileName} is creating..."
begin
    Zip::ZipOutputStream::open(zipFileName) do |zipfile|
        Dir.glob(source_files) do |fileName|
            fullFileName = source_folder + "\\" + fileName.gsub('/','\\')
            next if FileTest.directory?(fullFileName)
            File.open(fullFileName, "rb") do |file|
                file.binmode
                zipfile.put_next_entry(fileName, Zlib::BEST_SPEED)
                zipfile.write(file.read)
            end
        end
    end
rescue Exception => err
    puts "Error :  #{err.message}"
    puts err.backtrace.join('\n')
    begin
        File.delete(zipFileName)
    rescue
    end
else
    puts "operation completed."
end

Bu bölümde ise gerçek işlemin yapıldığı bölümdür :)

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails)

Yaz aklındakini, çekinme :)

Lütfen: Yorumunuzun değerlendirilmesi ve yayınlanması uzun sürebilir. Yorumunuzu tekrar göndermeniz için bir neden yoktur, inanın tüm yorumları yayınlıyorum. Bazıları hariç :).