class Rulebow::Digest
Digest
class is used to read and write lists of files with their associated checksums. This class uses SHA1.
Constants
- DEFAULT_NAME
The name of the master digest.
Attributes
Digest
of files as they are presently on disk. [Hash]
Digest
of files as saved in the digest file. [Hash]
System
instance. [System]
Public Class Methods
Initialize new instance of Digest
.
Options
ignore - Instance of Ignore for filtering unwanted files. [Ignore] mark - Name of digest to load. [String]
# File lib/rulebow/digest.rb, line 27 def initialize(system) @system = system #@name = (options[:name] || MASTER_NAME).to_s #@ignore = options[:ignore] @filename = system.state_file @current = Hash.new{ |h,k| h[k.to_s] = {} } @saved = Hash.new{ |h,k| h[k.to_s] = {} } read refresh end
Public Instance Methods
Get current digest for a given ruleset.
# File lib/rulebow/digest.rb, line 42 def [](ruleset) for_ruleset(ruleset) end
Compute the sha1 identifer for a file.
file - path to a file
Returns [String] SHA1 digest string.
# File lib/rulebow/digest.rb, line 146 def checksum(file) sha = ::Digest::SHA1.new File.open(file, 'r') do |fh| fh.each_line do |l| sha << l end end sha.hexdigest end
Remove all digests.
# File lib/rulebow/digest.rb, line 54 def clear_all FileUtils.rm(filename) end
The digest file’s path.
Returns [String]
# File lib/rulebow/digest.rb, line 49 def filename @filename end
Filter files of those to be ignored.
ruleset - instance of {Ruleset} files - files to be filtered
Return [Array<String>]
# File lib/rulebow/digest.rb, line 162 def filter(ruleset, files) #case ruleset.ignore #when Watchlist ruleset.digest.filter(files) #when Array # files.reject!{ |path| ignore.any?{ |ig| /^#{ig}/ =~ path } } #else # files #end end
# File lib/rulebow/digest.rb, line 174 def for_ruleset(ruleset) For.instance(self, getruleset(ruleset)) end
Load digest from file system.
Returns nothing.
# File lib/rulebow/digest.rb, line 61 def read return unless File.exist?(filename) name = DEFAULT_NAME save = Hash.new{ |h,k| h[k.to_s] = {} } File.read(filename).lines.each do |line| if md = /^\[(\w+)\]$/.match(line) name = md[1] end if md = /^(\w+)\s+(.*?)$/.match(line) save[name][md[2]] = md[1] end end save.each do |name, digest| @saved[name] = digest end end
Refresh current digest for a given ruleset, or all rulesets if not given.
Returns nothing.
# File lib/rulebow/digest.rb, line 84 def refresh(ruleset=nil) if ruleset ruleset = getruleset(ruleset) current[ruleset.name.to_s] = ruleset.watchlist.digest else system.rulesets.each do |name, ruleset| refresh(ruleset) end end end
Remove digest.
# File lib/rulebow/digest.rb, line 116 def remove(ruleset) case ruleset when Ruleset current.remove(ruleset.name) else current.remove(ruleset.to_str) end save end
Save current digest.
Returns nothing.
# File lib/rulebow/digest.rb, line 98 def save(ruleset=nil) if ruleset ruleset = getruleset(ruleset) refresh(ruleset) saved[ruleset.name.to_s] = current[ruleset.name.to_s] else refresh saved = current end dir = File.dirname(filename) FileUtils.mkdir_p(dir) unless File.directory?(dir) File.open(filename, 'w') do |f| f << to_s end end
Produce the representation of the digest that is stored to disk.
Returns digest file format. [String]
# File lib/rulebow/digest.rb, line 129 def to_s s = "" saved.each do |name, list| s << "[#{name}]\n" list.each do |path, id| s << "#{id} #{path}\n" end s << "\n" end s end
Private Instance Methods
# File lib/rulebow/digest.rb, line 181 def getruleset(ruleset) case ruleset when Ruleset ruleset else system.rulesets[ruleset.to_sym] end end