cisco_node_utils_mgx 2.1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +96 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +676 -0
- data/CONTRIBUTING.md +43 -0
- data/Gemfile +10 -0
- data/LICENSE +201 -0
- data/README.md +246 -0
- data/Rakefile +44 -0
- data/SUPPORT.md +3 -0
- data/bin/.rubocop.yml +18 -0
- data/bin/check_metric_limits.rb +109 -0
- data/bin/git/hooks/commit-msg/enforce_style +89 -0
- data/bin/git/hooks/hook_lib +115 -0
- data/bin/git/hooks/hooks-wrapper +38 -0
- data/bin/git/hooks/post-flow-hotfix-start/update-version +24 -0
- data/bin/git/hooks/post-flow-release-finish/update-version +29 -0
- data/bin/git/hooks/post-flow-release-start/update-version +19 -0
- data/bin/git/hooks/post-merge/update-hooks +6 -0
- data/bin/git/hooks/post-rewrite/update-hooks +6 -0
- data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
- data/bin/git/hooks/pre-commit/rubocop +25 -0
- data/bin/git/hooks/pre-commit/validate-diffs +45 -0
- data/bin/git/hooks/pre-commit/validate-yaml +18 -0
- data/bin/git/hooks/pre-push/check-changelog +24 -0
- data/bin/git/hooks/pre-push/rubocop +7 -0
- data/bin/git/update-hooks +123 -0
- data/bin/show_running_yang.rb +233 -0
- data/cisco_node_utils.gemspec +41 -0
- data/docs/README-develop-best-practices.md +521 -0
- data/docs/README-develop-node-utils-APIs.md +570 -0
- data/docs/README-maintainers.md +77 -0
- data/docs/README-test-execution.md +57 -0
- data/docs/README-utilities.md +14 -0
- data/docs/agent_files.png +0 -0
- data/docs/cisco_node_utils.yaml.example +36 -0
- data/docs/template-router.rb +123 -0
- data/docs/template-test_router.rb +104 -0
- data/ext/mkrf_conf.rb +63 -0
- data/lib/.rubocop.yml +18 -0
- data/lib/cisco_node_utils/aaa_authentication_login.rb +95 -0
- data/lib/cisco_node_utils/aaa_authentication_login_service.rb +138 -0
- data/lib/cisco_node_utils/aaa_authorization_service.rb +156 -0
- data/lib/cisco_node_utils/ace.rb +467 -0
- data/lib/cisco_node_utils/acl.rb +101 -0
- data/lib/cisco_node_utils/banner.rb +63 -0
- data/lib/cisco_node_utils/bfd_global.rb +305 -0
- data/lib/cisco_node_utils/bgp.rb +988 -0
- data/lib/cisco_node_utils/bgp_af.rb +545 -0
- data/lib/cisco_node_utils/bgp_af_aggr_addr.rb +207 -0
- data/lib/cisco_node_utils/bgp_neighbor.rb +527 -0
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +780 -0
- data/lib/cisco_node_utils/bridge_domain.rb +178 -0
- data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +444 -0
- data/lib/cisco_node_utils/client/client.rb +238 -0
- data/lib/cisco_node_utils/client/grpc/client.rb +395 -0
- data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
- data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
- data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
- data/lib/cisco_node_utils/client/grpc.rb +33 -0
- data/lib/cisco_node_utils/client/nxapi/client.rb +368 -0
- data/lib/cisco_node_utils/client/nxapi.rb +31 -0
- data/lib/cisco_node_utils/client/utils.rb +180 -0
- data/lib/cisco_node_utils/client.rb +35 -0
- data/lib/cisco_node_utils/cmd_ref/README_YAML.md +590 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +40 -0
- data/lib/cisco_node_utils/cmd_ref/acl.yaml +48 -0
- data/lib/cisco_node_utils/cmd_ref/banner.yaml +11 -0
- data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +383 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +223 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_af_aa.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +174 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +236 -0
- data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +49 -0
- data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
- data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +128 -0
- data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +55 -0
- data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_multicast.yaml +12 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_multisite.yaml +18 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_stormcontrol.yaml +18 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +48 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +183 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +40 -0
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +126 -0
- data/lib/cisco_node_utils/cmd_ref/hostname.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/hsrp_global.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/images.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +781 -0
- data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/interface_evpn_multisite.yaml +17 -0
- data/lib/cisco_node_utils/cmd_ref/interface_hsrp_group.yaml +120 -0
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +112 -0
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +87 -0
- data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +42 -0
- data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/ip_multicast.yaml +22 -0
- data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
- data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
- data/lib/cisco_node_utils/cmd_ref/memory.yaml +24 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_auth_key.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +27 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +34 -0
- data/lib/cisco_node_utils/cmd_ref/object_group.yaml +32 -0
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/pim.yaml +43 -0
- data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +86 -0
- data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +100 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +19 -0
- data/lib/cisco_node_utils/cmd_ref/route_map.yaml +601 -0
- data/lib/cisco_node_utils/cmd_ref/show_system.yaml +9 -0
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +84 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +81 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +9 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +74 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +57 -0
- data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +23 -0
- data/lib/cisco_node_utils/cmd_ref/span_session.yaml +65 -0
- data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +235 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_facility.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +34 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/system.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +63 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +64 -0
- data/lib/cisco_node_utils/cmd_ref/upgrade.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +52 -0
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +106 -0
- data/lib/cisco_node_utils/cmd_ref/vpc.yaml +233 -0
- data/lib/cisco_node_utils/cmd_ref/vrf.yaml +86 -0
- data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +139 -0
- data/lib/cisco_node_utils/cmd_ref/vtp.yaml +32 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +114 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +71 -0
- data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +68 -0
- data/lib/cisco_node_utils/command_reference.rb +724 -0
- data/lib/cisco_node_utils/configparser_lib.rb +195 -0
- data/lib/cisco_node_utils/constants.rb +40 -0
- data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
- data/lib/cisco_node_utils/dns_domain.rb +93 -0
- data/lib/cisco_node_utils/domain_name.rb +82 -0
- data/lib/cisco_node_utils/encapsulation.rb +112 -0
- data/lib/cisco_node_utils/environment.rb +110 -0
- data/lib/cisco_node_utils/evpn_multicast.rb +66 -0
- data/lib/cisco_node_utils/evpn_multisite.rb +96 -0
- data/lib/cisco_node_utils/evpn_stormcontrol.rb +84 -0
- data/lib/cisco_node_utils/evpn_vni.rb +159 -0
- data/lib/cisco_node_utils/exceptions.rb +140 -0
- data/lib/cisco_node_utils/fabricpath_global.rb +405 -0
- data/lib/cisco_node_utils/fabricpath_topology.rb +137 -0
- data/lib/cisco_node_utils/feature.rb +377 -0
- data/lib/cisco_node_utils/hostname.rb +62 -0
- data/lib/cisco_node_utils/hsrp_global.rb +97 -0
- data/lib/cisco_node_utils/interface.rb +2128 -0
- data/lib/cisco_node_utils/interface_channel_group.rb +142 -0
- data/lib/cisco_node_utils/interface_evpn_multisite.rb +72 -0
- data/lib/cisco_node_utils/interface_hsrp_group.rb +557 -0
- data/lib/cisco_node_utils/interface_ospf.rb +378 -0
- data/lib/cisco_node_utils/interface_portchannel.rb +180 -0
- data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
- data/lib/cisco_node_utils/ip_multicast.rb +90 -0
- data/lib/cisco_node_utils/itd_device_group.rb +228 -0
- data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
- data/lib/cisco_node_utils/itd_service.rb +511 -0
- data/lib/cisco_node_utils/logger.rb +78 -0
- data/lib/cisco_node_utils/name_server.rb +64 -0
- data/lib/cisco_node_utils/node.rb +443 -0
- data/lib/cisco_node_utils/node_util.rb +111 -0
- data/lib/cisco_node_utils/ntp_auth_key.rb +67 -0
- data/lib/cisco_node_utils/ntp_config.rb +83 -0
- data/lib/cisco_node_utils/ntp_server.rb +86 -0
- data/lib/cisco_node_utils/object_group.rb +75 -0
- data/lib/cisco_node_utils/object_group_entry.rb +143 -0
- data/lib/cisco_node_utils/overlay_global.rb +142 -0
- data/lib/cisco_node_utils/pim.rb +131 -0
- data/lib/cisco_node_utils/pim_group_list.rb +109 -0
- data/lib/cisco_node_utils/pim_rp_address.rb +103 -0
- data/lib/cisco_node_utils/platform.rb +217 -0
- data/lib/cisco_node_utils/portchannel_global.rb +347 -0
- data/lib/cisco_node_utils/radius_global.rb +165 -0
- data/lib/cisco_node_utils/radius_server.rb +421 -0
- data/lib/cisco_node_utils/radius_server_group.rb +117 -0
- data/lib/cisco_node_utils/route_map.rb +2540 -0
- data/lib/cisco_node_utils/router_ospf.rb +77 -0
- data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
- data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
- data/lib/cisco_node_utils/router_ospf_vrf.rb +342 -0
- data/lib/cisco_node_utils/snmp_notification_receiver.rb +176 -0
- data/lib/cisco_node_utils/snmpcommunity.rb +109 -0
- data/lib/cisco_node_utils/snmpgroup.rb +54 -0
- data/lib/cisco_node_utils/snmpnotification.rb +57 -0
- data/lib/cisco_node_utils/snmpserver.rb +132 -0
- data/lib/cisco_node_utils/snmpuser.rb +403 -0
- data/lib/cisco_node_utils/span_session.rb +149 -0
- data/lib/cisco_node_utils/stp_global.rb +676 -0
- data/lib/cisco_node_utils/syslog_facility.rb +64 -0
- data/lib/cisco_node_utils/syslog_server.rb +146 -0
- data/lib/cisco_node_utils/syslog_settings.rb +174 -0
- data/lib/cisco_node_utils/tacacs_global.rb +137 -0
- data/lib/cisco_node_utils/tacacs_server.rb +173 -0
- data/lib/cisco_node_utils/tacacs_server_group.rb +149 -0
- data/lib/cisco_node_utils/tacacs_server_host.rb +216 -0
- data/lib/cisco_node_utils/upgrade.rb +122 -0
- data/lib/cisco_node_utils/vdc.rb +118 -0
- data/lib/cisco_node_utils/version.rb +21 -0
- data/lib/cisco_node_utils/vlan.rb +301 -0
- data/lib/cisco_node_utils/vpc.rb +466 -0
- data/lib/cisco_node_utils/vrf.rb +192 -0
- data/lib/cisco_node_utils/vrf_af.rb +327 -0
- data/lib/cisco_node_utils/vtp.rb +125 -0
- data/lib/cisco_node_utils/vxlan_vtep.rb +286 -0
- data/lib/cisco_node_utils/vxlan_vtep_vni.rb +331 -0
- data/lib/cisco_node_utils/yang.rb +160 -0
- data/lib/cisco_node_utils/yum.rb +213 -0
- data/lib/cisco_node_utils.rb +21 -0
- data/lib/minitest/environment_plugin.rb +31 -0
- data/lib/minitest/log_level_plugin.rb +41 -0
- data/spec/client_spec.rb +7 -0
- data/spec/environment_spec.rb +384 -0
- data/spec/grpc_client_spec.rb +23 -0
- data/spec/isolate/all_clients_spec.rb +9 -0
- data/spec/isolate/grpc_only_spec.rb +16 -0
- data/spec/isolate/no_clients_spec.rb +26 -0
- data/spec/isolate/nxapi_only_spec.rb +16 -0
- data/spec/nxapi_client_spec.rb +42 -0
- data/spec/schema.yaml +82 -0
- data/spec/shared_examples_for_clients.rb +14 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/whitespace_spec.rb +10 -0
- data/spec/yaml_spec.rb +42 -0
- data/tests/.rubocop.yml +18 -0
- data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
- data/tests/basetest.rb +243 -0
- data/tests/ciscotest.rb +577 -0
- data/tests/cmd_config.yaml +75 -0
- data/tests/cmd_config_invalid.yaml +16 -0
- data/tests/n9000_sample-1.0.0-7.0.3.x86_64.rpm +0 -0
- data/tests/noop.rb +7 -0
- data/tests/platform_info.rb +63 -0
- data/tests/tacacs_server.yaml.example +6 -0
- data/tests/test_aaa_authentication_login.rb +243 -0
- data/tests/test_aaa_authentication_login_service.rb +761 -0
- data/tests/test_aaa_authorization_service.rb +874 -0
- data/tests/test_ace.rb +304 -0
- data/tests/test_acl.rb +185 -0
- data/tests/test_banner.rb +85 -0
- data/tests/test_bfd_global.rb +272 -0
- data/tests/test_bgp_af.rb +875 -0
- data/tests/test_bgp_af_aa.rb +108 -0
- data/tests/test_bgp_neighbor.rb +596 -0
- data/tests/test_bgp_neighbor_af.rb +781 -0
- data/tests/test_bridge_domain.rb +198 -0
- data/tests/test_bridge_domain_vni.rb +109 -0
- data/tests/test_client_utils.rb +111 -0
- data/tests/test_cmn_utils.rb +76 -0
- data/tests/test_command_config.rb +206 -0
- data/tests/test_command_reference.rb +669 -0
- data/tests/test_dhcp_relay_global.rb +286 -0
- data/tests/test_dns_domain.rb +123 -0
- data/tests/test_domain_name.rb +96 -0
- data/tests/test_encapsulation.rb +75 -0
- data/tests/test_evpn_multicast.rb +65 -0
- data/tests/test_evpn_multisite.rb +70 -0
- data/tests/test_evpn_stormcontrol.rb +56 -0
- data/tests/test_evpn_vni.rb +131 -0
- data/tests/test_fabricpath_global.rb +246 -0
- data/tests/test_fabricpath_topology.rb +77 -0
- data/tests/test_feature.rb +272 -0
- data/tests/test_grpc.rb +166 -0
- data/tests/test_hostname.rb +64 -0
- data/tests/test_hsrp_global.rb +79 -0
- data/tests/test_interface.rb +1958 -0
- data/tests/test_interface_bdi.rb +80 -0
- data/tests/test_interface_channel_group.rb +131 -0
- data/tests/test_interface_evpn_multisite.rb +94 -0
- data/tests/test_interface_hsrp.rb +134 -0
- data/tests/test_interface_hsrp_group.rb +570 -0
- data/tests/test_interface_ospf.rb +820 -0
- data/tests/test_interface_portchannel.rb +135 -0
- data/tests/test_interface_private_vlan.rb +365 -0
- data/tests/test_interface_service_vni.rb +203 -0
- data/tests/test_interface_svi.rb +210 -0
- data/tests/test_interface_switchport.rb +468 -0
- data/tests/test_ip_multicast.rb +80 -0
- data/tests/test_itd_device_group.rb +145 -0
- data/tests/test_itd_device_group_node.rb +199 -0
- data/tests/test_itd_service.rb +314 -0
- data/tests/test_logger.rb +43 -0
- data/tests/test_name_server.rb +94 -0
- data/tests/test_node.rb +50 -0
- data/tests/test_node_ext.rb +406 -0
- data/tests/test_node_util.rb +119 -0
- data/tests/test_ntp_auth_key.rb +77 -0
- data/tests/test_ntp_config.rb +100 -0
- data/tests/test_ntp_server.rb +146 -0
- data/tests/test_nxapi.rb +236 -0
- data/tests/test_object_group.rb +122 -0
- data/tests/test_overlay_global.rb +108 -0
- data/tests/test_pim.rb +203 -0
- data/tests/test_pim_group_list.rb +147 -0
- data/tests/test_pim_rp_address.rb +155 -0
- data/tests/test_platform.rb +254 -0
- data/tests/test_portchannel_global.rb +322 -0
- data/tests/test_radius_global.rb +108 -0
- data/tests/test_radius_server.rb +377 -0
- data/tests/test_radius_server_group.rb +151 -0
- data/tests/test_route_map.rb +1479 -0
- data/tests/test_router_bgp.rb +1325 -0
- data/tests/test_router_ospf.rb +56 -0
- data/tests/test_router_ospf_area.rb +433 -0
- data/tests/test_router_ospf_area_vlink.rb +298 -0
- data/tests/test_router_ospf_vrf.rb +690 -0
- data/tests/test_snmp_notification_receiver.rb +169 -0
- data/tests/test_snmpcommunity.rb +422 -0
- data/tests/test_snmpgroup.rb +71 -0
- data/tests/test_snmpnotification.rb +91 -0
- data/tests/test_snmpserver.rb +251 -0
- data/tests/test_snmpuser.rb +666 -0
- data/tests/test_span_session.rb +155 -0
- data/tests/test_stp_global.rb +575 -0
- data/tests/test_syslog_facility.rb +80 -0
- data/tests/test_syslog_server.rb +119 -0
- data/tests/test_syslog_settings.rb +123 -0
- data/tests/test_tacacs_global.rb +109 -0
- data/tests/test_tacacs_server.rb +436 -0
- data/tests/test_tacacs_server_group.rb +434 -0
- data/tests/test_tacacs_server_host.rb +427 -0
- data/tests/test_upgrade.rb +105 -0
- data/tests/test_vdc.rb +64 -0
- data/tests/test_vlan.rb +386 -0
- data/tests/test_vlan_private.rb +656 -0
- data/tests/test_vpc.rb +548 -0
- data/tests/test_vrf.rb +248 -0
- data/tests/test_vrf_af.rb +288 -0
- data/tests/test_vtp.rb +278 -0
- data/tests/test_vxlan_vtep.rb +327 -0
- data/tests/test_vxlan_vtep_vni.rb +326 -0
- data/tests/test_yang.rb +369 -0
- data/tests/test_yum.rb +109 -0
- data/tests/upgrade_info.yaml.example +3 -0
- data/tests/yum_package.yaml +94 -0
- metadata +534 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# Copyright (c) 2014-2016 Cisco and/or its affiliates.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
require_relative 'node_util'
|
|
16
|
+
|
|
17
|
+
module Cisco
|
|
18
|
+
# SnmpUser - node utility class for SNMP user configuration management
|
|
19
|
+
class SnmpUser < NodeUtil
|
|
20
|
+
def initialize(name, groups, authproto, authpass, privproto,
|
|
21
|
+
privpass, localizedkey, engineid, instantiate=true)
|
|
22
|
+
initialize_validator(name, groups, authproto, authpass, privproto,
|
|
23
|
+
privpass, engineid, instantiate)
|
|
24
|
+
@name = name
|
|
25
|
+
@engine_id = engineid
|
|
26
|
+
|
|
27
|
+
@authproto = authproto
|
|
28
|
+
@privproto = privproto
|
|
29
|
+
@groups_arr = groups
|
|
30
|
+
|
|
31
|
+
authprotostr = _auth_sym_to_str(authproto)
|
|
32
|
+
privprotostr = _priv_sym_to_str(privproto)
|
|
33
|
+
|
|
34
|
+
return unless instantiate
|
|
35
|
+
# Config string syntax:
|
|
36
|
+
# [no] snmp-server user <user> [group] ...
|
|
37
|
+
# [auth {md5|sha} <passwd1>
|
|
38
|
+
# [priv [aes-128] <passwd2>] [localizedkey] [engineID <id>]
|
|
39
|
+
# ]
|
|
40
|
+
# Assume if multiple groups, apply all config to each
|
|
41
|
+
groups = [''] if groups.empty?
|
|
42
|
+
groups.each do |group|
|
|
43
|
+
config_set('snmp_user', 'user', '',
|
|
44
|
+
name,
|
|
45
|
+
group,
|
|
46
|
+
authpass.empty? ? '' : "auth #{authprotostr} #{authpass}",
|
|
47
|
+
privpass.empty? ? '' : "priv #{privprotostr} #{privpass}",
|
|
48
|
+
localizedkey ? 'localizedkey' : '',
|
|
49
|
+
engineid.empty? ? '' : "engineID #{engineid}")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def initialize_validator(name, groups, authproto, authpass, privproto,
|
|
54
|
+
privpass, engineid, instantiate)
|
|
55
|
+
fail TypeError unless name.is_a?(String) &&
|
|
56
|
+
groups.is_a?(Array) &&
|
|
57
|
+
authproto.is_a?(Symbol) &&
|
|
58
|
+
authpass.is_a?(String) &&
|
|
59
|
+
privproto.is_a?(Symbol) &&
|
|
60
|
+
privpass.is_a?(String) &&
|
|
61
|
+
engineid.is_a?(String)
|
|
62
|
+
fail ArgumentError if name.empty?
|
|
63
|
+
# empty password but protocol provided = bad
|
|
64
|
+
# non-empty password and no protocol provided = bad
|
|
65
|
+
if authpass.empty?
|
|
66
|
+
fail ArgumentError if [:sha, :md5].include?(authproto) && instantiate
|
|
67
|
+
else
|
|
68
|
+
fail ArgumentError unless [:sha, :md5].include?(authproto)
|
|
69
|
+
end
|
|
70
|
+
if privpass.empty?
|
|
71
|
+
fail ArgumentError if [:des, :aes128].include?(privproto) && instantiate
|
|
72
|
+
else
|
|
73
|
+
fail ArgumentError unless [:des, :aes128].include?(privproto)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.users
|
|
78
|
+
users_hash = {}
|
|
79
|
+
# config_get returns hash if 1 user, array if multiple, nil if none
|
|
80
|
+
users = config_get('snmp_user', 'user')
|
|
81
|
+
return users_hash if users.nil?
|
|
82
|
+
users.each do |user|
|
|
83
|
+
# n7k has enforcepriv, use-ipv*acl, avoid them
|
|
84
|
+
next if user[/(enforcePriv|use-ipv4acl|use-ipv6acl)/]
|
|
85
|
+
user_var_hash = _get_snmp_user_parse(user)
|
|
86
|
+
name = user_var_hash[:name]
|
|
87
|
+
engineid = user_var_hash[:engineid]
|
|
88
|
+
if engineid.empty?
|
|
89
|
+
index = name
|
|
90
|
+
else
|
|
91
|
+
index = name + ' ' + engineid
|
|
92
|
+
end
|
|
93
|
+
auth = user_var_hash[:auth]
|
|
94
|
+
priv = user_var_hash[:priv]
|
|
95
|
+
groups_arr = []
|
|
96
|
+
# take care of multiple groups here
|
|
97
|
+
# if the name already exists in hash
|
|
98
|
+
# get all the previous properties
|
|
99
|
+
if users_hash.key?(index)
|
|
100
|
+
groups_arr = users_hash[index].groups
|
|
101
|
+
auth = users_hash[index].auth_protocol
|
|
102
|
+
priv = users_hash[index].priv_protocol
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# add the group to the array
|
|
106
|
+
groups_arr << _get_group_arr(user_var_hash)
|
|
107
|
+
users_hash[index] = SnmpUser.new(name, groups_arr.flatten, auth,
|
|
108
|
+
'', priv, '', false,
|
|
109
|
+
engineid,
|
|
110
|
+
false)
|
|
111
|
+
end
|
|
112
|
+
users_hash
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def destroy
|
|
116
|
+
# The parser doesn't care what the real value is but need to come to the
|
|
117
|
+
# end of the parser chain. Hence we just pass in some fake values for
|
|
118
|
+
# auth method and password
|
|
119
|
+
unless auth_password.nil? || auth_password.empty?
|
|
120
|
+
auth_str = "auth #{_auth_sym_to_str(auth_protocol)} #{auth_password}"
|
|
121
|
+
local_str = 'localizedkey'
|
|
122
|
+
end
|
|
123
|
+
unless priv_password.nil? || priv_password.empty?
|
|
124
|
+
priv_str = "priv #{_priv_sym_to_str(priv_protocol)} #{priv_password}"
|
|
125
|
+
end
|
|
126
|
+
config_set('snmp_user', 'user', 'no',
|
|
127
|
+
@name, '', auth_str, priv_str, local_str,
|
|
128
|
+
@engine_id.empty? ? '' : "engineID #{@engine_id}")
|
|
129
|
+
SnmpUser.users.delete(@name + ' ' + @engine_id)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
attr_reader :name
|
|
133
|
+
|
|
134
|
+
def groups
|
|
135
|
+
@groups_arr
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.default_groups
|
|
139
|
+
[config_get_default('snmp_user', 'group')]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def auth_protocol
|
|
143
|
+
@authproto
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.default_auth_protocol
|
|
147
|
+
_auth_str_to_sym(config_get_default('snmp_user', 'auth_protocol'))
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def self.default_auth_password
|
|
151
|
+
config_get_default('snmp_user', 'auth_password')
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def self.auth_password(name, engine_id)
|
|
155
|
+
if engine_id.empty?
|
|
156
|
+
users = config_get('snmp_user', 'auth_password')
|
|
157
|
+
return nil if users.nil? || users.empty?
|
|
158
|
+
users.each_entry { |user| return user[1] if user[0] == name }
|
|
159
|
+
else
|
|
160
|
+
users = config_get('snmp_user', 'auth_password_with_engine_id')
|
|
161
|
+
return nil if users.nil? || users.empty?
|
|
162
|
+
users.each_entry do |user|
|
|
163
|
+
return user[1] if user[0] == name && user[2] == engine_id
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
nil
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def auth_password
|
|
170
|
+
SnmpUser.auth_password(@name, @engine_id)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def priv_protocol
|
|
174
|
+
@privproto
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def self.priv_password(name, engine_id)
|
|
178
|
+
if engine_id.empty?
|
|
179
|
+
users = config_get('snmp_user', 'priv_password')
|
|
180
|
+
unless users.nil? || users.empty?
|
|
181
|
+
users.each_entry { |user| return user[1] if user[0] == name }
|
|
182
|
+
end
|
|
183
|
+
else
|
|
184
|
+
users = config_get('snmp_user', 'priv_password_with_engine_id')
|
|
185
|
+
unless users.nil? || users.empty?
|
|
186
|
+
users.each_entry do |user|
|
|
187
|
+
return user[1] if user[0] == name && user[2] == engine_id
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
nil
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def priv_password
|
|
195
|
+
SnmpUser.priv_password(@name, @engine_id)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def self.default_priv_protocol
|
|
199
|
+
_priv_str_to_sym(config_get_default('snmp_user', 'priv_protocol'))
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def self.default_priv_password
|
|
203
|
+
config_get_default('snmp_user', 'priv_password')
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
attr_reader :engine_id
|
|
207
|
+
|
|
208
|
+
def self.default_engine_id
|
|
209
|
+
config_get_default('snmp_user', 'engine_id')
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Passwords are hashed and so cannot be retrieved directly, but can be
|
|
213
|
+
# checked for equality. This is done by creating a fake user with the
|
|
214
|
+
# password and then comparing the hashes
|
|
215
|
+
def auth_password_equal?(input_pw, is_localized=false)
|
|
216
|
+
input_pw = input_pw.to_s unless input_pw.is_a?(String)
|
|
217
|
+
# If we provide no password, and no password present, it's a match!
|
|
218
|
+
return true if input_pw.empty? && auth_protocol == :none
|
|
219
|
+
# If we provide no password, but a password is present, or vice versa...
|
|
220
|
+
return false if input_pw.empty? || auth_protocol == :none
|
|
221
|
+
# OK, we have an input password, and a password is configured
|
|
222
|
+
current_pw = auth_password
|
|
223
|
+
if current_pw.nil?
|
|
224
|
+
fail "SNMP user #{@name} #{@engine_id} has auth #{auth_protocol} " \
|
|
225
|
+
"but no password?\n" + @@node.get(command: 'show run snmp all')
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
if is_localized
|
|
229
|
+
# In this case, the password is already hashed.
|
|
230
|
+
hashed_pw = input_pw
|
|
231
|
+
else
|
|
232
|
+
# In this case passed in password is clear text while the running
|
|
233
|
+
# config is hashed value. We need to hash the passed in clear text.
|
|
234
|
+
|
|
235
|
+
# Create dummy user
|
|
236
|
+
config_set('snmp_user', 'user', '', 'dummy_user', '',
|
|
237
|
+
"auth #{_auth_sym_to_str(auth_protocol)} #{input_pw}",
|
|
238
|
+
'', '',
|
|
239
|
+
@engine_id.empty? ? '' : "engineID #{@engine_id}")
|
|
240
|
+
|
|
241
|
+
# Retrieve password hashes
|
|
242
|
+
hashed_pw = SnmpUser.auth_password('dummy_user', @engine_id)
|
|
243
|
+
if hashed_pw.nil?
|
|
244
|
+
fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
|
|
245
|
+
"but password is missing?\n" \
|
|
246
|
+
+ @@node.get(command: 'show run snmp all')
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Delete dummy user
|
|
250
|
+
config_set('snmp_user', 'user', 'no', 'dummy_user', '',
|
|
251
|
+
"auth #{_auth_sym_to_str(auth_protocol)} #{hashed_pw}",
|
|
252
|
+
'', 'localizedkey',
|
|
253
|
+
@engine_id.empty? ? '' : "engineID #{@engine_id}")
|
|
254
|
+
end
|
|
255
|
+
hashed_pw == current_pw
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# Passwords are hashed and so cannot be retrieved directly, but can be
|
|
259
|
+
# checked for equality. This is done by creating a fake user with the
|
|
260
|
+
# password and then comparing the hashes
|
|
261
|
+
def priv_password_equal?(input_pw, is_localized=false)
|
|
262
|
+
input_pw = input_pw.to_s unless input_pw.is_a?(String)
|
|
263
|
+
# If no input password, and no password present, true!
|
|
264
|
+
return true if input_pw.empty? && priv_protocol == :none
|
|
265
|
+
# Otherwise, if either one is missing, false!
|
|
266
|
+
return false if input_pw.empty? || priv_protocol == :none
|
|
267
|
+
# Otherwise, we have both input and configured passwords to compare
|
|
268
|
+
current_pw = priv_password
|
|
269
|
+
if current_pw.nil?
|
|
270
|
+
fail "SNMP user #{@name} #{@engine_id} has priv #{priv_protocol} " \
|
|
271
|
+
"but no password?\n" + @@node.get(command: 'show run snmp all')
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
if is_localized
|
|
275
|
+
# In this case, the password is already hashed.
|
|
276
|
+
hashed_pw = input_pw
|
|
277
|
+
else
|
|
278
|
+
# In this case passed in password is clear text while the running
|
|
279
|
+
# config is hashed value. We need to hash the passed in clear text.
|
|
280
|
+
|
|
281
|
+
# Create dummy user
|
|
282
|
+
config_set('snmp_user', 'user', '', 'dummy_user', '',
|
|
283
|
+
"auth #{_auth_sym_to_str(auth_protocol)} #{input_pw}",
|
|
284
|
+
"priv #{_priv_sym_to_str(priv_protocol)} #{input_pw}",
|
|
285
|
+
'',
|
|
286
|
+
@engine_id.empty? ? '' : "engineID #{@engine_id}")
|
|
287
|
+
|
|
288
|
+
# Retrieve password hashes
|
|
289
|
+
dummyau = SnmpUser.auth_password('dummy_user', @engine_id)
|
|
290
|
+
hashed_pw = SnmpUser.priv_password('dummy_user', @engine_id)
|
|
291
|
+
if hashed_pw.nil?
|
|
292
|
+
fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
|
|
293
|
+
"but password is missing?\n" \
|
|
294
|
+
+ @@node.get(command: 'show run snmp all')
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Delete dummy user
|
|
298
|
+
config_set('snmp_user', 'user', 'no', 'dummy_user', '',
|
|
299
|
+
"auth #{_auth_sym_to_str(auth_protocol)} #{dummyau}",
|
|
300
|
+
"priv #{_priv_sym_to_str(priv_protocol)} #{hashed_pw}",
|
|
301
|
+
'localizedkey',
|
|
302
|
+
@engine_id.empty? ? '' : "engineID #{@engine_id}")
|
|
303
|
+
end
|
|
304
|
+
hashed_pw == current_pw
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
private
|
|
308
|
+
|
|
309
|
+
def self._get_snmp_user_parse(user)
|
|
310
|
+
user_var = {}
|
|
311
|
+
lparams = user.split
|
|
312
|
+
name = lparams[0]
|
|
313
|
+
engineid_index = lparams.index('engineID')
|
|
314
|
+
auth_index = lparams.index('auth')
|
|
315
|
+
priv_index = lparams.index('priv')
|
|
316
|
+
# engineID always comes after engineid_index
|
|
317
|
+
engineid = engineid_index.nil? ? '' : lparams[engineid_index + 1]
|
|
318
|
+
# authproto always comes after auth_index
|
|
319
|
+
aut = auth_index.nil? ? '' : lparams[auth_index + 1]
|
|
320
|
+
# privproto always comes after priv_index if priv exists
|
|
321
|
+
pri = priv_index.nil? ? '' : lparams[priv_index + 1]
|
|
322
|
+
# for the empty priv protocol default
|
|
323
|
+
pri = 'des' unless pri.empty? || pri == 'aes-128'
|
|
324
|
+
auth = _auth_str_to_sym(aut)
|
|
325
|
+
priv = _priv_str_to_sym(pri)
|
|
326
|
+
user_var[:name] = name
|
|
327
|
+
user_var[:engineid] = engineid
|
|
328
|
+
user_var[:auth] = auth
|
|
329
|
+
user_var[:priv] = priv
|
|
330
|
+
user_var[:auth_index] = auth_index
|
|
331
|
+
user_var[:engineid_index] = engineid_index
|
|
332
|
+
# group may or may not exist but it is always after name
|
|
333
|
+
# lparams[1] can be group, it is not known here,
|
|
334
|
+
# but will be determined in the _get_group_arr method
|
|
335
|
+
user_var[:group] = lparams[1]
|
|
336
|
+
user_var
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def self._get_group_arr(user_var_hash)
|
|
340
|
+
user_groups = []
|
|
341
|
+
auth_index = user_var_hash[:auth_index]
|
|
342
|
+
engineid_index = user_var_hash[:engineid_index]
|
|
343
|
+
# after the name it can be group or auth or engineID
|
|
344
|
+
# so filter it properly
|
|
345
|
+
user_groups << user_var_hash[:group] unless auth_index == 1 ||
|
|
346
|
+
engineid_index == 1
|
|
347
|
+
user_groups
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def _auth_sym_to_str(sym)
|
|
351
|
+
case sym
|
|
352
|
+
when :sha
|
|
353
|
+
return 'sha'
|
|
354
|
+
when :md5
|
|
355
|
+
return 'md5'
|
|
356
|
+
else
|
|
357
|
+
return ''
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
def _priv_sym_to_str(sym)
|
|
362
|
+
case sym
|
|
363
|
+
when :des
|
|
364
|
+
return '' # no protocol specified defaults to DES
|
|
365
|
+
when :aes128
|
|
366
|
+
return 'aes-128'
|
|
367
|
+
else
|
|
368
|
+
return ''
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def _auth_str_to_sym(str)
|
|
373
|
+
SnmpUser._auth_str_to_sym(str)
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
# must be class method b/c it's used by default methods
|
|
377
|
+
def self._auth_str_to_sym(str)
|
|
378
|
+
case str
|
|
379
|
+
when /sha/i
|
|
380
|
+
return :sha
|
|
381
|
+
when /md5/i
|
|
382
|
+
return :md5
|
|
383
|
+
else
|
|
384
|
+
return :none
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
def _priv_str_to_sym(str)
|
|
389
|
+
SnmpUser._priv_str_to_sym(str)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def self._priv_str_to_sym(str)
|
|
393
|
+
case str
|
|
394
|
+
when /des/i
|
|
395
|
+
return :des
|
|
396
|
+
when /aes/i
|
|
397
|
+
return :aes128
|
|
398
|
+
else
|
|
399
|
+
return :none
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Insert appropriate license here
|
|
2
|
+
require_relative 'node_util'
|
|
3
|
+
require_relative 'interface'
|
|
4
|
+
|
|
5
|
+
module Cisco
|
|
6
|
+
# node utils class for SPAN (switchport analyzer) sessions
|
|
7
|
+
class SpanSession < NodeUtil
|
|
8
|
+
attr_reader :session_id
|
|
9
|
+
|
|
10
|
+
def initialize(session_id, instantiate=true)
|
|
11
|
+
validate_args(session_id.to_i)
|
|
12
|
+
create if instantiate
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.sessions
|
|
16
|
+
hash = {}
|
|
17
|
+
all = config_get('span_session', 'all_sessions')
|
|
18
|
+
return hash if all.nil?
|
|
19
|
+
|
|
20
|
+
all.each do |id|
|
|
21
|
+
hash[id] = SpanSession.new(id, false)
|
|
22
|
+
end
|
|
23
|
+
hash
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def validate_args(session_id)
|
|
27
|
+
fail TypeError unless session_id.is_a?(Integer)
|
|
28
|
+
@session_id = session_id
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create
|
|
32
|
+
config_set('span_session', 'create', id: @session_id)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def destroy
|
|
36
|
+
config_set('span_session', 'destroy', id: @session_id)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def description
|
|
40
|
+
config_get('span_session', 'description', id: @session_id)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def description=(val)
|
|
44
|
+
val = val.to_s
|
|
45
|
+
if val.empty?
|
|
46
|
+
config_set('span_session', 'description', id: @session_id,
|
|
47
|
+
state: 'no', description: '')
|
|
48
|
+
else
|
|
49
|
+
config_set('span_session', 'description', id: @session_id,
|
|
50
|
+
state: '', description: val)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def destination
|
|
55
|
+
config_get('span_session', 'destination', id: @session_id).downcase
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def destination=(int)
|
|
59
|
+
# fail if int is not a valid interface
|
|
60
|
+
fail TypeError unless Interface.interfaces.key?(int.downcase)
|
|
61
|
+
config_set('span_session', 'destination', state: '', id: @session_id,
|
|
62
|
+
intf_name: int)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def session_id
|
|
66
|
+
config_get('span_session', 'session_id')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def session_id=(id)
|
|
70
|
+
fail TypeError unless id.is_a?(Integer)
|
|
71
|
+
config_set('span_session', 'session_id', id: id, state: '')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def shutdown
|
|
75
|
+
config_get('span_session', 'shutdown', id: @session_id)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def shutdown=(bool)
|
|
79
|
+
fail TypeError unless bool.is_a?(Boolean)
|
|
80
|
+
config_set('span_session', 'shutdown', id: @session_id, shutdown: bool)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def source_interfaces
|
|
84
|
+
ints = config_get('span_session', 'source_interfaces', id: @session_id)
|
|
85
|
+
intf = []
|
|
86
|
+
ints.each { |i| intf << i.map(&:downcase) }
|
|
87
|
+
intf
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def source_interfaces=(sources)
|
|
91
|
+
fail TypeError unless sources.is_a?(Hash)
|
|
92
|
+
delta_hash = Utils.delta_add_remove(sources.to_a, source_interfaces.to_a,
|
|
93
|
+
:updates_not_allowed)
|
|
94
|
+
return if delta_hash.values.flatten.empty?
|
|
95
|
+
[:remove, :add].each do |action|
|
|
96
|
+
delta_hash[action].each do |name, dir|
|
|
97
|
+
state = (action == :add) ? '' : 'no'
|
|
98
|
+
config_set('span_session', 'source_interfaces', id: @session_id,
|
|
99
|
+
state: state, int_name: name, direction: dir)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def default_source_interfaces
|
|
105
|
+
config_get_default('span_session', 'source_interfaces')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def source_vlans
|
|
109
|
+
v = config_get('span_session', 'source_vlans', id: @session_id)
|
|
110
|
+
v.empty? ? v : [Utils.normalize_range_array(v[0]), v[1]]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def source_vlans=(sources)
|
|
114
|
+
fail TypeError unless sources.is_a?(Hash)
|
|
115
|
+
is = Utils.dash_range_to_elements(source_vlans[0]) unless
|
|
116
|
+
source_vlans.empty?
|
|
117
|
+
should = Utils.dash_range_to_elements(sources[:vlans])
|
|
118
|
+
direction = sources[:direction]
|
|
119
|
+
delta_hash = Utils.delta_add_remove(should, is)
|
|
120
|
+
[:add, :remove].each do |action|
|
|
121
|
+
delta_hash[action].each do |vlans|
|
|
122
|
+
state = (action == :add) ? '' : 'no'
|
|
123
|
+
config_set('span_session', 'source_vlans',
|
|
124
|
+
id: @session_id, state: state,
|
|
125
|
+
vlans: vlans, direction: direction)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def default_source_vlans
|
|
131
|
+
config_get_default('span_session', 'source_vlans')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def type
|
|
135
|
+
config_get('span_session', 'type', id: @session_id)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def type=(str)
|
|
139
|
+
valid_types = ['local', 'rspan', 'erspan-source']
|
|
140
|
+
fail TypeError unless valid_types.include?(str)
|
|
141
|
+
destroy # need to destroy session before changing type
|
|
142
|
+
if str.empty?
|
|
143
|
+
config_set('span_session', 'type', id: @session_id, type: 'local')
|
|
144
|
+
else
|
|
145
|
+
config_set('span_session', 'type', id: @session_id, type: str)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end # class
|
|
149
|
+
end # module
|