class ArgusYml

Attributes

alert[R]
bns[R]
info_yml[R]
instance[R]
logs[R]
name[R]
node[R]

Public Class Methods

new(filename_or_hash, product = nil) click to toggle source
# File lib/ymlex/argusyml.rb, line 170
def initialize filename_or_hash, product = nil
  if filename_or_hash.kind_of? String
    yml = Ymlex.load_file filename_or_hash
  else
    yml = filename_or_hash
  end
  @info_yml = value_to_str yml
  @name = @info_yml["name"]
  @bns = @info_yml["bns"] || []
  node_list = @info_yml["node"] || []
  node_str = ""
  node_list.each {|v| node_str += v + ","}
  @node = node_str.sub /,$/, ""
  @product = product || @info_yml["product"] || @bns.first.sub(/^.*?\./,"").sub(/\..*$/,"") || "Undefined_Product"
  @logs = {}
  @alert = Alert.new @info_yml["contacts"], @info_yml["alert"]
  @service_aggr = []
  @service_rule = []
  @service_alert = [default_alert]
  reset_instance
  trans_ytoj
end
process_dir(dir_path, dest_path, product = nil) click to toggle source
# File lib/ymlex/argusyml.rb, line 158
def self.process_dir dir_path, dest_path, product = nil
  filelist = `find #{dir_path} -type f -name '*yex'`.split(' ')
  product = File.basename dir_path if !product
  filelist.each do |ymx|
    puts "process #{ymx}"
    ags = ArgusYml.new ymx, product
    ags.dump_json dest_path
  end
end

Public Instance Methods

dump_json(dir_path) click to toggle source
# File lib/ymlex/argusyml.rb, line 213
def dump_json dir_path
  
  dir = "#{dir_path}/cluster/cluster.#{@name}.#{@product}.all"
  `mkdir -p #{dir}`

  # instance
  filename = "#{dir}/instance"
  new_instance = @instance
  File.open(filename,"w") do |f|
    f.puts JSON.pretty_generate new_instance
  end

  # log
  @logs.each do |log_key, log_value|
    log_name = "#{dir}/#{log_key}.conf"
    File.open(log_name, "w") do |f|
      f.puts JSON.pretty_generate log_value
    end
  end

  # cluster
  aggr_name = "#{dir}/cluster"
  File.open(aggr_name, "w") do |f|
    cluster = { "aggr" => @service_aggr,
                "rule" => @service_rule,
                "alert" => @service_alert,
              }
    cluster["namespace_list"] = @bns if @bns != []
    cluster["service_node"] = @node if @node != ""
    f.puts JSON.pretty_generate cluster
  end
end
reset_instance() click to toggle source
# File lib/ymlex/argusyml.rb, line 193
def reset_instance
  @instance = empty
