module Mihari::Mixins::Rule
Public Instance Methods
initialize_rule_yaml(filename, files = Dry::Files.new, template: rule_template)
click to toggle source
Create (blank) rule file
@param [String] filename @param [Dry::Files] files @param [String] template
@return [nil]
# File lib/mihari/mixins/rule.rb, line 78 def initialize_rule_yaml(filename, files = Dry::Files.new, template: rule_template) files.write(filename, template) end
load_rule(path)
click to toggle source
Load rule into hash
@param [String] path Path to YAML file or YAML string
@return [Hash]
# File lib/mihari/mixins/rule.rb, line 16 def load_rule(path) return YAML.safe_load(File.read(path), permitted_classes: [Date], symbolize_names: true) if Pathname(path).exist? YAML.safe_load(path, symbolize_names: true) end
rule_template()
click to toggle source
Returns a template for rule
@return [String] A template for rule
# File lib/mihari/mixins/rule.rb, line 56 def rule_template # Use ERB to fill created_on and updated_on with Date.today data = File.read(File.expand_path("../templates/rule.yml.erb", __dir__)) template = ERB.new(data) data = template.result # validate the template of rule for just in case rule = YAML.safe_load(data, permitted_classes: [Date], symbolize_names: true) validate_rule rule data end
validate_rule(rule)
click to toggle source
Validate rule schema and return a normalized rule
@param [Hash] rule
@return [Hash]
# File lib/mihari/mixins/rule.rb, line 29 def validate_rule(rule) error_message = "Failed to parse the input as a rule!" contract = Schemas::RuleContract.new begin result = contract.call(rule) unless result.errors.empty? messages = result.errors.messages.map do |message| path = message.path.map(&:to_s).join "#{path} #{message.text}" end puts error_message.colorize(:red) raise ArgumentError, messages.join("\n") end rescue NoMethodError puts error_message.colorize(:red) raise ArgumentError, "Invalid rule schema" end result.to_h end