Class: Duracloud::SyncValidation

Inherits:
Hashie::Dash
  • Object
show all
Defined in:
lib/duracloud/sync_validation.rb

Direct Known Subclasses

FastSyncValidation

Defined Under Namespace

Classes: CheckResult

Constant Summary collapse

TWO_SPACES =
'  '
MD5_CSV_OPTS =
{ col_sep: TWO_SPACES }.freeze
MANIFEST_CSV_OPTS =
{ col_sep: "\t", headers: true, return_headers: false }.freeze
MISSING =
"MISSING"
CHANGED =
"CHANGED"
FOUND =
"FOUND"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(*args) ⇒ Object



22
23
24
# File 'lib/duracloud/sync_validation.rb', line 22

def self.call(*args)
  new(*args).call
end

Instance Method Details

#auditObject



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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

#callObject



36
37
38
39
40
41
42
# File 'lib/duracloud/sync_validation.rb', line 36

def call
  in_work_dir do
    download_manifest
    convert_manifest
    audit
  end
end

#convert_manifestObject



52
53
54
55
56
57
58
# 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_manifestObject



44
45
46
47
48
49
50
# 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_dirObject



26
27
28
29
30
31
32
33
34
# 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

#recheckObject



77
78
79
80
81
82
83
84
85
86
# 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