end
trans_aggr(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 287
def trans_aggr list
  list.each do | rule_name, value | 
    @service_aggr << { "items" => value["items"],
                       "types" => value["types"] || "sum",
                     }
    if value["formula"]
      rule_name = "#{@name}_aggr_#{rule_name}"
      alert_name = "default_alert"
      other = default_alert_level
      if value["alert"]
        alt = @alert.get_alert value["alert"]
        alt["name"] = rule_name
        other = alt.delete "other"
        @service_alert << alt
        alert_name = rule_name
      end
      @service_rule << { "name" => rule_name,
                         "formula" => value["formula"],
                         "filter" => value["filter"] || "1/1",
                         "merge_window" => other["merge_window"],
                         "level" => other["level"],
                         "alert" => alert_name }
    end
  end
end
trans_derived(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 279
def trans_derived list
  @instance["derived"] = []
  list.each do |key, value|
      @instance["derived"] << value
  end
  #@instance["derived"] = list
end
trans_exec(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 313
def trans_exec list
  list.each do | raw_key, raw_value |
    dft_exec_raw = { "cycle" => "60",
                     "method" => "exec",
                   }
    raw_value["name"] = "#{@name}_exec_#{raw_key}"
    @instance["raw"] << dft_exec_raw.merge(raw_value)
  end
end
trans_log(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 344
def trans_log list
  list.each do |log_key, log_value|
    raw_name = "#{@name}_log_#{log_key}"
    log_raw = { "name" => raw_name,
                "cycle" => log_value["cycle"] || "60",
                "method" => "noah",
                "target" => "logmon",
                "params" => "${ATTACHMENT_DIR}/#{raw_name}.conf",
              }
    @instance["raw"] << log_raw

    log_conf = { "log_filepath" => log_value["path"],
                 "limit_rate" => "5",
                 "item" => []
               }
    log_value.each do |raw_key, raw_value|
      next if raw_key == "path"
      item_name_prefix = "#{raw_name}_#{raw_key}" 
      item = { "item_name_prefix" => item_name_prefix,
               "cycle" => raw_value["cycle"] || "60",
               "match_str" => raw_value["match_str"],
               "filter_str" => raw_value["filter_str"] || "",
             }
      log_conf["item"] << item
      next unless raw_value["formula"]
      alert_name = "default_alert"
      other = default_alert_level
      if raw_value["alert"]
        alt = @alert.get_alert raw_value["alert"]
        alt["name"] = item_name_prefix
        other = alt.delete "other"
        @instance["alert"] << alt
        alert_name = item_name_prefix
      end
      @instance["rule"] << { "name" => item_name_prefix, 
                             "formula" => raw_value["formula"],
                             "filter" => raw_value["filter"] || "1/1",
                             "merge_window" => other["merge_window"],
                             "level" => other["level"],
                             "alert" => alert_name,
                           }
    end
    @logs[raw_name] = log_conf
  end
end
trans_move_core_path(value) click to toggle source
# File lib/ymlex/argusyml.rb, line 271
def trans_move_core_path value
  @instance["move_core_path"] = value
end
trans_other(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 323
def trans_other list
  list.each do | rule_key, rule_value |
    rule_name = "#{@name}_other_#{rule_key}"
    alert_name = "default_alert"
    other = default_alert_level
    if rule_value["alert"]
      alt = @alert.get_alert rule_value["alert"]
      alt["name"] = rule_name
      other = alt.delete "other"
      @instance["alert"] << alt
      alert_name = rule_name
    end
    @instance["rule"] << { "name" => rule_name,
                           "formula" => rule_value["formula"],
                           "filter" => rule_value["filter"] || "1/1",
                           "merge_window" => other["merge_window"],
                           "level" => other["level"],
                           "alert" => alert_name }
  end
end
trans_proc(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 390
def trans_proc list
  list.each do |raw_key, raw_value|
    raw_name = "#{@name}_proc_#{raw_key}"
    @instance["raw"] << { "name" => raw_name,
                          "cycle" => raw_value["cycle"]||"10",
                          "method" => "noah",
                          "target" => "procmon",
                          "params" => raw_value["path"] }
    raw_value.each do |rule_key, rule_value|
      next if (rule_key == "path" || !rule_value["formula"])
      rule_name = "#{raw_name}_#{rule_key}"
      alert_name = "default_alert"
      other = default_alert_level
      if rule_value["alert"]
        alt = @alert.get_alert rule_value["alert"]
        alt["name"] = rule_name
        other = alt.delete "other"
        @instance["alert"] << alt
        alert_name = rule_name
      end
      @instance["rule"] << { "name" => rule_name,
                             "formula" => rule_value["formula"],
                             "filter" => rule_value["filter"]||"3/3",
                             "merge_window" => other["merge_window"],
                             "level" => other["level"],
                             "alert" => alert_name }
    end
  end
end
trans_request(list) click to toggle source
# File lib/ymlex/argusyml.rb, line 420
def trans_request list
  list.each do |raw_key, raw_value|
    raw_name = "#{@name}_request_#{raw_key}"
    dft_raw = { "name" => raw_name,
                "cycle" => "60",
                "port" => "8080",
                "protocol" => "tcp",
                "mon_idc" => "local",
                "req_type" => "port",
              }
    alert_name = "default_alert"
    other = default_alert_level
    if raw_value["alert"]
      alt = @alert.get_alert raw_value["alert"]
      alt["name"] = raw_name
      other = alt.delete "other"
      @instance["alert"] << alt
      alert_name = raw_name
      raw_value.delete "alert"
    end
    @instance["request"] << dft_raw.merge(raw_value)
    @instance["rule"] << { "name" => raw_name,
                           "formula" => "#{raw_name} != 'ok'",
                           "filter" => raw_value["filter"]||"3/3",
                           "merge_window" => other["merge_window"],
                           "level" => other["level"],
                           "alert" => alert_name }
  end
end
trans_started_mode(value) click to toggle source
# File lib/ymlex/argusyml.rb, line 275
def trans_started_mode value
  @instance["started_mode"] = value
end
trans_ytoj() click to toggle source
# File lib/ymlex/argusyml.rb, line 246
def trans_ytoj
  @info_yml.each do |key, value| 
    case key
    when "move_core_path"
      trans_move_core_path value
    when "started_mode"
      trans_started_mode value
    when "proc"
      trans_proc value
    when "request"
      trans_request value
    when "exec"
      trans_exec value
    when "other"
      trans_other value
    when "log"
      trans_log value
    when "aggr"
      trans_aggr value
    when "derived"
      trans_derived value
    end
  end
end
value_to_str(input) click to toggle source
# File lib/ymlex/argusyml.rb, line 197
def value_to_str input
  case 
  when input.kind_of?(Hash)
    input.each do |k,v|
      input[k] = value_to_str v
    end
  when input.kind_of?(Array)
    input.each_index do |i|
      input[i] = value_to_str input[i]
    end
  when input.kind_of?(Fixnum) || input.kind_of?(Float)
    input = input.to_s
  end
  input
end

Private Instance Methods

default_alert() click to toggle source
# File lib/ymlex/argusyml.rb, line 461
def default_alert
  alt = @alert.get_alert
  alt["name"] = "default_alert"
  alt.delete "other"
  alt
end
default_alert_level() click to toggle source
# File lib/ymlex/argusyml.rb, line 468
def default_alert_level
  alt = @alert.get_alert
  alt["other"]
end
empty() click to toggle source
# File lib/ymlex/argusyml.rb, line 480
def empty
  {"raw"=>[], "request"=>[], "rule"=>[], "alert"=>[default_alert]}
end
noah_error() click to toggle source
# File lib/ymlex/argusyml.rb, line 452
def noah_error
  {
    "name" => "noah_error",
    "formula" => "noah_error != '' && not_contain(noah_error,'logmon open log failed') && time_between('080000-220000')",
    "filter" => "100/100",
    "alert" => "noah_error_alert",
  } 
end
noah_error_alert() click to toggle source
# File lib/ymlex/argusyml.rb, line 473
def noah_error_alert
  alt = @alert.get_alert({"rd" => nil, "qa" => nil, "op" => "warn" })
  alt["name"] = "noah_error_alert"
  alt.delete "other"
  alt
end