Class: Rbeapi::Netdev::Snmp
- Inherits:
-
Api::Entity
- Object
- Api::Entity
- Rbeapi::Netdev::Snmp
- Defined in:
- lib/rbeapi/netdev/snmp.rb
Overview
The Netdev class is a straight port of the original PuppetX netdev code that existed prior to rbeapi. This should be considered a legacy implementation that will go away as the functions get merged into rbeapi.
This class should NOT be used for any further development. YE BE WARNED!
Constant Summary collapse
- SNMP_USER_PARAM =
Map SNMP headings from
show snmp userto snmp_user parameter names { user: :name, engine: :engine_id, security: :version, authentication: :auth, privacy: :privacy, group: :roles }.freeze
Instance Attribute Summary
Attributes inherited from Api::Entity
Instance Method Summary collapse
-
#parse_snmp_hosts(text) ⇒ Array<Hash<Symbol,Object>>
private
parse_snmp_hosts parses the raw text from the
show snmp hostcommand and returns an Array of resource hashes. -
#parse_snmp_users(text) ⇒ Array<Hash<Symbol,Object>>
private
parse_snmp_users takes the text output from the
show snmp userEAPI command and parses the text into structured data suitable for use as a resource has to the provider initializer method. -
#snmp_notification_receiver_remove(opts = {}) ⇒ Boolean
snmp_notification_receiver_remove removes an snmp-server host from the target device.
-
#snmp_notification_receiver_set(opts = {}) ⇒ Boolean
snmp_notification_receiver_set takes a resource hash and configures a SNMP notification host on the target device.
-
#snmp_notification_receivers ⇒ Array<Hash<Symbol,Object>>
snmp_notification_receivers obtains a list of all the snmp notification receivers and returns them as an Array of resource hashes suitable for the provider's new class method.
-
#snmp_user_destroy(opts = {}) ⇒ Hash<Symbol,Object>, String
snmp_user_destroy removes an SNMP user from the target device.
-
#snmp_user_password_hash(running_config, user_cmd) ⇒ Hash<Symbol,String>
snmp_user_password obtains the password hash from the device in order to provide an idempotent configuration value.
-
#snmp_user_set(opts = {}) ⇒ Hash<Symbol,Object>
snmp_user_set creates or updates an SNMP user account on the target device.
-
#snmp_users ⇒ Array<Hash<Symbol,Object>>
snmp_users retrieves all of the SNMP users defined on the target device and returns an Array of Hash objects suitable for use as a resource hash to the provider's initializer method.
Methods inherited from Api::Entity
#command_builder, #configure, #configure_interface, #get_block, #initialize, instance
Constructor Details
This class inherits a constructor from Rbeapi::Api::Entity
Instance Method Details
#parse_snmp_hosts(text) ⇒ Array<Hash<Symbol,Object>>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
parse_snmp_hosts parses the raw text from the show snmp host
command and returns an Array of resource hashes.
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/rbeapi/netdev/snmp.rb', line 99 def parse_snmp_hosts(text) re = /host: ([^\s]+)\s+.*?port: (\d+)\s+type: (\w+)\s*user: (.*?)\s+security model: (.*?)\n/m # rubocop:disable Metrics/LineLength text.scan(re).map do |(host, port, type, username, auth)| resource_hash = { name: host, ensure: :present, port: port.to_i } sec_match = /^v3 (\w+)/.match(auth) resource_hash[:security] = sec_match[1] if sec_match ver_match = /^(v\d)/.match(auth) # first 2 characters resource_hash[:version] = ver_match[1] if ver_match resource_hash[:type] = type =~ /trap/ ? :traps : :informs resource_hash[:username] = username resource_hash end end |
#parse_snmp_users(text) ⇒ Array<Hash<Symbol,Object>>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
parse_snmp_users takes the text output from the show snmp user EAPI
command and parses the text into structured data suitable for use as
a resource has to the provider initializer method.
User name : jeff
Security model : v3
Engine ID : f5717f00420008177800
Authentication : SHA
Privacy : AES-128
Group : developers
User name : nigel
Security model : v2c
Group : sysops (not configured)
User name : nigel
Security model : v3
Engine ID : f5717f00420008177800
Authentication : SHA
Privacy : AES-128
Group : sysops
241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
# File 'lib/rbeapi/netdev/snmp.rb', line 241 def parse_snmp_users(text) text.split("\n\n").map do |user_s| user_s.scan(/^(\w+).*?: (.*)/).each_with_object({}) do |(h, v), m| key = SNMP_USER_PARAM[h.downcase.intern] || h.downcase.intern m[key] = case key when :privacy then v =~ /AES/ ? :aes128 : :des when :version then v.sub('v2c', 'v2').intern when :auth then v.downcase.intern when :roles then v.sub(/ \(.*?\)/, '') else v.downcase end end end end |
#snmp_notification_receiver_remove(opts = {}) ⇒ Boolean
snmp_notification_receiver_remove removes an snmp-server host from the target device.
185 186 187 188 |
# File 'lib/rbeapi/netdev/snmp.rb', line 185 def snmp_notification_receiver_remove(opts = {}) cmd = 'no ' << snmp_notification_receiver_cmd(opts) configure cmd end |
#snmp_notification_receiver_set(opts = {}) ⇒ Boolean
snmp_notification_receiver_set takes a resource hash and configures a SNMP notification host on the target device. In practice this method usually creates a resource because nearly all of the properties can vary and are components of a resource identifier.
139 140 141 |
# File 'lib/rbeapi/netdev/snmp.rb', line 139 def snmp_notification_receiver_set(opts = {}) configure snmp_notification_receiver_cmd(opts) end |
#snmp_notification_receivers ⇒ Array<Hash<Symbol,Object>>
snmp_notification_receivers obtains a list of all the snmp
notification receivers and returns them as an Array of resource
hashes suitable for the provider's new class method. This command
maps the show snmp host command to an array of resource hashes.
55 56 57 58 59 60 |
# File 'lib/rbeapi/netdev/snmp.rb', line 55 def snmp_notification_receivers cmd = 'show snmp host' result = node.enable(cmd) text = result.first[:result]['output'] parse_snmp_hosts(text) end |
#snmp_user_destroy(opts = {}) ⇒ Hash<Symbol,Object>, String
snmp_user_destroy removes an SNMP user from the target device
336 337 338 339 340 341 342 |
# File 'lib/rbeapi/netdev/snmp.rb', line 336 def snmp_user_destroy(opts = {}) group = [*opts[:roles]].first version = opts[:version].to_s.sub('v2', 'v2c') cmd = "no snmp-server user #{opts[:name]} #{group} #{version}" configure cmd {} end |
#snmp_user_password_hash(running_config, user_cmd) ⇒ Hash<Symbol,String>
snmp_user_password obtains the password hash from the device in order to provide an idempotent configuration value.
356 357 358 359 360 |
# File 'lib/rbeapi/netdev/snmp.rb', line 356 def snmp_user_password_hash(running_config, user_cmd) regexp = /#{user_cmd} .*?auth \w+\s+(.*?)\s+priv \w+\s+(.*?)\s/ (auth_hash, priv_hash) = running_config.scan(regexp).first { auth: auth_hash, privacy: priv_hash } end |
#snmp_user_set(opts = {}) ⇒ Hash<Symbol,Object>
snmp_user_set creates or updates an SNMP user account on the target device.
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 |
# File 'lib/rbeapi/netdev/snmp.rb', line 291 def snmp_user_set(opts = {}) group = [*opts[:roles]].first raise ArgumentError, 'at least one role is required' unless group version = opts[:version].to_s.sub('v2', 'v2c') cmd = user_cmd = "snmp-server user #{opts[:name]} #{group} #{version}" if opts[:password] && version == 'v3' privacy = opts[:privacy].to_s.scan(/aes|des/).first unless privacy raise ArgumentError, 'privacy is required when managing passwords' end cmd += " auth #{opts[:auth] || 'sha'} #{opts[:password]} "\ "priv #{privacy} #{opts[:password]}" end configure cmd hash = snmp_user_password_hash(running_config, user_cmd) { password: hash[:auth] } end |
#snmp_users ⇒ Array<Hash<Symbol,Object>>
snmp_users retrieves all of the SNMP users defined on the target device and returns an Array of Hash objects suitable for use as a resource hash to the provider's initializer method.
198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/rbeapi/netdev/snmp.rb', line 198 def snmp_users cmd = 'show snmp user' result = node.enable(cmd) text = result.first[:result]['output'] users = parse_snmp_users(text) users.each do |h| cmd = "snmp-server user #{h[:name]} #{h[:roles]} #{h[:version]}" password = snmp_user_password_hash(config, cmd)[:auth] h[:password] = password if password end end |