fingerprint 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/fingerprint CHANGED
@@ -21,13 +21,18 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  require 'optparse'
24
+ require 'pathname'
24
25
  require 'fingerprint'
25
26
 
27
+ FINGERPRINT_NAME = "._fingerprint"
28
+
26
29
  OPTIONS = {
27
30
  :root => "./",
28
31
  :mode => :scan,
29
32
  :output => nil,
30
- :verbose => false
33
+ :verbose => false,
34
+ :force => false,
35
+ :name => "._fingerprint.txt"
31
36
  }
32
37
 
33
38
  ARGV.options do |o|
@@ -36,6 +41,30 @@ ARGV.options do |o|
36
41
  o.banner = "Usage: #{script_name} [options] [path]"
37
42
  o.define_head "This script is used to calculate and compare a basic file system fingerprint."
38
43
 
44
+ o.separator ""
45
+ o.separator "Directory analysis and verification:"
46
+
47
+ o.on("--analyze [path]", String, "Generage a fingerprint of the given path and save it for later verification.") do |path|
48
+ OPTIONS[:mode] = :analyze
49
+ OPTIONS[:root] = path
50
+ end
51
+
52
+ o.on("--verify [path]", String, "Verify a given path based on a previously saved fingerprint.") do |path|
53
+ OPTIONS[:mode] = :verify
54
+ OPTIONS[:root] = path
55
+ end
56
+
57
+ o.on("-n name", String, "Specify the name of the fingerprint file (default #{OPTIONS[:name]}).") do |name|
58
+ OPTIONS[:name] = name
59
+ end
60
+
61
+ o.on("-f", "Force any operation to complete despite warnings.") do
62
+ OPTIONS[:force] = true
63
+ end
64
+
65
+ o.separator ""
66
+ o.separator "Low level operations:"
67
+
39
68
  o.on("-c", "Compare the given fingerprints. Check that the second fingerprint is a superset of the first.") do
40
69
  OPTIONS[:mode] = :check
41
70
  end
@@ -49,19 +78,59 @@ ARGV.options do |o|
49
78
  end
50
79
 
51
80
  o.separator ""
52
- o.separator "Help and Copyright information"
81
+ o.separator "Help and Copyright information:"
53
82
 
54
83
  o.on_tail("--copy", "Display copyright information") {
55
- puts "#{script_name} v#{Fingerprint::VERSION::STRING}. Copyright (c) 2010 Samuel Williams. Released under the GPLv3."
56
- puts "See http://www.oriontransfer.co.nz/ for more information."
84
+ $stderr.puts "#{script_name} v#{Fingerprint::VERSION::STRING}. Copyright (c) 2011 Samuel Williams. Released under the MIT license."
85
+ $stderr.puts "See http://www.oriontransfer.co.nz/ for more information."
57
86
 
58
87
  exit
59
88
  }
60
89
 
61
- o.on_tail("-h", "--help", "Show this help message.") { puts o; exit }
90
+ o.on_tail("-h", "--help", "Show this help message.") { $stderr.puts o; exit }
62
91
  end.parse!
63
92
 
93
+ unless File.directory? OPTIONS[:root]
94
+ $stderr.puts "Path #{OPTIONS[:root]} doesn't exist!"
95
+ exit(255)
96
+ end
97
+
64
98
  case (OPTIONS[:mode])
99
+ when :analyze
100
+ output_file = Pathname.new(OPTIONS[:root]) + OPTIONS[:name]
101
+
102
+ if output_file.exist? && !OPTIONS[:force]
103
+ $stderr.puts "Output file #{output_file} already exists. Aborting."
104
+ exit(2)
105
+ end
106
+
107
+ options = {}
108
+ options[:verbose] = true if OPTIONS[:verbose]
109
+
110
+ File.open(output_file, "w") do |io|
111
+ options[:output] = io
112
+
113
+ Fingerprint::Scanner.scan_paths([OPTIONS[:root]], options)
114
+ end
115
+ when :verify
116
+ error_count = 0
117
+
118
+ input_file = Pathname.new(OPTIONS[:root]) + OPTIONS[:name]
119
+
120
+ scanner = Fingerprint::Scanner.scan_paths([OPTIONS[:root]])
121
+ scanner.output.seek(0)
122
+
123
+ File.open(input_file, "r") do |io|
124
+ error_count += Fingerprint::Checker.check_files(io, scanner.output)
125
+ end
126
+
127
+ if error_count == 0
128
+ $stderr.puts "Data verified, 0 errors found."
129
+ exit(0)
130
+ else
131
+ $stderr.puts "Data inconsistent, #{error_count} errors found!"
132
+ exit(1)
133
+ end
65
134
  when :scan
66
135
  roots = ARGV
67
136
  roots << Dir.pwd if roots.size == 0
@@ -92,17 +92,21 @@ module Fingerprint
92
92
  # Helper function to check two fingerprint files.
93
93
  def self.check_files(master, copy, &block)
94
94
  error_count = 0
95
- checker = Checker.new(File.open(master), File.open(copy))
95
+
96
+ master = File.open(master) unless master.respond_to? :read
97
+ copy = File.open(copy) unless copy.respond_to? :read
98
+
99
+ checker = Checker.new(master, copy)
96
100
 
97
101
  checker.check do |hash, path|
98
102
  error_count += 1
99
103
 
100
104
  if !checker.file_paths[path]
101
- $stderr.puts "Source file: #{path.dump} does not exist in destination!"
105
+ $stderr.puts "File #{path.dump} is missing!"
102
106
  elsif checker.file_paths[path] != hash
103
- $stderr.puts "Destination file: #{path.dump} is different!"
107
+ $stderr.puts "File #{path.dump} is different!"
104
108
  else
105
- $stderr.puts "Unknown error for path: #{path.dump}"
109
+ $stderr.puts "Unknown error for path #{path.dump}"
106
110
  end
107
111
  end
108
112
 
@@ -22,8 +22,8 @@
22
22
  module Fingerprint
23
23
  module VERSION
24
24
  MAJOR = 1
25
- MINOR = 1
26
- TINY = 3
25
+ MINOR = 2
26
+ TINY = 0
27
27
 
28
28
  STRING = [MAJOR, MINOR, TINY].join('.')
29
29
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 1
8
- - 3
9
- version: 1.1.3
7
+ - 2
8
+ - 0
9
+ version: 1.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Samuel Williams
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-07-17 00:00:00 +12:00
17
+ date: 2011-07-20 00:00:00 +12:00
18
18
  default_executable: fingerprint
19
19
  dependencies: []
20
20