nearline 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,13 +16,21 @@ module Nearline
16
16
  # The path doesn't actually exist and fails a File.lstat
17
17
  return nil if file_information.path_hash.nil?
18
18
 
19
- # We need to create a record for either a directory or file
19
+ # We need to create a record for a link, directory or file
20
20
  archived_file = ArchivedFile.new(
21
21
  file_information.archived_file_parameters
22
22
  )
23
+
24
+ # Find a new link
25
+ if(file_information.ftype == "link")
26
+ archived_file.ftype_data = file_information.link_target
27
+ archived_file.save!
28
+ file_information.manifest.archived_files << archived_file
29
+ return archived_file
30
+ end
23
31
 
24
32
  # Find a new directory
25
- if (file_information.is_directory)
33
+ if (file_information.ftype=="directory")
26
34
  archived_file.save!
27
35
  file_information.manifest.archived_files << archived_file
28
36
  return archived_file
@@ -38,20 +46,28 @@ module Nearline
38
46
  end
39
47
  archived_file
40
48
 
41
- # TODO: Symbolic links, block devices, ...?
49
+ # TODO: block devices, ...?
42
50
  end
43
51
 
44
52
  def restore(*args)
45
53
  @options = args.extract_options!
46
- if (self.is_directory)
54
+
55
+ if (self.ftype == "link")
56
+ guarantee_path
57
+ File.symlink(self.ftype_data,
58
+ option_override(:path))
59
+ #restore_metadata
60
+ return
61
+ end
62
+
63
+ if (self.ftype == "directory")
47
64
  FileUtils.mkdir_p option_override(:path)
48
65
  restore_metadata
49
66
  return
50
67
  end
51
- target_path = File.dirname(option_override(:path))
52
- if (!File.exist? target_path)
53
- FileUtils.mkdir_p target_path
54
- end
68
+
69
+ # ftype == "file"
70
+ guarantee_path
55
71
  f = File.open(option_override(:path), "wb")
56
72
  self.file_content.restore_to(f)
57
73
  f.close
@@ -59,6 +75,13 @@ module Nearline
59
75
  return
60
76
  end
61
77
 
78
+ def guarantee_path
79
+ target_path = File.dirname(option_override(:path))
80
+ if (!File.exist? target_path)
81
+ FileUtils.mkdir_p target_path
82
+ end
83
+ end
84
+
62
85
  def option_override(key)
63
86
  if (@options.has_key?(key))
64
87
  return @options[key]
@@ -0,0 +1,88 @@
1
+ module Nearline
2
+ module Models
3
+
4
+ # Handles file paths and metadata for a file in a manifest
5
+ # Acts as a builder for archived_file by providing the construction parameters
6
+ class FileInformation
7
+ attr_reader :path_hash,
8
+ :stat, # lstat result
9
+ :ftype, # file type, either "link", "directory", or "file"
10
+ :archived_file_parameters, # construction parameters for archived_file
11
+ :manifest, # reference to the associated manifest, so logging can happen
12
+ :file_path, # the full, expanded file path of the file
13
+ :archived_path, # the path as stored to the repository (less drive letter in Windows)
14
+ :link_target
15
+
16
+ def initialize(file_path, manifest)
17
+ @manifest = manifest
18
+ @file_path = File.expand_path(file_path)
19
+ @archived_path = cleaned_file_path
20
+ @stat = read_stat
21
+ @ftype = ftype_lookup(file_path)
22
+ @path_hash = generate_path_hash
23
+ @archived_file_parameters = build_parameters
24
+ end
25
+
26
+ def cleaned_file_path
27
+ if RUBY_PLATFORM =~/win/
28
+ return @file_path[2..-1]
29
+ end
30
+ @file_path
31
+ end
32
+
33
+ def read_stat
34
+ stat = nil
35
+ begin
36
+ stat = File.lstat(@file_path)
37
+ rescue
38
+ @manifest.add_log("File not found on lstat: #{@file_path}")
39
+ end
40
+ stat
41
+ end
42
+
43
+ def generate_path_hash
44
+ return nil if @stat.nil?
45
+ target = [@manifest.system.name,
46
+ @archived_path,
47
+ @stat.uid,
48
+ @stat.gid,
49
+ @stat.mtime.to_i,
50
+ @stat.mode].join(':')
51
+ Digest::SHA1.hexdigest(target)
52
+ end
53
+
54
+ def file_content_value
55
+ return FileContent.new unless @ftype == "directory"
56
+ return nil
57
+ end
58
+
59
+ def ftype_lookup(file_path)
60
+ if File.symlink?(file_path)
61
+ @link_target = File.readlink file_path
62
+ return "link"
63
+ end
64
+ if File.directory?(file_path)
65
+ return "directory"
66
+ end
67
+ return "file"
68
+ end
69
+
70
+ def build_parameters
71
+ return nil if @stat.nil?
72
+ {
73
+ :system => @manifest.system,
74
+ :path => @archived_path,
75
+ :path_hash => @path_hash,
76
+ :file_content => file_content_value,
77
+ :uid => @stat.uid,
78
+ :gid => @stat.gid,
79
+ :mtime => @stat.mtime.to_i,
80
+ :mode => @stat.mode,
81
+ :ftype => @ftype
82
+ }
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+ end
@@ -25,64 +25,6 @@ module Nearline
25
25
  end
