class Duracloud::SyncValidation

Constants

CHANGED
CheckResult
FOUND
MANIFEST_CSV_OPTS
MD5_CSV_OPTS
MISSING
TWO_SPACES

Public Class Methods

call(*args) click to toggle source
# File lib/duracloud/sync_validation.rb, line 22
def self.call(*args)
  new(*args).call
end

Public Instance Methods

audit() click to toggle source
# File lib/duracloud/sync_validation.rb, line 60
def audit
  outfile = File.join(FileUtils.pwd, audit_filename)
  infile = File.join(FileUtils.pwd, converted_manifest_filename)
  pid = spawn("md5deep", "-X", infile, "-l", "-r", ".", chdir: content_dir, out: outfile)
  Process.wait(pid)
  case $?.exitstatus
  when 0
    true
  when 1, 2
    recheck
  when 64, 128
    raise Error, "md5deep error."
  else
    raise Error, "Unknown error."
  end
end
call() click to toggle source
# File lib/duracloud/sync_validation.rb, line 36
def call
  in_work_dir do
    download_manifest
    convert_manifest
    audit
  end
end
convert_manifest() click to toggle source
# File lib/duracloud/sync_validation.rb, line 52
def convert_manifest
  File.open(converted_manifest_filename, "w") do |f|
    CSV.foreach(manifest_filename, MANIFEST_CSV_OPTS) do |row|
      f.puts [ row[2], row[1] ].join(TWO_SPACES)
    end
  end
end
download_manifest() click to toggle source
# File lib/duracloud/sync_validation.rb, line 44
def download_manifest
  File.open(manifest_filename, "w") do |manifest|
    Manifest.download(space_id, store_id) do |chunk|
      manifest.write(chunk)
    end
  end
end
in_work_dir() { || ... } click to toggle source
# File lib/duracloud/sync_validation.rb, line 26
def in_work_dir
  if work_dir
    FileUtils.cd(work_dir) { yield }
  else
    Dir.mktmpdir("#{space_id}-validation-") do |tmpdir|
      FileUtils.cd(tmpdir) { yield }
    end
  end
end
recheck() click to toggle source
# File lib/duracloud/sync_validation.rb, line 77
def recheck
  success = true
  recheck_file do |csv|
    do_recheck.each do |result|
      csv << result.to_a
      success &&= result.found?
    end
  end
  success
end

Private Instance Methods

audit_filename() click to toggle source
# File lib/duracloud/sync_validation.rb, line 142
def audit_filename
  filename("audit.txt")
end
check(content_id, md5 = nil) click to toggle source
# File lib/duracloud/sync_validation.rb, line 104
def check(content_id, md5 = nil)
  status = begin
             exist?(content_id, md5) ? FOUND : MISSING
           rescue MessageDigestError => e
             CHANGED
           end
  CheckResult.new(status, md5 || "-", content_id)
end
converted_manifest_filename() click to toggle source
# File lib/duracloud/sync_validation.rb, line 138
def converted_manifest_filename
  filename("converted-manifest.txt")
end
do_recheck() click to toggle source
# File lib/duracloud/sync_validation.rb, line 117
def do_recheck
  Enumerator.new do |e|
    CSV.foreach(audit_filename, MD5_CSV_OPTS) do |md5, path|
      content_id = path.sub(/^\.\//, "")
      e << check(content_id, md5)
    end
  end
end
exist?(content_id, md5 = nil) click to toggle source
# File lib/duracloud/sync_validation.rb, line 113
def exist?(content_id, md5 = nil)
  Duracloud::Content.exist?(space_id: space_id, store_id: store_id, content_id: content_id, md5: md5)
end
filename(suffix) click to toggle source
# File lib/duracloud/sync_validation.rb, line 130
def filename(suffix)
  [ prefix, suffix ].join("-")
end
manifest_filename() click to toggle source
# File lib/duracloud/sync_validation.rb, line 134
def manifest_filename
  filename("manifest.tsv")
end
prefix() click to toggle source
# File lib/duracloud/sync_validation.rb, line 126
def prefix
  space_id
end
recheck_file() { |csv| ... } click to toggle source
# File lib/duracloud/sync_validation.rb, line 96
def recheck_file
  if work_dir
    CSV.open(recheck_filename, "w", col_sep: "\t") { |csv| yield(csv) }
  else
    CSV($stdout, col_sep: "\t") { |csv| yield(csv) }
  end
end
recheck_filename() click to toggle source
# File lib/duracloud/sync_validation.rb, line 146
def recheck_filename
  filename("recheck.txt")
end