uniak/puppet-networkdevice

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

Summary

Maintainability
C
1 day
Test Coverage
require 'puppet/util/network_device/cisco_ios/model'
require 'puppet/util/network_device/cisco_ios/model/aaa_group'
require 'puppet/util/network_device/cisco_ios/model/acl'
require 'puppet/util/network_device/cisco_ios/model/snmp'
require 'puppet/util/network_device/cisco_ios/model/snmp_community'
require 'puppet/util/network_device/cisco_ios/model/snmp_host'
require 'puppet/util/network_device/cisco_ios/model/interface'
require 'puppet/util/network_device/cisco_ios/model/line'
require 'puppet/util/network_device/cisco_ios/model/model_value'
require 'puppet/util/network_device/cisco_ios/model/switch'

module Puppet::Util::NetworkDevice::Cisco_ios::Model::Switch::Base

  def self.register(base)
    base.register_simple(:hostname, /^hostname\s+(\S+)$/, 'sh run', 'hostname')

    base.register_simple(:ip_domain_name, /^ip\s+domain-name\s+(\S+)$/, 'sh run', 'ip domain-name')

    base.register_array(:ntp_servers, /^ntp\s+server\s+(\S+)$/, 'sh run', 'ntp server') do |values|
      values.select { |ip| IPAddr.new(ip) }
    end

    base.register_array(:logging_servers, /^logging\s+(\S+)$/, 'sh run', 'logging')

    # MET 1 0 vs. MET 1
    # in conf t vs sh run
    base.register_simple(:clock_timezone, /^clock\s+timezone\s+(.+)$/, 'sh run', 'clock timezone')

    base.register_simple(:system_mtu_routing, /^system\s+mtu\s+routing\s+(\d+)$/, 'sh run', 'system mtu routing')

    base.register_bool(:ip_classless, /^ip\s+classless$/, 'sh run', 'ip classless')

    base.register_bool(:ip_domain_lookup, /^ip\s+domain-lookup$/, 'sh run', 'ip domain-lookup')

    base.register_simple(:ip_domain_lookup_source_interface, /^ip\s+domain-lookup\s+source-interface\s+(\S+)$/, 'sh run', 'ip domain-lookup source-interface')

    base.register_array(:ip_name_servers, /^ip\s+name-server\s+(\S+)$/, 'sh run', 'ip name-server') do |values|
      values.select { |ip| IPAddr.new(ip) }
    end

    base.register_simple(:ip_radius_source_interface, /^ip\s+radius\s+source-interface\s+(\S+)\s?$/, 'sh run', 'ip radius source-interface')
    base.register_simple(:logging_trap, /^logging\s+trap\s+(\S+)$/, 'sh run', 'logging trap')
    base.register_simple(:logging_facility, /^logging\s+facility\s+(\S+)$/, 'sh run', 'logging facility')

    base.register_param :ip_default_gateway do
      match do |txt|
        txt.match(/^ip\s+default-gateway\s+(\S+)$/)
        if $1
          IPAddr.new($1)
        else
          :absent
        end
      end
      cmd 'sh run'
      add do |transport, value|
        transport.command("ip default-gateway #{value}")
      end
      remove do |transport, old_value|
        transport.command("no ip default-gateway #{old_value}")
      end
    end

    # TODO: Separate Type for vtp properties?
    base.register_simple(:vtp_version, /^VTP\sversion\srunning\s+:\s+(\d)$/, 'sh vtp status', 'vtp version')

    base.register_param :vtp_domain do
      match /^VTP\sDomain\sName\s+:\s+(\S+)$/
      cmd 'sh vtp status'
      add do |transport, value|
        transport.command("vtp domain #{value}")
      end
      remove do |transport, _|
        # TODO: Find out the real NULL Value ...
        transport.command("vtp domain NULL")
      end
    end

    base.register_param :vtp_operation_mode do
      match do |txt|
        txt.scan(/^VTP\sOperating\sMode\s+:\s+(?:.*\s)?(\S+)$/).flatten[0].downcase
      end
      cmd 'sh vtp status'
      add do |transport, value|
        transport.command("vtp mode #{value}")
      end
      remove do |transport, old_value|
        transport.command("no vtp mode #{old_value}")
      end
    end

    base.register_simple(:vtp_password, /^VTP\sPassword:\s+(\S+)$/, 'sh vtp password', 'vtp password')

    # TODO: Separate Type for dhcp properties?
    base.register_bool(:ip_dhcp_snooping, /^ip\sdhcp\ssnooping$/, 'sh run', 'ip dhcp snooping')

    base.register_simple(:ip_dhcp_snooping_vlans, /^ip\sdhcp\ssnooping\svlan\s(\S+)$/, 'sh run', 'ip dhcp snooping vlan')

    base.register_param :ip_dhcp_snooping_remote_id do
      match(lambda do |txt|
        return :hostname if txt.match(/^ip\sdhcp\ssnooping\sinformation\soption\sformat\sremote-id\shostname$/)
        return $1 if txt.match(/^ip\sdhcp\ssnooping\sinformation\soption\sformat\sremote-id\s(\S+)$/)
        return :absent
      end)
      cmd 'sh run'
      add do |transport, value|
        transport.command("ip dhcp snooping information option format remote-id #{value}")
      end
      remove do |transport, old_value|
          transport.command("no ip dhcp snooping information option format remote-id #{old_value}") unless old_value.to_sym == :absent
      end
    end

    base.register_simple(:ip_dhcp_relay_information, /^ip\sdhcp\srelay\sinformation\s(.+)$/, 'sh run', 'ip dhcp relay information')

    base.register_bool(:password_encryption, /^service\s+password-encryption$/, 'sh run', 'service password-encryption')

    base.register_bool(:aaa_new_model, /^aaa\s+new-model$$/, 'sh run', 'aaa new-model')

    # TODO: Hardcode *sigh*
    base.register_param :ip_ssh do
      match do |txt|
        if txt.match(/^SSH Disabled/)
          :absent
        else
          :present
        end
      end
      cmd 'sh ip ssh'
      add do |transport, _|
        transport.command("crypto key generate rsa modulus 2048")
      end
      remove do |transport, _|
        transport.command("crypto key zeroize rsa")
      end
      after :ip_domain_name
    end

    base.register_param :ip_ssh_version do
      match /^ip ssh version (\d)$/
      cmd 'sh run'
      add do |transport, value|
        transport.command("ip ssh version #{value}")
      end
      remove do |transport, old_value|
        transport.command("no ip ssh version #{old_value}")
      end
      after :ip_ssh
    end

    base.register_param :errdisable_recovery_cause do
      match do |txt|
        cause = txt.scan(/^errdisable recovery cause (.*)$/).flatten
        cause.empty? ? nil : cause
      end
      cmd 'sh run'
      add do |transport, value|
        transport.command("errdisable recovery cause #{value}")
      end
      remove do |transport, old_value|
        transport.command("no errdisable recovery cause #{old_value}")
      end
    end

    base.register_simple(:errdisable_recovery_interval, /^errdisable recovery interval (\d+)\s*$/, 'sh run', 'errdisable recovery interval')

    base.register_model(:interfaces, Puppet::Util::NetworkDevice::Cisco_ios::Model::Interface, /^interface\s+(\S+)\r*$/, 'sh run')

    base.register_model(:aaa_group, Puppet::Util::NetworkDevice::Cisco_ios::Model::Aaa_group, /^aaa group server (?:radius|tacacs\+)\s+(\S+)$/, 'sh run')

    base.register_model(:acl, Puppet::Util::NetworkDevice::Cisco_ios::Model::Acl, /^ip access-list (?:standard|extended)\s+(\S+)$/, 'sh run')

    base.register_model(:radius_server, Puppet::Util::NetworkDevice::Cisco_ios::Model::Radius_server, /^radius-server\s+host\s+(\S+)/, 'sh run')

    base.register_model(:user, Puppet::Util::NetworkDevice::Cisco_ios::Model::User, /^username\s+(\S+)/, 'sh run')

    base.register_param :lines, Puppet::Util::NetworkDevice::Cisco_ios::Model::ModelValue do
      model Puppet::Util::NetworkDevice::Cisco_ios::Model::Line
      match do |txt|
        txt.scan(/^line\s+((?:vty|con)\s+\d+(?:\s+\d+)?)$/).flatten.collect do |m|
          matches = m.match /(con|vty)\s+(\d+)(?:\s+(\d+))?/
          return unless matches
          type = matches[1]
          from = matches[2].to_i
          if matches[3].nil?
            # single number
            model.new(@transport, @facts, { :name => "#{type} #{from}" } )
          else
            # range
            to = matches[3].to_i
            (from..to).collect do |vty|
              model.new(@transport, @facts, { :name => "#{type} #{vty}" } )
            end
          end
        end.flatten
      end
      cmd 'sh run'
    end

    base.register_model(:snmp_community, Puppet::Util::NetworkDevice::Cisco_ios::Model::Snmp_community, /^snmp-server\scommunity\s+(\S+)/, 'sh run')

    base.register_model(:snmp_host, Puppet::Util::NetworkDevice::Cisco_ios::Model::Snmp_host, /^snmp-server\shost\s+(\S+)/, 'sh run')

    base.register_model(:vlan, Puppet::Util::NetworkDevice::Cisco_ios::Model::Vlan, /^(\d+)\s\S+/, 'sh vlan brief')

    if base.facts && base.facts['canonicalized_hardwaremodel'] == 'c4500'
      base.register_new_module('c4500', 'hardware')
    end

    if base.facts && base.facts['canonicalized_hardwaremodel'] == 'c2960'
      base.register_new_module('c2960', 'hardware')
    end

  end
end