26
26
  end
27
27
 
28
- # Handles file paths and metadata for a file in a manifest
29
- class FileInformation
30
- attr_reader :path_hash, :stat, :is_directory,
31
- :archived_file_parameters, :manifest, :file_path
32
-
33
- def initialize(file_path, manifest)
34
- @manifest = manifest
35
- @file_path = file_path
36
- @stat = read_stat
37
- @is_directory = File.directory?(file_path)
38
- @path_hash = generate_path_hash
39
- @archived_file_parameters = build_parameters
40
- end
41
-
42
- def read_stat
43
- stat = nil
44
- begin
45
- # TODO: change to lstat when we handle links
46
- stat = File.stat(@file_path)
47
- rescue
48
- @manifest.add_log("File not found on stat: #{@file_path}")
49
- end
50
- stat
51
- end
52
-
53
- def generate_path_hash
54
- return nil if @stat.nil?
55
- target = [@manifest.system.name,
56
- @file_path,
57
- @stat.uid,
58
- @stat.gid,
59
- @stat.mtime.to_i,
60
- @stat.mode].join(':')
61
- Digest::SHA1.hexdigest(target)
62
- end
63
-
64
- def file_content_entry_for_files_only
65
- return FileContent.new unless @is_directory
66
- return nil
67
- end
68
-
69
- def build_parameters
70
- return nil if @stat.nil?
71
- {
72
- :system => @manifest.system,
73
- :path => @file_path,
74
- :path_hash => @path_hash,
75
- :file_content => file_content_entry_for_files_only,
76
- :uid => @stat.uid,
77
- :gid => @stat.gid,
78
- :mtime => @stat.mtime.to_i,
79
- :mode => @stat.mode,
80
- :is_directory => @is_directory
81
- }
82
- end
83
-
84
- end
85
-
86
28
  # A Manifest represents the corpus of ArchivedFiles and
87
29
  # set of Log messages resulting from a backup attempt
88
30
  class Manifest < ActiveRecord::Base
@@ -192,16 +134,16 @@ module Nearline
192
134
 
193
135
  # Iterate all missing files from this manifest, yielding each
194
136
  def iterate_all_missing
195
- files_restored = []
137
+ files_iterated = []
196
138
  self.archived_files.each do |af|
197
139
  begin
198
- File.stat(af.path)
140
+ File.lstat(af.path)
199
141
  rescue
200
142
  yield af
201
- files_restored << af.path
143
+ files_iterated << af.path
202
144
  end
203
145
  end
204
- return files_restored
146
+ return files_iterated
205
147
  end
206
148
 
207
149
  def add_log(message)
@@ -223,12 +165,12 @@ module Nearline
223
165
  def archived_file_content_query(op)
224
166
  <<-END_SQL
225
167
  select distinct fc.id
