class Qdumpfs::Option

Attributes

backup_at[R]
cmd[R]
debug[R]
delete_dirs[R]
delete_from[R]
delete_to[R]
dirs[R]
dst[R]
interval_proc[R]
keep_day[R]
keep_month[R]
keep_week[R]
keep_year[R]
logdir[R]
logger[R]
logpath[R]
matcher[R]
reporter[R]
src[R]
verifypath[R]

Public Class Methods

new(opts, dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 104
def initialize(opts, dirs)
  @opts = opts
  @dirs = dirs
  @src = dirs[0] if dirs.size > 0
  @dst = dirs[1] if dirs.size > 1
  @cmd = @opts[:c] || 'backup'
  
  #      @logger = NullLogger.new
  logfile = 'qdumpfs.log'
  #ログディレクトリの作成
  @logdir = @opts[:logdir] || Dir.pwd
  Dir.mkdir(@logdir) unless FileTest.directory?(@logdir)
  @logpath = File.join(@logdir, logfile)
  @logger = SimpleLogger.new(@logpath)
  
  verifyfile = 'verify.txt'
  @verifypath = File.join(@logdir, verifyfile)

  @matcher = NullMatcher.new
  
  size = @opts[:es]
  globs = @opts[:eg]
  patterns = @opts[:ep]
  if size || globs || patterns
    @matcher = FileMatcher.new(:size => size, :globs => globs, :patterns => patterns)
  end      
  
  # 同期用のオプションは日常使いのpdumpfs-cleanのオプションより期間短めに設定
  @limit = @opts[:limit]
  @keep_year = 100
  @keep_month = 12
  @keep_week = 12
  @keep_day = 30
  keep = @opts[:keep]
  @keep_year = $1.to_i if keep =~ /(\d+)Y/
  @keep_month = $1.to_i if keep =~ /(\d+)M/
  @keep_week = $1.to_i if keep =~ /(\d+)W/
  @keep_day = $1.to_i if keep =~ /(\d+)D/
  @delete_from = @opts[:delete_from]
  @delete_to = @opts[:delete_to]
  @delete_dirs = @opts[:delete_dirs] || []
  @backup_at = @opts[:backup_at]
  @today = Date.today
  @debug = @opts[:d]
end

Public Instance Methods

detect_delete_dirs(backup_dirs, delete_from, delete_to) click to toggle source
# File lib/qdumpfs/option.rb, line 228
def detect_delete_dirs(backup_dirs, delete_from, delete_to)
  
  backup_dirs.each do |backup_dir|
    backup_dir.keep = true
    if delete_from && delete_to
      if backup_dir.date >= delete_from && backup_dir.date <= delete_to
        backup_dir.keep = false
      end
    elsif delete_from
      if backup_dir.date >= delete_from
        backup_dir.keep = false
      end
    elsif delete_to
      if backup_dir.date <= delete_to
        backup_dir.keep = false
      end
    end
  end
end
detect_expire_dirs(backup_dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 221
def detect_expire_dirs(backup_dirs)
  detect_year_keep_dirs(backup_dirs)
  detect_month_keep_dirs(backup_dirs)
  detect_week_keep_dirs(backup_dirs)
  detect_day_keep_dirs(backup_dirs)
end
dry_run() click to toggle source
# File lib/qdumpfs/option.rb, line 191
def dry_run
  @opts[:n]
end
limit_sec() click to toggle source
# File lib/qdumpfs/option.rb, line 195
def limit_sec
  @limit.to_i * 3600
end
log(msg, console = true) click to toggle source
# File lib/qdumpfs/option.rb, line 185
def log(msg, console = true)
  return if (msg.nil? || msg == '')
  puts msg if console
  @logger.print(msg)
end
open_listfile() click to toggle source
# File lib/qdumpfs/option.rb, line 255
def open_listfile
  filename = File.join(@logdir, "list_" + @src.gsub(/[:\/]/, '_') + '.txt')
  if FileTest.file?(filename)
    File.unlink(filename)
  end
  File.open(filename, 'a')
end
open_verifyfile() click to toggle source
# File lib/qdumpfs/option.rb, line 248
def open_verifyfile
  if FileTest.file?(@verifypath)
    File.unlink(@verifypath)
  end
  File.open(@verifypath, 'a')
end
report(type, filename) click to toggle source
# File lib/qdumpfs/option.rb, line 156
def report(type, filename)
  if @opts[:v]
    stat = File.stat(filename)
    size = stat.size
    format_size = convert_bytes(size)
    msg = format_report_with_size(type, filename, size, format_size)        
  elsif @opts[:r]
    if type =~ /^new_file/
      stat = File.stat(filename)
      size = stat.size
      format_size = convert_bytes(size)
      msg = format_report_with_size(type, filename, size, format_size)
    end
  else
    # 何も指定されていない場合
    if type == 'new_file'
      stat = File.stat(filename)
      size = stat.size
      msg = format_report(type, filename, size)
    end
  end
  log(msg)
end
report_error(filename, reason) click to toggle source
# File lib/qdumpfs/option.rb, line 180
def report_error(filename, reason)
  msg = sprintf("err_file\t%s\t%s\n", filename, reason)
  log(msg)
end
validate_directories(min_count) click to toggle source
# File lib/qdumpfs/option.rb, line 205
def validate_directories(min_count)
  @dirs.each do |dir|
    validate_directory(dir)
  end
  if @dirs.size == 2 && windows?
    # ディレクトリが2つだけ指定されている場合、コピー先はntfsである必要がある
    unless ntfs?(dst)
      fstype = get_filesystem_type(dst)
      raise sprintf("only NTFS is supported but %s is %s.", dst, fstype)
    end      
  end
  if @dirs.size < min_count
    raise "#{min_count} directories required."
  end
end
validate_directory(dir) click to toggle source
# File lib/qdumpfs/option.rb, line 199
def validate_directory(dir)
  if dir.nil? || !File.directory?(dir)
    raise ArgumentError, "No such directory: #{dir}"
  end
end

Private Instance Methods

convert_bytes(bytes) click to toggle source
# File lib/qdumpfs/option.rb, line 280
def convert_bytes(bytes)
  if bytes < 1024
    sprintf("%dB", bytes)
  elsif bytes < 1024 * 1000 # 1000kb
    sprintf("%.1fKB", bytes.to_f / 1024)
  elsif bytes < 1024 * 1024 * 1000  # 1000mb
    sprintf("%.1fMB", bytes.to_f / 1024 / 1024)
  else
    sprintf("%.1fGB", bytes.to_f / 1024 / 1024 / 1024)
  end
end
detect_day_keep_dirs(backup_dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 326
def detect_day_keep_dirs(backup_dirs)
  keep_dirs(backup_dirs, @keep_day) do |i|
    base_date = @today - i
    from_date = base_date
    to_date = base_date
    [from_date, to_date]
  end
end
detect_month_keep_dirs(backup_dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 308
def detect_month_keep_dirs(backup_dirs)
  keep_dirs(backup_dirs, @keep_month) do |i|
    base_date = @today <<  i
    from_date = Date.new(base_date.year, base_date.month, 1)
    to_date = from_date >> 1
    [from_date, to_date]
  end
end
detect_week_keep_dirs(backup_dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 317
def detect_week_keep_dirs(backup_dirs)
  keep_dirs(backup_dirs, @keep_week) do |i|
    base_date = @today  - 7 * i
    from_date = base_date - base_date.cwday # 1
    to_date = from_date + 6
    [from_date, to_date]
  end
end
detect_year_keep_dirs(backup_dirs) click to toggle source
# File lib/qdumpfs/option.rb, line 300
def detect_year_keep_dirs(backup_dirs)
  keep_dirs(backup_dirs, @keep_year) do |i|
  from_date = Date.new(@today.year - i, 1, 1)
    to_date = Date.new(@today.year - i, 12, 31)
    [from_date, to_date]
  end
end
format_report(type, filename, size) click to toggle source
# File lib/qdumpfs/option.rb, line 264
def format_report(type, filename, size)
  sprintf("%s\t%s\t%d\n", type, filename, size)
end
format_report_as_csv(type, filename) click to toggle source
# File lib/qdumpfs/option.rb, line 276
def format_report_as_csv(type, filename)
  sprintf("%s,%s\n", type, filename.encode('cp932', undef: :replace))
end
format_report_with_size(type, filename, size, format_size) click to toggle source
# File lib/qdumpfs/option.rb, line 268
def format_report_with_size(type, filename, size, format_size)
  sprintf("%s\t%s\t%d\t%s\n", type, filename, size, format_size)
end
format_report_with_size_as_csv(type, filename, size, format_size) click to toggle source
# File lib/qdumpfs/option.rb, line 272
def format_report_with_size_as_csv(type, filename, size, format_size)
  sprintf("%s,%s,%d,%s\n", type, filename.encode('cp932', undef: :replace), size, format_size)
end
keep_dirs(backup_dirs, num) { |i| ... } click to toggle source
# File lib/qdumpfs/option.rb, line 292
def keep_dirs(backup_dirs, num)
  num.downto(0) do |i|
    from_date, to_date = yield(i)
    dirs = BackupDir.find(backup_dirs, from_date, to_date)
    dirs[0].keep = true if dirs.size > 0
  end
end