cisco_node_utils 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +293 -0
- data/CHANGELOG.md +5 -0
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +4 -0
- data/LICENSE +201 -0
- data/README.md +113 -0
- data/Rakefile +4 -0
- data/cisco_node_utils.gemspec +30 -0
- data/lib/cisco_node_utils.rb +33 -0
- data/lib/cisco_node_utils/README_YAML.md +333 -0
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +92 -0
- data/lib/cisco_node_utils/command_reference.rb +415 -0
- data/lib/cisco_node_utils/command_reference_common.yaml +845 -0
- data/lib/cisco_node_utils/command_reference_n3064.yaml +13 -0
- data/lib/cisco_node_utils/command_reference_n7k.yaml +48 -0
- data/lib/cisco_node_utils/command_reference_n9k.yaml +35 -0
- data/lib/cisco_node_utils/configparser_lib.rb +196 -0
- data/lib/cisco_node_utils/interface.rb +501 -0
- data/lib/cisco_node_utils/interface_ospf.rb +241 -0
- data/lib/cisco_node_utils/node.rb +673 -0
- data/lib/cisco_node_utils/platform.rb +184 -0
- data/lib/cisco_node_utils/platform_info.rb +58 -0
- data/lib/cisco_node_utils/platform_info.yaml +10 -0
- data/lib/cisco_node_utils/router_ospf.rb +96 -0
- data/lib/cisco_node_utils/router_ospf_vrf.rb +258 -0
- data/lib/cisco_node_utils/snmpcommunity.rb +91 -0
- data/lib/cisco_node_utils/snmpgroup.rb +55 -0
- data/lib/cisco_node_utils/snmpserver.rb +150 -0
- data/lib/cisco_node_utils/snmpuser.rb +342 -0
- data/lib/cisco_node_utils/tacacs_server.rb +175 -0
- data/lib/cisco_node_utils/tacacs_server_host.rb +128 -0
- data/lib/cisco_node_utils/version.rb +17 -0
- data/lib/cisco_node_utils/vlan.rb +153 -0
- data/lib/cisco_node_utils/vtp.rb +127 -0
- data/lib/cisco_node_utils/yum.rb +84 -0
- data/tests/basetest.rb +93 -0
- data/tests/ciscotest.rb +136 -0
- data/tests/cmd_config.yaml +51 -0
- data/tests/cmd_config_invalid.yaml +16 -0
- data/tests/test_all_cisco.rb +46 -0
- data/tests/test_command_config.rb +192 -0
- data/tests/test_command_reference.rb +222 -0
- data/tests/test_interface.rb +1017 -0
- data/tests/test_interface_ospf.rb +763 -0
- data/tests/test_interface_svi.rb +267 -0
- data/tests/test_interface_switchport.rb +722 -0
- data/tests/test_node.rb +108 -0
- data/tests/test_node_ext.rb +450 -0
- data/tests/test_platform.rb +188 -0
- data/tests/test_router_ospf.rb +164 -0
- data/tests/test_router_ospf_vrf.rb +753 -0
- data/tests/test_snmpcommunity.rb +344 -0
- data/tests/test_snmpgroup.rb +71 -0
- data/tests/test_snmpserver.rb +443 -0
- data/tests/test_snmpuser.rb +803 -0
- data/tests/test_tacacs_server.rb +388 -0
- data/tests/test_tacacs_server_host.rb +391 -0
- data/tests/test_vlan.rb +264 -0
- data/tests/test_vtp.rb +319 -0
- data/tests/test_yum.rb +106 -0
- metadata +188 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
# VTP provider class
|
2
|
+
#
|
3
|
+
# Mike Wiebe, November 2014
|
4
|
+
#
|
5
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
|
19
|
+
require File.join(File.dirname(__FILE__), 'node')
|
20
|
+
|
21
|
+
module Cisco
|
22
|
+
class Vtp
|
23
|
+
attr_reader :name
|
24
|
+
|
25
|
+
MAX_VTP_DOMAIN_NAME_SIZE = 32
|
26
|
+
MAX_VTP_PASSWORD_SIZE = 64
|
27
|
+
|
28
|
+
@@node = Node.instance
|
29
|
+
|
30
|
+
# Constructor for Vtp
|
31
|
+
def initialize(instantiate=true)
|
32
|
+
enable if instantiate and not Vtp.enabled
|
33
|
+
end
|
34
|
+
|
35
|
+
def Vtp.enabled
|
36
|
+
not @@node.config_get("vtp", "feature").nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
def enable
|
40
|
+
@@node.config_set("vtp", "feature", "")
|
41
|
+
end
|
42
|
+
|
43
|
+
# Disable vtp feature
|
44
|
+
def destroy
|
45
|
+
@@node.config_set("vtp", "feature", "no")
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get vtp domain name
|
49
|
+
def Vtp.domain
|
50
|
+
@@node.config_get("vtp", "domain")
|
51
|
+
end
|
52
|
+
|
53
|
+
def domain
|
54
|
+
Vtp.domain
|
55
|
+
end
|
56
|
+
|
57
|
+
# Set vtp domain name
|
58
|
+
def domain=(domain)
|
59
|
+
raise ArgumentError unless domain and domain.is_a? String and
|
60
|
+
domain.length.between?(1, MAX_VTP_DOMAIN_NAME_SIZE)
|
61
|
+
begin
|
62
|
+
@@node.config_set("vtp", "domain", domain)
|
63
|
+
rescue Cisco::CliError => e
|
64
|
+
# cmd will syntax reject when setting name to same name
|
65
|
+
raise unless e.clierror =~ /ERROR: Domain name already set to /
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Get vtp password
|
70
|
+
def password
|
71
|
+
# Unfortunately nxapi returns "\\" when the password is not set
|
72
|
+
password = @@node.config_get("vtp", "password")
|
73
|
+
return '' if password.nil?
|
74
|
+
password.gsub(/\\/, '')
|
75
|
+
end
|
76
|
+
|
77
|
+
# Set vtp password
|
78
|
+
def password=(password)
|
79
|
+
raise TypeError if password.nil?
|
80
|
+
raise TypeError unless password.is_a? String
|
81
|
+
raise ArgumentError if password.length > MAX_VTP_PASSWORD_SIZE
|
82
|
+
password == default_password ?
|
83
|
+
@@node.config_set("vtp", "password", "no", "") :
|
84
|
+
@@node.config_set("vtp", "password", "", password)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Get default vtp password
|
88
|
+
def default_password
|
89
|
+
@@node.config_get_default("vtp", "password")
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get vtp filename
|
93
|
+
def filename
|
94
|
+
match = @@node.config_get("vtp", "filename")
|
95
|
+
match.nil? ? default_filename : match.first
|
96
|
+
end
|
97
|
+
|
98
|
+
# Set vtp filename
|
99
|
+
def filename=(uri)
|
100
|
+
raise TypeError if uri.nil?
|
101
|
+
uri.empty? ?
|
102
|
+
@@node.config_set("vtp", "filename", "no", "") :
|
103
|
+
@@node.config_set("vtp", "filename", "", uri)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Get default vtp filename
|
107
|
+
def default_filename
|
108
|
+
@@node.config_get_default("vtp", "filename")
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get vtp version
|
112
|
+
def version
|
113
|
+
match = @@node.config_get("vtp", "version")
|
114
|
+
match.nil? ? default_version : match.first.to_i
|
115
|
+
end
|
116
|
+
|
117
|
+
# Set vtp version
|
118
|
+
def version=(version)
|
119
|
+
@@node.config_set("vtp", "version", "#{version}")
|
120
|
+
end
|
121
|
+
|
122
|
+
# Get default vtp version
|
123
|
+
def default_version
|
124
|
+
@@node.config_get_default("vtp", "version")
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#
|
2
|
+
# NXAPI implementation of Yum class
|
3
|
+
#
|
4
|
+
# April 2015, Alex Hunsberger
|
5
|
+
#
|
6
|
+
# Copyright (c) 2015 Cisco and/or its affiliates.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
|
20
|
+
require File.join(File.dirname(__FILE__), 'node')
|
21
|
+
|
22
|
+
module Cisco
|
23
|
+
# This Yum class provides cisco package management functions through nxapi.
|
24
|
+
class Yum
|
25
|
+
@@node = Cisco::Node.instance
|
26
|
+
|
27
|
+
def self.decompose_name(file_name)
|
28
|
+
# ex: chef-12.0.0alpha.2+20150319.git.1.b6f-1.el5.x86_64.rpm
|
29
|
+
name_ver_arch_regex = /^([\w\-\+]+)-(\d+\..*)\.(\w{4,})(?:\.rpm)?$/
|
30
|
+
|
31
|
+
# ex n9000_sample-1.0.0-7.0.3.x86_64.rpm
|
32
|
+
name_ver_arch_regex_nx = /^(.*)-([\d\.]+-[\d\.]+)\.(\w{4,})\.rpm$/
|
33
|
+
|
34
|
+
# ex: b+z-ip2.x64_64
|
35
|
+
name_arch_regex = /^([\w\-\+]+)\.(\w+)$/
|
36
|
+
|
37
|
+
file_name.match(name_ver_arch_regex) ||
|
38
|
+
file_name.match(name_ver_arch_regex_nx) ||
|
39
|
+
file_name.match(name_arch_regex)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.validate(pkg)
|
43
|
+
file_name = pkg.strip.gsub(':', '/').split('/').last
|
44
|
+
pkg_info = Yum.decompose_name(file_name)
|
45
|
+
if pkg_info.nil?
|
46
|
+
query_name = file_name
|
47
|
+
else
|
48
|
+
if pkg_info[3].nil?
|
49
|
+
query_name = pkg_info[1]
|
50
|
+
else
|
51
|
+
query_name = "#{pkg_info[1]}.#{pkg_info[3]}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
should_ver = pkg_info[2] if pkg_info && pkg_info[3]
|
55
|
+
ver = self.query(query_name)
|
56
|
+
if ver.nil? || (!should_ver.nil? && should_ver != ver)
|
57
|
+
raise RuntimeError, "Failed to install the requested rpm"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.install(pkg)
|
62
|
+
@@node.config_set("yum", "install", pkg)
|
63
|
+
|
64
|
+
# HACK: The current nxos host installer is a multi-part command
|
65
|
+
# which may fail at a later stage yet return a false positive;
|
66
|
+
# therefore a post-validation check is needed here to verify the
|
67
|
+
# actual outcome.
|
68
|
+
self.validate(pkg)
|
69
|
+
end
|
70
|
+
|
71
|
+
# returns version of package, or false if package doesn't exist
|
72
|
+
def self.query(pkg)
|
73
|
+
raise TypeError unless pkg.is_a? String
|
74
|
+
raise ArgumentError if pkg.empty?
|
75
|
+
b = @@node.config_get("yum", "query", pkg)
|
76
|
+
raise "Multiple matching packages found for #{pkg}" if b and b.size > 1
|
77
|
+
b.nil? ? nil : b.first
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.remove(pkg)
|
81
|
+
@@node.config_set("yum", "remove", pkg)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/tests/basetest.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Basic unit test case class.
|
4
|
+
# December 2014, Glenn F. Matthews
|
5
|
+
#
|
6
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
|
20
|
+
require 'rubygems'
|
21
|
+
gem 'minitest', '>= 2.5.1', '< 5.0.0'
|
22
|
+
require 'minitest/autorun'
|
23
|
+
require 'net/telnet'
|
24
|
+
require 'test/unit'
|
25
|
+
begin
|
26
|
+
require 'cisco_nxapi'
|
27
|
+
rescue LoadError
|
28
|
+
require File.expand_path("../../../cisco_nxapi/lib/cisco_nxapi")
|
29
|
+
end
|
30
|
+
|
31
|
+
class TestCase < Test::Unit::TestCase
|
32
|
+
@@address = nil
|
33
|
+
@@username = nil
|
34
|
+
@@password = nil
|
35
|
+
|
36
|
+
def process_arguments
|
37
|
+
if ARGV.length != 3 and ARGV.length != 4
|
38
|
+
puts "Usage:"
|
39
|
+
puts " ruby test_nxapi.rb [options] -- <address> <username> <password> [debug]"
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
|
43
|
+
# Record the version of Ruby we got invoked with.
|
44
|
+
puts "\nRuby Version - #{RUBY_VERSION}"
|
45
|
+
|
46
|
+
@@address = ARGV[0]
|
47
|
+
@@username = ARGV[1]
|
48
|
+
@@password = ARGV[2]
|
49
|
+
|
50
|
+
if ARGV.length == 4
|
51
|
+
if ARGV[3] == "debug"
|
52
|
+
CiscoLogger.debug_enable
|
53
|
+
else
|
54
|
+
puts "Only 'debug' is allowed"
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# setup-once params
|
61
|
+
def address
|
62
|
+
process_arguments unless @@address
|
63
|
+
@@address
|
64
|
+
end
|
65
|
+
|
66
|
+
def username
|
67
|
+
process_arguments unless @@username
|
68
|
+
@@username
|
69
|
+
end
|
70
|
+
|
71
|
+
def password
|
72
|
+
process_arguments unless @@password
|
73
|
+
@@password
|
74
|
+
end
|
75
|
+
|
76
|
+
def setup
|
77
|
+
@device = Net::Telnet.new("Host" => address, "Timeout" => 240)
|
78
|
+
@device.login(username, password)
|
79
|
+
rescue Errno::ECONNREFUSED
|
80
|
+
puts "Connection refused - please check that the IP address is correct"
|
81
|
+
puts " and that you have enabled 'feature telnet' on the UUT"
|
82
|
+
exit
|
83
|
+
end
|
84
|
+
|
85
|
+
def teardown
|
86
|
+
@device.close unless @device.nil?
|
87
|
+
GC.start
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_placeholder
|
91
|
+
# needed so that we don't get a "no tests were specified" error
|
92
|
+
end
|
93
|
+
end
|
data/tests/ciscotest.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# Copyright (c) 2013-2015 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 File.join(File.dirname(__FILE__), 'basetest')
|
16
|
+
require File.expand_path("../../lib/cisco_node_utils/platform_info", __FILE__)
|
17
|
+
require File.expand_path("../../lib/cisco_node_utils/node", __FILE__)
|
18
|
+
|
19
|
+
include Cisco
|
20
|
+
|
21
|
+
Node.lazy_connect = true # we'll specify the connection info later
|
22
|
+
|
23
|
+
class CiscoTestCase < TestCase
|
24
|
+
@@node = nil
|
25
|
+
@@interfaces = nil
|
26
|
+
@@interfaces_id = nil
|
27
|
+
|
28
|
+
def node
|
29
|
+
unless @@node
|
30
|
+
@@node = Node.instance
|
31
|
+
@@node.connect(@@address, @@username, @@password)
|
32
|
+
@@node.cache_enable = true
|
33
|
+
@@node.cache_auto = true
|
34
|
+
puts "Node in CiscoTestCase Class: #{@@node}"
|
35
|
+
end
|
36
|
+
@@node
|
37
|
+
end
|
38
|
+
|
39
|
+
def process_arguments
|
40
|
+
super
|
41
|
+
node # Connect to device
|
42
|
+
# Record the platform we're running on
|
43
|
+
puts "Platform:"
|
44
|
+
puts " - name - #{@@node.host_name}"
|
45
|
+
puts " - type - #{@@node.product_id}"
|
46
|
+
puts " - image - #{@@node.system}\n\n"
|
47
|
+
end
|
48
|
+
|
49
|
+
def cmd_ref
|
50
|
+
node.cmd_ref
|
51
|
+
end
|
52
|
+
|
53
|
+
def interfaces
|
54
|
+
unless @@interfaces
|
55
|
+
# Build the platform_info, used for interface lookup
|
56
|
+
begin
|
57
|
+
platform_info = PlatformInfo.new(node.host_name)
|
58
|
+
@@interfaces = platform_info.get_value_from_key("interfaces")
|
59
|
+
rescue Exception => e
|
60
|
+
# If there is a problem reading platform_info.yaml, assign default values
|
61
|
+
default_interfaces = ["Ethernet1/1", "Ethernet1/2", "Ethernet1/10"]
|
62
|
+
puts "Caught exception: #{e}, assigning interfaces to default - #{default_interfaces}"
|
63
|
+
@@interfaces = default_interfaces
|
64
|
+
end
|
65
|
+
end
|
66
|
+
@@interfaces
|
67
|
+
end
|
68
|
+
|
69
|
+
def interfaces_id
|
70
|
+
unless @@interfaces_id
|
71
|
+
@@interfaces_id = []
|
72
|
+
interfaces.each { |interface|
|
73
|
+
id = interface.split("Ethernet")[1]
|
74
|
+
@@interfaces_id << id
|
75
|
+
}
|
76
|
+
end
|
77
|
+
@@interfaces_id
|
78
|
+
end
|
79
|
+
|
80
|
+
# Class method method to set the class variable 'debug_flag'
|
81
|
+
# Can be true or false.
|
82
|
+
def self.debug_flag=(flag)
|
83
|
+
@@debug_flag = flag
|
84
|
+
end
|
85
|
+
|
86
|
+
# Class method to set the class variable 'debug_method'
|
87
|
+
# Can be name of the method or "all"
|
88
|
+
def self.debug_method=(name)
|
89
|
+
@@debug_method = name
|
90
|
+
end
|
91
|
+
|
92
|
+
# Class method to set the class variable 'debug_group'
|
93
|
+
# Can be the name of the method or "all"
|
94
|
+
def self.debug_group=(group)
|
95
|
+
@@debug_group = group
|
96
|
+
end
|
97
|
+
|
98
|
+
# Class method to set the class variable 'debug_detail'
|
99
|
+
# Can be true or false
|
100
|
+
def self.debug_detail=(detail)
|
101
|
+
@@debug_detail = detail
|
102
|
+
end
|
103
|
+
|
104
|
+
# Class method to dump debug data.
|
105
|
+
# The passed in parameters will control what is printed and how.
|
106
|
+
# Parameters:
|
107
|
+
# method - Name of the method the debug belongs to.
|
108
|
+
# group - Name of the group the debug belongs to.
|
109
|
+
# indent - Indent controls the display of the data.
|
110
|
+
# detail - Detail controls if detail debugs should be displayed.
|
111
|
+
# data - Data to be displayed. Must be a fully formatted string.
|
112
|
+
def self.debug(method, group, indent, data)
|
113
|
+
if (@@debug_flag) &&
|
114
|
+
(((@@debug_method == method) || (@@debug_method == "all")) ||
|
115
|
+
((@@debug_group == group) || (@@debug_group == "all")))
|
116
|
+
indent_spaces = " " * indent
|
117
|
+
puts "#{indent_spaces}#{method} - #{data}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Class method to dump detailed debug data.
|
122
|
+
# The passed in parameters will control what is printed and how.
|
123
|
+
# Parameters:
|
124
|
+
# method - Name of the method the debug belongs to.
|
125
|
+
# group - Name of the group the debug belongs to.
|
126
|
+
# indent - Indent controls the display of the data.
|
127
|
+
# data - Data to be displayed. Must be a fully formatted string.
|
128
|
+
def self.debug_detail(method, group, indent, data)
|
129
|
+
if (@@debug_detail) &&
|
130
|
+
(((@@debug_method == method) || (@@debug_method == "all")) ||
|
131
|
+
((@@debug_group == group) || (@@debug_group == "all")))
|
132
|
+
indent_spaces = " " * indent
|
133
|
+
puts "#{indent_spaces}#{method} - #{data}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# test command config yaml file
|
2
|
+
---
|
3
|
+
feature-enable:
|
4
|
+
command: |
|
5
|
+
feature tacacs+
|
6
|
+
feature ospf
|
7
|
+
feature bgp
|
8
|
+
feature pim
|
9
|
+
feature msdp
|
10
|
+
feature private-vlan
|
11
|
+
feature udld
|
12
|
+
feature interface-vlan
|
13
|
+
feature hsrp
|
14
|
+
feature lacp
|
15
|
+
feature dhcp
|
16
|
+
feature vtp
|
17
|
+
|
18
|
+
feature-disable:
|
19
|
+
command: |
|
20
|
+
no feature tacacs+
|
21
|
+
no feature ospf
|
22
|
+
no feature bgp
|
23
|
+
no feature pim
|
24
|
+
no feature msdp
|
25
|
+
no feature private-vlan
|
26
|
+
no feature udld
|
27
|
+
no feature interface-vlan
|
28
|
+
no feature hsrp
|
29
|
+
no feature lacp
|
30
|
+
no feature dhcp
|
31
|
+
no feature vtp
|
32
|
+
|
33
|
+
feature-snmp-comm-acl-ro:
|
34
|
+
command: |
|
35
|
+
snmp-server community networkopercom group network-operator
|
36
|
+
snmp-server community networkopercom use-acl SNMP_RO
|
37
|
+
|
38
|
+
feature-snmp-comm-acl-rw:
|
39
|
+
command: |
|
40
|
+
snmp-server community admincom group network-admin
|
41
|
+
snmp-server community admincom use-acl SNMP_RW
|
42
|
+
|
43
|
+
feature-int-loopback:
|
44
|
+
command: >
|
45
|
+
interface loopback0
|
46
|
+
description testloopback
|
47
|
+
|
48
|
+
feature-int-portchannel:
|
49
|
+
command: >
|
50
|
+
interface port-channel100
|
51
|
+
description test-portchannel
|