226
- from archived_files af,
227
- archived_files_manifests afm, file_contents fc
228
- where
229
- afm.manifest_id #{op} #{self.id} and
230
- afm.archived_file_id = af.id and
231
- af.file_content_id = fc.id
168
+ from archived_files af,
169
+ archived_files_manifests afm, file_contents fc
170
+ where
171
+ afm.manifest_id #{op} #{self.id} and
172
+ afm.archived_file_id = af.id and
173
+ af.file_content_id = fc.id
232
174
  END_SQL
233
175
  end
234
176
 
@@ -301,8 +243,8 @@ select distinct af.id
301
243
  # A simple string reporting the performance of the manifest
302
244
  def summary
303
245
  completed = (completed_at.nil?) ? "DNF" : completed_at
304
- "#{system.name} started: #{created_at}; finished: #{completed}; " +
305
- "#{archived_files.size} files; #{logs.size} Errors reported"
246
+ "#{system.name} started: #{created_at}\nfinished: #{completed}\n" +
247
+ "#{archived_files.size} files\n#{logs.size} Error#{(logs.size != 1) ? 's' : ''} reported"
306
248
  end
307
249
 
308
250
  end
@@ -2,9 +2,9 @@ module Nearline
2
2
  module_function
3
3
 
4
4
  # Version of the software
5
- VERSION = "0.0.5"
5
+ VERSION = "0.0.6"
6
6
  # Last version that changed the database structure
7
- DB_VERSION = "0.0.4"
7
+ DB_VERSION = "0.0.6"
8
8
 
9
9
  # Array of every Nearline Model using an ActiveRecord connection
10
10
  AR_MODELS = Nearline::Models.constants.map do |m|
@@ -44,11 +44,6 @@ module Nearline
44
44
  t.column :file_content_id, :integer, :null => false
45
45
  end
46
46
 
47
- add_index :sequences, [:sequence, :file_content_id], :unique => true,
48
- :name => "sequence_jn_index"
49
-
50
- add_index :sequences, [:block_id]
51
-
52
47
  create_table :systems do |t|
53
48
  t.column :name, :string, :null => false
54
49
  end
@@ -64,7 +59,8 @@ module Nearline
64
59
  t.column :gid, :integer, :default => -1
65
60
  t.column :mtime, :integer, :default => 0
66
61
  t.column :mode, :integer, :default => 33206 # "chmod 100666"
67
- t.column :is_directory, :boolean
62
+ t.column :ftype, :string, :null => false
63
+ t.column :ftype_data, :text
68
64
  end
69
65
 
70
66
  add_index :archived_files, [:path_hash], :unique => true
@@ -81,12 +77,6 @@ module Nearline
81
77
  t.column :archived_file_id, :integer
82
78
  t.column :manifest_id, :integer
83
79
  end
84
-
85
- add_index :archived_files_manifests,
86
- [:archived_file_id, :manifest_id], {
87
- :unique => true,
88
- :name => "manifest_jn_index"
89
- }
90
80
 
91
81
  # Keeps a record of problems during backup related to a manifest
92
82
  create_table :logs do |t|
data/lib/nearline.rb CHANGED
@@ -16,6 +16,7 @@ require 'nearline/log'
16
16
  require 'nearline/manifest'
17
17
 
18
18
  # Non-AR model
19
+ require 'nearline/file_information'
19
20
  require 'nearline/file_sequencer'
20
21
 
21
22
  # Static methods on Nearline
@@ -9,7 +9,6 @@ unless File.exist?($data_path)
9
9
  FileUtils.mkdir $data_path
10
10
  end
11
11
 
12
- require 'schema_test'
13
12
  require 'block_test'
14
13
  require 'nearline_module_test'
15
14
  require 'file_content_test'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nearline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert J. Osborne
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-22 00:00:00 -04:00
12
+ date: 2008-07-20 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -39,6 +39,7 @@ files:
39
39
  - lib/nearline/log.rb
40
40
  - lib/nearline/archived_file.rb
41
41
  - lib/nearline/file_content.rb
42
+ - lib/nearline/file_information.rb
42
43
  - lib/nearline/manifest.rb
43
44
  - lib/nearline.rb
44
45
  - tasks/gemspec.rake