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

current[R]

Digest of files as they are presently on disk. [Hash]

saved[R]

Digest of files as saved in the digest file. [Hash]

system[R]

System instance. [System]

Public Class Methods

new(system) click to toggle source

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

[](ruleset) click to toggle source

Get current digest for a given ruleset.

# File lib/rulebow/digest.rb, line 42
def [](ruleset)
  for_ruleset(ruleset)
end
checksum(file) click to toggle source

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
clear_all() click to toggle source

Remove all digests.

# File lib/rulebow/digest.rb, line 54
def clear_all
  FileUtils.rm(filename)
end
filename() click to toggle source

The digest file’s path.

Returns [String]

# File lib/rulebow/digest.rb, line 49
def filename
  @filename
end
filter(ruleset, files) click to toggle source

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
for_ruleset(ruleset) click to toggle source
# File lib/rulebow/digest.rb, line 174
def for_ruleset(ruleset)
  For.instance(self, getruleset(ruleset))
end
read() click to toggle source

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(ruleset=nil) click to toggle source

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(ruleset) click to toggle source

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(ruleset=nil) click to toggle source

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
to_s() click to toggle source

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

getruleset(ruleset) click to toggle source
# File lib/rulebow/digest.rb, line 181
def getruleset(ruleset)
  case ruleset
  when Ruleset
    ruleset
  else
    system.rulesets[ruleset.to_sym]
  end
end