uniak/puppet-networkdevice

View on GitHub
lib/puppet/util/network_device/cisco_ios/possible_facts/base.rb

Summary

Maintainability
C
1 day
Test Coverage
require 'puppet/util/network_device/cisco_ios/possible_facts'

module Puppet::Util::NetworkDevice::Cisco_ios::PossibleFacts::Base
  def self.register(base)
    base.register_param ['hardwaremodel', 'processor', 'hardwarerevision', 'memorysize'] do
      match /[cC]isco ([\S-]+) (?:\(([\w-]+)\) processor )?\(revision (.+)\) with (\d+[KMG])(?:\/(\d+[KMG]))? bytes of memory\./
      cmd "sh ver"
    end

    base.register_param 'canonicalized_hardwaremodel' do
      match do |hardwaremodel|
        canonicalize_hardwaremodel(hardwaremodel)
      end
      cmd false
      match_param 'hardwaremodel'
      after 'hardwaremodel'
    end

    base.register_param ['hostname', 'uptime'] do
      match /^\s*([\w-]+)\s+uptime is (.*?)$/
      cmd "sh ver"
      after 'domain'
      downcase true
    end

    base.register_param 'domain' do
      match /^ip\s+domain-name\s+(.*)$/
      cmd "sh run"
      downcase true
    end

    base.register_param 'fqdn' do
      match do |hostname, domain|
        "#{hostname}.#{domain}" unless hostname.nil? or domain.nil?
      end
      cmd false
      match_param [ 'hostname', 'domain' ]
      after 'hostname'
    end

    base.register_param 'uptime_seconds' do
      match do |uptime|
        uptime_to_seconds(uptime)
      end
      cmd false
      match_param 'uptime'
      after 'uptime'
    end

    base.register_param 'uptime_days' do
      match do |uptime_seconds|
        (uptime_seconds / 86400) if uptime_seconds
      end
      cmd false
      match_param 'uptime_seconds'
      after 'uptime_seconds'
    end

    base.register_param ['operatingsystem', 'operatingsystemplatform', 'operatingsystemxeplatform', 'operatingsystemfeature', 'operatingsystemrelease'] do
      match /^(?:Cisco )?(IOS)\s*(?:\(tm\) |Software, )?(\S+)\s+Software,?\s+(?:Catalyst\s+(\d+))?(?:.*)\(\w+-(\w+)-\w+\), Version ([0-9.()A-Za-z]+)\.?/
      cmd "sh ver"
    end

    base.register_param 'operatingsystemmajrelease' do
      match do |operatingsystemrelease|
        ios_major_version(operatingsystemrelease)
      end
      cmd false
      match_param 'operatingsystemrelease'
      after 'operatingsystemrelease'
    end

    base.register_param 'system_image' do
      match do |txt|
        matched = txt.match(/^[sS]ystem image file is "(\S+)"$/)
        # TODO: SPEC
        matched.nil? ? "" : File.basename(matched.captures.first)
      end
      cmd "sh ver"
    end

    base.register_param 'configuration_register' do
      match /^Configuration\s+register\s+is\s+(\S+)$/
      cmd "sh ver"
    end

    base.register_param 'processor_board_id' do
      match /^Processor\s+board\s+ID\s(\S+)$/
      cmd "sh ver"
    end

    base.register_param 'ethernet_interfaces' do
      match do |txt|
        txt.scan(/^(\d+)\s+(.+)\s*Ethernet\s+interfaces$/).inject({}) do |res, (num, type)|
          res[type.downcase.split.join("_") + "_ethernet"] = num
          res
        end
      end
      cmd "sh ver"
    end

    base.register_param 'inventory' do
      match do |txt|
        txt.split(/^$/).map do |line|
          line.scan(/(\S+):\s+"(.+)",\s+(\S+):\s+"(.+)"\n(\S+):\s+(\S+)\s+,\s+(\S+):\s+(\S+)?\s+,\s+(\S+):\s+(\S+)\s+$/).flatten.map do |item|
            item.strip unless item.nil?
          end
        end.delete_if {|x| x.empty?}.inject({}) do |res, data|
          prefix = data[1].downcase.gsub(/(\(|\)|\/|\s)/, '_').gsub(/_$/, '')
          data[2..-1].each_slice(2) do |name, val|
            res["inventory_#{prefix}_" + name.downcase] = val
          end
          res
        end
      end
      cmd "sh inventory"
    end

    base.register_param 'vtp_mode' do
      match do |txt|
        txt.scan(/^VTP Operating Mode\s+:\s(.+)$/).flatten.first.gsub(/ /, '_').downcase
      end
      cmd 'sh vtp status'
    end

    base.register_param 'vtp_version' do
      match do |txt|
        txt.scan(/^VTP version running\s+:\s+(\d)$/).flatten.first
      end
      cmd 'sh vtp status'
    end

    base.register_param 'vtp_domain' do
      match do |txt|
        txt.scan(/^VTP Domain Name\s+:\s+(\S+)$/).flatten.first
      end
      cmd 'sh vtp status'
    end

    base.register_param 'interfaces' do
      match do |txt|
        Hash[*txt.scan(/^(?:\*)?\s+(\S+)/).flatten.map do |line|
          line.scan(/(\D+)(\d+)\/?.*$/).flatten
        end.map do |arr|
          arr.join
        end.delete_if do |arr|
          arr.empty?
        end.group_by do |arr|
          arr
        end.map do |k,v|
          ["interfaces_" + k.downcase.scan(/(\D+)(\d+)/).flatten.join("_"), v.length.to_s]
        end.flatten]
      end
      cmd "sh interfaces summary"
    end

    base.register_module_after 'operatingsystem', 'ios' do
      base.facts['operatingsystem'].value == "IOS"
    end

    base.register_module_after 'operatingsystemplatform', 'iosxe' do
      base.facts['operatingsystemplatform'].value == "IOS-XE"
    end

    base.register_module_after 'canonicalized_hardwaremodel', 'c4500', 'hardware' do
      base.facts['canonicalized_hardwaremodel'].value == 'c4500'
    end

    base.register_module_after 'canonicalized_hardwaremodel', 'c3750', 'hardware' do
      base.facts['canonicalized_hardwaremodel'].value == 'c3750'
    end
  end
end