class Snmp2mkr::Discoverer

Attributes

host[R]
host_manager[R]
logger[R]
mib[R]

Public Class Methods

new(host, host_manager: nil, logger: Logger.new(File::NULL), mib: Mib.default) click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 9
def initialize(host, host_manager: nil, logger: Logger.new(File::NULL), mib: Mib.default)
  @host = host
  @host_manager = host_manager
  @logger = logger
  @mib = mib
end

Public Instance Methods

inspect() click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 16
def inspect
  "#<#{self.class}:#{'%x' % __id__}, #{host.name.inspect}>"
end
perform!() click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 22
def perform!
  if host_manager
    host_manager.set_vhosts(host.name, vhosts)
  end

  vhosts
end
primary_vhost() click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 37
def primary_vhost
  @primary_vhost ||= Vhost.new(
    name: host.name,
    roles: host.definition.roles,
    metrics: host.metric_definitions + discover_metrics(host.metric_discoveries),
    mib: mib
  )
end
snmp_trees() click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 46
def snmp_trees
  @snmp_trees ||= host.snmp do |snmp|
    oids = [*host.metric_discoveries.values, *host.vhost_discoveries.values].
      compact.
      flat_map { |_| _.keys.values.map(&:evaluate) }.
      uniq.
      map { |_| Snmp2mkr::Oid.new(mib.name_to_oid(_), name: _) }.
      uniq.
      sort_by { |_| -_.to_a.size }

    oids.map do |oid|
      [oid.to_s, snmp.subtree(oid).to_a]
    end.to_h
  end
end
vhosts() click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 30
def vhosts
  @vhosts ||= [
    primary_vhost,
    *discover_vhosts(host.vhost_discoveries),
  ]
end

Private Instance Methods

discover_metrics(rules) click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 64
def discover_metrics(rules)
  rules.each_value.flat_map do |rule|
    rule_keys = rule.keys.map { |k, confoid| [k, Snmp2mkr::Oid.new(confoid.evaluate, mib: mib)] }
    primary_oid = rule_keys.first.last.to_s

    snmp_trees[primary_oid].flat_map do |index_vb|
      index = index_vb.oid.index_of(primary_oid)
      keys = rule_keys.map do |k, oid|
        [k, snmp_trees[oid.to_s].find{ |vb| vb.oid.index_of(oid) == index }.value.to_s]
      end.to_h
      keys['index'] = index

      rule.metrics.bind_context(keys).evaluate.values
    end
  end
end
discover_vhosts(rules) click to toggle source
# File lib/snmp2mkr/discoverer.rb, line 81
def discover_vhosts(rules)
  rules.each.flat_map do |rule_name, rule|
    rule_keys = rule.keys.map { |k, confoid| [k, Snmp2mkr::Oid.new(confoid.evaluate, mib: mib)] }
    primary_oid = rule_keys.first.last.to_s

    snmp_trees[primary_oid].flat_map do |index_vb|
      index = index_vb.oid.index_of(primary_oid)
      keys = rule_keys.map do |k, oid|
        [k, snmp_trees[oid.to_s].find{ |vb| vb.oid.index_of(oid) == index }.value.to_s]
      end.to_h
      keys['index'] = index

      bind_rule = rule.bind_context(keys)
      Vhost.new(
        name: bind_rule.name.evaluate,
        roles: bind_rule.roles.map(&:evaluate),
        metrics: bind_rule.metrics.evaluate.values,
        discovery_name: rule_name,
      )
    end
  end
end