rbeapi 0.1.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.
- data/.gitignore +35 -0
- data/Gemfile +25 -0
- data/Guardfile +15 -0
- data/LICENSE +28 -0
- data/README.md +218 -0
- data/Rakefile +12 -0
- data/lib/rbeapi.rb +32 -0
- data/lib/rbeapi/api.rb +135 -0
- data/lib/rbeapi/api/aaa.rb +410 -0
- data/lib/rbeapi/api/dns.rb +198 -0
- data/lib/rbeapi/api/interfaces.rb +1193 -0
- data/lib/rbeapi/api/ipinterfaces.rb +328 -0
- data/lib/rbeapi/api/logging.rb +157 -0
- data/lib/rbeapi/api/mlag.rb +519 -0
- data/lib/rbeapi/api/ntp.rb +201 -0
- data/lib/rbeapi/api/ospf.rb +214 -0
- data/lib/rbeapi/api/prefixlists.rb +98 -0
- data/lib/rbeapi/api/radius.rb +317 -0
- data/lib/rbeapi/api/radius.rb.old +399 -0
- data/lib/rbeapi/api/routemaps.rb +100 -0
- data/lib/rbeapi/api/snmp.rb +427 -0
- data/lib/rbeapi/api/staticroutes.rb +88 -0
- data/lib/rbeapi/api/stp.rb +381 -0
- data/lib/rbeapi/api/switchports.rb +272 -0
- data/lib/rbeapi/api/system.rb +87 -0
- data/lib/rbeapi/api/tacacs.rb +236 -0
- data/lib/rbeapi/api/varp.rb +181 -0
- data/lib/rbeapi/api/vlans.rb +338 -0
- data/lib/rbeapi/client.rb +454 -0
- data/lib/rbeapi/eapilib.rb +334 -0
- data/lib/rbeapi/netdev/snmp.rb +370 -0
- data/lib/rbeapi/utils.rb +70 -0
- data/lib/rbeapi/version.rb +37 -0
- data/rbeapi.gemspec +32 -0
- data/spec/fixtures/dut.conf +5 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/fixtures.rb +114 -0
- data/spec/support/shared_examples_for_api_modules.rb +124 -0
- data/spec/system/api_ospf_interfaces_spec.rb +58 -0
- data/spec/system/api_ospf_spec.rb +111 -0
- data/spec/system/api_varp_interfaces_spec.rb +60 -0
- data/spec/system/api_varp_spec.rb +44 -0
- data/spec/system/rbeapi/api/dns_spec.rb +77 -0
- data/spec/system/rbeapi/api/interfaces_base_spec.rb +94 -0
- data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +135 -0
- data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +188 -0
- data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +115 -0
- data/spec/system/rbeapi/api/ipinterfaces_spec.rb +97 -0
- data/spec/system/rbeapi/api/logging_spec.rb +65 -0
- data/spec/system/rbeapi/api/mlag_interfaces_spec.rb +80 -0
- data/spec/system/rbeapi/api/mlag_spec.rb +94 -0
- data/spec/system/rbeapi/api/ntp_spec.rb +76 -0
- data/spec/system/rbeapi/api/snmp_spec.rb +68 -0
- data/spec/system/rbeapi/api/stp_instances_spec.rb +61 -0
- data/spec/system/rbeapi/api/stp_interfaces_spec.rb +71 -0
- data/spec/system/rbeapi/api/stp_spec.rb +57 -0
- data/spec/system/rbeapi/api/switchports_spec.rb +135 -0
- data/spec/system/rbeapi/api/system_spec.rb +38 -0
- data/spec/system/rbeapi/api/vlans_spec.rb +121 -0
- metadata +274 -0
@@ -0,0 +1,454 @@
|
|
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
|
+
require 'inifile'
|
33
|
+
|
34
|
+
require 'rbeapi/utils'
|
35
|
+
require 'rbeapi/eapilib'
|
36
|
+
require 'rbeapi/api'
|
37
|
+
|
38
|
+
##
|
39
|
+
# Rbeapi toplevel namespace
|
40
|
+
module Rbeapi
|
41
|
+
##
|
42
|
+
# Rbeapi::Client
|
43
|
+
module Client
|
44
|
+
|
45
|
+
class << self
|
46
|
+
|
47
|
+
DEFAULT_TRANSPORT = 'http'
|
48
|
+
|
49
|
+
TRANSPORTS = { 'http' => 'Rbeapi::Eapilib::HttpEapiConnection',
|
50
|
+
'https' => 'Rbeapi::Eapilib::HttpsEapiConnection',
|
51
|
+
'http_local' => 'Rbeapi::Eapilib::HttpLocalEapiConenction',
|
52
|
+
'socket' => 'Rbeapi::Eapilib::SocketEapiConnection' }
|
53
|
+
|
54
|
+
##
|
55
|
+
# Returns the currently loaded config object. This function will
|
56
|
+
# create a new instance of the config object if one doesn't already
|
57
|
+
# exist
|
58
|
+
#
|
59
|
+
# @return [Config] Returns an instance of Config used for working
|
60
|
+
# with the eapi.conf file
|
61
|
+
def config
|
62
|
+
return @config if @config
|
63
|
+
@config = Config.new()
|
64
|
+
return @config
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# load_config overrides the default conf file loaded in the config
|
69
|
+
# instances using the supplied conf argument as the conf file. This
|
70
|
+
# method will clear out an previously loaded configuration and replace
|
71
|
+
# all entries with the contects of the supplied file.
|
72
|
+
#
|
73
|
+
# @param [String] :conf The full path to the conf file to load into
|
74
|
+
# the config instance.
|
75
|
+
def load_config(conf)
|
76
|
+
config.read(conf)
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Returns the configuration options for the named connection from the
|
81
|
+
# the loaded configuuration. The configuration name is specified as
|
82
|
+
# the string right of the colon in the section name.
|
83
|
+
#
|
84
|
+
# @param [String] :name The connection name to return from the loaded
|
85
|
+
# configuration
|
86
|
+
#
|
87
|
+
# @return [Hash, nil] This method will return the configuration hash for
|
88
|
+
# the named configuration if found. If the name is not found, then
|
89
|
+
# nil is returned
|
90
|
+
def config_for(name)
|
91
|
+
return config.get_connection(name)
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Retrieves the node config form the loaded configuration file and
|
96
|
+
# returns a Rbeapi::Node instance for working with the remote node.
|
97
|
+
#
|
98
|
+
# @param [String] :name The named configuration to use for creating the
|
99
|
+
# connection to the remote node
|
100
|
+
#
|
101
|
+
# @return [Rbeapi::Node, nil] Returns an instance of Rbeapi::Node. If
|
102
|
+
# the named configuration is not found then nil is returned
|
103
|
+
def connect_to(name)
|
104
|
+
config = config_for(name)
|
105
|
+
return nil unless config
|
106
|
+
config = Rbeapi::Utils.transform_keys_to_symbols(config)
|
107
|
+
connection = connect config
|
108
|
+
Node.new(connection)
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Builds a connection object to a remote node using the specified
|
113
|
+
# options and return an instance of Rbeapi::Connection. All
|
114
|
+
# configuration options can be passed via the :opts param or can be
|
115
|
+
# overridden using environment variables. Environment variables are
|
116
|
+
# specified by prepending EAPI to the option name. For instance to
|
117
|
+
# override the host param use EAPI_HOST.
|
118
|
+
#
|
119
|
+
# @param [Hash] :opts the options to create a message with
|
120
|
+
# @option :opts [String] :host The IP address or hostname of the remote
|
121
|
+
# eAPI endpint
|
122
|
+
# @option :opts [String] :username The username to use to authenticate
|
123
|
+
# the eAPI connection with
|
124
|
+
# @option :opts [String] :password The password to use to authenticate
|
125
|
+
# the eAPI connection with
|
126
|
+
# @option :opts [String] :enable_pwd The enable password (if defined) to
|
127
|
+
# pass to the remote node to enter priviledged mode
|
128
|
+
# @option :opts [String] :use_ssl Specifies whether or not to use the
|
129
|
+
# HTTP or HTTPS protocol
|
130
|
+
# @option :opts [String] :port The port to connect to. If not specified
|
131
|
+
# The port is automatically determined based on the protocol used
|
132
|
+
# (443 for https, 80 for http)
|
133
|
+
#
|
134
|
+
# @return [Rbeapi::Connection] Returns an instance of Rbeapi::Connection
|
135
|
+
# using the specified configuration options
|
136
|
+
def connect(opts = {})
|
137
|
+
transport = opts.fetch(:transport, DEFAULT_TRANSPORT)
|
138
|
+
make_connection(transport, opts)
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Creates a connection instance that can either be used directly or
|
143
|
+
# passed to a Node instance.
|
144
|
+
#
|
145
|
+
# @params [String] :transport The name of the transport to create.
|
146
|
+
# @params [Hash] :opts The options used to create the transport
|
147
|
+
#
|
148
|
+
# @return [Rbeapi::EapiConnection] A instance of a connection object
|
149
|
+
def make_connection(transport, opts = {})
|
150
|
+
klass = TRANSPORTS.fetch(transport)
|
151
|
+
cls = Rbeapi::Utils.class_from_string(klass)
|
152
|
+
cls.new(opts)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class Config < IniFile
|
157
|
+
|
158
|
+
CONFIG_SEARCH_PATH = ['~/.eapi.conf', '/mnt/flash/eapi.conf']
|
159
|
+
|
160
|
+
##
|
161
|
+
# The Config class holds the loaded configuration file data. It is a
|
162
|
+
# subclass of IniFile. The Config class will automatically search for
|
163
|
+
# a filename to load (if none provided) and load the data when the
|
164
|
+
# object is instantiated.
|
165
|
+
#
|
166
|
+
# @param [String] :filename The full path to the filename to load. If
|
167
|
+
# the filename is not provided, then this class will attempt to find
|
168
|
+
# a valid conf file using the CONFIG_SEARCH_PATH.
|
169
|
+
def initialize(opts = {})
|
170
|
+
super(parameter: ':')
|
171
|
+
@filename = opts.fetch(:filename, nil)
|
172
|
+
autoload
|
173
|
+
end
|
174
|
+
|
175
|
+
##
|
176
|
+
# This private method automtically finds and loads the conf file
|
177
|
+
# into the instance using the class variable CONFIG_SEARCH_PATH. The
|
178
|
+
# connections should be retrieved using the get_connection method
|
179
|
+
#
|
180
|
+
# @param [Hash] :opts The options for specifying the message
|
181
|
+
# @option :opts [String] :filename The full path to the filename
|
182
|
+
# to load. Using this option eliminates the use of the
|
183
|
+
# search path
|
184
|
+
def autoload(opts = {})
|
185
|
+
search_path = CONFIG_SEARCH_PATH.dup
|
186
|
+
search_path.insert(0, ENV['EAPI_CONF']) if ENV.key?('EAPI_CONF')
|
187
|
+
|
188
|
+
path = opts[:filename] || search_path
|
189
|
+
|
190
|
+
path.each do |fn|
|
191
|
+
fn = File.expand_path(fn)
|
192
|
+
return read(fn) if File.exists?(fn)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
private :autoload
|
196
|
+
|
197
|
+
##
|
198
|
+
# This method will read the specified filename and load its contents
|
199
|
+
# into the instance. It will also add the default localhost entry
|
200
|
+
# if it doesn't exist in the conf file
|
201
|
+
#
|
202
|
+
# @param [String] :filename The full path to the filename to load
|
203
|
+
def read(filename)
|
204
|
+
super(filename: filename)
|
205
|
+
unless get_connection 'localhost'
|
206
|
+
add_connection('localhost', transport: 'socket')
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
##
|
211
|
+
# This method will cause the config to be loaded. The process of
|
212
|
+
# finding the configuration will be repeated so it is possible a
|
213
|
+
# different conf file could be choosen if the original file was
|
214
|
+
# removed or a new file added higher on the search priority list
|
215
|
+
#
|
216
|
+
# @param [Hash] :opts The options for specifying the message
|
217
|
+
# @opton :opts [String] :filename The full path to the file to load
|
218
|
+
def reload(opts = {})
|
219
|
+
autoload opts
|
220
|
+
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# Returns the configuration for the connection specified
|
224
|
+
#
|
225
|
+
# @param [String] :name The name of the connection to return from
|
226
|
+
# the configuration. This should be the string right of the :
|
227
|
+
# in the config section header
|
228
|
+
#
|
229
|
+
# @return [nil, Hash<String, String> Returns a hash of the connection
|
230
|
+
# properities from the loaded config. This method will return nil
|
231
|
+
# if the connection name is not found.
|
232
|
+
def get_connection(name)
|
233
|
+
return nil unless sections.include? "connection:#{name}"
|
234
|
+
self["connection:#{name}"]
|
235
|
+
end
|
236
|
+
|
237
|
+
##
|
238
|
+
# Adds a new connection section to the current configuration
|
239
|
+
#
|
240
|
+
# @param [String] :name The name of the connection to add to the
|
241
|
+
# configuration.
|
242
|
+
# @param [Hash] :values The properties for the connection
|
243
|
+
def add_connection(name, values)
|
244
|
+
self["connection:#{name}"] = values
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
class Node
|
249
|
+
|
250
|
+
attr_reader :connection
|
251
|
+
|
252
|
+
##
|
253
|
+
# The Node object provies an instnace for sending and receiveing messages
|
254
|
+
# with a specific EOS device. The methods provided in this calss allow
|
255
|
+
# for handling both enable mode and config mode commands
|
256
|
+
#
|
257
|
+
# @param [Rbeapi::Eapilib::EapiConnection] :connection An instance of
|
258
|
+
# EapiConnection used to send and receive eAPI formatted messages
|
259
|
+
def initialize(connection)
|
260
|
+
@connection = connection
|
261
|
+
@autorefresh = true
|
262
|
+
end
|
263
|
+
|
264
|
+
##
|
265
|
+
# Provides access the nodes running-configuration. This is a lazily
|
266
|
+
# loaded memoized property for working with the node configuration
|
267
|
+
#
|
268
|
+
# @return [String] The node's running-config as a string
|
269
|
+
def running_config
|
270
|
+
return @running_config if @running_config
|
271
|
+
@running_config = get_config(params: 'all', as_string: true)
|
272
|
+
return @running_config
|
273
|
+
end
|
274
|
+
|
275
|
+
##
|
276
|
+
# Provides access to the nodes startup-configuration. This is a lazily
|
277
|
+
# loaded memoized prpoerty for working with the nodes startup config
|
278
|
+
#
|
279
|
+
# @return [String] The node's startup-config as a string
|
280
|
+
def startup_config
|
281
|
+
return @startup_config if @startup_config
|
282
|
+
@startup_config = get_config(config: 'startup-config', as_string: true)
|
283
|
+
return @startup_config
|
284
|
+
end
|
285
|
+
|
286
|
+
##
|
287
|
+
# Configures the node instance to use an enable password. EOS can be
|
288
|
+
# configured to require a second layer of authentication when putting
|
289
|
+
# the session into enable mode. The password supplied will be used to
|
290
|
+
# authenticate the session to enable mode if necessary.
|
291
|
+
#
|
292
|
+
# @param [String] :password The value of the enable password
|
293
|
+
def enable_authentication(password)
|
294
|
+
@enablepwd = password
|
295
|
+
end
|
296
|
+
|
297
|
+
##
|
298
|
+
# The config method is a convenience method that will handling putting
|
299
|
+
# the switch into config mode prior to executing commands. The method
|
300
|
+
# will insert 'config' at the top of the command stack and then pop
|
301
|
+
# the empty hash from the response output before return the array
|
302
|
+
# to the caller
|
303
|
+
#
|
304
|
+
# @param [Array<String>] commands An ordered list of commands to execute
|
305
|
+
#
|
306
|
+
# @return [Array<Hash>] ordered list of output from commands
|
307
|
+
def config(commands)
|
308
|
+
commands = [*commands] unless commands.respond_to?('each')
|
309
|
+
|
310
|
+
commands.insert(0, 'configure')
|
311
|
+
response = run_commands commands
|
312
|
+
|
313
|
+
refresh if @autorefresh
|
314
|
+
|
315
|
+
response.shift
|
316
|
+
response
|
317
|
+
end
|
318
|
+
|
319
|
+
##
|
320
|
+
# The enable method is a convenience method that will handling putting
|
321
|
+
# the switch into priviledge mode prior to executing commands.
|
322
|
+
#
|
323
|
+
# @param [Array<String>] commands An ordered list of commands to execute
|
324
|
+
# @param [String] :encoding The encoding scheme to use for sending and
|
325
|
+
# receive eAPI messages. Valid values are json and text. The default
|
326
|
+
# value is json
|
327
|
+
#
|
328
|
+
# @return [Array<Hash>] ordered list of output from commands
|
329
|
+
def enable(commands, opts = {})
|
330
|
+
commands = [*commands] unless commands.respond_to?('each')
|
331
|
+
|
332
|
+
encoding = opts.fetch(:encoding, 'json')
|
333
|
+
strict = opts.fetch(:strict, false)
|
334
|
+
|
335
|
+
results = []
|
336
|
+
if strict
|
337
|
+
responses = run_commands(commands, encoding)
|
338
|
+
responses.each_with_index do |resp, idx|
|
339
|
+
results << make_response(commands[idx], resp, encoding)
|
340
|
+
end
|
341
|
+
else
|
342
|
+
commands.each do |cmd|
|
343
|
+
begin
|
344
|
+
response = run_commands(cmd, encoding)
|
345
|
+
results << make_response(cmd, response.first, encoding)
|
346
|
+
rescue Rbeapi::Eapilib::CommandError => exc
|
347
|
+
raise unless exc.error_code == 1003
|
348
|
+
response = run_commands(cmd, 'text')
|
349
|
+
results << make_response(cmd, response.first, encoding)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
results
|
354
|
+
end
|
355
|
+
|
356
|
+
##
|
357
|
+
# Returns a response object from a call to the enable method. This
|
358
|
+
# private method is an internal method to ensure consistency in the
|
359
|
+
# return message format
|
360
|
+
#
|
361
|
+
# @param [String] :command The command send to the node
|
362
|
+
# @param [Hash] :response The response returned from the eAPI call
|
363
|
+
# @param [String] :encoding The encoding scheme used in the response
|
364
|
+
# which should be either json or text
|
365
|
+
#
|
366
|
+
# @return [Hash] A Ruby hash object
|
367
|
+
def make_response(command, result, encoding)
|
368
|
+
{ command: command, result: result, encoding: encoding }
|
369
|
+
end
|
370
|
+
private :make_response
|
371
|
+
|
372
|
+
##
|
373
|
+
# This method will send the ordered list of commands to the destination
|
374
|
+
# node using the transport. It is also response for inserting enable
|
375
|
+
# onto the command stack and popping the enable result on the response
|
376
|
+
#
|
377
|
+
# @param [Array] :commands The ordered list of commands to send to the
|
378
|
+
# destination node.
|
379
|
+
# @param [String] :encoding The encoding scheme to use for sending and
|
380
|
+
# receive eAPI requests. This argument is optional. Valid values
|
381
|
+
# include json or text. The default is json
|
382
|
+
def run_commands(commands, encoding = 'json')
|
383
|
+
commands = [*commands] unless commands.respond_to?('each')
|
384
|
+
commands = commands.dup
|
385
|
+
|
386
|
+
if @enablepwd
|
387
|
+
commands.insert(0, { 'cmd' => 'enable', 'input' => @enablepwd })
|
388
|
+
else
|
389
|
+
commands.insert(0, 'enable')
|
390
|
+
end
|
391
|
+
|
392
|
+
response = @connection.execute(commands, format: encoding)
|
393
|
+
response.shift
|
394
|
+
response
|
395
|
+
end
|
396
|
+
|
397
|
+
##
|
398
|
+
# This method will retrieve the specified configuration from the node
|
399
|
+
# and return it in full text.
|
400
|
+
#
|
401
|
+
# @param [Hash] opts the options to create a message with
|
402
|
+
# @option :opts [String] :config The configuration instance to return from
|
403
|
+
# the node. Valid values are 'running-config' and 'startup-config'. If
|
404
|
+
# no value is specified, then 'running-config' is used
|
405
|
+
# @ :opts [String] :param Additional parameters to append to the
|
406
|
+
# retrieving the configuration. Valid values depend on the config
|
407
|
+
# file requested
|
408
|
+
#
|
409
|
+
# running-config params
|
410
|
+
# all Configuration with defaults
|
411
|
+
# detail Detail configuration with defaults
|
412
|
+
# diffs Differences from startup-config
|
413
|
+
# interfaces Filter config to include only the given interfaces
|
414
|
+
# sanitized Sanitized Output
|
415
|
+
# section Display sections containing matching commands
|
416
|
+
#
|
417
|
+
# startup-config params
|
418
|
+
# errors Show information about the errors in startup-config
|
419
|
+
# interfaces Filter config to include only the given interfaces
|
420
|
+
# section Display sections containing matching commands
|
421
|
+
#
|
422
|
+
# @return [String] the specified configuration as text
|
423
|
+
def get_config(opts = {})
|
424
|
+
config = opts.fetch(:config, 'running-config')
|
425
|
+
params = opts.fetch(:params, '')
|
426
|
+
as_string = opts.fetch(:as_string, false)
|
427
|
+
result = run_commands("show #{config} #{params}", 'text')
|
428
|
+
return result.first['output'].strip.split("\n") unless as_string
|
429
|
+
result.first['output'].strip
|
430
|
+
end
|
431
|
+
|
432
|
+
##
|
433
|
+
# Returns an API module for working with the active conifguraiton
|
434
|
+
# of the node
|
435
|
+
def api(name, opts = {})
|
436
|
+
path = opts.fetch(:path, 'rbeapi/api')
|
437
|
+
namespace = opts.fetch(:namespace, 'Rbeapi::Api')
|
438
|
+
require "#{path}/#{name}"
|
439
|
+
clsname = "#{namespace}::#{name.capitalize}"
|
440
|
+
cls = Rbeapi::Utils.class_from_string(clsname)
|
441
|
+
return cls.instance(self) if cls.respond_to?(:instance)
|
442
|
+
cls.new(self)
|
443
|
+
end
|
444
|
+
|
445
|
+
##
|
446
|
+
# Forces both the running-config and startup-config to be refreshed on
|
447
|
+
# the next call to those properties.
|
448
|
+
def refresh
|
449
|
+
@running_config = nil
|
450
|
+
@startup_config = nil
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|