class FileBasedRuleRepo

This is really the traditional implementation for CustomRuleLoader that looks in cfn-nag/custom_rules and an optional directory of a client's choosing

Public Class Methods

new(rule_directory) click to toggle source
# File lib/cfn-nag/rule_repos/file_based_rule_repo.rb, line 11
def initialize(rule_directory)
  @rule_directory = rule_directory
  validate_extra_rule_directory rule_directory
end

Public Instance Methods

discover_rules() click to toggle source
# File lib/cfn-nag/rule_repos/file_based_rule_repo.rb, line 16
def discover_rules
  rule_registry = RuleRegistry.new

  # we look on the file system, and we load from the file system into a Class
  # that the runtime can refer back to later from the registry which is effectively
  # just a set of rule definitons
  discover_rule_classes(@rule_directory).each do |rule_class|
    rule_registry.definition(rule_class)
  end

  rule_registry
end

Private Instance Methods

discover_rule_classes(rule_directory) click to toggle source
# File lib/cfn-nag/rule_repos/file_based_rule_repo.rb, line 50
def discover_rule_classes(rule_directory)
  rule_classes = []

  rule_filenames = discover_rule_filenames(rule_directory)
  rule_filenames.each do |rule_filename|
    require(File.absolute_path(rule_filename))
    rule_classname = File.basename(rule_filename, '.rb')

    rule_classes << Object.const_get(rule_classname)
  end
  Logging.logger['log'].debug "rule_classes: #{rule_classes}"

  rule_classes
end
discover_rule_filenames(rule_directory) click to toggle source
# File lib/cfn-nag/rule_repos/file_based_rule_repo.rb, line 37
def discover_rule_filenames(rule_directory)
  rule_filenames = []
  unless rule_directory.nil?
    rule_filenames += Dir[File.join(rule_directory, '*Rule.rb')].sort
  end
  rule_filenames += Dir[File.join(__dir__, '..', 'custom_rules', '*Rule.rb')].sort

  # Windows fix when running ruby from Command Prompt and not bash
  rule_filenames.reject! { |filename| filename =~ /_rule.rb$/ }
  Logging.logger['log'].debug "rule_filenames: #{rule_filenames}"
  rule_filenames
end
validate_extra_rule_directory(rule_directory) click to toggle source
# File lib/cfn-nag/rule_repos/file_based_rule_repo.rb, line 31
def validate_extra_rule_directory(rule_directory)
  return true if rule_directory.nil? || File.directory?(rule_directory)

  raise "Not a real directory #{rule_directory}"
end