puppet_x_eos_eapi 0.2.0
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 +17 -0
- data/Gemfile +24 -0
- data/LICENSE.txt +202 -0
- data/README.md +87 -0
- data/Rakefile +1 -0
- data/lib/puppet_x/eos/autoload.rb +57 -0
- data/lib/puppet_x/eos/eapi.rb +259 -0
- data/lib/puppet_x/eos/module_base.rb +37 -0
- data/lib/puppet_x/eos/modules/daemon.rb +109 -0
- data/lib/puppet_x/eos/modules/extension.rb +167 -0
- data/lib/puppet_x/eos/modules/interface.rb +180 -0
- data/lib/puppet_x/eos/modules/ipinterface.rb +133 -0
- data/lib/puppet_x/eos/modules/mlag.rb +268 -0
- data/lib/puppet_x/eos/modules/ntp.rb +129 -0
- data/lib/puppet_x/eos/modules/ospf.rb +129 -0
- data/lib/puppet_x/eos/modules/portchannel.rb +277 -0
- data/lib/puppet_x/eos/modules/radius.rb +367 -0
- data/lib/puppet_x/eos/modules/snmp.rb +177 -0
- data/lib/puppet_x/eos/modules/switchport.rb +255 -0
- data/lib/puppet_x/eos/modules/system.rb +138 -0
- data/lib/puppet_x/eos/modules/tacacs.rb +302 -0
- data/lib/puppet_x/eos/modules/vlan.rb +179 -0
- data/lib/puppet_x/eos/modules/vxlan.rb +132 -0
- data/lib/puppet_x/eos/provider.rb +71 -0
- data/lib/puppet_x/eos/version.rb +41 -0
- data/lib/puppet_x/net_dev/eos_api.rb +1011 -0
- data/lib/puppet_x/net_dev/eos_api/common_methods.rb +27 -0
- data/lib/puppet_x/net_dev/eos_api/snmp_methods.rb +647 -0
- data/lib/puppet_x/net_dev/eos_api/version.rb +8 -0
- data/lib/puppet_x_eos_eapi.rb +4 -0
- data/puppet_x_eos_eapi.gemspec +31 -0
- data/spec/fixtures/fixture_all_portchannel_modes.json +8 -0
- data/spec/fixtures/fixture_all_portchannels_detailed.json +15 -0
- data/spec/fixtures/fixture_create_vlan_error.json +17 -0
- data/spec/fixtures/fixture_create_vlan_success.json +12 -0
- data/spec/fixtures/fixture_eapi_conf.yaml +4 -0
- data/spec/fixtures/fixture_enable_configure_vlan_3111_name_foo.json +14 -0
- data/spec/fixtures/fixture_enable_configure_vlan_foo_name_bar.json +19 -0
- data/spec/fixtures/fixture_get_snmp_communities_non_existent_acl.yaml +2 -0
- data/spec/fixtures/fixture_get_snmp_location_westeros.json +5 -0
- data/spec/fixtures/fixture_portchannel_min_links_1.json +8 -0
- data/spec/fixtures/fixture_portchannel_min_links_2.json +8 -0
- data/spec/fixtures/fixture_running_config.yaml +1 -0
- data/spec/fixtures/fixture_running_configuration_radius_configured.yaml +30 -0
- data/spec/fixtures/fixture_running_configuration_radius_default.yaml +29 -0
- data/spec/fixtures/fixture_running_configuration_radius_server_groups.yaml +38 -0
- data/spec/fixtures/fixture_running_configuration_radius_servers.yaml +34 -0
- data/spec/fixtures/fixture_running_configuration_tacacs_configured.yaml +38 -0
- data/spec/fixtures/fixture_running_configuration_tacacs_default.yaml +38 -0
- data/spec/fixtures/fixture_running_configuration_tacacs_groups.yaml +1 -0
- data/spec/fixtures/fixture_running_configuration_tacacs_groups_3.yaml +43 -0
- data/spec/fixtures/fixture_running_configuration_tacacs_servers.yaml +41 -0
- data/spec/fixtures/fixture_s4_show_etherchannel_detailed.json +9 -0
- data/spec/fixtures/fixture_show_flowcontrol_et1.json +5 -0
- data/spec/fixtures/fixture_show_interfaces.json +297 -0
- data/spec/fixtures/fixture_show_interfaces_switchport_format_text.json +9 -0
- data/spec/fixtures/fixture_show_port_channel_summary_2_lags.json +9 -0
- data/spec/fixtures/fixture_show_port_channel_summary_static.json +9 -0
- data/spec/fixtures/fixture_show_snmp_community.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_contact_empty.json +5 -0
- data/spec/fixtures/fixture_show_snmp_contact_name.json +5 -0
- data/spec/fixtures/fixture_show_snmp_disabled.json +5 -0
- data/spec/fixtures/fixture_show_snmp_enabled.json +5 -0
- data/spec/fixtures/fixture_show_snmp_host.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_host_duplicates.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_host_more_duplicates.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_location_empty.json +5 -0
- data/spec/fixtures/fixture_show_snmp_trap.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_user.yaml +2 -0
- data/spec/fixtures/fixture_show_snmp_user_raw_text.yaml +1 -0
- data/spec/fixtures/fixture_show_vlan.json +37 -0
- data/spec/fixtures/fixture_show_vlan_3110.json +18 -0
- data/spec/fixtures/fixture_show_vlan_4000.json +18 -0
- data/spec/fixtures/fixture_snmp_host_opts.yaml +11 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/fixtures.rb +104 -0
- data/spec/unit/puppet_x/eos/eapi_spec.rb +182 -0
- data/spec/unit/puppet_x/eos/module_base_spec.rb +26 -0
- data/spec/unit/puppet_x/eos/modules/daemon_spec.rb +110 -0
- data/spec/unit/puppet_x/eos/modules/extension_spec.rb +197 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/daemon_getall.json +3 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/extension_getall.json +28 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/hostname.json +6 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/interface_getall.json +509 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/ipinterface_getall.json +56 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/mlag_get.json +21 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/mlag_get_interfaces.json +18 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/ntp_get.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/ospf_instance_getall.json +58 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/portchannel_get.json +54 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/portchannel_getlacpmode.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/portchannel_getmembers.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/portchannel_po1.json +7 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/snmp_get.json +14 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/switchport_get.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/switchport_get_et1.json +7 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/switchport_getall_interfaces.json +230 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/system_domain_list.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/system_domain_name.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/system_hostname.json +6 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/system_name_servers.json +5 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/vlan_getall.json +123 -0
- data/spec/unit/puppet_x/eos/modules/fixtures/vxlan_get.json +24 -0
- data/spec/unit/puppet_x/eos/modules/interface_spec.rb +281 -0
- data/spec/unit/puppet_x/eos/modules/ipinterface_spec.rb +143 -0
- data/spec/unit/puppet_x/eos/modules/mlag_spec.rb +349 -0
- data/spec/unit/puppet_x/eos/modules/ntp_spec.rb +136 -0
- data/spec/unit/puppet_x/eos/modules/ospf_spec.rb +143 -0
- data/spec/unit/puppet_x/eos/modules/portchannel_spec.rb +357 -0
- data/spec/unit/puppet_x/eos/modules/radius_spec.rb +509 -0
- data/spec/unit/puppet_x/eos/modules/snmp_spec.rb +202 -0
- data/spec/unit/puppet_x/eos/modules/switchport_get_et1.json +7 -0
- data/spec/unit/puppet_x/eos/modules/switchport_spec.rb +307 -0
- data/spec/unit/puppet_x/eos/modules/system_spec.rb +170 -0
- data/spec/unit/puppet_x/eos/modules/tacacs_spec.rb +448 -0
- data/spec/unit/puppet_x/eos/modules/vlan_spec.rb +244 -0
- data/spec/unit/puppet_x/eos/modules/vxlan_spec.rb +189 -0
- data/spec/unit/puppet_x/eos/provider_spec.rb +35 -0
- data/spec/unit/puppet_x/net_dev/eos_api/common_methods_spec.rb +34 -0
- data/spec/unit/puppet_x/net_dev/eos_api/snmp_methods_spec.rb +842 -0
- data/spec/unit/puppet_x/net_dev/eos_api_spec.rb +1000 -0
- metadata +369 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module PuppetX
|
|
4
|
+
##
|
|
5
|
+
# Eos is module namesapce for working with the EOS command API
|
|
6
|
+
module Eos
|
|
7
|
+
##
|
|
8
|
+
# Tacacs provides instance methods to retrieve and set tacacs configuration
|
|
9
|
+
# values.
|
|
10
|
+
class Tacacs < ModuleBase
|
|
11
|
+
# Regular expression to extract a tacacs server's attributes from the
|
|
12
|
+
# running-configuration text. The explicit [ ] spaces enable line
|
|
13
|
+
# wrappping and indentation with the /x flag.
|
|
14
|
+
SERVER_REGEXP = /tacacs-server[ ]host[ ](.*?)
|
|
15
|
+
(?:[ ](single-connection))?
|
|
16
|
+
(?:[ ]port[ ](\d+))?
|
|
17
|
+
(?:[ ]timeout[ ](\d+))?
|
|
18
|
+
(?:[ ]key[ ](\d+)[ ](\w+))?\s/x
|
|
19
|
+
|
|
20
|
+
# Default Tacacs TCP port
|
|
21
|
+
DEFAULT_PORT = 49
|
|
22
|
+
|
|
23
|
+
# Regular expression to extract a tacacs server's attributes from the
|
|
24
|
+
# running-configuration text. The explicit [ ] spaces enable line
|
|
25
|
+
# wrappping and indentation with the /x flag.
|
|
26
|
+
SERVER_GROUP_REGEXP = /aaa group server tacacs[+]? (.*)/
|
|
27
|
+
|
|
28
|
+
# FIXME Needs to be updated
|
|
29
|
+
GROUP_MEMBER_REGEXP = /server[ ](.*?)
|
|
30
|
+
(?:[ ]vrf[ ]([^ ]+))?
|
|
31
|
+
(?:[ ]port[ ](\d+))?\s/x
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# getall Returns an Array with a single resource Hash describing the
|
|
35
|
+
# current state of the global tacacs configuration on the target device.
|
|
36
|
+
# This method is intended to be used by a provider's instances class
|
|
37
|
+
# method.
|
|
38
|
+
#
|
|
39
|
+
# The resource hash returned contains the following information:
|
|
40
|
+
# * name: ('settings')
|
|
41
|
+
# * enable: (true | false) if tacacs functionality is enabled. This is
|
|
42
|
+
# always true for EOS.
|
|
43
|
+
# * key: (String) the key either in plaintext or hashed format
|
|
44
|
+
# * key_format: (Integer) e.g. 0 or 7
|
|
45
|
+
# * timeout: (Integer) seconds before the timeout period ends
|
|
46
|
+
#
|
|
47
|
+
# @api public
|
|
48
|
+
#
|
|
49
|
+
# @return [Array<Hash>] Single element Array of resource hashes
|
|
50
|
+
def getall
|
|
51
|
+
config = running_configuration
|
|
52
|
+
rsrc_hsh = tacacs_global_defaults
|
|
53
|
+
rsrc_hsh.merge!(parse_global_key(config))
|
|
54
|
+
rsrc_hsh.merge!(parse_global_timeout(config))
|
|
55
|
+
[rsrc_hsh]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# tacacs_global_defaults returns the default values for the tacacs_global
|
|
60
|
+
# resource. This is in a single method to keep the information in one
|
|
61
|
+
# place. If a value is explicitly configured to be the same as a default
|
|
62
|
+
# value it will not show up in the running configuration and as a result
|
|
63
|
+
# will not be parsed out by the parse instance methods. This method
|
|
64
|
+
# exposes the default values.
|
|
65
|
+
#
|
|
66
|
+
# @return [Array<Hash>] Single element Array of resource hashes
|
|
67
|
+
def tacacs_global_defaults
|
|
68
|
+
{
|
|
69
|
+
name: 'settings',
|
|
70
|
+
enable: true,
|
|
71
|
+
timeout: 5,
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
private :tacacs_global_defaults
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# parse_global_key takes a running configuration as a string and
|
|
78
|
+
# parses out the radius global key and global key format if it exists in
|
|
79
|
+
# the configuration. An empty Hash is returned if there is no global key
|
|
80
|
+
# configured. The intent of the Hash is to be merged into a property
|
|
81
|
+
# hash.
|
|
82
|
+
#
|
|
83
|
+
# @param [String] config The running configuration as a single string.
|
|
84
|
+
#
|
|
85
|
+
# @api private
|
|
86
|
+
#
|
|
87
|
+
# @return [Hash<Symbol,Object>] resource hash attributes
|
|
88
|
+
def parse_global_key(config)
|
|
89
|
+
rsrc_hsh = {}
|
|
90
|
+
(key_format, key) = config.scan(/tacacs-server key (\d+) (\w+)/).first
|
|
91
|
+
rsrc_hsh[:key_format] = key_format.to_i if key_format
|
|
92
|
+
rsrc_hsh[:key] = key if key
|
|
93
|
+
rsrc_hsh
|
|
94
|
+
end
|
|
95
|
+
private :parse_global_key
|
|
96
|
+
|
|
97
|
+
##
|
|
98
|
+
# parse_global_timeout takes a running configuration as a string
|
|
99
|
+
# and parses out the tacacs global timeout if it exists in the
|
|
100
|
+
# configuration. An empty Hash is returned if there is no global timeout
|
|
101
|
+
# value configured. The intent of the Hash is to be merged into a
|
|
102
|
+
# property hash.
|
|
103
|
+
#
|
|
104
|
+
# @param [String] config The running configuration as a single string.
|
|
105
|
+
#
|
|
106
|
+
# @api private
|
|
107
|
+
#
|
|
108
|
+
# @return [Hash<Symbol,Object>] resource hash attributes
|
|
109
|
+
def parse_global_timeout(config)
|
|
110
|
+
rsrc_hsh = {}
|
|
111
|
+
timeout = config.scan(/tacacs-server timeout (\d+)/).first
|
|
112
|
+
# EOS default is 5 (does not show up in the running config)
|
|
113
|
+
rsrc_hsh[:timeout] = timeout.first.to_i if timeout
|
|
114
|
+
rsrc_hsh
|
|
115
|
+
end
|
|
116
|
+
private :parse_global_timeout
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# set_global_key configures the tacacs default key. This method maps to
|
|
120
|
+
# the `tacacs-server key` EOS configuration command, e.g. `tacacs-server
|
|
121
|
+
# key 7 070E234F1F5B4A`.
|
|
122
|
+
#
|
|
123
|
+
# @option opts [String] :key ('070E234F1F5B4A') The key value
|
|
124
|
+
#
|
|
125
|
+
# @option opts [Fixnum] :key_format (7) The key format, 0 for plaintext
|
|
126
|
+
# and 7 for a hashed value. 7 will be assumed if this option is not
|
|
127
|
+
# provided.
|
|
128
|
+
#
|
|
129
|
+
# @api public
|
|
130
|
+
#
|
|
131
|
+
# @return [Boolean] true if no errors
|
|
132
|
+
def set_global_key(opts = {})
|
|
133
|
+
format = opts[:key_format] || 7
|
|
134
|
+
key = opts[:key]
|
|
135
|
+
fail ArgumentError, 'key option is required' unless key
|
|
136
|
+
result = api.config("tacacs-server key #{format} #{key}")
|
|
137
|
+
result == [{}]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# set_timeout configures the tacacs default timeout. This method maps to
|
|
142
|
+
# the `tacacs-server timeout` setting.
|
|
143
|
+
#
|
|
144
|
+
# @option opts [Fixnum] :timeout (50) The timeout in seconds to
|
|
145
|
+
# configure.
|
|
146
|
+
#
|
|
147
|
+
# @api public
|
|
148
|
+
#
|
|
149
|
+
# @return [Boolean] true if no errors
|
|
150
|
+
def set_timeout(opts = {})
|
|
151
|
+
timeout = opts[:timeout]
|
|
152
|
+
fail ArgumentError, 'timeout option is required' unless timeout
|
|
153
|
+
result = api.config("tacacs-server timeout #{timeout}")
|
|
154
|
+
result == [{}]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
##
|
|
158
|
+
# servers returns an Array of tacacs server resource hashes. Each hash
|
|
159
|
+
# describes the current state of the tacacs server and is suitable for
|
|
160
|
+
# use in initializing a tacacs_server provider.
|
|
161
|
+
#
|
|
162
|
+
# The resource hash returned contains the following information:
|
|
163
|
+
#
|
|
164
|
+
# * hostname: hostname or ip address, part of the identifier
|
|
165
|
+
# * port: (Fixnum) TCP port of the server, part of the identifier
|
|
166
|
+
# * key: (String) the key either in plaintext or hashed format
|
|
167
|
+
# * key_format: (Fixnum) e.g. 0 or 7
|
|
168
|
+
# * timeout: (Fixnum) seconds before the timeout period ends
|
|
169
|
+
# * multiplex: (Boolean) true when configured to make requests through a
|
|
170
|
+
# single connection
|
|
171
|
+
#
|
|
172
|
+
# @api public
|
|
173
|
+
#
|
|
174
|
+
# @return [Array<Hash<Symbol,Object>>] Array of resource hashes
|
|
175
|
+
def servers
|
|
176
|
+
config = running_configuration
|
|
177
|
+
tuples = config.scan(SERVER_REGEXP)
|
|
178
|
+
tuples.map do |(host, mplex, port, tout, keyfm, key)|
|
|
179
|
+
hsh = { port: DEFAULT_PORT }
|
|
180
|
+
hsh[:hostname] = host if host
|
|
181
|
+
hsh[:port] = port.to_i if port
|
|
182
|
+
hsh[:timeout] = tout.to_i if tout
|
|
183
|
+
hsh[:key_format] = keyfm.to_i if keyfm
|
|
184
|
+
hsh[:key] = key if key
|
|
185
|
+
hsh[:multiplex] = mplex ? true : false
|
|
186
|
+
hsh
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
##
|
|
191
|
+
# server_groups retrieves a list of tacacs server groups from the target
|
|
192
|
+
# device.
|
|
193
|
+
#
|
|
194
|
+
# @api public
|
|
195
|
+
#
|
|
196
|
+
# @return [Array<Hash<Symbol,Object>>] Array of resource hashes
|
|
197
|
+
def server_groups
|
|
198
|
+
config = running_configuration
|
|
199
|
+
regexp = SERVER_GROUP_REGEXP
|
|
200
|
+
tuples = config.scan(regexp)
|
|
201
|
+
tuples.map do |(name)|
|
|
202
|
+
{ name: name, servers: parse_group_servers(config, name) }
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
##
|
|
207
|
+
# parse_group_servers parses the list of servers associated with a tacacs
|
|
208
|
+
# server group given a group name and a running configuration text.
|
|
209
|
+
#
|
|
210
|
+
# @param [String] config The running configuration text.
|
|
211
|
+
#
|
|
212
|
+
# @param [String] name The name of the server group to parse.
|
|
213
|
+
#
|
|
214
|
+
# @api private
|
|
215
|
+
#
|
|
216
|
+
# @return [Array<Hash<Symbol,Object>] Array of server attributes
|
|
217
|
+
def parse_group_servers(config, name)
|
|
218
|
+
regexp = /aaa group server tacacs[+] #{name}(.*?)!/m
|
|
219
|
+
mdata = regexp.match(config)
|
|
220
|
+
tuples = mdata[1].scan(GROUP_MEMBER_REGEXP)
|
|
221
|
+
tuples.collect do |(hostname, vrf, port)|
|
|
222
|
+
{ hostname: hostname, port: port ? port.to_i : DEFAULT_PORT }
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
##
|
|
227
|
+
# update_server_group updates a tacacs server group given an Array of
|
|
228
|
+
# server attributes and the name of the server group. The update happens
|
|
229
|
+
# by first deleting the existing group if it exists then creating it
|
|
230
|
+
# again with all of the specified servers.
|
|
231
|
+
#
|
|
232
|
+
# @param [String] name The name of the server group to update
|
|
233
|
+
#
|
|
234
|
+
# @param [Array<Hash<Symbol,Object>>] servers The array of servers to
|
|
235
|
+
# associate with the server group. This hash should have at least the
|
|
236
|
+
# :hostname key.
|
|
237
|
+
#
|
|
238
|
+
# @api public
|
|
239
|
+
#
|
|
240
|
+
# @return [Boolean] true if no errors
|
|
241
|
+
def update_server_group(opts = {})
|
|
242
|
+
cmd = "aaa group server tacacs+ #{opts[:name]}"
|
|
243
|
+
api.config("no #{cmd}")
|
|
244
|
+
cmds = [cmd]
|
|
245
|
+
opts[:servers].each do |hsh|
|
|
246
|
+
cmds << "server #{hsh[:hostname]} port #{hsh[:port] || DEFAULT_PORT}"
|
|
247
|
+
end
|
|
248
|
+
result = api.config(cmds)
|
|
249
|
+
!result.find { |r| r != {} }
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
##
|
|
253
|
+
# remove_server_group removes a tacacs server group by name. This API
|
|
254
|
+
# call maps to the `no aaa group server tacacs <name>` command.
|
|
255
|
+
#
|
|
256
|
+
# @option opts [String] :name ('TAC-GR') The name of the tacacs server
|
|
257
|
+
# group to remove.
|
|
258
|
+
#
|
|
259
|
+
# @api public
|
|
260
|
+
#
|
|
261
|
+
# @return [Boolean] true if no errors
|
|
262
|
+
def remove_server_group(opts = {})
|
|
263
|
+
result = api.config("no aaa group server tacacs+ #{opts[:name]}")
|
|
264
|
+
result == [{}]
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
##
|
|
268
|
+
# update_server configures a tacacs server resource on the target device.
|
|
269
|
+
# This API method maps to the `tacacs server host` command, e.g.
|
|
270
|
+
# `tacacs-server host 1.2.3.4 single-connection port 4949 timeout 6 key 7
|
|
271
|
+
# 06070D221D1C5A`
|
|
272
|
+
#
|
|
273
|
+
# @api public
|
|
274
|
+
#
|
|
275
|
+
# @return [Boolean] true if there are no errors
|
|
276
|
+
def update_server(opts = {})
|
|
277
|
+
key_format = opts[:key_format] || 7
|
|
278
|
+
cmd = "tacacs-server host #{opts[:hostname]}"
|
|
279
|
+
cmd << ' single-connection' if opts[:multiplex]
|
|
280
|
+
cmd << " port #{opts[:port]}" if opts[:port]
|
|
281
|
+
cmd << " timeout #{opts[:timeout]}" if opts[:timeout]
|
|
282
|
+
cmd << " key #{key_format} #{opts[:key]}" if opts[:key]
|
|
283
|
+
result = api.config(cmd)
|
|
284
|
+
result == [{}]
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
##
|
|
288
|
+
# remove_server removes the tacacs server identified by the hostname,
|
|
289
|
+
# and port attributes.
|
|
290
|
+
#
|
|
291
|
+
# @api public
|
|
292
|
+
#
|
|
293
|
+
# @return [Boolean] true if no errors
|
|
294
|
+
def remove_server(opts = {})
|
|
295
|
+
cmd = "no tacacs-server host #{opts[:hostname]}"
|
|
296
|
+
cmd << " port #{opts[:port]}" if opts[:port]
|
|
297
|
+
result = api.config(cmd)
|
|
298
|
+
result == [{}]
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2014, Arista Networks, Inc.
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
|
6
|
+
# modification, are permitted provided that the following conditions are
|
|
7
|
+
# met:
|
|
8
|
+
#
|
|
9
|
+
# Redistributions of source code must retain the above copyright notice,
|
|
10
|
+
# this list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
# notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
# documentation and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# Neither the name of Arista Networks nor the names of its
|
|
17
|
+
# contributors may be used to endorse or promote products derived from
|
|
18
|
+
# this software without specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS
|
|
24
|
+
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
27
|
+
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
28
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
29
|
+
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
30
|
+
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Eos is the toplevel namespace for working with Arista EOS nodes
|
|
35
|
+
module PuppetX
|
|
36
|
+
##
|
|
37
|
+
# Eapi is module namesapce for working with the EOS command API
|
|
38
|
+
module Eos
|
|
39
|
+
##
|
|
40
|
+
# The Vlan class provides an interface for working wit VLAN resources
|
|
41
|
+
# in EOS. All configuration is sent and received using eAPI. In order
|
|
42
|
+
# to use this class, eAPI must be enablined in EOS. This class
|
|
43
|
+
# can be instatiated either using the Eos::Eapi::Switch.load_class
|
|
44
|
+
# method or used directly.
|
|
45
|
+
#
|
|
46
|
+
class Vlan
|
|
47
|
+
def initialize(api)
|
|
48
|
+
@api = api
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# Returns the vlan data for the provided id with the
|
|
53
|
+
# show vlan <id> command. If the id doesn't exist then
|
|
54
|
+
# nil is returned
|
|
55
|
+
#
|
|
56
|
+
# Example:
|
|
57
|
+
# [
|
|
58
|
+
# { "sourceDetail": <string>, "vlans": {...} },
|
|
59
|
+
# { "trunkGroups": {...} }
|
|
60
|
+
# ]
|
|
61
|
+
#
|
|
62
|
+
# @return [nil, Hash<String, String|Hash|Array>] Hash describing the
|
|
63
|
+
# vlan configuration specified by id. If the id is not
|
|
64
|
+
# found then nil is returned
|
|
65
|
+
def getall
|
|
66
|
+
@api.enable(['show vlan', 'show vlan trunk group'])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Adds a new VLAN resource in EOS setting the VLAN ID to id. The
|
|
71
|
+
# VLAN ID must be in the valid range of 1 through 4094
|
|
72
|
+
#
|
|
73
|
+
# @param [String] id The VLAN identifier (e.g. 1)
|
|
74
|
+
#
|
|
75
|
+
# @return [Boolean] returns true if the command completed successfully
|
|
76
|
+
def create(id)
|
|
77
|
+
@api.config("vlan #{id}") == [{}]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# Deletes an existing VLAN resource in EOS as specified by ID. If
|
|
82
|
+
# the supplied VLAN ID does not exist no error is raised
|
|
83
|
+
#
|
|
84
|
+
# @param [String] id The VLAN identifier (e.g. 1)
|
|
85
|
+
#
|
|
86
|
+
# @return [Boolean] always returns true
|
|
87
|
+
def delete(id)
|
|
88
|
+
@api.config("no vlan #{id}") == [{}]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# Defaults an existing VLAN resource in EOS as specified by ID. If
|
|
93
|
+
# the supplied VLAN ID does not exist no error is raised. Note: setting
|
|
94
|
+
# a vlan to default is equivalent to negating it
|
|
95
|
+
#
|
|
96
|
+
# @param [String] id The VLAN identifier (e.g. 1)
|
|
97
|
+
#
|
|
98
|
+
# @return [Boolean] returns true if the command completed successfully
|
|
99
|
+
def default(id)
|
|
100
|
+
@api.config("default vlan #{id}") == [{}]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# Configures the VLAN name of the VLAN specified by ID. set_name maps
|
|
105
|
+
# to the EOS name WORD command. Spaces in the name will be converted
|
|
106
|
+
# to _
|
|
107
|
+
#
|
|
108
|
+
# @param [Hash] opts The configuration parameters for the VLAN
|
|
109
|
+
# @option opts [String] :id The VLAN ID to change
|
|
110
|
+
# @option opts [string] :value The value to set the name to
|
|
111
|
+
# @option opts [Boolean] :default The value should be set to default
|
|
112
|
+
#
|
|
113
|
+
# @return [Boolean] returns true if the command completed successfully
|
|
114
|
+
def set_name(id, opts = {})
|
|
115
|
+
value = opts[:value]
|
|
116
|
+
default = opts[:default] || false
|
|
117
|
+
|
|
118
|
+
cmds = ["vlan #{id}"]
|
|
119
|
+
case default
|
|
120
|
+
when true
|
|
121
|
+
cmds << 'default name'
|
|
122
|
+
when false
|
|
123
|
+
cmds << (value.nil? ? 'no name' : "name #{value}")
|
|
124
|
+
end
|
|
125
|
+
@api.config(cmds) == [{}, {}]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Configures the administrative state of the VLAN specified by ID. The
|
|
130
|
+
# set_state function accepts 'active' or 'suspend' to configure the
|
|
131
|
+
# VLAN state.
|
|
132
|
+
#
|
|
133
|
+
# @param [Hash] opts The configuration parameters for the VLAN
|
|
134
|
+
# @option opts [String] :id The VLAN ID to change
|
|
135
|
+
# @option opts [string] :value The value to set the state to
|
|
136
|
+
# @option opts [Boolean] :default The value should be set to default
|
|
137
|
+
#
|
|
138
|
+
# @return [Boolean] returns true if the command completed successfully
|
|
139
|
+
def set_state(id, opts = {})
|
|
140
|
+
value = opts[:value]
|
|
141
|
+
default = opts[:default] || false
|
|
142
|
+
|
|
143
|
+
cmds = ["vlan #{id}"]
|
|
144
|
+
case default
|
|
145
|
+
when true
|
|
146
|
+
cmds << 'default state'
|
|
147
|
+
when false
|
|
148
|
+
cmds << (value.nil? ? 'no state' : "state #{value}")
|
|
149
|
+
end
|
|
150
|
+
@api.config(cmds) == [{}, {}]
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
##
|
|
154
|
+
# Configures the trunk group value for the VLAN specified by ID. The
|
|
155
|
+
# trunk group setting is typically used to associate VLANs with MLAG
|
|
156
|
+
# configurations
|
|
157
|
+
#
|
|
158
|
+
# @param [Hash] opts The configuration parameters for the VLAN
|
|
159
|
+
# @option opts [String] :id The VLAN ID to change
|
|
160
|
+
# @option opts [string] :value The value to set the trunk group to
|
|
161
|
+
# @option opts [Boolean] :default The value should be set to default
|
|
162
|
+
#
|
|
163
|
+
# @return [Boolean] returns true if the command completed successfully
|
|
164
|
+
def set_trunk_group(id, opts = {})
|
|
165
|
+
value = opts[:value]
|
|
166
|
+
default = opts[:default] || false
|
|
167
|
+
|
|
168
|
+
cmds = ["vlan #{id}"]
|
|
169
|
+
case default
|
|
170
|
+
when true
|
|
171
|
+
cmds << 'default trunk group'
|
|
172
|
+
when false
|
|
173
|
+
cmds << (value.nil? ? 'no trunk group' : "trunk group #{value}")
|
|
174
|
+
end
|
|
175
|
+
@api.config(cmds) == [{}, {}]
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|