Browse Source

Re-introduce a trunk branch.

Joe Clarke 4 years ago
commit
b9dd69f752
89 changed files with 33751 additions and 0 deletions
  1. 2 0
      automation/cleu-ansible-n9k/.gitignore
  2. 8 0
      automation/cleu-ansible-n9k/add-vlan-playbook.yml
  3. 6 0
      automation/cleu-ansible-n9k/add-vm-playbook.yml
  4. 157 0
      automation/cleu-ansible-n9k/add_vlan.py
  5. 11 0
      automation/cleu-ansible-n9k/assets/banner.txt
  6. 8 0
      automation/cleu-ansible-n9k/configure-switchport-playbook.yml
  7. 196 0
      automation/cleu-ansible-n9k/configure_switchport.py
  8. 13 0
      automation/cleu-ansible-n9k/group_vars/DC1.yml
  9. 13 0
      automation/cleu-ansible-n9k/group_vars/DC2.yml
  10. 12 0
      automation/cleu-ansible-n9k/group_vars/all.yml
  11. 26 0
      automation/cleu-ansible-n9k/inventory/hosts
  12. 6 0
      automation/cleu-ansible-n9k/roles/cli/tasks/main.yml
  13. 9 0
      automation/cleu-ansible-n9k/roles/get-facts/tasks/main.yml
  14. 4 0
      automation/cleu-ansible-n9k/roles/get-groups/tasks/main.yml
  15. 44 0
      automation/cleu-ansible-n9k/roles/snmp/tasks/main.yml
  16. 110 0
      automation/cleu-ansible-n9k/roles/switchport/tasks/main.yml
  17. 135 0
      automation/cleu-ansible-n9k/roles/vlan/tasks/main.yml
  18. 23 0
      automation/cleu-ansible-n9k/roles/vm/tasks/main.yml
  19. 5 0
      automation/cleu-ansible-n9k/roles/write-mem/tasks/main.yml
  20. 10 0
      automation/cleu-ansible-n9k/run-cli-playbook.yml
  21. 51 0
      automation/cleu-ansible-n9k/run_cli.py
  22. 1 0
      automation/cmx/cmx-map/.gitignore
  23. 283 0
      automation/cmx/cmx-map/cmx.py
  24. 16 0
      automation/cmx/cmx-map/requirements.txt
  25. 240 0
      automation/dc/NXOSVlans.py
  26. 118 0
      automation/dc/UCSVlans.py
  27. 276 0
      automation/dc/create_vlan.sh
  28. 30 0
      automation/dc/dc.cfg
  29. 71 0
      automation/dc/misc/config_iscsi.exp
  30. 68 0
      automation/dc/misc/iscsiMultiPath.pl
  31. 22 0
      automation/dc/misc/reset_coredump_warning.sh
  32. 36 0
      automation/dc/misc/restart_hostd.exp
  33. 121 0
      automation/dc/nxos_add_delete_vlan.py
  34. 91 0
      automation/dc/ucs_add_delete_vlan.py
  35. 47 0
      automation/dc/vmware_alarm_to_spark.py
  36. 2158 0
      automation/monitoring/grafana/arp_mac.json
  37. 1331 0
      automation/monitoring/grafana/core.json
  38. 499 0
      automation/monitoring/grafana/dc.json
  39. 294 0
      automation/monitoring/grafana/dhcp.json
  40. 1344 0
      automation/monitoring/grafana/hx.json
  41. 16 0
      automation/monitoring/observium/observium_templates_alert_all.xml
  42. 98 0
      automation/monitoring/prometheus/prometheus.yml
  43. 10271 0
      automation/monitoring/prometheus/snmp.yml
  44. 9395 0
      automation/monitoring/prometheus/snmp_ifalias.yml
  45. 61 0
      automation/monitoring/scripts/notify-by-spark.py
  46. 47 0
      automation/monitoring/scripts/observium-to-spark.py
  47. 68 0
      automation/monitoring/scripts/observium-to-syslog.py
  48. 144 0
      automation/my-diag-bridge/db_callback.py
  49. 52 0
      automation/network/dhcp_metrics.py
  50. 116 0
      automation/network/diff-route-tables.py
  51. 67 0
      automation/network/gen_ip_stats.sh
  52. 171 0
      automation/network/gen_util.sh
  53. 165 0
      automation/network/get-devs.py
  54. 135 0
      automation/network/get-sw-inv.py
  55. 52 0
      automation/network/mac_metrics.py
  56. 81 0
      automation/network/poll_dhcp.py
  57. 130 0
      automation/network/poll_errors.py
  58. 151 0
      automation/network/poll_macs.py
  59. 135 0
      automation/network/poll_tcam.py
  60. 139 0
      automation/network/show_ip_stats.php
  61. 189 0
      automation/op-insights/fridge-alarm.py
  62. 102 0
      automation/op-insights/lost-device.py
  63. 106 0
      automation/services/AD/add_ad_users.py
  64. 92 0
      automation/services/AD/create_users.py
  65. 248 0
      automation/services/AD/reset_password.py
  66. 66 0
      automation/services/add-to-observium.py
  67. 79 0
      automation/services/add_cnames.py
  68. 70 0
      automation/services/clean_reservation.py
  69. 622 0
      automation/services/dhcp-hook.py
  70. 134 0
      automation/services/dhcp_scope_watch.py
  71. 346 0
      automation/services/dns-hook.py
  72. 116 0
      automation/services/dns-tester.py
  73. 136 0
      automation/services/extend_scope.py
  74. 70 0
      automation/services/remove_scopes.py
  75. 120 0
      automation/services/show_dhcp_stats.php
  76. 144 0
      automation/services/tool-to-observium.py
  77. 209 0
      automation/services/update-dns-pi.py
  78. 212 0
      automation/services/update-dns-tool.py
  79. 142 0
      automation/services/update_dhcp.py
  80. 109 0
      automation/services/update_dns.py
  81. 285 0
      automation/spark/sparker.py
  82. 60 0
      automation/syslog-ng-filters/err_disable.py
  83. 57 0
      automation/syslog-ng-filters/ipsla_timeout.py
  84. 49 0
      automation/syslog-ng-filters/ps_fail.py
  85. 55 0
      automation/syslog-ng-filters/qfp_alerts.py
  86. 120 0
      brknms-3021/mdt-ipsla/ipsla_pro.json
  87. 128 0
      brknms-3021/mdt-ipsla/yp-to-pro.py
  88. 170 0
      patches/loganalyzer/logstreamlineparsersyslog.class.php
  89. 126 0
      patches/loganalyzer/logstreamlineparsersyslog23.class.php

+ 2 - 0
automation/cleu-ansible-n9k/.gitignore

@@ -0,0 +1,2 @@
+*.retry
+var-playbook.yml

+ 8 - 0
automation/cleu-ansible-n9k/add-vlan-playbook.yml

@@ -0,0 +1,8 @@
+---
+- name: Configure core switches
+  hosts: Core
+  gather_facts: false
+  connection: network_cli
+  roles:
+      - vlan
+      - write-mem

+ 6 - 0
automation/cleu-ansible-n9k/add-vm-playbook.yml

@@ -0,0 +1,6 @@
+---
+- name: Add a VM
+  hosts: vCenter
+  gather_facts: false
+  roles:
+      - vm

+ 157 - 0
automation/cleu-ansible-n9k/add_vlan.py

@@ -0,0 +1,157 @@
+#!/usr/bin/env python2
+
+import argparse
+import sys
+import re
+import subprocess
+import os
+
+IPV4SEG  = r'(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])'
+IPV4ADDR = r'(?:(?:' + IPV4SEG + r'\.){3,3}' + IPV4SEG + r')'
+IPV6SEG  = r'(?:(?:[0-9a-fA-F]){1,4})'
+IPV6GROUPS = (
+    r'(?:' + IPV6SEG + r':){7,7}' + IPV6SEG,                  # 1:2:3:4:5:6:7:8
+    r'(?:' + IPV6SEG + r':){1,7}:',                           # 1::                                 1:2:3:4:5:6:7::
+    r'(?:' + IPV6SEG + r':){1,6}:' + IPV6SEG,                 # 1::8               1:2:3:4:5:6::8   1:2:3:4:5:6::8
+    r'(?:' + IPV6SEG + r':){1,5}(?::' + IPV6SEG + r'){1,2}',  # 1::7:8             1:2:3:4:5::7:8   1:2:3:4:5::8
+    r'(?:' + IPV6SEG + r':){1,4}(?::' + IPV6SEG + r'){1,3}',  # 1::6:7:8           1:2:3:4::6:7:8   1:2:3:4::8
+    r'(?:' + IPV6SEG + r':){1,3}(?::' + IPV6SEG + r'){1,4}',  # 1::5:6:7:8         1:2:3::5:6:7:8   1:2:3::8
+    r'(?:' + IPV6SEG + r':){1,2}(?::' + IPV6SEG + r'){1,5}',  # 1::4:5:6:7:8       1:2::4:5:6:7:8   1:2::8
+    IPV6SEG + r':(?:(?::' + IPV6SEG + r'){1,6})',             # 1::3:4:5:6:7:8     1::3:4:5:6:7:8   1::8
+    r':(?:(?::' + IPV6SEG + r'){1,7}|:)',                     # ::2:3:4:5:6:7:8    ::2:3:4:5:6:7:8  ::8       ::
+    r'fe80:(?::' + IPV6SEG + r'){0,4}%[0-9a-zA-Z]{1,}',       # fe80::7:8%eth0     fe80::7:8%1  (link-local IPv6 addresses with zone index)
+    r'::(?:ffff(?::0{1,4}){0,1}:){0,1}[^\s:]' + IPV4ADDR,     # ::255.255.255.255  ::ffff:255.255.255.255  ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
+    r'(?:' + IPV6SEG + r':){1,4}:[^\s:]' + IPV4ADDR,          # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
+)
+IPV6ADDR = '|'.join(['(?:{})'.format(g) for g in IPV6GROUPS[::-1]]) # Reverse rows for greedy match
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description='Add a VLAN to the core')
+    parser.add_argument('--vlan-name', '-n', metavar='<VLAN_NAME>',
+                        help='Name of the VLAN to add', required=True)
+    parser.add_argument('--vlan-id', '-i', metavar='<VLAN_ID>',
+                        help='ID of the VLAN to add', type=int, required=True)
+    parser.add_argument('--svi-v4-network', metavar='<SVI_NETWORK>',
+                        help='IPv4 network address of the SVI')
+    parser.add_argument('--svi-subnet-len', metavar='<SVI_PREFIX_LEN>',
+                        help='Subnet length of the SVI v4 IP (e.g., 24 for a /24)', type=int)
+    parser.add_argument('--svi-v6-network', metavar='<SVI_NETWORK>',
+                        help='IPv6 network address of the SVI (prefix len is assumed to be /64)')
+    parser.add_argument('--svi-descr', metavar='<SVI_DESCRIPTION>',
+                        help='Description of the SVI')
+    parser.add_argument('--no-hsrp', help='Use HSRP or not (default: False)', action="store_true")
+    parser.add_argument('--no-passive-interface', help='Whether or not to have OSPF use passive interface (default: False)', action='store_true')
+    parser.add_argument('--v6-link-local', help='Only use v6 link-local addresses', action='store_true')
+    parser.add_argument('--ospf-broadcast', help='OSPF network is broadcast instead of P2P (default: P2P)', action='store_true')
+    parser.add_argument('--interfaces', metavar='<INTF_LIST>', help='List of interfaces to enable for VLAN')
+    parser.add_argument('--mtu', '-m', metavar='<MTU>',
+                        help='MTU of SVI (default: 1500)', type=int)
+    parser.add_argument('--username', '-u', metavar='<USERNAME>',
+                        help='Username to use to connect to the N9Ks', required=True)
+    parser.add_argument('--site', '-s', metavar='<SITE NAME>',
+                        help='Name of site to which to add N9Ks (default: all sites)')
+    args = parser.parse_args()
+
+    if args.vlan_id < 1 or args.vlan_id > 3967:
+        print('ERROR: VLAN ID must be between 1 and 3967')
+        sys.exit(1)
+
+    svi_prefix = None
+    use_hsrp = True
+    passive_interface = True
+    svi_v6_link_local = False
+    ospf_type = 'point-to-point'
+
+    if args.svi_v4_network:
+        m = re.match(r'(\d+)\.(\d+)\.(\d+).(\d+)', args.svi_v4_network)
+
+        if not m:
+            print('ERROR: SVI Network must be an IPv4 network address')
+            sys.exit(1)
+
+        if not args.svi_subnet_len:
+            print('ERROR: SVI Prefix Length is required when an SVI Network is specified')
+            sys.exit(1)
+
+        if int(args.svi_subnet_len) < 8 or int(args.svi_subnet_len) > 30:
+            print('ERROR: SVI Prefix Length must be between 8 and 30')
+            sys.exit(1)
+
+        if args.svi_subnet_len >= 24:
+            svi_prefix = '{}.{}.{}'.format(m.group(1), m.group(2), m.group(3))
+        elif args.svi_prefix_len < 24 and args.svi_subnet_len >= 16:
+            svi_prefix = '{}.{}'.format(m.group(1), m.group(2))
+        else:
+            svi_prefix = m.group(1)
+
+    if args.svi_v4_network or args.svi_v6_network:
+        if args.mtu and (args.mtu < 1500 or args.mtu > 9216):
+            print('ERROR: MTU must be between 1500 and 9216')
+            sys.exit(1)
+        elif not args.mtu:
+            args.mtu = 1500
+
+        if args.no_passive_interface:
+            passive_interface = False
+
+        if args.no_hsrp:
+            use_hsrp = False
+
+        if args.ospf_broadcast:
+            ospf_type = 'broadcast'
+
+    if args.svi_v6_network:
+        m = re.match(IPV6ADDR, args.svi_v6_network)
+
+        if not m:
+            print('ERROR: SVI Network must be an IPv6 network address')
+            sys.exit(1)
+
+        if args.v6_link_local:
+            print('ERROR: Cannot specify both svi-v6-network and v6-link-local')
+            sys.exit(1)
+
+    elif args.v6_link_local:
+        svi_v6_link_local = True
+
+    os.environ['ANSIBLE_FORCE_COLOR'] = 'True'
+    os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
+    os.environ['ANSIBLE_PERSISTENT_COMMAND_TIMEOUT'] = '300'
+
+    command = ['ansible-playbook', '-i', 'inventory/hosts',
+               '-u', args.username, '-k', '-e',
+               'vlan_name={}'.format(
+                   args.vlan_name), '-e', 'vlan_id={}'.format(args.vlan_id), '-e', 'ansible_python_interpreter={}'.format(sys.executable),
+               '-e', 'ospf_type={}'.format(ospf_type),
+               'add-vlan-playbook.yml']
+    if args.svi_v4_network:
+        command += ['-e', 'svi_v4_prefix={}'.format(
+            svi_prefix), '-e', 'svi_subnet_len={}'.format(args.svi_subnet_len),
+            '-e', 'svi_v4_network={}'.format(args.svi_v4_network)]
+    if args.svi_v6_network:
+        command += ['-e', 'svi_v6_network={}'.format(args.svi_v6_network)]
+    if args.mtu:
+        command += ['-e', 'svi_mtu={}'.format(args.mtu)]
+    if args.svi_descr:
+        command += ['-e', 'svi_descr='.format(args.svi_descr)]
+    if use_hsrp:
+        command += ['-e', 'use_hsrp={}'.format(use_hsrp)]
+    if passive_interface:
+        command += ['-e', 'passive_interface={}'.format(passive_interface)]
+    if svi_v6_link_local:
+        command += ['-e', 'svi_v6_link_local={}'.format(svi_v6_link_local)]
+    if args.interfaces:
+        command += ['-e', '{{"iflist": [{}]}}'.format(args.interfaces)]
+    if args.site:
+        command += ['--limit', args.site]
+    p = subprocess.Popen(command, stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT)
+    for c in iter(lambda: p.stdout.read(1), ''):
+        sys.stdout.write(c)
+        sys.stdout.flush()
+
+
+if __name__ == '__main__':
+    main()

+ 11 - 0
automation/cleu-ansible-n9k/assets/banner.txt

@@ -0,0 +1,11 @@
+CISCO
+
+Learning[at]Cisco
+Technical Implementation & Support (TIS)
+tis_support[at]cisco.com  Duty #: 408.424.6000
+
+UNAUTHORIZED ACCESS TO THIS NETWORK DEVICE IS PROHIBITED.
+
+You must have explicit permission to access or configure this device.
+All activities performed on this device are logged and violations of this policy
+can result in disciplinary/legal action.

+ 8 - 0
automation/cleu-ansible-n9k/configure-switchport-playbook.yml

@@ -0,0 +1,8 @@
+---
+- name: Configure switchport
+  hosts: Core
+  gather_facts: false
+  connection: network_cli
+  roles:
+      - switchport
+      - write-mem

+ 196 - 0
automation/cleu-ansible-n9k/configure_switchport.py

@@ -0,0 +1,196 @@
+#!/usr/bin/env python2
+
+import argparse
+import sys
+import re
+import subprocess
+import os
+import csv
+import json
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description='Configure a switch port')
+    parser.add_argument('--switch', '-s', metavar='<SWITCH NAME>',
+                        help='Name of the switch to configure', required=True)
+    parser.add_argument('--interface', '-i', action='append', metavar='<INTF>',
+                        help='Name of interface to configure (can be specified multiple times)')
+    parser.add_argument('--descr', '-d', metavar='<INTF_DESCR>',
+                        help='Interface description')
+    parser.add_argument('--mode', '-m', metavar='<trunk|access>',
+                        help='Switchport mode to configure (access or trunk)')
+    parser.add_argument('--mtu', metavar='<MTU>',
+                        help='MTU for switchport', type=int)
+    parser.add_argument('--port-channel', metavar='<PC NUM>',
+                        help='Port-channel number (also used as for vPC)', type=int)
+    parser.add_argument(
+        '--no-vpc', help='Whether or not to put port-channel in a vPC (default: yes)', action='store_true')
+    parser.add_argument('--access-vlan', '-a', metavar='<ACCESS_VLAN_NUM>',
+                        help='Access VLAN number (when mode=access)')
+    parser.add_argument('--trunk-allowed-vlans', metavar='<TRUNK_VLANS>',
+                        help='List of VLANs allowed on the trunk (when mode=trunk)')
+    parser.add_argument('--pc-descr', metavar='<PORT_CHANNEL_DESCR>',
+                        help='Description for the port-channel interface (default is to use the interface description)')
+    parser.add_argument('--username', '-u', metavar='<USERNAME>',
+                        help='Username to use to connect to the N9Ks', required=True)
+    parser.add_argument('--input', metavar='<input TSV file>',
+                        help='Path to the input TSV file')
+    args = parser.parse_args()
+
+    n9k_switchports = []
+
+    if args.input:
+        with open(args.input, 'rb') as tsvin:
+            tsvin = csv.reader(tsvin, delimiter='\t')
+
+            for row in tsvin:
+                if len(row) >= 4:
+                    row[3] = re.sub(r'\s', '', row[3])
+                    n9k_switchport = {
+                        'name': row[1].capitalize().strip(),
+                        'descr': row[0].strip(),
+                        'mode': row[2].strip()
+                    }
+
+                    m = re.match(r'Ethernet\d+/\d+(/\d+)?',
+                                 n9k_switchport['name'])
+                    if not m:
+                        print('WARNING: Invalid interface name {}'.format(
+                            n9k_switchport['name']))
+                        continue
+
+                    if row[2] == 'access':
+                        n9k_switchport['access_vlan'] = row[3]
+                    elif row[2] == 'trunk':
+                        n9k_switchport['trunk_allowed_vlans'] = row[3]
+                    else:
+                        print(
+                            'WARNING: Invalid value for mode, {}'.format(row[2]))
+                        continue
+
+                    if len(row) >= 5:
+                        if m.group(1) is None:
+                            mtu = 1500
+                            try:
+                                mtu = int(row[4])
+                            except:
+                                print('WARNING: MTU must be an integer for {}'.format(
+                                    n9k_switchport['name']))
+                                continue
+
+                            if mtu < 1500 or mtu > 9216:
+                                print('WARNING: MTU for {} must be between 1500 and 9216'.format(
+                                    n9k_switchport['name']))
+                                continue
+                            n9k_switchport['mtu'] = mtu
+
+                    if len(row) >= 6:
+                        pcn = None
+                        try:
+                            pcn = int(row[5])
+                        except:
+                            print(
+                                'WARNING: Port-channel must be an integer for {}'.format(n9k_switchport['name']))
+                            continue
+
+                        if pcn < 1 or pcn > 4096:
+                            print(
+                                'WARNING: Port-channel number for {} must be between 1 and 4096'.format(n9k_switchport['name']))
+                            continue
+
+                        n9k_switchport['port_channel'] = pcn
+
+                    if len(row) >= 7:
+                        if re.match(r'[tT]rue', row[6]):
+                            n9k_switchport['vpc'] = True
+
+                    if len(row) >= 8:
+                        n9k_switchport['pc_descr'] = row[7]
+
+                    n9k_switchports.append(n9k_switchport)
+    else:
+        if not args.mode or (args.mode != 'trunk' and args.mode != 'access'):
+            print('ERROR: Mode must be one of "trunk" or "access"')
+            sys.exit(1)
+
+        if not args.interface or len(args.interface) == 0:
+            print('ERROR: At least one interface must be specified')
+            sys.exit(1)
+
+        if args.mode != 'access' and args.access_vlan:
+            print('ERROR: Access VLAN must only be specified when mode is access')
+            sys.exit(1)
+
+        if args.mode != 'trunk' and args.trunk_allowed_vlans:
+            print('ERROR: Trunk allowed VLANs must only be specified when mode is trunk')
+            sys.exit(1)
+
+        if args.mode == 'access' and not args.access_vlan:
+            print('ERROR: You must specify an access VLAN when mode is access')
+            sys.exit(1)
+
+        if args.mode == 'trunk' and not args.trunk_allowed_vlans:
+            args.trunk_allowed_vlans = '1-4094'
+
+        if args.port_channel and (args.port_channel < 1 or args.port_channel > 4096):
+            print('ERROR: Port-channel number must be between 1 and 4096')
+            sys.exit(1)
+
+        for intf in args.interface:
+            m = re.match(r'[eE]thernet\d+/\d+(/\d+)?', intf)
+            if not m:
+                print(
+                    'WARNING: The interface {} is not in the format "Ethernet[FEX/]MOD/PORT (e.g., Ethernet101/1/2)"'.format(intf))
+                continue
+
+            n9k_switchport = {
+                'name': intf.capitalize(),
+                'mode': args.mode,
+            }
+
+            if args.descr:
+                n9k_switchport['descr'] = args.descr
+
+            if args.mode == 'access':
+                n9k_switchport['access_vlan'] = args.access_vlan
+            else:
+                n9k_switchport['trunk_allowed_vlans'] = args.trunk_allowed_vlans
+
+            if m.group(1) is None:
+                if args.mtu:
+                    if args.mtu < 1500 or args.mtu > 9216:
+                        print('WARNING: MTU must be between 1500 and 9216')
+                        continue
+
+                    n9k_switchport['mtu'] = args.mtu
+
+            if args.port_channel:
+                n9k_switchport['port_channel'] = args.port_channel
+                if not args.no_vpc:
+                    n9k_switchport['vpc'] = True
+                if args.pc_descr:
+                    n9k_switchport['pc_descr'] = args.pc_descr
+
+            n9k_switchports.append(n9k_switchport)
+
+    os.environ['ANSIBLE_FORCE_COLOR'] = 'True'
+    os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
+    os.environ['ANSIBLE_PERSISTENT_COMMAND_TIMEOUT'] = '300'
+
+    command = ['ansible-playbook', '-i', 'inventory/hosts', '--limit', '{}'.format(args.switch),
+               '-u', args.username, '-k', '-e',
+               '{{"n9k_switchports": {}}}'.format(
+        json.dumps(n9k_switchports)),
+        '-e', 'ansible_python_interpreter={}'.format(sys.executable),
+        'configure-switchport-playbook.yml']
+
+    p = subprocess.Popen(command, stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT)
+    for c in iter(lambda: p.stdout.read(1), ''):
+        sys.stdout.write(c)
+        sys.stdout.flush()
+
+
+if __name__ == '__main__':
+    main()

+ 13 - 0
automation/cleu-ansible-n9k/group_vars/DC1.yml

@@ -0,0 +1,13 @@
+---
+# This file contains all DC1 site-specific parameters
+#
+
+# This should reflect the name of the file.
+n9k_site: DC1
+
+# Site-specific SNMP location.
+snmp_location: "002"
+
+# Site-specific management prefix.
+mgmt_prefix: "172.27"
+mgmt_network: "172.27.0.0/16"

+ 13 - 0
automation/cleu-ansible-n9k/group_vars/DC2.yml

@@ -0,0 +1,13 @@
+---
+# This file contains all DC2 site-specific parameters
+#
+
+# This should reflect the name of the file.
+n9k_site: DC2
+
+# Site-specific SNMP location.
+snmp_location: "057"
+
+# Site-specific management prefix.
+mgmt_prefix: "172.17"
+mgmt_network: "172.17.0.0/16"

+ 12 - 0
automation/cleu-ansible-n9k/group_vars/all.yml

@@ -0,0 +1,12 @@
+---
+# This file holds variables relevant to all sites and devices.
+#
+
+# This should always be "nxos".
+ansible_network_os: nxos
+
+# Core variables
+core_hsrp_vip_v4_suffix: "254"
+core_hsrp_vip_v6_suffix: "fe"
+core_hsrp_v4_track: "3"
+core_hsrp_v6_track: "5"

+ 26 - 0
automation/cleu-ansible-n9k/inventory/hosts

@@ -0,0 +1,26 @@
+[DC1]
+10.127.0.249 core_svi_v4_suffix="249" core_svi_v6_suffix="f9" core_hsrp_priority="105"
+10.127.0.250 core_svi_v4_suffix="250" core_svi_v6_suffix="fa" core_hsrp_priority="104"
+
+[DC2]
+10.127.0.247 core_svi_v4_suffix="247" core_svi_v6_suffix="f7" core_hsrp_priority="103"
+10.127.0.248 core_svi_v4_suffix="248" core_svi_v6_suffix="f8" core_hsrp_priority="102"
+
+[Core:children]
+DC1
+DC2
+
+[vCenter]
+10.100.253.11
+
+[DC1-MDS]
+10.127.253.11
+10.127.253.12
+
+[DC2-MDS]
+10.127.254.11
+10.127.254.12
+
+[MDS:children]
+DC1-MDS
+DC2-MDS

+ 6 - 0
automation/cleu-ansible-n9k/roles/cli/tasks/main.yml

@@ -0,0 +1,6 @@
+---
+- name: Run configuration commands
+  nxos_config:
+      lines: "{{ cli_commands }}"
+      parents: "{{ cli_parents }}"
+  tags: cli

+ 9 - 0
automation/cleu-ansible-n9k/roles/get-facts/tasks/main.yml

@@ -0,0 +1,9 @@
+- name: Gather NX-OS facts
+  nxos_facts:
+      gather_subset:
+          - interfaces
+  tags: facts
+
+      #- name: Print results
+      #  debug:
+      #    var: hostvars[inventory_hostname]

+ 4 - 0
automation/cleu-ansible-n9k/roles/get-groups/tasks/main.yml

@@ -0,0 +1,4 @@
+---
+- name: List groups
+  debug:
+      msg: "{{ hostvars[inventory_hostname] }} is part of {{ group_names }}"

+ 44 - 0
automation/cleu-ansible-n9k/roles/snmp/tasks/main.yml

@@ -0,0 +1,44 @@
+---
+- name: Add SNMP RO community
+  nxos_snmp_community:
+      community: "{{ snmp_ro_community }}"
+      acl: "{{ mgmt_acl_name }}"
+      group: network-operator
+  tags: snmp
+
+- name: Add SNMP RW community
+  nxos_snmp_community:
+      community: "{{ snmp_rw_community }}"
+      acl: "{{ mgmt_acl_name }}"
+      group: network-admin
+  tags: snmp
+
+- name: Add SNMP location
+  nxos_snmp_location:
+      location: "{{ snmp_location }}"
+  tags: snmp
+
+- name: Add SNMP contact
+  nxos_snmp_contact:
+      contact: "{{ snmp_contact }}"
+  tags: snmp
+
+- name: Add SNMP notification host
+  nxos_snmp_host:
+      community: "{{ snmp_notif_community }}"
+      snmp_host: "{{ snmp_notif_host }}"
+      udp: "{{ snmp_notif_port }}"
+      version: "{{ snmp_notif_version }}"
+      snmp_type: "{{ snmp_notif_type }}"
+  tags: snmp
+
+- name: Add SNMPv3 users
+  nxos_snmp_user:
+      authentication: "{{ item.hash }}"
+      group: "{{ item.group }}"
+      privacy: "{{ item.password }}"
+      encrypt: no
+      pwd: "{{ item.password }}"
+      user: "{{ item.username }}"
+  with_items: "{{ n9k_snmp_users }}"
+  tags: snmp

+ 110 - 0
automation/cleu-ansible-n9k/roles/switchport/tasks/main.yml

@@ -0,0 +1,110 @@
+---
+- name: Configure switchport interface
+  nxos_interface:
+      admin_state: up
+      name: "{{ item.name }}"
+      mode: layer2
+  with_items: "{{ n9k_switchports }}"
+  tags: switchport
+
+- name: Configure switchport description
+  nxos_interface:
+      name: "{{ item.name }}"
+      description: "{{ item.descr }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.descr is defined
+  tags: switchport
+
+- name: Configure switchport MTU
+  nxos_interface:
+      name: "{{ item.name }}"
+      mtu: "{{ item.mtu }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.mtu is defined
+  tags: switchport
+
+- name: Configure switchport access parameters
+  nxos_l2_interface:
+      name: "{{ item.name }}"
+      mode: access
+      access_vlan: "{{ item.access_vlan }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.mode == "access"
+  tags: switchport
+
+- name: Configure switchport trunk parameters
+  nxos_l2_interface:
+      name: "{{ item.name }}"
+      mode: trunk
+      trunk_allowed_vlans: "{{ item.trunk_allowed_vlans }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.mode == "trunk"
+  tags: switchport
+
+- name: Configure port-channel interface
+  nxos_interface:
+      name: Port-channel{{ item.port_channel }}
+      admin_state: up
+      mode: layer2
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined
+  tags: switchport
+
+- name: Configure port-channel description
+  nxos_interface:
+      name: Port-channel{{ item.port_channel }}
+      description: "{{ item.pc_descr }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.pc_descr is defined
+  tags: switchport
+
+- name: Configure port-channel description
+  nxos_interface:
+      name: Port-channel{{ item.port_channel }}
+      description: "{{ item.descr }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.descr is defined
+  tags: switchport
+
+- name: Configure port-channel MTU
+  nxos_interface:
+      name: Port-channel{{ item.port_channel }}
+      mtu: "{{ item.mtu }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.mtu is defined
+  tags: switchport
+
+- name: Configure port-channel access parameters
+  nxos_l2_interface:
+      name: Port-channel{{ item.port_channel }}
+      mode: access
+      access_vlan: "{{ item.access_vlan }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.mode == "access"
+  tags: switchport
+
+- name: Configure port-channel trunk parameters
+  nxos_l2_interface:
+      name: Port-channel{{ item.port_channel }}
+      mode: trunk
+      trunk_allowed_vlans: "{{ item.trunk_allowed_vlans }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.mode == "trunk"
+  tags: switchport
+
+- name: Configure port-channel link aggregation
+  nxos_config:
+      lines:
+          - channel-group {{ item.port_channel }} mode active
+      parents: interface {{ item.name }}
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined
+  tags: switchport
+
+- name: Set vPC on port-channel interface
+  nxos_vpc_interface:
+      portchannel: "{{ item.port_channel }}"
+      vpc: "{{ item.port_channel }}"
+  with_items: "{{ n9k_switchports }}"
+  when: item.port_channel is defined and item.vpc is defined
+  tags: switchport

+ 135 - 0
automation/cleu-ansible-n9k/roles/vlan/tasks/main.yml

@@ -0,0 +1,135 @@
+---
+- name: Add VLAN definition
+  nxos_vlan:
+      admin_state: up
+      name: "{{ vlan_name }}"
+      vlan_id: "{{ vlan_id }}"
+  tags: vlan
+
+- name: Associate interfaces to VLAN
+  nxos_config:
+      lines:
+          - switchport trunk allowed vlan add {{ vlan_id }}
+      parents: interface {{ item }}
+  with_items: "{{ iflist }}"
+  when: iflist is defined
+
+- name: Add SVI definition
+  nxos_interface:
+      admin_state: up
+      name: Vlan{{ vlan_id }}
+      mode: layer3
+      mtu: "{{ svi_mtu }}"
+      description: "{{ svi_descr }}"
+  when: svi_v4_prefix is defined or svi_v6_network is defined or svi_v6_link_local is defined
+  tags: vlan
+
+- name: Add SVI v4 L3 parameters
+  nxos_l3_interface:
+      name: Vlan{{ vlan_id }}
+      ipv4: "{{ svi_v4_prefix }}.{{ core_svi_v4_suffix }}/{{ svi_subnet_len }}"
+  when: svi_v4_prefix is defined
+  tags: vlan
+
+- name: Add SVI v6 L3 parameters
+  nxos_l3_interface:
+      name: Vlan{{ vlan_id }}
+      ipv6: "{{ svi_v6_network }}{{ core_svi_v6_suffix }}/64"
+  when: svi_v6_network is defined
+  tags: vlan
+
+- name: Add SVI v6 L3 parameters
+  nxos_config:
+      lines:
+          - ipv6 address use-link-local-only
+      parents: interface Vlan{{ vlan_id }}
+  when: svi_v6_link_local is defined
+  tags: vlan
+
+- name: Add SVI OSPFv2 parameters
+  nxos_interface_ospf:
+      area: 0.0.0.0
+      ospf: 1
+      interface: Vlan{{ vlan_id }}
+  when: svi_v4_prefix is defined
+  tags: vlan
+
+- name: Add additional SVI OSPFv2 parameters
+  nxos_config:
+      lines:
+          - ip ospf network {{ ospf_type }}
+      parents: interface Vlan{{ vlan_id }}
+  when: svi_v4_prefix is defined
+  tags: vlan
+
+- name: Disable SVI OSPFv2 passive interface
+  nxos_config:
+      lines:
+          - no ip ospf passive-interface
+      parents: interface Vlan{{ vlan_id }}
+  when: svi_v4_prefix is defined and not passive_interface is defined
+  tags: vlan
+
+- name: Add SVI OSPFv3 parameters
+  nxos_config:
+      lines:
+          - ipv6 router ospfv3 1 area 0.0.0.0
+          - ospfv3 network {{ ospf_type }}
+      parents: interface Vlan{{ vlan_id }}
+  when: svi_v6_network is defined or svi_v6_link_local is defined
+  tags: vlan
+
+- name: Disable SVI OSPFv3 passive interface
+  nxos_config:
+      lines:
+          - no ospfv3 passive-interface
+      parents: interface Vlan{{ vlan_id }}
+  when: (svi_v6_network is defined or svi_v6_link_local is defined) and not passive_interface is defined
+  tags: vlan
+
+- name: Add addition SVI parameters
+  nxos_config:
+      lines:
+          - no ip redirects
+          - no ipv6 redirects
+      parents: interface Vlan{{ vlan_id }}
+  when: svi_v4_prefix is defined or svi_v6_network is defined
+  tags: vlan
+
+- name: Enable HSRP
+  nxos_config:
+      lines:
+          - hsrp version 2
+      parents: interface Vlan{{ vlan_id }}
+  when: (svi_v4_prefix is defined or svi_v6_network is defined) and use_hsrp is defined
+  tags: vlan
+
+- name: Add HSRP v4 configuration
+  nxos_config:
+      lines:
+          - authentication md5 key-chain HSRP_KEY
+          - preempt
+          - priority {{ core_hsrp_priority }}
+          - timers  1  3
+          - ip {{ svi_v4_prefix }}.{{ core_hsrp_vip_v4_suffix }}
+          - track {{ core_hsrp_v4_track }} decrement 20
+      parents:
+          - interface Vlan{{ vlan_id }}
+          - hsrp 1
+  when: svi_v4_prefix is defined and use_hsrp is defined
+  tags: vlan
+
+- name: Add HSRP v6 configuration
+  nxos_config:
+      lines:
+          - authentication md5 key-chain HSRP_KEY
+          - preempt
+          - priority {{ core_hsrp_priority }}
+          - timers  1  3
+          - ip {{ svi_v6_network }}{{ core_hsrp_vip_v6_suffix }}
+          - track {{ core_hsrp_v6_track }} decrement 20
+      parents:
+          - interface Vlan{{ vlan_id }}
+          - hsrp 2 ipv6
+  when: svi_v6_network is defined and use_hsrp is defined
+  tags: vlan

+ 23 - 0
automation/cleu-ansible-n9k/roles/vm/tasks/main.yml

@@ -0,0 +1,23 @@
+---
+- name: Add virtual machine
+  vmware_guest:
+      hostname: "{{ inventory_hostname }}"
+      cluster: "{{ vmware_cluster }}"
+      guest_id: "{{ guest_id }}"
+      name: "{{ guest_name }}"
+      datacenter: "{{ vmware_datacenter }}"
+      folder: /{{ vmware_datacenter }}/vm/
+      cdrom:
+          type: client
+      disk:
+          - size_gb: "{{ guest_size }}"
+            type: thin
+            datastore: "{{ guest_datastore }}"
+      hardware:
+          memory_mb: "{{ guest_mem }}"
+          num_cpus: "{{ guest_cpu }}"
+          scsi: "{{ guest_scsi }}"
+      networks:
+          - name: "{{ guest_network }}"
+      validate_certs : no
+  delegate_to: localhost

+ 5 - 0
automation/cleu-ansible-n9k/roles/write-mem/tasks/main.yml

@@ -0,0 +1,5 @@
+---
+- name: Save running-config
+  nxos_config:
+      save_when: modified
+  tags: write-mem

+ 10 - 0
automation/cleu-ansible-n9k/run-cli-playbook.yml

@@ -0,0 +1,10 @@
+---
+- name: Configure switchport
+  hosts:
+      - Core
+      - MDS
+  gather_facts: false
+  connection: network_cli
+  roles:
+      - cli
+      - write-mem

+ 51 - 0
automation/cleu-ansible-n9k/run_cli.py

@@ -0,0 +1,51 @@
+#!/usr/bin/env python2
+
+import argparse
+import sys
+import re
+import subprocess
+import os
+import csv
+import json
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description='Configure a switch port')
+    parser.add_argument('--switch', '-s', metavar='<SWITCH NAME(s)>',
+                        help='Switch name or names (comma-separated) on which to run commands (defaults to all) ')
+    parser.add_argument('--commands', '-c', metavar='<COMMAND(s)>', help='Pipe-separated list of commands to run', required=True)
+    parser.add_argument('--parents', '-p', metavar='<PARENT(s)>', help='Pipe-separated list of parents for all commands')
+    parser.add_argument('--username', '-u', metavar='<USERNAME>',
+                        help='Username to use to connect to the N9Ks', required=True)
+    args = parser.parse_args()
+
+    clist = args.commands.split('|')
+    plist = []
+
+    if args.parents:
+        plist = args.parents.split('|')
+
+    os.environ['ANSIBLE_FORCE_COLOR'] = 'True'
+    os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
+    os.environ['ANSIBLE_PERSISTENT_COMMAND_TIMEOUT'] = '300'
+
+    command = ['ansible-playbook', '-i', 'inventory/hosts',
+               '-u', args.username, '-k', '-e',
+               '{{"cli_commands": {}}}'.format(
+        json.dumps(clist)), '-e', '{{"cli_parents": {}}}'.format(json.dumps(plist)),
+        '-e', 'ansible_python_interpreter={}'.format(sys.executable),
+        'run-cli-playbook.yml']
+
+    if args.switch:
+        command += ['--limit', '{}'.format(args.switch)]
+
+    p = subprocess.Popen(command, stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT)
+    for c in iter(lambda: p.stdout.read(1), ''):
+        sys.stdout.write(c)
+        sys.stdout.flush()
+
+
+if __name__ == '__main__':
+    main()

+ 1 - 0
automation/cmx/cmx-map/.gitignore

@@ -0,0 +1 @@
+venv

+ 283 - 0
automation/cmx/cmx-map/cmx.py

@@ -0,0 +1,283 @@
+#
+# Copyright (c) 2017-2018  Lionel Hercot <lhercot@cisco.com>
+# All rights reserved.
+#
+import requests
+import sys
+import json
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+from flask import Flask
+from flask import abort
+from flask_restful import Api
+from flask_restful import Resource
+from flask_restful import reqparse
+from flask import send_file
+from pathlib import Path
+from io import StringIO
+from io import BytesIO
+from ipaddress import IPv6Address
+import os
+import traceback
+
+
+from PIL import Image, ImageDraw
+
+
+app = Flask(__name__)
+api = Api(app)
+# Disable SSL warnings
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+@app.after_request
+def after_request(response):
+    response.headers.add('Access-Control-Allow-Origin', '*')
+    response.headers.add('Access-Control-Allow-Headers',
+                         'Content-Type,Authorization')
+    response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
+    return response
+
+
+cmxBaseUrl = 'http://10.100.253.139'
+cmxAuth = ('admin', 'B4rc4123!')
+
+imgDir = 'maps/'
+markerDir = 'markers/'
+markerFiles = os.listdir(markerDir)
+markers = {}
+for filename in markerFiles:
+    name = filename.split('.')[0]
+    markers[name] = Image.open(markerDir + filename).convert("RGBA")
+    markers[name].thumbnail((100, 100), Image.ANTIALIAS)
+    # markerW, markerH = marker.size
+
+apiUri = {
+    'mac': '/api/location/v1/clients?macAddress=',
+    'ip': '/api/location/v2/clients?ipAddress=',
+    'map': '/api/config/v1/maps/imagesource/',
+    'ssid': '/api/location/v2/clients/?include=metadata&pageSize=1000&page=',
+    'count': '/api/location/v2/clients/count',
+    'floors': '/api/config/v1/maps',
+    'tag': '/api/location/v1/tags/'
+}
+
+
+def serve_pil_image(pil_img):
+    img_io = BytesIO()
+    pil_img.save(img_io, 'JPEG', quality=100)
+    img_io.seek(0)
+    return send_file(img_io, mimetype='image/jpeg')
+
+
+def getMap(imageName):
+    imgFile = Path(imgDir + imageName)
+    if not imgFile.is_file():
+        respImg = requests.get(cmxBaseUrl + apiUri['map'] + imageName,
+                               auth=cmxAuth, verify=False, stream=True)
+        if respImg.status_code == 200:
+            with open(str(imgFile), 'wb') as f:
+                for chunk in respImg:
+                    f.write(chunk)
+
+
+def getAllFloorMaps():
+    response = requests.get(cmxBaseUrl + apiUri['floors'],
+                            auth=cmxAuth, verify=False)
+    floorList = {}
+    if response and response != '':
+        try:
+            dataDict = json.loads(response.text)
+            if 'campuses' in dataDict:
+                for campus in dataDict['campuses']:
+                    if'buildingList' in campus:
+                        for building in campus['buildingList']:
+                            for floor in building['floorList']:
+                                floorId = floor['aesUid']
+                                imageName = floor['image']['imageName']
+                                floorList[floorId] = imageName
+                                getMap(imageName)
+        except:
+            print ('Unexpected error' + str(sys.exc_info()[0]),
+            file=sys.stderr)
+            raise
+
+    return floorList
+
+class CMX(Resource):
+    def get(self):
+        parser = reqparse.RequestParser()
+        parser.add_argument('ip', help='IP address of the endpoint')
+        parser.add_argument('ipv6', help='IPv6 address of the endpoint')
+        parser.add_argument('mac', help='MAC address of the endpoint')
+        parser.add_argument('marker', help='Marker used to display the location of the endpoint', default='marker')
+        parser.add_argument('size', help='Size of the image returned')
+        parser.add_argument('tag', help='Asset tag MAC address')
+
+        args = parser.parse_args()
+        response = ''
+        if args.get('ip'):
+            clientIp = args.get('ip')
+            response = requests.get(cmxBaseUrl + apiUri['ip'] + clientIp,
+                                    auth=cmxAuth, verify=False)
+        elif args.get('tag'):
+            clientMac = args.get('tag')
+            response = requests.get(cmxBaseUrl + apiUri['tag'] + clientMac,
+                                    auth=cmxAuth, verify=False)
+        elif args.get('mac'):
+            clientMac = args.get('mac')
+            response = requests.get(cmxBaseUrl + apiUri['mac'] + clientMac,
+                                    auth=cmxAuth, verify=False)
+        elif args.get('ipv6'):
+            clientIp = IPv6Address(args.get('ipv6')).exploded
+            response = requests.get(cmxBaseUrl + apiUri['ip'] + clientIp,
+                                    auth=cmxAuth, verify=False)
+
+        markerName = args.get('marker')
+        marker = markers['marker']
+        if markerName in markers:
+            marker = markers[markerName]
+
+        markerW, markerH = marker.size
+
+        if response and response != '':
+            try:
+                dataDict = json.loads(response.text)
+                result = None
+                if args.get('tag') and dataDict and 'mapInfo' in dataDict:
+                    result = dataDict
+                elif len(dataDict) > 0 and 'mapInfo' in dataDict[0]:
+                    result = dataDict[0]
+
+                if result is not None:
+                    imageName = result['mapInfo']['image']['imageName']
+                    mapLength = result['mapInfo']['floorDimension']['length']
+                    mapWidth = result['mapInfo']['floorDimension']['width']
+                    imageLength = result['mapInfo']['image']['height']
+                    imageWidth = result['mapInfo']['image']['width']
+                    coordX = result['mapCoordinate']['x']
+                    coordY = result['mapCoordinate']['y']
+                    positionX = (imageWidth / mapWidth)*coordX
+                    positionY = (imageLength / mapLength)*coordY
+                    getMap(imageName)
+                    im = Image.open(str(imgDir + imageName))
+                    positionX = positionX - markerW/2
+                    positionY = positionY - markerH
+                    offset = (int(positionX), int(positionY))
+                    im.paste(marker, offset, marker)
+                    if args.get('size'):
+                        # print('SIZE', file=sys.stderr)
+                        size = args.get('size')
+                        im.thumbnail((int(size), int(size)), Image.ANTIALIAS)
+
+                    return serve_pil_image(im)
+                else:
+                    abort(404, 'Requested element not found')
+            except Exception as inst:
+                print ('Unexpected error with request= {} | error : {}'.format(response.text, inst), file=sys.stderr)
+                return {'response': str(response.text), 'error': str(inst)}
+
+        return abort(404, 'Missing parameter ip, ipv6 or mac. Other possible parameters are: marker (' + ', '.join(markers.keys()) + ')')
+
+class CMX_SSID(Resource):
+    def get(self):
+        parser = reqparse.RequestParser()
+        parser.add_argument('ssid', help='SSID used by the clients')
+        parser.add_argument('floor', help='Floor used by the clients')
+        parser.add_argument('marker', help='Marker used to display the location of the endpoint', default='marker')
+
+        args = parser.parse_args()
+        response = ''
+        if args.get('ssid'):
+            ssid = args.get('ssid')
+            countResp = requests.get(cmxBaseUrl + apiUri['count'],
+                                     auth=cmxAuth, verify=False)
+            try:
+                dataDict = json.loads(countResp.text)
+                if 'count' in dataDict:
+                    count = dataDict['count']
+                    maxPageId = (count // 1000) + 1
+                    print ('Count: {} MaxPage: {}'.format(count, maxPageId),
+                           file=sys.stderr)
+                    userList = {}
+                    floorList = getAllFloorMaps()
+                    for pageId in range(1, maxPageId):
+                        print ('Page: {} MaxPage: {}'.format(pageId, maxPageId),
+                               file=sys.stderr)
+                        response = requests.get(cmxBaseUrl + apiUri['ssid']
+                                                + str(pageId), auth=cmxAuth,
+                                                verify=False)
+                        if response and response.text != '':
+                            try:
+                                userDict = json.loads(response.text)
+                                for user in userDict:
+                                    if user['ssId'] == ssid:
+                                        floorName = user['mapInfo']['floorRefId']
+                                        if floorName in userList:
+                                            userList[floorName].append(user)
+                                        else:
+                                            userList[floorName] = [user]
+                            except:
+                                print ('Unexpected error with page request= '
+                                       + response.text + ' | error : '
+                                       + str(sys.exc_info()[0]),
+                                       file=sys.stderr)
+                                return {'response': str(response.text), 'error': str(inst)}
+
+                    if args.get('floor'):
+                        floor = args.get('floor')
+                        if floor in userList:
+                            markerName = args.get('marker')
+                            marker = ''
+                            if markerName in markers:
+                                marker = markers[markerName]
+                            else:
+                                marker = markers['marker']
+
+                            markerW, markerH = marker.size
+                            imageName = floorList[floorName]
+                            getMap()
+                            im = Image.open(str(imgDir + imageName))
+                            for data in userList[floor]:
+                                mapInfo = data['mapInfo']
+                                mapLength = mapInfo['floorDimension']['length']
+                                mapWidth = mapInfo['floorDimension']['width']
+                                imageLength = mapInfo['image']['height']
+                                imageWidth = mapInfo['image']['width']
+                                coordX = data['mapCoordinate']['x']
+                                coordY = data['mapCoordinate']['y']
+                                positionX = (imageWidth / mapWidth)*coordX
+                                positionY = (imageLength / mapLength)*coordY
+
+                                positionX = positionX - markerW/2
+                                positionY = positionY - markerH
+                                offset = (int(positionX), int(positionY))
+                                im.paste(marker, offset, marker)
+
+                            return serve_pil_image(im)
+                        elif floor in floorList:
+                            imageName = floorList[floor]
+                            getMap(imageName)
+                            im = Image.open(str(imgDir + imageName))
+                            return serve_pil_image(im)
+                        else:
+                            abort(404)
+                    else:
+                        return list(floorList.keys())
+            except Exception as inst:
+                print ('Unexpected error with request= {} | error : {}'.format(countResp, inst), file=sys.stderr)
+                return  {'response': str(countResp), 'error': str(inst)}
+
+class sync(Resource):
+    def get(self):
+        return getAllFloorMaps()
+
+class home(Resource):
+    def get(self):
+        return {}
+
+api.add_resource(home, '/')
+api.add_resource(CMX, '/api/v0.1/cmx')
+api.add_resource(CMX_SSID, '/api/v0.1/ssid')
+api.add_resource(sync, '/api/v0.1/sync')
+
+if __name__ == '__main__':
+    app.run(host='10.100.253.13', debug=True, port=8002, threaded=True)

+ 16 - 0
automation/cmx/cmx-map/requirements.txt

@@ -0,0 +1,16 @@
+aniso8601==2.0.0
+certifi==2018.1.18
+chardet==3.0.4
+click==6.7
+Flask==0.12.2
+Flask-RESTful==0.3.6
+idna==2.6
+itsdangerous==0.24
+Jinja2==2.10
+MarkupSafe==1.0
+Pillow==5.0.0
+pytz==2017.3
+requests==2.18.4
+six==1.11.0
+urllib3==1.22
+Werkzeug==0.14.1

+ 240 - 0
automation/dc/NXOSVlans.py

@@ -0,0 +1,240 @@
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from ncclient import manager
+import json
+import xmltodict
+import xml.dom.minidom
+import logging
+import os
+import pprint
+
+# logging.basicConfig(level=logging.DEBUG)
+
+
+class NXOSVlans():
+
+    vlan_get = '''
+<show xmlns="http://www.cisco.com/nxos:1.0:vlan_mgr_cli">
+<vlan>
+<id>
+<vlan-id>{}</vlan-id>
+</id>
+</vlan>
+</show>
+    '''
+
+    vlan_add = '''
+<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
+<configure xmlns="http://www.cisco.com/nxos:1.0:vlan_mgr_cli">
+<__XML__MODE__exec_configure>
+<vlan>
+<vlan-id-create-delete>
+  <__XML__PARAM_value>{}</__XML__PARAM_value>
+  <__XML__MODE_vlan>
+    <name>
+      <vlan-name>{}</vlan-name>
+    </name>
+    <state>
+      <vstate>active</vstate>
+    </state>
+    <no>
+      <shutdown/>
+    </no>
+  </__XML__MODE_vlan>
+</vlan-id-create-delete>
+</vlan>
+</__XML__MODE__exec_configure>
+</configure>
+</config>
+    '''
+
+    vlan_delete = '''
+<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
+  <configure xmlns="http://www.cisco.com/nxos:1.0:vlan_mgr_cli">
+    <__XML__MODE__exec_configure>
+      <no>
+        <vlan>
+          <vlan-id-create-delete>{}</vlan-id-create-delete>
+        </vlan>
+      </no>
+    </__XML__MODE__exec_configure>
+  </configure>
+</config>
+    '''
+
+    vlan_port_add = '''
+<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
+  <configure>
+    <__XML__MODE__exec_configure>
+      <interface>
+        <{}>
+          <interface>{}</interface>
+          <__XML__MODE_if-eth-{}-switch>
+            <switchport>
+              <trunk>
+                <allowed>
+                  <vlan>
+                    <add>
+                      <add-vlans>{}</add-vlans>
+                    </add>
+                  </vlan>
+                </allowed>
+              </trunk>
+            </switchport>
+          </__XML__MODE_if-eth-{}-switch>
+        </{}>
+      </interface>
+    </__XML__MODE__exec_configure>
+  </configure>
+</config>
+    '''
+
+    vlan_port_delete = '''
+<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
+  <configure>
+    <__XML__MODE__exec_configure>
+      <interface>
+        <{}>
+          <interface>{}</interface>
+          <__XML__MODE_if-eth-{}-switch>
+            <switchport>
+              <trunk>
+                <allowed>
+                  <vlan>
+                    <removed>
+                      <remove-vlans>{}</remove-vlans>
+                    </remove>
+                  </vlan>
+                </allowed>
+              </trunk>
+            </switchport>
+          </__XML__MODE_if-eth-{}-switch>
+        </{}>
+      </interface>
+    </__XML__MODE__exec_configure>
+  </configure>
+</config>
+    '''
+
+    def deploy_l2_vlan(self):
+        with manager.connect_ssh(host=self.device, port=22, username=self.username, hostkey_verify=False, password=os.environ['NXOS_ADMIN_PW'], device_params={'name': 'nexus'}) as m:
+
+            # See if the VLAN currently exists.
+            try:
+                res = m.get(('subtree', self.vlan_get.format(self.vid)))
+                resd = xmltodict.parse(res.data_xml)
+                if '__XML__OPT_Cmd_show_vlan_id___readonly__' in resd['data']['show']['vlan']['id']['vlan-id']:
+                    print('Error: VLAN {} already exists on {}'.format(
+                        self.vid, self.device))
+                    return False
+            except Exception as e:
+                print('Error getting VLAN {} from device {}: {}'.format(
+                    self.vid, self.device, e))
+                return False
+
+            # Create L2 VLAN.
+            try:
+                res = m.edit_config(
+                    target='running', config=self.vlan_add.format(self.vid, self.vname))
+            except Exception as e:
+                print('Error adding VLAN {} to device {}: {}'.format(
+                    self.vid, self.device, e))
+                return False
+
+            # Add L2 VLAN to trunk ports
+            if self.trunks:
+                good_config = False
+                for trunk in self.trunks:
+                    rem = re.match(
+                        r'(ethernet|port-channel)(\d+)', trunk, re.I)
+                    if not rem:
+                        print(
+                            'Error: trunk port {} is not a valid port name'.format(trunk))
+                        continue
+                    pname = rem.group(1).lower()
+                    try:
+                        m.edit_config(target='running', config=self.vlan_port_add.format(
+                            pname, rem.group(2), pname, self.vid, pname, pname))
+                        good_config = True
+                    except Exception as e:
+                        print('Error adding VLAN {} to port {}: {}'.format(
+                            self.vid, trunk, e))
+                        continue
+
+                if not good_config:
+                    print('Error: Failed to add VLAN {} to any trunk ports on device {}'.format(
+                        self.vid, self.device))
+                    return False
+
+        return True
+
+    def delete_l2_vlan(self):
+        with manager.connect_ssh(host=self.device, port=22, username=self.username, hostkey_verify=False, password=os.environ['NXOS_ADMIN_PW'], device_params={'name': 'nexus'}) as m:
+            try:
+                m.edit_config(target='running',
+                              config=self.vlan_delete.format(self.vid))
+            except Exception as e:
+                print('Error deleteing VLAN {} from device {}: {}'.format(
+                    self.vid, self.device, e))
+                return False
+
+        return True
+
+    # XXX: This config is very specific to Cisco Live Europe
+    def deploy_svi(self):
+        with manager.connect_ssh(host=self.device, port=22, username=self.username, hostkey_verify=False, password=os.environ['NXOS_ADMIN_PW'], device_params={'name': 'nexus'}) as m:
+            cmds = ['config t', 'no int vlan{}'.format(self.vid), 'int vlan{}'.format(self.vid), 'description {}'.format(
+                self.description), 'no shutdown', 'no ip redirects', 'ip address {}'.format(self.ipv4), 'ip ospf network point-to-point', 'ip router ospf 1 area 0.0.0.0']
+            if self.ipv6:
+                cmds += ['ipv6 address {}'.format(
+                    self.ipv6), 'no ipv6 redirects', 'ipv6 router ospfv3 1 area 0.0.0.0']
+            if self.hsrpv4:
+                cmds += ['no ip arp gratuitous hsrp duplicate', 'hsrp version 2', 'hsrp 1', 'authentication md5 key-chain HSRP_KEY', 'preempt',
+                         'priority {}'.format(self.hsrp_priority), 'timers 1 3', 'ip {}'.format(self.hsrpv4), 'track 3 decrement 20']
+            if self.hsrpv6:
+                cmds += ['hsrp 2 ipv6', 'authentication md5 key-chain HSRP_KEY', 'preempt', 'priority {}'.format(
+                    self.hsrp_priority), 'timers 1 3', 'ip {}'.format(self.hsrpv6), 'track 5 decrement 20']
+
+            # print(pprint.pprint(cmds))
+
+            try:
+                m.exec_command(cmds)
+            except Exception as e:
+                print('Error adding SVI for VLAN {} to device {}: {}'.format(
+                    self.vid, self.device, e))
+                return False
+
+        return True
+
+    def write_config(self):
+        with manager.connect_ssh(host=self.device, port=22, username=self.username, hostkey_verify=False, password=os.environ['NXOS_ADMIN_PW'], device_params={'name': 'nexus'}) as m:
+            try:
+                m.exec_command(['copy running startup'])
+            except Exception as e:
+                print('Error copying running config to startup on {}: {}'.format(
+                    self.device, e))
+                return False
+        return True

+ 118 - 0
automation/dc/UCSVlans.py

@@ -0,0 +1,118 @@
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from ucsmsdk.ucshandle import UcsHandle
+from ucsmsdk.mometa.fabric.FabricVlan import FabricVlan
+from ucsmsdk.mometa.vnic.VnicEtherIf import VnicEtherIf
+import os
+import pprint
+
+
+class UCSVlans():
+
+    _handle = None
+
+    def _login(self):
+        if self._handle is not None:
+            return self._handle
+
+        handle = UcsHandle(self.device, self.username,
+                           os.environ['NXOS_ADMIN_PW'])
+
+        handle.login()
+        self._handle = handle
+
+        return self._handle
+
+    def deploy_fabric_vlan(self):
+        try:
+            handle = self._login()
+
+            v = FabricVlan(parent_mo_or_dn='fabric/lan',
+                           name=self.vname, id=str(self.vid))
+            handle.add_mo(v)
+            handle.commit()
+        except Exception as e:
+            print('Error adding VLAN {} to fabric on {}: {}'.format(
+                self.vid, self.device, e))
+            return False
+
+        return True
+
+    def delete_fabric_vlan(self):
+        try:
+            handle = self._login()
+            filter_str = '(id, "{}")'.format(self.vid)
+            v = handle.query_classid(
+                class_id='FabricVlan', filter_str=filter_str)
+            if len(v) != 1:
+                raise Exception(
+                    'Got {} elements with VLAN ID {}'.format(len(v), self.vid))
+            handle.remove_mo(v[0])
+            handle.commit()
+        except Exception as e:
+            print('Error deleting VLAN {} on {}: {}'.format(
+                self.vid, self.device, e))
+            return False
+
+        return True
+
+    def deploy_lan_policy(self):
+        try:
+            handle = self._login()
+
+            mos = []
+
+            for vnic in (self.vnic_a, self.vnic_b):
+                try:
+                    v = VnicEtherIf(
+                        parent_mo_or_dn='org-root/lan-conn-pol-{}/ether-{}'.format(self.policy, vnic), name=self.vname)
+                    handle.add_mo(v)
+                    handle.commit()
+                    mos.append(v)
+                except Exception as e:
+                    print('Error adding VLAN {} to LAN connectivity policy {}/{} on {}: {}'.format(
+                        self.vname, self.policy, vnic, self.device, e))
+                    if len(mos) > 0:
+                        try:
+                            handle.delete_mo(v)
+                            handle.commit()
+                        except Exception as ie:
+                            print('Error removing VLAN {} from LAN connectivity policy {} on {}: {}'.format(
+                                self.vname, self.policy, self.device, ie))
+                    return False
+        except Exception as le:
+            print('Error logging into {}: {}'.format(self.device, le))
+            return False
+
+        return True
+
+    def logout(self):
+        if self._handle is None:
+            return
+        try:
+            self._handle.logout()
+        except:
+            pass

+ 276 - 0
automation/dc/create_vlan.sh

@@ -0,0 +1,276 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+function usage() {
+  echo "$0: [-d] -v <VLAN_ID> -n <VLAN_NAME> [-t <TRUNK_PORT1[,TRUNK_PORT2[,...]]] [-s [-D <SVI_DESCRIPTION>] -4 <SVI_IPV4_3_OCTETS> -m <SVI_IPV4_CIDR> [-6 <SVI_IPV6_8_WORDS> -M <SVI_IPV6_LEN>] [-r <HSRP_IPV4_VIRTUAL_IP] [-R <HSRP_IPV6_VIRTUAL_IP]]"
+  exit 1
+}
+
+. ./dc.cfg
+
+export PERL_LWP_SSL_VERIFY_HOSTNAME=0
+
+delete_vlan=0
+vid=-1
+vname=""
+svi=0
+svi_descr=""
+ipv4=""
+cidr=""
+ipv6=""
+plen=""
+hsrpv4=""
+hsrpv6=""
+trunks=""
+
+while getopts ":v:n:s4:6:m:M:dD:r:R:t:" opt; do
+  case $opt in
+    d)
+      delete_vlan=1
+    ;;
+    v)
+      vid=$OPTARG
+    ;;
+    n)
+      vname=$OPTARG
+    ;;
+    s)
+      svi=1
+    ;;
+    D)
+      svi_descr=$OPTARG
+    ;;
+    4)
+      ipv4=$OPTARG
+    ;;
+    m)
+      cidr=$OPTARG
+    ;;
+    6)
+      ipv6=$OPTARG
+    ;;
+    M)
+      plen=$OPTARG
+    ;;
+    r)
+      hsrpv4=$OPTARG
+    ;;
+    R)
+      hsrpv6=$OPTARG
+    ;;
+    t)
+      trunks=$OPTARG
+    ;;
+    :)
+      echo "Option -${OPTARG} requires an argument"
+      usage
+    ;;
+    \?)
+      echo "Invalid option, -${OPTARG}"
+      usage
+    ;;
+  esac
+done
+
+if [ ${vid} = "-1" ]; then
+  echo "Error: VLAN ID is required"
+  usage
+fi
+
+if [ -z "${vname}" ]; then
+  echo "Error: VLAN name is required"
+  usage
+fi
+
+if [ ${svi} -eq 1 -a ${delete_vlan} -eq 0 ]; then
+  if [ -z "${ipv4}" ]; then
+    echo "Error: SVI IPv4 address is required"
+    usage
+  fi
+  if [ -z "${cidr}" ]; then
+    echo "Error: SVI IPv4 CIDR bits are required"
+    usage
+  fi
+  if [ -n "${ipv6}" -a -z "${plen}" ]; then
+    echo "Error: IPv6 prefix length is required with IPv6 address"
+    usage
+  fi
+  if [ -n "${hsrpv6}" -a -z "${ipv6}" ]; then
+    echo "Error: IPv6 address is required if an HSRP IPv6 address is provided"
+    usage
+  fi
+fi
+
+if [ ${delete_vlan} = 1 ]; then
+  echo -n "Are you sure you want to delete VLAN ${vid} (${vname}): [y/N]? "
+  read resp
+  if echo ${resp} | grep -qvE '^[Yy]'; then
+    exit 0
+  fi
+fi
+
+if [ -z "${VI_USERNAME}" ]; then
+  VI_USERNAME=${ADMIN_USERNAME}
+fi
+export VI_USERNAME
+
+if [ -z "${ADMIN_PASSWORD}" ]; then
+  echo "Error: Environment variable ADMIN_PASSWORD must be set to the password for ${ADMIN_USERNAME}"
+  exit 1
+fi
+
+if [ -z "${NXOS_ADMIN_PW}" ]; then
+  NXOS_ADMIN_PW=${ADMIN_PASSWORD}
+fi
+export NXOS_ADMIN_PW
+
+if [ -z "${UCS_ADMIN_PW}" ]; then
+  UCS_ADMIN_PW=${ADMIN_PASSWORD}
+fi
+export UCS_ADMIN_PW
+
+for sw in ${SWITCHES}; do
+  old_IFS=${IFS}
+  IFS=","
+  sw_parts=(${sw})
+  hn=${sw_parts[0]}
+  pri=${sw_parts[1]}
+  v4=${sw_parts[2]}
+  v6=${sw_parts[3]}
+
+  #echo "${hn} : ${pri} : ${v4} : ${v6}"
+  IFS=${old_IFS}
+
+  if [ ${delete_vlan} -eq 1 ]; then
+    echo -n "Deleting VLAN ${vid} from switch ${hn}..."
+    nxos_add_delete_vlan.py -D -v ${vid} -d ${hn} -u ${ADMIN_USERNAME}
+    if [ $? = 0 ]; then
+      echo "DONE."
+    else
+      echo "ERROR."
+    fi
+  else
+    args="-v ${vid} -n ${vname} -d ${hn} -u ${ADMIN_USERNAME}"
+    if [ -n "${trunks}" ]; then
+      old_IFS=${IFS}
+      IFS=","
+      args="${args} -t"
+      for trunk in ${trunks}; do
+        args="${args} ${trunk}"
+      done
+      IFS=${old_IFS}
+    fi
+    if [ ${svi} -eq 1 ]; then
+      args="${args} -s -4 ${ipv4}.${v4}/${cidr}"
+      if [ -n "${svi_descr}" ]; then
+        args="${args} -e '${svi_descr}'"
+      fi
+      if [ -n "${ipv6}" ]; then
+        args="${args} -6 ${ipv6}::${v6}/${plen}"
+      fi
+      if [ -n "${hsrpv4}" ]; then
+        args="${args} -p ${pri} -r ${hsrpv4}"
+      fi
+      if [ -n "${hsrpv6}" ]; then
+        args="${args} -R ${hsrpv6}"
+      fi
+    fi
+    echo -n "Adding VLAN ${vid} to switch ${hn}..."
+    nxos_add_delete_vlan.py ${args}
+    if [ $? = 0 ]; then
+      echo "DONE."
+    else
+      echo "ERROR."
+    fi
+  fi
+done
+
+for ucs in ${UCSES}; do
+  old_IFS=${IFS}
+  IFS=","
+  ucs_parts=(${ucs})
+  hn=${ucs_parts[0]}
+  vnica=${ucs_parts[1]}
+  vnicb=${ucs_parts[2]}
+  policy=${ucs_parts[3]}
+
+  #echo "${hn} : ${vnica} : ${vnicb} : ${policy}"
+  IFS=${old_IFS}
+
+  if [ ${delete_vlan} = 1 ]; then
+    echo -n "Deleting VLAN ${vid} from UCS ${hn}..."
+    ucs_add_delete_vlan.py -D -v ${vid} -d ${hn} -u ${ADMIN_USERNAME}
+    if [ $? = 0 ]; then
+      echo "DONE."
+    else
+      echo "ERROR."
+    fi
+  else
+    args="-v ${vid} -n ${vname} -d ${hn} -u ${ADMIN_USERNAME} -p ${policy} -a ${vnica} -b ${vnicb}"
+    echo -n "Adding VLAN ${vid} to UCS ${hn}..."
+    ucs_add_delete_vlan.py ${args}
+    if [ $? = 0 ]; then
+      echo "DONE."
+    else
+      echo "ERROR."
+    fi
+  fi
+done
+
+for host in ${VMHOSTS}; do
+  old_IFS=${IFS}
+  IFS=","
+  host_parts=(${host})
+  hn=${host_parts[0]}
+  vsw=${host_parts[1]}
+
+  #echo "${hn} : ${vsw}"
+  IFS=${old_IFS}
+
+  if [ ${delete_vlan} = 1 ]; then
+    echo -n "Deleting VLAN ${vid} from VM host ${hn}..."
+    vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -D ${vname} ${vsw}
+    if [ $? = 0 ]; then
+      echo "DONE."
+    else
+      echo "ERROR."
+    fi
+  else
+    echo -n "Adding VLAN ${vid} to VM host ${hn}..."
+    vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -A ${vname} ${vsw}
+    if [ $? = 0 ]; then
+      vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -v ${vid} -p ${vname} ${vsw}
+      if [ $? = 0 ]; then
+        echo "DONE."
+      else
+        echo "ERROR."
+      fi
+    else
+      echo "ERROR."
+    fi
+  fi
+done

+ 30 - 0
automation/dc/dc.cfg

@@ -0,0 +1,30 @@
+ADMIN_USERNAME="jclarke"
+VCENTER="10.100.253.11"
+
+# SWITCHES: hostname,HSRP Priority,Last IPv4 Octet, Last IPv6 word
+SWITCHES="ccb-dc-ethsw-1,105,249,f9
+	ccb-dc-ethsw-2,104,250,fa \
+	034-dc-ethsw-1,103,247,f7 \
+	034-dc-ethsw-2,102,248,f8"
+
+# UCSES: hostname,vNIC-A Name,vNIC-B Name,LAN Connectivity Policy Name
+UCSES="ccb-dc-comp-chassis,vNIC-A,vNIC-B,CLEU-LAN-Policy \
+       034-dc-comp-chassis,vNIC-A,vNIC-B,CLEU-LAN-Policy"
+
+# VMHOSTS: hostname,vSwitch Name
+VMHOSTS="034-dc-hv-1,vSwitch0 \
+         034-dc-hv-2,vSwitch0 \
+         034-dc-hv-3,vSwitch0 \
+         034-dc-hv-4,vSwitch0 \
+         034-dc-hv-5,vSwitch0 \
+         034-dc-hv-6,vSwitch0 \
+         034-dc-hv-7,vSwitch0 \
+         034-dc-hv-8,vSwitch0 \
+         ccb-dc-hv-1,vSwitch0 \
+         ccb-dc-hv-2,vSwitch0 \
+         ccb-dc-hv-3,vSwitch0 \
+         ccb-dc-hv-4,vSwitch0 \
+         ccb-dc-hv-5,vSwitch0 \
+         ccb-dc-hv-6,vSwitch0 \
+         ccb-dc-hv-7,vSwitch0 \
+         ccb-dc-hv-8,vSwitch0"

+ 71 - 0
automation/dc/misc/config_iscsi.exp

@@ -0,0 +1,71 @@
+#!/usr/local/bin/expect
+
+
+if { ! [info exists env(ESXI_ROOT_PW)] } {
+    puts "ERROR: Please set the ESXI_ROOT_PW environment variable first!"
+    exit 1
+}
+if { ! [info exists env(VI_USERNAME)] } {
+    puts "ERROR: Please set the VI_USERNAME environment variable first!"
+    exit 1
+}
+if { ! [info exists env(VI_PASSWORD)] } {
+    puts "ERROR: Please set the VI_PASSWORD environment variable first!"
+    exit 1
+}
+if { ! [info exists env(VI_SERVER)] } {
+    puts "ERROR: Please set the VI_SERVER environment variable first!"
+    exit 1
+}
+set pw $env(ESXI_ROOT_PW)
+
+set hosts [list \
+   "dc1-hv-1.ciscolive.network" \
+   "dc1-hv-2.ciscolive.network" \
+   "dc1-hv-3.ciscolive.network" \
+   "dc1-hv-4.ciscolive.network" \
+   "dc1-hv-5.ciscolive.network" \
+   "dc1-hv-6.ciscolive.network" \
+   "dc1-hv-7.ciscolive.network" \
+   "dc1-hv-8.ciscolive.network" \
+   "dc2-hv-1.ciscolive.network" \
+   "dc2-hv-2.ciscolive.network" \
+   "dc2-hv-3.ciscolive.network" \
+   "dc2-hv-4.ciscolive.network" \
+   "dc2-hv-5.ciscolive.network" \
+   "dc2-hv-6.ciscolive.network" \
+   "dc2-hv-7.ciscolive.network" \
+   "dc2-hv-8.ciscolive.network"]
+
+#set hosts [list "dc1-hv-5.ciscolive.network"]
+
+set vmks [list "vmk1" "vmk4"]
+array set target_arr [list "dc1" [list "10.118.253.20:3260" "10.119.253.20:3260" "10.118.253.21:3260" "10.119.253.21:3260"] "dc2" [list "10.118.253.22:3260" "10.119.253.22:3260" "10.118.253.23:3260" "10.119.253.23:3260"]]
+
+foreach host $hosts {
+    if { [catch {exec /home/jclarke/iscsiMultiPath.pl $host} result] } {
+	puts "ERROR: Failed to get iSCSI HBA for $host: $result"
+	continue
+    }
+
+    set hba $result
+
+    eval spawn ssh -o StrictHostKeyChecking=no root@$host
+    interact -o -nobuffer -re "assword:" return
+    send "$pw\r"
+    interact -o -nobuffer -re "root@.*\]" return
+    foreach vmk $vmks {
+        send "esxcli iscsi networkportal add --nic $vmk --adapter $hba\r"
+        expect -re "root@.*\]"
+    }
+    if { [regexp {^(dc\d)-} $host -> dc] } {
+	set targets $target_arr($dc)
+        foreach target $targets {
+	    send "vmkiscsi-tool -D -a $target $hba\r"
+	    expect -re "root@.*\]"
+        }
+    }
+    send "esxcli storage core adapter rescan --adapter $hba\r"
+    expect -re "root@.*\]"
+    send "exit\r"
+}

+ 68 - 0
automation/dc/misc/iscsiMultiPath.pl

@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use VMware::VILib;
+use VMware::VIRuntime;
+use Data::Dumper;
+
+# validate options, and connect to the server
+Opts::parse();
+Opts::validate();
+Util::connect();
+
+my $hname = undef;
+
+if (scalar(@ARGV) == 1) {
+        $hname = $ARGV[0];
+}
+
+my @iscsiHosts = ();
+
+if ($hname) {
+        my $vmhost = Vim::find_entity_view(
+                view_type => 'HostSystem',
+                filter    => {name => $hname}
+        );
+        if (!$vmhost) {
+                print "Failed to find host $hname\n";
+                exit(1);
+        }
+
+        push @iscsiHosts, $vmhost;
+} else {
+        my $vmhosts = Vim::find_entity_views(view_type => 'HostSystem',);
+
+        foreach (@$vmhosts) {
+                push @iscsiHosts, $_;
+        }
+}
+
+my $error = 0;
+
+foreach my $host (@iscsiHosts) {
+        my $ss = Vim::get_view(mo_ref => $host->configManager->storageSystem,);
+
+        my $hbas = $ss->storageDeviceInfo->hostBusAdapter;
+        my $hba  = undef;
+
+        foreach my $h (@$hbas) {
+                if ($h->isa('HostInternetScsiHba')) {
+                        $hba = $h;
+                        print $hba->device, "\n";
+                        last;
+                }
+        }
+
+        if (!$hba) {
+                print "Did not find HBA for $host->{'name'}\n";
+		$error = 1;
+                next;
+        }
+}
+
+Util::disconnect();
+
+if ($error) {
+	exit(1);
+}

+ 22 - 0
automation/dc/misc/reset_coredump_warning.sh

@@ -0,0 +1,22 @@
+#!/bin/sh
+
+export VI_SERVER="cl-vcenter.ciscolive.network"
+
+if [ -z "${VI_USERNAME}" -o -z "${VI_PASSWORD}" ]; then
+    echo "You must set the VI_USERNAME and VI_PASSWORD environment variables first."
+    exit 1
+fi
+
+hosts=$(/home/jclarke/getHosts.pl)
+
+for h in ${hosts}; do
+    vicfg-advcfg -h ${h} --set 0 UserVars.SuppressCoredumpWarning >/dev/null
+    if [ $? != 0 ]; then
+	echo "Failed to unset suppression warning for ${h}!"
+	continue
+    fi
+    vicfg-advcfg -h ${h} --set 1 UserVars.SuppressCoredumpWarning > /dev/null
+    if [ $? != 0 ]; then
+	echo "Failed to set suppression warning for ${h}!"
+    fi
+done

+ 36 - 0
automation/dc/misc/restart_hostd.exp

@@ -0,0 +1,36 @@
+#!/usr/local/bin/expect
+
+
+if { ! [info exists env(ESXI_ROOT_PW)] } {
+    puts "ERROR: Please set the ESXI_ROOT_PW environment variable first!"
+    exit 1
+}
+set pw $env(ESXI_ROOT_PW)
+
+set hosts [list \
+   "dc1-hv-1.ciscolive.network" \
+   "dc1-hv-2.ciscolive.network" \
+   "dc1-hv-3.ciscolive.network" \
+   "dc1-hv-4.ciscolive.network" \
+   "dc1-hv-5.ciscolive.network" \
+   "dc1-hv-6.ciscolive.network" \
+   "dc1-hv-7.ciscolive.network" \
+   "dc1-hv-8.ciscolive.network" \
+   "dc2-hv-1.ciscolive.network" \
+   "dc2-hv-2.ciscolive.network" \
+   "dc2-hv-3.ciscolive.network" \
+   "dc2-hv-4.ciscolive.network" \
+   "dc2-hv-5.ciscolive.network" \
+   "dc2-hv-6.ciscolive.network" \
+   "dc2-hv-7.ciscolive.network" \
+   "dc2-hv-8.ciscolive.network"]
+
+foreach host $hosts {
+    eval spawn ssh -o StrictHostKeyChecking=no root@$host
+    interact -o -nobuffer -re "assword:" return
+    send "$pw\r"
+    interact -o -nobuffer -re "\]" return
+    send "/etc/init.d/hostd restart\r"
+    expect -re "\]"
+    send "exit\r"
+}

+ 121 - 0
automation/dc/nxos_add_delete_vlan.py

@@ -0,0 +1,121 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import time
+import os
+import pprint
+import argparse
+import sys
+import re
+from NXOSVlans import NXOSVlans
+
+if __name__ == '__main__':
+    nav = NXOSVlans()
+
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description='Add or delete a VLAN to an NX-OS switch')
+    parser.add_argument('--device', '-d', dest='device', metavar='<HOSTNAME|IP>',
+                        help='NX-OS device to which to add VLAN', required=True)
+    parser.add_argument('--vlan', '-v', dest='vid',
+                        metavar='<VLAN_ID>', help='VLAN ID', type=int, required=True)
+    parser.add_argument('--name', '-n', dest='vname',
+                        metavar='<VLAN_NAME>', help='VLAN Name')
+    parser.add_argument('--username', '-u', dest='username',
+                        metavar='<USERNAME>', help='Device username', required=True)
+    parser.add_argument('--trunks', '-t', dest='trunks', metavar='<TRUNK_PORT1 TRUNK_PORT2 ...>',
+                        nargs='+', help='List of trunk ports to which VLAN will be added')
+    parser.add_argument('--svi', '-i', dest='svi',
+                        action='store_true', help='Create an SVI for this VLAN?')
+    parser.add_argument('--description', '-e', dest='description',
+                        metavar='<DESCRIPTION>', help='SVI description')
+    parser.add_argument('--ip', '-4', dest='ipv4', metavar='<IP_ADDRESS/CIDR>',
+                        help='SVI IPv4 address and subnet bits')
+    parser.add_argument('--ip6', '-6', dest='ipv6', metavar='<IPV6_ADDRESS/LENGTH>',
+                        help='SVI IPv6 address and prefix length')
+    parser.add_argument('--hsrp', '-r', dest='hsrpv4',
+                        metavar='<HSRP_IPV4_ADDRESS>', help='SVI HSRP virtual IPv4 address')
+    parser.add_argument('--hsrpv6', '-R', dest='hsrpv6',
+                        metavar='<HSRP_IPV6_ADDRESS>', help='SVI HSRP virtual IPv6 address')
+    parser.add_argument('--priority', '-p', dest='hsrp_priority',
+                        metavar='<PRIORITY>', type=int, help='SVI HSRP priority')
+    parser.add_argument('--delete', '-D', action='store_true',
+                        dest='delete', help='Delete the specified VLAN')
+    parser.set_defaults(svi=False, delete=False)
+    parser.parse_args(namespace=nav)
+    if not nav.delete and not nav.vname:
+        parser.error('VLAN name must be specified')
+    if not nav.delete and nav.svi and not nav.ipv4:
+        parser.error('IPv4 address must be specified for the SVI')
+    if not nav.delete and nav.svi and not nav.description:
+        nav.description = '-> {}'.format(nav.name)
+    if not nav.delete and nav.svi and nav.hsrpv6 and not nav.ipv6:
+        parser.error('IPv6 address must be specified if HSRPv6 is used')
+    if not nav.delete and not nav.svi and (nav.ipv4 or nav.ipv6 or nav.hsrpv4 or nav.hsrpv6):
+        parser.error(
+            'IP and HSRP addresses can only be specified if --svi is given')
+    if not nav.delete and nav.ipv4 and not re.match(r'[\d\.]+/\d+', nav.ipv4):
+        parser.error(
+            'Invalid IPv4 address; must be in the format of ADDRESS/CIDR')
+    if not nav.delete and nav.ipv6 and not re.match(r'[a-fA-F0-9:]+/\d+', nav.ipv6):
+        parser.error(
+            'Invalid IPv6 address; must be in the format of ADDRESS/LENGTH')
+    if not nav.delete and nav.hsrpv4 and not re.match(r'[\d\.]+', nav.hsrpv4):
+        parser.error('Invalid HSRPv4 address')
+    if not nav.delete and nav.hsrpv6 and not re.match(r'[a-fA-F0-9:]+', nav.hsrpv6):
+        parser.error('Invalid HSRPv6 address')
+    if not nav.delete and (nav.hsrpv4 or nav.hsrpv6) and not nav.hsrp_priority:
+        parser.error('SVI HSRP priority must be specified')
+
+    if 'NXOS_ADMIN_PW' not in os.environ:
+        print('The environment variable "NXOS_ADMIN_PW" must be set with the password for {}'.format(
+            nav.username))
+        sys.exit(1)
+
+    if nav.delete:
+        res = nav.delete_l2_vlan()
+        if not res:
+            print('Error deleting VLAN {} from {}'.format(nav.vid, nav.device))
+            sys.exit(1)
+    else:
+
+        res = nav.deploy_l2_vlan()
+        if not res:
+            print('Error deploying VLAN {} to {}; removing VLAN'.format(
+                nav.vid, nav.device))
+            nav.delete_l2_vlan()
+            sys.exit(1)
+
+        if nav.svi:
+            res = nav.deploy_svi()
+            if res:
+                nav.write_config()
+            else:
+                print('Error deploying SVI for VLAN {} to {}; removing L2 VLAN'.format(
+                    nav.vid, nav.device))
+                nav.delete_l2_vlan()
+                sys.exit(1)

+ 91 - 0
automation/dc/ucs_add_delete_vlan.py

@@ -0,0 +1,91 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import argparse
+import os
+import sys
+from UCSVlans import UCSVlans
+
+if __name__ == '__main__':
+    uv = UCSVlans()
+
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description='Add a new VLAN to a UCS fabric')
+    parser.add_argument('--device', '-d', dest='device', metavar='<HOSTNAME|IP>',
+                        help='UCS chassis to which to add VLAN', required=True)
+    parser.add_argument('--vlan', '-v', dest='vid',
+                        metavar='<VLAN_ID>', help='VLAN ID', type=int, required=True)
+    parser.add_argument('--name', '-n', dest='vname',
+                        metavar='<VLAN_NAME>', help='VLAN Name')
+    parser.add_argument('--username', '-u', dest='username',
+                        metavar='<USERNAME>', help='Device username', required=True)
+    parser.add_argument('--policy', '-p', dest='policy', metavar='<POLICY>',
+                        help='Name of LAN Connectivity Policy')
+    parser.add_argument('--vnic-a', '-a', dest='vnic_a', metavar='<VNIC_A_NAME>',
+                        help='Name of vNIC in LAN connectivity policy for Fabric-A')
+    parser.add_argument('--vnic-b', '-b', dest='vnic_b', metavar='<VNIC_B_NAME>',
+                        help='Name of vNIC in LAN connectivity policy for Fabric-B')
+    parser.add_argument('--delete', '-D', dest='delete',
+                        action='store_true', help='Delete the specified VLAN')
+    parser.set_defaults(delete=False)
+    parser.parse_args(namespace=uv)
+
+    if 'UCS_ADMIN_PW' not in os.environ:
+        print('The environment variable "UCS_ADMIN_PW" must be set with the password for {}'.format(
+            uv.username))
+        sys.exit(1)
+
+    if not uv.delete and not uv.vname:
+        parser.error('VLAN name must be specified')
+    if not uv.delete and not uv.policy:
+        parser.error('LAN connectivity policy name must be specified')
+    if not uv.delete and not uv.vnic_a:
+        parser.error('vNIC name for Fabric-A must be specified')
+    if not uv.delete and not uv.vnic_b:
+        parser.error('vNIC name for Fabric-B muct be specified')
+
+    if uv.delete:
+        res = uv.delete_fabric_vlan()
+        if not res:
+            print('Error deleting VLAN {} from {}'.format(uv.vid, uv.device))
+            uv.logout()
+            sys.exit(1)
+    else:
+        res = uv.deploy_fabric_vlan()
+        if not res:
+            uv.logout()
+            sys.exit(1)
+
+        res = uv.deploy_lan_policy()
+        if not res:
+            print('Error deploying LAN Policy changes to {}; removing VLAN from fabric'.format(
+                uv.device))
+            uv.delete_fabric_vlan()
+            uv.logout()
+            sys.exit(1)
+
+    uv.logout()

+ 47 - 0
automation/dc/vmware_alarm_to_spark.py

@@ -0,0 +1,47 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import sys
+import sparker
+
+TEXT = '**{}** > _{}_ : {}'
+
+TEAM_NAME = 'CL18-Infra_team'
+ROOM_NAME = 'Data Center Alarms'
+
+if __name__ == '__main__':
+
+    if len(sys.argv) != 4:
+        sys.stderr.write(
+            'usage: {} ALARM_NAME ALARM_TARGET ALARM_DESCRIPTION\n'.format(sys.argv[0]))
+        sys.exit(1)
+
+    spark = sparker.Sparker()
+
+    message = TEXT.format(sys.argv[1], sys.argv[2], sys.argv[3])
+
+    spark.post_to_spark(TEAM_NAME, ROOM_NAME, message)

+ 2158 - 0
automation/monitoring/grafana/arp_mac.json

@@ -0,0 +1,2158 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": 5,
+  "links": [],
+  "refresh": "1m",
+  "rows": [
+    {
+      "collapse": false,
+      "height": 296,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 3,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "arpEntries{idf=\"CORE1-L3C\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-L3C",
+              "refId": "A"
+            },
+            {
+              "expr": "arpEntries{idf=\"CORE2-L3C\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-L3C",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Core ARP Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 8,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "ndEntries{idf=\"CORE1-L3C\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-L3C",
+              "refId": "A"
+            },
+            {
+              "expr": "ndEntries{idf=\"CORE2-L3C\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-L3C",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Core ND Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 10,
+          "legend": {
+            "avg": false,
+            "current": true,
+            "max": true,
+            "min": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "qfpUtil{idf=\"CORE1-EDGE\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-EDGE QFP Utilization",
+              "refId": "A"
+            },
+            {
+              "expr": "qfpUtil{idf=\"CORE2-EDGE\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-EDGE QFP Utilization",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Edge QFP Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "percent",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 11,
+          "legend": {
+            "avg": false,
+            "current": true,
+            "max": true,
+            "min": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "natTranslations{idf=\"CORE1-EDGE\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-EDGE NAT Translations",
+              "refId": "A"
+            },
+            {
+              "expr": "natTranslations{idf=\"CORE2-EDGE\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-EDGE NAT Tranlsations",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Edge NAT Translations",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 5,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "totalMacs{idf=\"CORE1-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-WA",
+              "refId": "A"
+            },
+            {
+              "expr": "totalMacs{idf=\"CORE2-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-WA",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "WA MAC Counts",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 6,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "arpEntries{idf=\"CORE1-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-WA",
+              "refId": "A"
+            },
+            {
+              "expr": "arpEntries{idf=\"CORE2-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-WA",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "WA ARP Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 7,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "ndEntries{idf=\"CORE1-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-WA",
+              "refId": "A"
+            },
+            {
+              "expr": "ndEntries{idf=\"CORE2-WA\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE2-WA",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "WA ND Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": "250px",
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "decimals": null,
+          "fill": 1,
+          "id": 1,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "totalMacs{idf=\"10.127.0.2\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TLA-X02",
+              "refId": "2"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.1\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.1",
+              "refId": "1"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.3\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X03",
+              "refId": "3"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.4\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X04",
+              "refId": "4"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.5\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X05",
+              "refId": "5"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.6\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X06",
+              "refId": "6"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.7\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X07",
+              "refId": "7"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.8\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X08",
+              "refId": "8"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.9\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X09",
+              "refId": "9"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.10\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X10",
+              "refId": "10"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.11\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X11",
+              "refId": "11"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.12\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X12",
+              "refId": "12"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.13\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X13",
+              "refId": "13"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.14\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X14",
+              "refId": "14"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.15\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X15",
+              "refId": "15"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.16\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X16",
+              "refId": "16"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.17\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X17",
+              "refId": "17"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.18\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X18",
+              "refId": "18"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.19\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X19",
+              "refId": "19"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.20\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X20",
+              "refId": "20"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.21\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X21",
+              "refId": "21"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.22\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X22",
+              "refId": "22"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.23\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X23",
+              "refId": "23"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.24\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X24",
+              "refId": "24"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.25\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X25",
+              "refId": "25"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.26\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X26",
+              "refId": "26"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.27\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X27",
+              "refId": "27"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.28\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X28",
+              "refId": "28"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.29\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X29",
+              "refId": "29"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.30\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.30",
+              "refId": "30"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.31\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X31",
+              "refId": "31"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.32\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X32",
+              "refId": "32"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.33\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X33",
+              "refId": "33"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.34\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X34",
+              "refId": "34"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.35\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X35",
+              "refId": "35"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.36\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X36",
+              "refId": "36"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.37\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X37",
+              "refId": "37"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.38\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X38",
+              "refId": "38"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.39\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X39",
+              "refId": "39"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.40\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X40",
+              "refId": "40"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.41\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X41",
+              "refId": "41"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.42\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X42",
+              "refId": "42"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.43\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X43",
+              "refId": "43"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.44\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X44",
+              "refId": "44"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.45\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X45",
+              "refId": "45"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.46\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X46",
+              "refId": "46"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.47\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X47",
+              "refId": "47"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.48\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X48",
+              "refId": "48"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.49\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X49",
+              "refId": "49"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.50\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X50",
+              "refId": "50"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.51\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X51",
+              "refId": "51"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.52\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X52",
+              "refId": "52"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.53\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X53",
+              "refId": "53"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.54\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.54",
+              "refId": "54"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.55\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.55",
+              "refId": "55"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.56\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.56",
+              "refId": "56"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.57\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X57",
+              "refId": "57"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.58\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.58",
+              "refId": "58"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.59\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.59",
+              "refId": "59"
+            },
+            {
+              "expr": "totalMacs{idf=\"10.127.0.60\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.60",
+              "refId": "60"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "IDF MAC Counts",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "decimals": null,
+              "format": "none",
+              "label": "Number of MACs",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 2,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "arpEntries{idf=\"10.127.0.1\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.1",
+              "refId": "1"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.2\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TLA-X02",
+              "refId": "2"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.3\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X03",
+              "refId": "3"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.4\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X04",
+              "refId": "4"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.5\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X05",
+              "refId": "5"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.6\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X06",
+              "refId": "6"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.7\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X07",
+              "refId": "7"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.8\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X08",
+              "refId": "8"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.9\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X09",
+              "refId": "9"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.10\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X10",
+              "refId": "10"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.11\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X11",
+              "refId": "11"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.12\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X12",
+              "refId": "12"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.13\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X13",
+              "refId": "13"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.14\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X14",
+              "refId": "14"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.15\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X15",
+              "refId": "15"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.16\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X16",
+              "refId": "16"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.17\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X17",
+              "refId": "17"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.18\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X18",
+              "refId": "18"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.19\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X19",
+              "refId": "19"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.20\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X20",
+              "refId": "20"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.21\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X21",
+              "refId": "21"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.22\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X22",
+              "refId": "22"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.23\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X23",
+              "refId": "23"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.24\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X24",
+              "refId": "24"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.25\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X25",
+              "refId": "25"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.26\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X26",
+              "refId": "26"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.27\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X27",
+              "refId": "27"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.28\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X28",
+              "refId": "28"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.29\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X29",
+              "refId": "29"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.30\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.30",
+              "refId": "30"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.31\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X31",
+              "refId": "31"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.32\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X32",
+              "refId": "32"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.33\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X33",
+              "refId": "33"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.34\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X34",
+              "refId": "34"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.35\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X35",
+              "refId": "35"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.36\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X36",
+              "refId": "36"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.37\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X37",
+              "refId": "37"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.38\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X38",
+              "refId": "38"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.39\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X39",
+              "refId": "39"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.40\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X40",
+              "refId": "40"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.41\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X41",
+              "refId": "41"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.42\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X42",
+              "refId": "42"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.43\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X43",
+              "refId": "43"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.44\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X44",
+              "refId": "44"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.45\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X45",
+              "refId": "45"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.46\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X46",
+              "refId": "46"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.47\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X47",
+              "refId": "47"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.48\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X48",
+              "refId": "48"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.49\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X49",
+              "refId": "49"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.50\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X50",
+              "refId": "50"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.51\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X51",
+              "refId": "51"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.52\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X52",
+              "refId": "52"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.53\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X53",
+              "refId": "53"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.54\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.54",
+              "refId": "54"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.55\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.55",
+              "refId": "55"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.56\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.56",
+              "refId": "56"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.57\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X57",
+              "refId": "57"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.58\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.58",
+              "refId": "58"
+            },
+            {
+              "expr": "arpEntries{idf=\"10.127.0.59\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.59",
+              "refId": "59"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-L3C",
+              "refId": "A"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "IDF ARP Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 9,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "ndEntries{idf=\"10.127.0.1\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.1",
+              "refId": "1"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.2\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TLA-X02",
+              "refId": "2"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.3\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X03",
+              "refId": "3"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.4\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X04",
+              "refId": "4"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.5\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-X05",
+              "refId": "5"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.6\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X06",
+              "refId": "6"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.7\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X07",
+              "refId": "7"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.8\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X08",
+              "refId": "8"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.9\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X09",
+              "refId": "9"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.10\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X10",
+              "refId": "10"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.11\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X11",
+              "refId": "11"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.12\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X12",
+              "refId": "12"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.13\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X13",
+              "refId": "13"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.14\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-X14",
+              "refId": "14"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.15\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X15",
+              "refId": "15"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.16\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X16",
+              "refId": "16"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.17\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X17",
+              "refId": "17"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.18\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X18",
+              "refId": "18"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.19\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X19",
+              "refId": "19"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.20\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X20",
+              "refId": "20"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.21\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X21",
+              "refId": "21"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.22\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X22",
+              "refId": "22"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.23\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X23",
+              "refId": "23"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.24\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X24",
+              "refId": "24"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.25\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X25",
+              "refId": "25"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.26\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X26",
+              "refId": "26"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.27\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X27",
+              "refId": "27"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.28\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X28",
+              "refId": "28"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.29\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X29",
+              "refId": "29"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.30\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.30",
+              "refId": "30"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.31\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X31",
+              "refId": "31"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.32\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X32",
+              "refId": "32"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.33\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X33",
+              "refId": "33"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.34\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X34",
+              "refId": "34"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.35\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X35",
+              "refId": "35"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.36\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X36",
+              "refId": "36"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.37\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X37",
+              "refId": "37"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.38\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-X38",
+              "refId": "38"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.39\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X39",
+              "refId": "39"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.40\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X40",
+              "refId": "40"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.41\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X41",
+              "refId": "41"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.42\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X42",
+              "refId": "42"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.43\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X43",
+              "refId": "43"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.44\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X44",
+              "refId": "44"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.45\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X45",
+              "refId": "45"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.46\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X46",
+              "refId": "46"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.47\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X47",
+              "refId": "47"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.48\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X48",
+              "refId": "48"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.49\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X49",
+              "refId": "49"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.50\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X50",
+              "refId": "50"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.51\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X51",
+              "refId": "51"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.52\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X52",
+              "refId": "52"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.53\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-X53",
+              "refId": "53"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.54\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.54",
+              "refId": "54"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.55\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.55",
+              "refId": "55"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.56\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.56",
+              "refId": "56"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.57\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-X57",
+              "refId": "57"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.58\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.58",
+              "refId": "58"
+            },
+            {
+              "expr": "ndEntries{idf=\"10.127.0.59\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "10.127.0.59",
+              "refId": "59"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "CORE1-L3C",
+              "refId": "A"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "IDF ND Entries",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "2019-01-28T05:00:00.000Z",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "",
+  "title": "MAC, ARP, ND, NAT, QFP Counts",
+  "version": 15
+}

+ 1331 - 0
automation/monitoring/grafana/core.json

@@ -0,0 +1,1331 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": 1,
+  "links": [],
+  "refresh": false,
+  "rows": [
+    {
+      "collapse": false,
+      "height": 284,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 1,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"9\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/0_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"10\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/1_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"11\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/2_IN",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"12\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/3_IN",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"9\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/0_OUT",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"10\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/1_OUT",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"11\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/2_OUT",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"12\",instance=\"10.128.0.1\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TenGi0/1/3_OUT",
+              "refId": "H"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CORE1_EDGE_Interfaces",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 3,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"9\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/0_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"10\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/1_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"11\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/2_IN",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"12\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/3_IN",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"9\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/0_OUT",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"10\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/1_OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"11\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/2_OUT",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"12\",instance=\"10.128.0.2\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "TE0/1/3_OUT",
+              "refId": "H"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CORE2_EDGE_Interfaces",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 2,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"2\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/1_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"3\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/2_IN",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"4\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/3_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"5\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/4_IN",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"6\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/5_IN",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"7\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/6_IN",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"8\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/7_IN",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"9\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/8_IN",
+              "refId": "H"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"50\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/49_IN",
+              "refId": "I"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"51\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/50_IN",
+              "refId": "J"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"52\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/51_IN",
+              "refId": "K"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"53\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/52_IN",
+              "refId": "L"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"14\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/13_IN",
+              "refId": "M"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"15\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/14_IN",
+              "refId": "N"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"16\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/15_IN",
+              "refId": "O"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"17\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/16_IN",
+              "refId": "P"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"18\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/17_IN",
+              "refId": "Q"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"19\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/18_IN",
+              "refId": "R"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"20\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/19_IN",
+              "refId": "S"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"21\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/20_IN",
+              "refId": "T"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"2\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/1_OUT",
+              "refId": "U"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"3\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/2_OUT",
+              "refId": "V"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"4\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/3_OUT",
+              "refId": "W"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"5\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/4_OUT",
+              "refId": "X"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"6\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/5_OUT",
+              "refId": "Y"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"7\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/6_OUT",
+              "refId": "Z"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"8\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/7_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"9\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/8_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"50\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/49_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"51\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/50_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"52\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/51_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"53\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/52_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"14\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/13_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"15\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/14_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"16\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/15_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"17\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/16_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"18\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/17_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"19\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/18_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"20\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/19_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"21\",instance=\"10.127.0.252\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/20_OUT"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CORE1-L3C",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "Prometheus",
+          "fill": 1,
+          "id": 4,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"2\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/1_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"3\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/2_IN",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"4\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/3_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"5\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/4_IN",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"6\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/5_IN",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"7\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/6_IN",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"8\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/7_IN",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"9\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/8_IN",
+              "refId": "H"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"50\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/49_IN",
+              "refId": "I"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"51\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/50_IN",
+              "refId": "J"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"52\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/51_IN",
+              "refId": "K"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"53\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/52_IN",
+              "refId": "L"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"14\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/13_IN",
+              "refId": "M"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"15\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/14_IN",
+              "refId": "N"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"16\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/15_IN",
+              "refId": "O"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"17\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/16_IN",
+              "refId": "P"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"18\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/17_IN",
+              "refId": "Q"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"19\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/18_IN",
+              "refId": "R"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"20\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/19_IN",
+              "refId": "S"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"21\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/20_IN",
+              "refId": "T"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"2\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/1_OUT",
+              "refId": "U"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"3\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/2_OUT",
+              "refId": "V"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"4\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/3_OUT",
+              "refId": "W"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"5\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/4_OUT",
+              "refId": "X"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"6\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/5_OUT",
+              "refId": "Y"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"7\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/6_OUT",
+              "refId": "Z"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"8\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/7_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"9\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/8_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"50\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/49_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"51\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/50_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"52\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/51_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"53\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Hu1/0/52_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"14\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/13_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"15\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/14_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"16\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/15_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"17\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/16_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"18\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/17_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"19\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/18_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"20\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/19_OUT"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"21\",instance=\"10.127.0.253\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Twe1/0/20_OUT"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CORE2-L3C",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 5,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"67\",instance=\"10.127.0.101\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "003-Te1/1/8_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"67\",instance=\"10.127.0.103\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "003-Te1/1/8_OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"67\",instance=\"10.127.0.101\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-Te1/1/8_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"67\",instance=\"10.127.0.103\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-Te1/1/8_OUT",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.105\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-Te1/0/48_IN",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.105\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-Te1/0/48_OUT",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.107\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "006-Te1/0/48_IN",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.107\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-Te1/0/48_OUT",
+              "refId": "H"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.109\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "007-Te1/0/48_IN",
+              "refId": "I"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.109\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "007-Te1/0/48_OUT",
+              "refId": "J"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.111\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "008-Te1/0/48_IN",
+              "refId": "K"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.111\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-Te1/0/48_OUT",
+              "refId": "L"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "00x-MDF-a UPLinks to CORE1-L3C",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 6,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"67\",instance=\"10.127.0.102\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "003-Te1/1/8_IN",
+              "refId": "A"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"67\",instance=\"10.127.0.102\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "003-Te1/1/8_OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"67\",instance=\"10.127.0.104\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-Te1/1/8_IN",
+              "refId": "C"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"67\",instance=\"10.127.0.104\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "004-Te1/1/8_OUT",
+              "refId": "D"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.106\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-Te1/0/48_IN",
+              "refId": "E"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.106\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "005-Te1/0/48_OUT",
+              "refId": "F"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.108\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "006-Te1/0/48_IN",
+              "refId": "G"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.108\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "006-Te1/0/48_OUT",
+              "refId": "H"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.110\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "007-Te1/0/48_IN",
+              "refId": "I"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.110\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "007-Te1/0/48_OUT",
+              "refId": "J"
+            },
+            {
+              "expr": "delta(ifHCInOctets{ifIndex=\"49\",instance=\"10.127.0.112\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "008-Te1/0/48_IN",
+              "refId": "K"
+            },
+            {
+              "expr": "delta(ifHCOutOctets{ifIndex=\"49\",instance=\"10.127.0.10.112\",job=\"snmp\"}[5m])*8/300",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "008-Te1/0/48_OUT",
+              "refId": "L"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "00x-MDF-b UPLinks to CORE2-L3C",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-6h",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "",
+  "title": "CLEUR19_CORE-NETWORK",
+  "version": 25
+}

+ 499 - 0
automation/monitoring/grafana/dc.json

@@ -0,0 +1,499 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": 9,
+  "links": [],
+  "refresh": "1m",
+  "rows": [
+    {
+      "collapse": false,
+      "height": 235,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 1,
+          "legend": {
+            "alignAsTable": false,
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "irate(ifHCInOctets{job='snmp_ifalias',instance=~\"10.127.0.249\",ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) IN",
+              "refId": "A"
+            },
+            {
+              "expr": "irate(ifHCOutOctets{job=\"snmp_ifalias\",instance=~'10.127.0.249',ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "instant": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "C"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DC1-ETHSW-1 Interface Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 2,
+          "legend": {
+            "alignAsTable": false,
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "irate(ifHCInOctets{job='snmp_ifalias',instance=~\"10.127.0.250\",ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) IN",
+              "refId": "A"
+            },
+            {
+              "expr": "irate(ifHCOutOctets{job=\"snmp_ifalias\",instance=~'10.127.0.250',ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "instant": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "C"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DC1-ETHSW-2 Interface Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 3,
+          "legend": {
+            "alignAsTable": false,
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "irate(ifHCInOctets{job='snmp_ifalias',instance=~\"10.127.0.247\",ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) IN",
+              "refId": "A"
+            },
+            {
+              "expr": "irate(ifHCOutOctets{job=\"snmp_ifalias\",instance=~'10.127.0.247',ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "instant": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "C"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DC2-ETHSW-1 Interface Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 4,
+          "legend": {
+            "alignAsTable": false,
+            "avg": true,
+            "current": true,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "irate(ifHCInOctets{job='snmp_ifalias',instance=~\"10.127.0.248\",ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) IN",
+              "refId": "A"
+            },
+            {
+              "expr": "irate(ifHCOutOctets{job=\"snmp_ifalias\",instance=~'10.127.0.248',ifDescr=~'Ethernet.*'}[30s])",
+              "format": "time_series",
+              "instant": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{sysName}} : {{ifDescr}} ({{ifAlias}}) OUT",
+              "refId": "B"
+            },
+            {
+              "expr": "",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "C"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DC2-ETHSW-2 Interface Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": [
+      {
+        "allValue": null,
+        "current": {
+          "text": "10.127.0.248",
+          "value": [
+            "10.127.0.248"
+          ]
+        },
+        "datasource": "Prometheus",
+        "hide": 2,
+        "includeAll": false,
+        "label": null,
+        "multi": true,
+        "name": "Device",
+        "options": [],
+        "query": "query_result(sum by (instance)(ifHCInOctets{job=\"snmp_ifalias\"}))",
+        "refresh": 1,
+        "regex": ".*instance=\"(.*?)\".*",
+        "sort": 1,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allValue": null,
+        "current": {
+          "text": "All",
+          "value": "$__all"
+        },
+        "datasource": "Prometheus",
+        "hide": 2,
+        "includeAll": true,
+        "label": null,
+        "multi": false,
+        "name": "Interface",
+        "options": [],
+        "query": "query_result(ifHCInOctets{job=\"snmp_ifalias\",instance=~\"$Device\"})",
+        "refresh": 1,
+        "regex": ".*ifDescr=\"(.*?)\",.*",
+        "sort": 3,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      }
+    ]
+  },
+  "time": {
+    "from": "now-6h",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "utc",
+  "title": "New DC",
+  "version": 6
+}

+ 294 - 0
automation/monitoring/grafana/dhcp.json

@@ -0,0 +1,294 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": 8,
+  "links": [],
+  "refresh": "1m",
+  "rows": [
+    {
+      "collapse": false,
+      "height": 562,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 1,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "activeLeases{server=\"10.100.253.9\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP",
+              "refId": "A"
+            },
+            {
+              "expr": "activeLeases{server=\"10.100.253.109\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP",
+              "refId": "B"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DHCP Active Leases",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 2,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "irate(discovers{server=\"10.100.253.9\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP Discovers",
+              "refId": "C"
+            },
+            {
+              "expr": "irate(discovers{server=\"10.100.253.109\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP Discovers",
+              "refId": "D"
+            },
+            {
+              "expr": "acksPerSecond{server=\"10.100.253.9\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP Acks",
+              "refId": "A"
+            },
+            {
+              "expr": "acksPerSecond{server=\"10.100.253.109\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP Acks",
+              "refId": "B"
+            },
+            {
+              "expr": "irate(offers{server=\"10.100.253.9\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP Offers",
+              "refId": "E"
+            },
+            {
+              "expr": "irate(offers{server=\"10.100.253.109\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP Offers",
+              "refId": "F"
+            },
+            {
+              "expr": "irate(droppedTotal{server=\"10.100.253.9\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP Dropped",
+              "refId": "G"
+            },
+            {
+              "expr": "irate(droppedTotal{server=\"10.100.253.109\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP Dropped",
+              "refId": "H"
+            },
+            {
+              "expr": "irate(requests{server=\"10.100.253.9\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC1-DHCP Requests",
+              "refId": "I"
+            },
+            {
+              "expr": "irate(requests{server=\"10.100.253.109\"}[2m])",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "DC2-DHCP Requests",
+              "refId": "J"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "DHCP Transaction Rate",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "Counts Per Second",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "2019-01-28T05:00:00.000Z",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "",
+  "title": "DHCP Stats",
+  "version": 10
+}

+ 1344 - 0
automation/monitoring/grafana/hx.json

@@ -0,0 +1,1344 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": 7,
+  "links": [],
+  "refresh": "1m",
+  "rows": [
+    {
+      "collapse": false,
+      "height": "250px",
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 1,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "hideZero": true,
+            "max": true,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "MBps_Write{host=\"10.127.253.85\"}",
+              "format": "time_series",
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "Write Throughput HX-1",
+              "refId": "A"
+            },
+            {
+              "expr": "MBps_Read{host=\"10.127.253.85\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Read Throughput HX-1",
+              "refId": "B"
+            },
+            {
+              "expr": "MBps_Write{host=\"10.127.254.85\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Write Throughput HX-2",
+              "refId": "C"
+            },
+            {
+              "expr": "MBps_Read{host=\"10.127.254.85\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Read Throughput HX-2",
+              "refId": "D"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Throughput",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 2,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "IOPS_Read{host='10.127.253.85'}",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "IOPS Read HX-1",
+              "refId": "A"
+            },
+            {
+              "expr": "IOPS_Write{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "IOPS Write HX-1",
+              "refId": "B"
+            },
+            {
+              "expr": "IOPS_Read{host='10.127.254.85'}",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "IOPS Read HX-2",
+              "refId": "C"
+            },
+            {
+              "expr": "IOPS_Write{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "IOPS Write HX-2",
+              "refId": "D"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "IOPS",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 10,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": null,
+          "fill": 1,
+          "id": 3,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "Lat_Read{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Latency Read HX-1",
+              "refId": "A"
+            },
+            {
+              "expr": "Lat_Write{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Latency Write HX-1",
+              "refId": "B"
+            },
+            {
+              "expr": "Lat_Read{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Latency Read HX-2",
+              "refId": "C"
+            },
+            {
+              "expr": "Lat_Write{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Latency Write HX-2",
+              "refId": "D"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Latency",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "ms",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "Bps",
+          "gauge": {
+            "maxValue": 157286400,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 10,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "MBps_Read{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "104857600",
+          "title": "Read Throughput HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "Bps",
+          "gauge": {
+            "maxValue": 157286400,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 11,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "MBps_Write{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "104857600",
+          "title": "Write Throughput HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "Bps",
+          "gauge": {
+            "maxValue": 157286400,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 12,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "MBps_Read{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "104857600",
+          "title": "Read Throughput HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "Bps",
+          "gauge": {
+            "maxValue": 157286400,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 13,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "MBps_Write{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "104857600",
+          "title": "Write Throughput HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "iops",
+          "gauge": {
+            "maxValue": 8000,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 14,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "IOPS_Read{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "6000",
+          "title": "Read IOPS HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "iops",
+          "gauge": {
+            "maxValue": 8000,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 15,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "IOPS_Write{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "6000",
+          "title": "Write IOPS HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "iops",
+          "gauge": {
+            "maxValue": 8000,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 16,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "IOPS_Read{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "6000",
+          "title": "Read IOPS HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "iops",
+          "gauge": {
+            "maxValue": 8000,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 17,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "IOPS_Write{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "6000",
+          "title": "Write IOPS HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "ms",
+          "gauge": {
+            "maxValue": 30,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 9,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "Lat_Read{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "10",
+          "title": "Read Latency HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "ms",
+          "gauge": {
+            "maxValue": 30,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 8,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "Lat_Write{host='10.127.253.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "10",
+          "title": "Write Latency HX-1",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "ms",
+          "gauge": {
+            "maxValue": 30,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 6,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "Lat_Read{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "10",
+          "title": "Read Latency HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "#299c46",
+            "rgba(237, 129, 40, 0.89)",
+            "#d44a3a"
+          ],
+          "datasource": null,
+          "format": "ms",
+          "gauge": {
+            "maxValue": 30,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 7,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "Lat_Write{host='10.127.254.85'}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A"
+            }
+          ],
+          "thresholds": "10",
+          "title": "Write Latency HX-2",
+          "transparent": false,
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-7d",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "browser",
+  "title": "HX",
+  "version": 7
+}

+ 16 - 0
automation/monitoring/observium/observium_templates_alert_all.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<templates>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="5f024dc799e8f1d7983f573c7becaff7"><entity_type>port</entity_type><name>port too slow</name><message>One hundred (or fewer) reasons for the port to SPEED UP.  The port is too damn slow, and the rent is too damn high.</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>1</conditions_and><conditions>ifOperStatus == up</conditions><conditions>ifHighSpeed &lt; 1000</conditions><conditions>ifHighSpeed != 800</conditions><conditions>ifHighSpeed != 0</conditions><conditions_complex>ifOperStatus == up AND ifHighSpeed &lt; 1000 AND ifHighSpeed != 800 AND ifHighSpeed != 0</conditions_complex><associations><device>hostname notregexp ^\d+-\d+-s\d+</device><entity>ifType equals ethernetCsmacd</entity><entity>ifAlias notmatch *IGNORE*</entity><entity>ifAlias match ?*</entity></associations><associations><device>hostname regexp ^\d+-\d+-s\d+</device><device>hardware match *C3560CX*</device><entity>port_label_num equals 1/0/14</entity></associations></template>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="0803aba9572419f25db0d024480e8e12"><entity_type>port</entity_type><name>input/output errors</name><message>Port Errors</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>0</conditions_and><conditions>ifInErrors_rate &gt; 1</conditions><conditions>ifOutErrors_rate &gt; 1</conditions><conditions_complex>ifInErrors_rate &gt; 1 OR ifOutErrors_rate &gt; 1</conditions_complex><associations><device>*</device><entity>ifType equals fibreChannel</entity></associations><associations><device>hostname notregexp ^\d+-\d+-s\d+</device><entity>ifType equals ethernetCsmacd</entity><entity>ifAlias notmatch *IGNORE*</entity></associations><associations><device>hostname regexp ^\d+-\d+-s\d+</device><device>hardware match *C3560CX*</device><entity>port_label_num equals 1/0/14</entity></associations></template>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="948d3d3a2ab72b0c4e5b9e4d4613e44f"><entity_type>sensor</entity_type><name>temperature monitor</name><message>It's too damn hot...or cold.</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>0</conditions_and><conditions>sensor_value greater @sensor_limit</conditions><conditions>sensor_value less @sensor_limit_low</conditions><conditions_complex>sensor_value greater @sensor_limit OR sensor_value less @sensor_limit_low</conditions_complex><associations><device>*</device><entity>sensor_class equals temperature</entity></associations></template>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="27324e2a52db1b78b5376efef3b08af1"><entity_type>bgp_peer</entity_type><name>bgp peer down</name><message>Peer Down</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>1</conditions_and><conditions>bgpPeerAdminStatus notequals stop</conditions><conditions>bgpPeerAdminStatus notequals halted</conditions><conditions>bgpPeerState notequals established</conditions><conditions_complex>bgpPeerAdminStatus notequals stop AND bgpPeerAdminStatus notequals halted AND bgpPeerState notequals established</conditions_complex><associations><device>*</device><entity>*</entity></associations></template>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="85c96204ff2dd0bc1d04085731eb387c"><entity_type>port</entity_type><name>port down</name><message>Port Down</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>1</conditions_and><conditions>ifAdminStatus equals up</conditions><conditions>ifOperStatus equals down</conditions><conditions_complex>ifAdminStatus equals up AND ifOperStatus equals down</conditions_complex><associations><device>hostname notregexp ^\d+-\d+-s\d+</device><entity>ifAlias match ?*</entity><entity>ifType notmatch propVirtual</entity></associations></template>
+
+<template type="alert" description="Autogenerated observium template" version="0.91" created="Fri, 01 Feb 2019 13:27:13 +0100" observium="17.9.0" id="c3932cb01ae89e10afbdae042d015980"><entity_type>sla</entity_type><name>ipsla down</name><message>We lost an internet connection!</message><severity>crit</severity><suppress_recovery>0</suppress_recovery><delay>0</delay><conditions_and>1</conditions_and><conditions>rtt_sense equals timeout</conditions><conditions_complex>rtt_sense equals timeout</conditions_complex><associations><device>*</device><entity>*</entity></associations></template>
+
+</templates>

+ 98 - 0
automation/monitoring/prometheus/prometheus.yml

@@ -0,0 +1,98 @@
+# my global config
+global:
+  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
+  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
+  # scrape_timeout is set to the global default (10s).
+
+# Alertmanager configuration
+alerting:
+  alertmanagers:
+  - static_configs:
+    - targets:
+      # - alertmanager:9093
+
+# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
+rule_files:
+  # - "first_rules.yml"
+  # - "second_rules.yml"
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
+  - job_name: 'prometheus'
+
+    # metrics_path defaults to '/metrics'
+    # scheme defaults to 'http'.
+
+    static_configs:
+      - targets: ['localhost:9090']
+
+  - job_name: 'mac_metrics'
+    scrape_interval: 1m
+    static_configs:
+      - targets: ['10.100.253.13:8081']
+        labels:
+          service_name: idf_mac_address_count
+
+  - job_name: 'hx_metrics'
+    scrape_interval: 1m
+    static_configs:
+      - targets: ['10.100.253.13:8082']
+        labels:
+          service_name: hx_read_write_stats
+
+  - job_name: 'dhcp_metrics'
+    scrape_interval: 1m
+    static_configs:
+       - targets: ['10.100.253.13:8083']
+         labels:
+           service_name: dhcp_server_stats
+
+  - job_name: 'snmp'
+    metrics_path: /snmp
+    params:
+      module: [if_mib]
+    static_configs:
+      - targets:
+        - 10.128.0.1
+        - 10.128.0.2
+        - 10.128.0.5
+        - 10.128.0.6
+        - 10.128.0.7
+        - 10.128.0.9
+        - 10.128.0.10
+        - 10.127.0.61
+        - 10.127.0.62
+        - 10.127.0.101
+        - 10.127.0.102
+        - 10.127.0.103
+        - 10.127.0.104
+        - 10.127.0.105
+        - 10.127.0.106
+        - 10.127.0.107
+        - 10.127.0.108
+        - 10.127.0.109
+        - 10.127.0.110
+        - 10.127.0.111
+        - 10.127.0.112
+        - 10.127.0.113
+        - 10.127.0.114
+        - 10.127.0.115
+        - 10.127.0.116
+        - 10.127.0.242
+        - 10.127.0.243
+        - 10.127.0.244
+        - 10.127.0.252
+        - 10.127.0.253
+        - 10.127.0.247
+        - 10.127.0.248
+        - 10.127.0.249
+        - 10.127.0.250
+    relabel_configs:
+      - source_labels: [__address__]
+        target_label: __param_target
+      - source_labels: [__param_target]
+        target_label: instance
+      - target_label: __address__
+        replacement: 127.0.0.1:9116

+ 10271 - 0
automation/monitoring/prometheus/snmp.yml

@@ -0,0 +1,10271 @@
+apcups:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.4.1.318.1.1.1.12
+  - 1.3.6.1.4.1.318.1.1.1.2
+  - 1.3.6.1.4.1.318.1.1.1.3
+  - 1.3.6.1.4.1.318.1.1.1.4
+  - 1.3.6.1.4.1.318.1.1.1.7.2
+  - 1.3.6.1.4.1.318.1.1.1.8.1
+  - 1.3.6.1.4.1.318.1.1.10.2.3.2
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: upsOutletGroupStatusTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.1.1
+  - name: upsOutletGroupStatusIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+    type: DisplayString
+    help: The name of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusGroupState
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.3
+    type: gauge
+    help: Getting this variable will return the outlet group state - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.3
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusCommandPending
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.4
+    type: gauge
+    help: Getting this variable will return the command pending state of the outlet
+      group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.4
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.5
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.5
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusGroupFullState
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.6
+    type: DisplayString
+    help: An ASCII string containing the 32 flags representing the current state(s)
+      of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.6
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupConfigTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.2.1
+  - name: upsOutletGroupConfigIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.1
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.2
+    type: DisplayString
+    help: The name of the outlet group. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.2
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigPowerOnDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.3
+    type: gauge
+    help: The amount of time (seconds) the outlet group will delay powering on when
+      the delayed on, reboot, or shutdown command is applied - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.3
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigPowerOffDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.4
+    type: gauge
+    help: The amount of time (seconds) the outlet group will delay powering off when
+      the delayed off, reboot, or shutdown command is applied - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.4
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigRebootDuration
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.5
+    type: gauge
+    help: During a reboot sequence, power is turned off and then back on - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.5
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigMinReturnRuntime
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.6
+    type: gauge
+    help: In an Outlet Group shutdown sequence, the Outlet Group cycles power off
+      then on - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.6
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.7
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.7
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlSkipOffDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.8
+    type: gauge
+    help: Configures whether the outlet group's off delay setting (upsOutletGroupConfigPowerOffDelay)
+      will be used in a load shedding situation, where applicable. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.8
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlAutoRestart
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.9
+    type: gauge
+    help: Configures whether the outlet group will automatically restart after a load
+      shedding situation, where applicable. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.9
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.10
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) after the
+      UPS's time on battery has exceeded the upsOutletGroupConfigLoadShedTimeOnBattery
+      OID setting - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.10
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlRuntimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.11
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) when the UPS
+      is on battery and the remaining runtime is less than the upsOutletGroupConfigLoadShedRuntimeRemaining
+      OID setting - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.11
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlInOverload
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.12
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) when the UPS
+      is in an overload condition - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.12
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.13
+    type: gauge
+    help: When the UPS has been on battery for more time than this value, the outlet
+      group will turn off if this condition is enabled by the upsOutletGroupConfigLoadShedControlTimeOnBattery
+      OID - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.13
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedRuntimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.14
+    type: gauge
+    help: When the runtime remaining is less than this value, the outlet group will
+      turn off if this condition is enabled by the upsOutletGroupConfigLoadShedControlRuntimeRemaining
+      OID - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.14
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupControlTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.3.1
+  - name: upsOutletGroupControlIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.1
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.2
+    type: DisplayString
+    help: The name of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.2
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlCommand
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.3
+    type: gauge
+    help: Getting this variable will return the outlet group state - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.3
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.4
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.4
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsBasicBatteryStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.1
+    type: gauge
+    help: The status of the UPS batteries - 1.3.6.1.4.1.318.1.1.1.2.1.1
+  - name: upsBasicBatteryTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.2
+    type: gauge
+    help: The elapsed time since the UPS has switched to battery power. - 1.3.6.1.4.1.318.1.1.1.2.1.2
+  - name: upsBasicBatteryLastReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.3
+    type: DisplayString
+    help: The date when the UPS system's batteries were last replaced in mm/dd/yy
+      (or yyyy) format - 1.3.6.1.4.1.318.1.1.1.2.1.3
+  - name: upsAdvBatteryCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.1
+    type: gauge
+    help: The remaining battery capacity expressed in percent of full capacity. -
+      1.3.6.1.4.1.318.1.1.1.2.2.1
+  - name: upsAdvBatteryTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.2
+    type: gauge
+    help: The current internal UPS temperature expressed in Celsius. - 1.3.6.1.4.1.318.1.1.1.2.2.2
+  - name: upsAdvBatteryRunTimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.3
+    type: gauge
+    help: The UPS battery run time remaining before battery exhaustion. - 1.3.6.1.4.1.318.1.1.1.2.2.3
+  - name: upsAdvBatteryReplaceIndicator
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.4
+    type: gauge
+    help: Indicates whether the UPS batteries need replacing. - 1.3.6.1.4.1.318.1.1.1.2.2.4
+  - name: upsAdvBatteryNumOfBattPacks
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.5
+    type: gauge
+    help: The number of external battery packs connected to the UPS - 1.3.6.1.4.1.318.1.1.1.2.2.5
+  - name: upsAdvBatteryNumOfBadBattPacks
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.6
+    type: gauge
+    help: The number of external battery packs connected to the UPS that are defective
+      - 1.3.6.1.4.1.318.1.1.1.2.2.6
+  - name: upsAdvBatteryNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.7
+    type: gauge
+    help: The nominal battery voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.7
+  - name: upsAdvBatteryActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.8
+    type: gauge
+    help: The actual battery bus voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.8
+  - name: upsAdvBatteryCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.9
+    type: gauge
+    help: The battery current in Amps. - 1.3.6.1.4.1.318.1.1.1.2.2.9
+  - name: upsAdvTotalDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.10
+    type: gauge
+    help: The total DC current in Amps. - 1.3.6.1.4.1.318.1.1.1.2.2.10
+  - name: upsAdvBatteryFullCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.11
+    type: gauge
+    help: The full chargeable capacity of the battery which is expressed in percentage.
+      - 1.3.6.1.4.1.318.1.1.1.2.2.11
+  - name: upsAdvBatteryActualVoltageTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.1
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvBatteryActualVoltagePolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.2
+    type: gauge
+    help: The selected Battery Voltage Polarity - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.2
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvBatteryFrameActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.3
+    type: gauge
+    help: The actual battery bus voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.3
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvTotalDCCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.1
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvTotalDCCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.2
+    type: gauge
+    help: The selected Battery Current Polarity - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.2
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvTotalFrameDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.3
+    type: gauge
+    help: The Total DC Current of battery in Amperes. - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.3
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.1
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.2
+    type: gauge
+    help: The battery frame identifier. - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.2
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.3
+    type: gauge
+    help: The selected Battery current polarity - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.3
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.4
+    type: gauge
+    help: The Battery current measured in Amperes - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.4
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryEstimatedChargeTime
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.15
+    type: gauge
+    help: The estimated remaining time required to charge the UPS to a full state
+      of charge. - 1.3.6.1.4.1.318.1.1.1.2.2.15
+  - name: upsAdvBatteryPower
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.16
+    type: gauge
+    help: The measured battery power in kW. - 1.3.6.1.4.1.318.1.1.1.2.2.16
+  - name: upsAdvBatteryChargerStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.17
+    type: gauge
+    help: The status of the battery charger - 1.3.6.1.4.1.318.1.1.1.2.2.17
+  - name: upsAdvBatteryInternalSKU
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.19
+    type: DisplayString
+    help: The SKU of the internal battery. - 1.3.6.1.4.1.318.1.1.1.2.2.19
+  - name: upsAdvBatteryExternalSKU
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.20
+    type: DisplayString
+    help: The SKU of the external battery. - 1.3.6.1.4.1.318.1.1.1.2.2.20
+  - name: upsAdvBatteryRecommendedReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.21
+    type: DisplayString
+    help: The recommended replacement date for the battery based on the UPS internal
+      battery life algorithm. - 1.3.6.1.4.1.318.1.1.1.2.2.21
+  - name: upsHighPrecBatteryCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.1
+    type: gauge
+    help: The remaining battery capacity expressed in tenths of percent of full capacity.
+      - 1.3.6.1.4.1.318.1.1.1.2.3.1
+  - name: upsHighPrecBatteryTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.2
+    type: gauge
+    help: The current internal UPS temperature expressed in tenths of degrees Celsius.
+      - 1.3.6.1.4.1.318.1.1.1.2.3.2
+  - name: upsHighPrecBatteryNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.3
+    type: gauge
+    help: The nominal battery voltage in tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.3
+  - name: upsHighPrecBatteryActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.4
+    type: gauge
+    help: The actual battery bus voltage in tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.4
+  - name: upsHighPrecBatteryCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.5
+    type: gauge
+    help: The battery current in tenths of Amps. - 1.3.6.1.4.1.318.1.1.1.2.3.5
+  - name: upsHighPrecTotalDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.6
+    type: gauge
+    help: The total DC current in tenths of Amps. - 1.3.6.1.4.1.318.1.1.1.2.3.6
+  - name: upsHighPrecBatteryActualVoltageTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryActualVoltagePolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.2
+    type: gauge
+    help: The selected Battery Voltage polarity - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.3
+    type: gauge
+    help: The actual battery bus voltage expressed as tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.1
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.2
+    type: gauge
+    help: The selected Battery Current polarity - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.2
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.3
+    type: gauge
+    help: The total DC current in tenths of Amperes. - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.3
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.1
+    type: gauge
+    help: The Battery frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.2
+    type: gauge
+    help: The Battery frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.3
+    type: gauge
+    help: The selected Battery Current polarity - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.4
+    type: gauge
+    help: The Battery current in tenths of Amperes. - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.4
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.1
+    type: gauge
+    help: The number of entries in the upsHighPrecBatteryPacks. - 1.3.6.1.4.1.318.1.1.1.2.3.10.1
+  - name: upsHighPrecBatteryPackIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.1
+    type: gauge
+    help: The battery pack identifier. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryCartridgeIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.2
+    type: gauge
+    help: The battery cartridge identifier. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackFirmwareRevision
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.3
+    type: DisplayString
+    help: The battery pack firmware revision. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackSerialNumber
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.4
+    type: DisplayString
+    help: The battery pack serial number. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.4
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.5
+    type: gauge
+    help: The battery pack temperature measured in 10ths of degree Celcius - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.5
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.6
+    type: OctetString
+    help: The battery status for the pack only - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.6
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeHealth
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.7
+    type: OctetString
+    help: The battery cartridge health - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.7
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.8
+    type: DisplayString
+    help: The battery cartridge estimated battery replace date. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.8
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeInstallDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.9
+    type: DisplayString
+    help: The battery cartridge install date. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.9
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.10
+    type: OctetString
+    help: The battery cartridge status - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.10
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryHealth
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.11
+    type: OctetString
+    help: The battery health - 1.3.6.1.4.1.318.1.1.1.2.3.11
+  - name: upsBasicInputPhase
+    oid: 1.3.6.1.4.1.318.1.1.1.3.1.1
+    type: gauge
+    help: The current AC input phase. - 1.3.6.1.4.1.318.1.1.1.3.1.1
+  - name: upsAdvInputLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.1
+    type: gauge
+    help: The current utility line voltage in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.1
+  - name: upsAdvInputMaxLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.2
+    type: gauge
+    help: The maximum utility line voltage in VAC over the previous 1 minute period.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.2
+  - name: upsAdvInputMinLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.3
+    type: gauge
+    help: The minimum utility line voltage in VAC over the previous 1 minute period.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.3
+  - name: upsAdvInputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.4
+    type: gauge
+    help: The current input frequency to the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.4
+  - name: upsAdvInputLineFailCause
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.5
+    type: gauge
+    help: The reason for the occurrence of the last transfer to UPS battery power
+      - 1.3.6.1.4.1.318.1.1.1.3.2.5
+  - name: upsAdvInputNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.6
+    type: gauge
+    help: The nominal input frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.6
+  - name: upsAdvInputNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.7
+    type: gauge
+    help: The nominal input voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.7
+  - name: upsAdvInputBypassNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.8
+    type: gauge
+    help: The nominal bypass input frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.8
+  - name: upsAdvInputBypassNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.9
+    type: gauge
+    help: The nominal bypass input voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.9
+  - name: upsAdvInputStatisticsIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.1
+    type: gauge
+    help: The input identifier. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.1
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.2
+    type: gauge
+    help: The input apparent power(sum of all of the three phases) measured in kVA.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.2
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputVoltageTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.3
+    type: gauge
+    help: The input voltage Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.3
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputBypassVoltageTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.4
+    type: gauge
+    help: The bypass input voltage Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.4
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.5
+    type: gauge
+    help: The input peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.5
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputBypassPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.6
+    type: gauge
+    help: The bypass input peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.6
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.7
+    type: gauge
+    help: The input active power measured in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.7
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputTotalApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.11
+    type: gauge
+    help: The input total apparent power(sum of all three phases) of the UPS system
+      in kVA. - 1.3.6.1.4.1.318.1.1.1.3.2.11
+  - name: upsAdvInputTotalActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.12
+    type: gauge
+    help: The input total active power(sum of all three phases) of the UPS system
+      in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.12
+  - name: upsAdvInputBypassTotalApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.13
+    type: gauge
+    help: The input bypass total apparent power(sum of all three phases) of the UPS
+      system in kVA. - 1.3.6.1.4.1.318.1.1.1.3.2.13
+  - name: upsAdvInputBypassTotalActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.14
+    type: gauge
+    help: The input bypass total active power(sum of all three phases) of the UPS
+      system in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.14
+  - name: upsAdvInputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.15
+    type: gauge
+    help: The input energy usage of the UPS in kWh. - 1.3.6.1.4.1.318.1.1.1.3.2.15
+  - name: upsHighPrecInputLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.1
+    type: gauge
+    help: The current utility line voltage in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.3.3.1
+  - name: upsHighPrecInputMaxLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.2
+    type: gauge
+    help: The maximum utility line voltage in tenths of VAC over the previous 1 minute
+      period. - 1.3.6.1.4.1.318.1.1.1.3.3.2
+  - name: upsHighPrecInputMinLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.3
+    type: gauge
+    help: The minimum utility line voltage in tenths of VAC over the previous 1 minute
+      period. - 1.3.6.1.4.1.318.1.1.1.3.3.3
+  - name: upsHighPrecInputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.4
+    type: gauge
+    help: The current input frequency to the UPS system in tenths of Hz. - 1.3.6.1.4.1.318.1.1.1.3.3.4
+  - name: upsHighPrecInputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.5
+    type: gauge
+    help: The input energy usage of the UPS in hundredths of kWh. - 1.3.6.1.4.1.318.1.1.1.3.3.5
+  - name: upsHighPrecInputBypassVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.6
+    type: gauge
+    help: The current bypass line voltage in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.3.3.6
+  - name: upsHighPrecInputBypassFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.7
+    type: gauge
+    help: The current input bypass frequency to the UPS system in tenths of Hz. -
+      1.3.6.1.4.1.318.1.1.1.3.3.7
+  - name: upsBasicOutputStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.1
+    type: gauge
+    help: The current state of the UPS - 1.3.6.1.4.1.318.1.1.1.4.1.1
+  - name: upsBasicOutputPhase
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.2
+    type: gauge
+    help: The current output phase. - 1.3.6.1.4.1.318.1.1.1.4.1.2
+  - name: upsBasicSystemStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.3
+    type: gauge
+    help: Current state for the whole system (UPS and surrounding breakers) - 1.3.6.1.4.1.318.1.1.1.4.1.3
+  - name: upsBasicSystemInternalTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.4
+    type: gauge
+    help: The actual internal temperature of the UPS system in Celsius. - 1.3.6.1.4.1.318.1.1.1.4.1.4
+  - name: upsBasicSystemInverterStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.5
+    type: gauge
+    help: The current state of the UPS inverter - 1.3.6.1.4.1.318.1.1.1.4.1.5
+  - name: upsBasicSystemPFCStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.6
+    type: gauge
+    help: The general status of the power factor correction (AC input stage of the
+      UPS) - 1.3.6.1.4.1.318.1.1.1.4.1.6
+  - name: upsBasicOutputACwiringConfiguration
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.7
+    type: gauge
+    help: Indicates if neutral wire on output side of the UPS is used (load wired
+      line to neutral) - 1.3.6.1.4.1.318.1.1.1.4.1.7
+  - name: upsAdvOutputVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.1
+    type: gauge
+    help: The output voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.4.2.1
+  - name: upsAdvOutputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.2
+    type: gauge
+    help: The current output frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.4.2.2
+  - name: upsAdvOutputLoad
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.3
+    type: gauge
+    help: The current UPS load expressed in percent of rated capacity. - 1.3.6.1.4.1.318.1.1.1.4.2.3
+  - name: upsAdvOutputCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.4
+    type: gauge
+    help: The current in amperes drawn by the load on the UPS. - 1.3.6.1.4.1.318.1.1.1.4.2.4
+  - name: upsAdvOutputRedundancy
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.5
+    type: gauge
+    help: The number of power modules which can fail or be removed without causing
+      the UPS to generate a Minimum Redundancy Lost event. - 1.3.6.1.4.1.318.1.1.1.4.2.5
+  - name: upsAdvOutputKVACapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.6
+    type: gauge
+    help: The maximum load that this UPS can support. - 1.3.6.1.4.1.318.1.1.1.4.2.6
+  - name: upsAdvOutputNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.7
+    type: gauge
+    help: The nominal output frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.4.2.7
+  - name: upsAdvOutputActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.8
+    type: gauge
+    help: The total output active power of the UPS system in W - 1.3.6.1.4.1.318.1.1.1.4.2.8
+  - name: upsAdvOutputApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.9
+    type: gauge
+    help: The total output apparent power of all phases of the UPS system in VA. -
+      1.3.6.1.4.1.318.1.1.1.4.2.9
+  - name: upsAdvOutputStatisticsIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.1
+    type: gauge
+    help: The output identifier. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.1
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.2
+    type: gauge
+    help: The output peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.2
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputCurrentTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.3
+    type: gauge
+    help: The output current Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.3
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputCrestFactor
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.4
+    type: gauge
+    help: The output current crest factor expressed in tenths. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.4
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputNeutralCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.11
+    type: gauge
+    help: The neutral current in amperes. - 1.3.6.1.4.1.318.1.1.1.4.2.11
+  - name: upsAdvOutputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.12
+    type: gauge
+    help: The output energy usage of the UPS in kWh. - 1.3.6.1.4.1.318.1.1.1.4.2.12
+  - name: upsHighPrecOutputVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.1
+    type: gauge
+    help: The output voltage of the UPS system in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.4.3.1
+  - name: upsHighPrecOutputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.2
+    type: gauge
+    help: The current output frequency of the UPS system in tenths of Hz. - 1.3.6.1.4.1.318.1.1.1.4.3.2
+  - name: upsHighPrecOutputLoad
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.3
+    type: gauge
+    help: The current UPS load expressed in tenths of percent of rated capacity. -
+      1.3.6.1.4.1.318.1.1.1.4.3.3
+  - name: upsHighPrecOutputCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.4
+    type: gauge
+    help: The current in tenths of amperes drawn by the load on the UPS. - 1.3.6.1.4.1.318.1.1.1.4.3.4
+  - name: upsHighPrecOutputEfficiency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.5
+    type: gauge
+    help: The positive values represent efficiency of the UPS in tenths of percent
+      - 1.3.6.1.4.1.318.1.1.1.4.3.5
+  - name: upsHighPrecOutputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.6
+    type: gauge
+    help: The output energy usage of the UPS in hundredths of kWh. - 1.3.6.1.4.1.318.1.1.1.4.3.6
+  - name: upsAdvTestDiagnosticSchedule
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.1
+    type: gauge
+    help: The UPS system's automatic battery test schedule. - 1.3.6.1.4.1.318.1.1.1.7.2.1
+  - name: upsAdvTestDiagnostics
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.2
+    type: gauge
+    help: Setting this variable to testDiagnostics(2) causes the UPS to perform a
+      diagnostic self test - 1.3.6.1.4.1.318.1.1.1.7.2.2
+  - name: upsAdvTestDiagnosticsResults
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.3
+    type: gauge
+    help: The results of the last UPS diagnostics test performed. - 1.3.6.1.4.1.318.1.1.1.7.2.3
+  - name: upsAdvTestLastDiagnosticsDate
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.4
+    type: DisplayString
+    help: The date the last UPS diagnostics test was performed in mm/dd/yy format.
+      - 1.3.6.1.4.1.318.1.1.1.7.2.4
+  - name: upsAdvTestRuntimeCalibration
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.5
+    type: gauge
+    help: Setting this variable to performCalibration(2) causes the UPS to discharge
+      to calibrate the UPS - 1.3.6.1.4.1.318.1.1.1.7.2.5
+  - name: upsAdvTestCalibrationResults
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.6
+    type: gauge
+    help: The results of the last runtime calibration - 1.3.6.1.4.1.318.1.1.1.7.2.6
+  - name: upsAdvTestCalibrationDate
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.7
+    type: DisplayString
+    help: The date the last UPS runtime calibration was performed in mm/dd/yy format.
+      - 1.3.6.1.4.1.318.1.1.1.7.2.7
+  - name: upsAdvTestDiagnosticTime
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.8
+    type: DisplayString
+    help: The time of the day to perform automatic battery test - 1.3.6.1.4.1.318.1.1.1.7.2.8
+  - name: upsAdvTestDiagnosticDay
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.9
+    type: gauge
+    help: The day of the week to perform automatic battery test. - 1.3.6.1.4.1.318.1.1.1.7.2.9
+  - name: upsCommStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.8.1
+    type: gauge
+    help: The status of agent's communication with UPS. - 1.3.6.1.4.1.318.1.1.1.8.1
+  - name: iemStatusProbeNumber
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.1
+    type: gauge
+    help: The index of the probe. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.1
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeName
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.2
+    type: DisplayString
+    help: A descriptive name for the probe set by the user. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.2
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeStatus
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.3
+    type: gauge
+    help: The connected status of the probe, either disconnected(1) or connected(2).
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.3
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeCurrentTemp
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.4
+    type: gauge
+    help: The current temperature reading from the probe displayed in the units shown
+      in the 'iemStatusProbeTempUnits' OID (Celsius or Fahrenheit). - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.4
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeTempUnits
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.5
+    type: gauge
+    help: The temperature scale used to display the temperature thresholds of the
+      probe, Celsius(1) or Fahrenheit(2) - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.5
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeCurrentHumid
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.6
+    type: gauge
+    help: The current humidity reading from the probe in percent relative humidity.
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.6
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeHighTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.7
+    type: gauge
+    help: The high temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.7
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLowTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.8
+    type: gauge
+    help: The high temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.8
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeHighHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.9
+    type: gauge
+    help: The high humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.9
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLowHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.10
+    type: gauge
+    help: The low humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.10
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMaxTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.11
+    type: gauge
+    help: The max temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.11
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMinTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.12
+    type: gauge
+    help: The minimum temperature violation status of the probe temperature reading
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.12
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMaxHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.13
+    type: gauge
+    help: The maximum humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.13
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMinHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.14
+    type: gauge
+    help: The minimum humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.14
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLocation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.15
+    type: DisplayString
+    help: A descriptive location for the probe set by the user. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.15
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  version: 1
+arista_sw:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2.3.1.6
+  - 1.3.6.1.2.1.25.3.3.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.30065.3.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrProcessorLoad
+    oid: 1.3.6.1.2.1.25.3.3.1.2
+    type: gauge
+    help: The average, over the last minute, of the percentage of time that this processor
+      was not idle - 1.3.6.1.2.1.25.3.3.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: aristaSwFwdIpStatsIPVersion
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.1
+    type: gauge
+    help: The IP version of this row. - 1.3.6.1.4.1.30065.3.1.1.1.1.1
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInReceives
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.3
+    type: counter
+    help: The total number of input IP datagrams received in software, including those
+      received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.3
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInReceives
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.4
+    type: counter
+    help: The total number of input IP datagrams received in software, including those
+      received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.4
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.5
+    type: counter
+    help: The total number of octets received in software in input IP datagrams, including
+      those received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.5
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.6
+    type: counter
+    help: The total number of octets received in software in input IP datagrams, including
+      those received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.6
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInHdrErrors
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.7
+    type: counter
+    help: The number of input IP datagrams discarded in software due to errors in
+      their IP headers, including version number mismatch, other format errors, hop
+      count exceeded, errors discovered in processing their IP options, etc - 1.3.6.1.4.1.30065.3.1.1.1.1.7
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInNoRoutes
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.8
+    type: counter
+    help: The number of input IP datagrams discarded in software because no route
+      could be found to transmit them to their destination - 1.3.6.1.4.1.30065.3.1.1.1.1.8
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInAddrErrors
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.9
+    type: counter
+    help: The number of input IP datagrams discarded in software because the IP address
+      in their IP header's destination field was not a valid address to be received
+      at this entity - 1.3.6.1.4.1.30065.3.1.1.1.1.9
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInUnknownProtos
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.10
+    type: counter
+    help: The number of locally-addressed IP datagrams received successfully in software
+      but discarded because of an unknown or unsupported protocol - 1.3.6.1.4.1.30065.3.1.1.1.1.10
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInTruncatedPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.11
+    type: counter
+    help: The number of input IP datagrams discarded in software because the datagram
+      frame didn't carry enough data - 1.3.6.1.4.1.30065.3.1.1.1.1.11
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.12
+    type: counter
+    help: The number of input datagrams for which this entity was not their final
+      IP destination and for which this entity attempted in software to find a route
+      to forward them to that final destination - 1.3.6.1.4.1.30065.3.1.1.1.1.12
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.13
+    type: counter
+    help: The number of input datagrams for which this entity was not their final
+      IP destination and for which this entity attempted in software to find a route
+      to forward them to that final destination - 1.3.6.1.4.1.30065.3.1.1.1.1.13
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmReqds
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.14
+    type: counter
+    help: The number of IP fragments received that needed to be reassembled at this
+      interface - 1.3.6.1.4.1.30065.3.1.1.1.1.14
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmOKs
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.15
+    type: counter
+    help: The number of IP datagrams successfully reassembled - 1.3.6.1.4.1.30065.3.1.1.1.1.15
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmFails
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.16
+    type: counter
+    help: 'The number of failures detected by the IP re-assembly algorithm (for whatever
+      reason: timed out, errors, etc.) - 1.3.6.1.4.1.30065.3.1.1.1.1.16'
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInDiscards
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.17
+    type: counter
+    help: The number of input IP datagrams received in software for which no problems
+      were encountered to prevent their continued processing, but were discarded (e.g.,
+      for lack of buffer space) - 1.3.6.1.4.1.30065.3.1.1.1.1.17
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInDelivers
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.18
+    type: counter
+    help: The total number of datagrams successfully delivered to IP user-protocols
+      (including ICMP) - 1.3.6.1.4.1.30065.3.1.1.1.1.18
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInDelivers
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.19
+    type: counter
+    help: The total number of datagrams successfully delivered to IP user-protocols
+      (including ICMP) - 1.3.6.1.4.1.30065.3.1.1.1.1.19
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutRequests
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.20
+    type: counter
+    help: The total number of IP datagrams that local IP user- protocols (including
+      ICMP) supplied to IP in requests for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.20
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutRequests
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.21
+    type: counter
+    help: The total number of IP datagrams that local IP user- protocols (including
+      ICMP) supplied to IP in requests for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.21
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutNoRoutes
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.22
+    type: counter
+    help: The number of locally generated IP datagrams discarded because no route
+      could be found to transmit them to their destination - 1.3.6.1.4.1.30065.3.1.1.1.1.22
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.23
+    type: counter
+    help: The number of datagrams for which this entity was not their final IP destination
+      and for which it was successful in finding a path to their final destination
+      in software - 1.3.6.1.4.1.30065.3.1.1.1.1.23
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.24
+    type: counter
+    help: The number of datagrams for which this entity was not their final IP destination
+      and for which it was successful in finding a path to their final destination
+      in software - 1.3.6.1.4.1.30065.3.1.1.1.1.24
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutDiscards
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.25
+    type: counter
+    help: The number of output IP datagrams for which no problem was encountered to
+      prevent their transmission to their destination, but were discarded in software
+      (e.g., for lack of buffer space) - 1.3.6.1.4.1.30065.3.1.1.1.1.25
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragReqds
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.26
+    type: counter
+    help: The number of IP datagrams that would require fragmentation in order to
+      be transmitted - 1.3.6.1.4.1.30065.3.1.1.1.1.26
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragOKs
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.27
+    type: counter
+    help: The number of IP datagrams that have been successfully fragmented - 1.3.6.1.4.1.30065.3.1.1.1.1.27
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragFails
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.28
+    type: counter
+    help: The number of IP datagrams that have been discarded because they needed
+      to be fragmented but could not be - 1.3.6.1.4.1.30065.3.1.1.1.1.28
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragCreates
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.29
+    type: counter
+    help: The number of output datagram fragments that have been generated as a result
+      of IP fragmentation - 1.3.6.1.4.1.30065.3.1.1.1.1.29
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutTransmits
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.30
+    type: counter
+    help: The total number of IP datagrams that this entity supplied by software to
+      the lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.30
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutTransmits
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.31
+    type: counter
+    help: The total number of IP datagrams that this entity supplied by software to
+      the lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.31
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.32
+    type: counter
+    help: The total number of octets in IP datagrams delivered by software to the
+      lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.32
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.33
+    type: counter
+    help: The total number of octets in IP datagrams delivered by software to the
+      lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.33
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.34
+    type: counter
+    help: The number of IP multicast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.34
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.35
+    type: counter
+    help: The number of IP multicast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.35
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.36
+    type: counter
+    help: The total number of octets received by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.36
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.37
+    type: counter
+    help: The total number of octets received by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.37
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.38
+    type: counter
+    help: The number of IP multicast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.38
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.39
+    type: counter
+    help: The number of IP multicast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.39
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.40
+    type: counter
+    help: The total number of octets transmitted by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.40
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.41
+    type: counter
+    help: The total number of octets transmitted by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.41
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.42
+    type: counter
+    help: The number of IP broadcast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.42
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.43
+    type: counter
+    help: The number of IP broadcast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.43
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.44
+    type: counter
+    help: The number of IP broadcast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.44
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.45
+    type: counter
+    help: The number of IP broadcast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.45
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsDiscontinuityTime
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.46
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this entry's counters suffered a discontinuity - 1.3.6.1.4.1.30065.3.1.1.1.1.46
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsRefreshRate
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.47
+    type: gauge
+    help: The minimum reasonable polling interval for this entry - 1.3.6.1.4.1.30065.3.1.1.1.1.47
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+cisco_wlc:
+  walk:
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.14179.2.1.1.1.2
+  - 1.3.6.1.4.1.14179.2.1.1.1.38
+  - 1.3.6.1.4.1.14179.2.2.1.1.3
+  - 1.3.6.1.4.1.14179.2.2.13.1.3
+  - 1.3.6.1.4.1.14179.2.2.15.1.21
+  - 1.3.6.1.4.1.14179.2.2.2.1.15
+  - 1.3.6.1.4.1.14179.2.2.2.1.2
+  - 1.3.6.1.4.1.14179.2.2.2.1.4
+  - 1.3.6.1.4.1.14179.2.2.6.1
+  metrics:
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: bsnDot11EssNumberOfMobileStations
+    oid: 1.3.6.1.4.1.14179.2.1.1.1.38
+    type: counter
+    help: No of Mobile Stations currently associated with the WLAN. - 1.3.6.1.4.1.14179.2.1.1.1.38
+    indexes:
+    - labelname: bsnDot11EssSsid
+      type: gauge
+    lookups:
+    - labels:
+      - bsnDot11EssSsid
+      labelname: bsnDot11EssSsid
+      oid: 1.3.6.1.4.1.14179.2.1.1.1.2
+      type: DisplayString
+  - name: bsnAPIfLoadChannelUtilization
+    oid: 1.3.6.1.4.1.14179.2.2.13.1.3
+    type: gauge
+    help: Channel Utilization - 1.3.6.1.4.1.14179.2.2.13.1.3
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDBNoisePower
+    oid: 1.3.6.1.4.1.14179.2.2.15.1.21
+    type: gauge
+    help: This is the average noise power in dBm on each channel that is available
+      to Airespace AP - 1.3.6.1.4.1.14179.2.2.15.1.21
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    - labelname: bsnAPIfNoiseChannelNo
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnApIfNoOfUsers
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.15
+    type: counter
+    help: No of Users associated with this radio. - 1.3.6.1.4.1.14179.2.2.2.1.15
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfType
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.2
+    type: gauge
+    help: The type of this interface - 1.3.6.1.4.1.14179.2.2.2.1.2
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfPhyChannelNumber
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.4
+    type: gauge
+    help: Current channel number of the AP Interface - 1.3.6.1.4.1.14179.2.2.2.1.4
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11TransmittedFragmentCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.1
+    type: counter
+    help: This counter shall be incremented for an acknowledged MPDU with an individual
+      address in the address 1 field or an MPDU with a multicast address in the address
+      1 field of type Data or Management. - 1.3.6.1.4.1.14179.2.2.6.1.1
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MulticastTransmittedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.2
+    type: counter
+    help: This counter shall increment only when the multicast bit is set in the destination
+      MAC address of a successfully transmitted MSDU - 1.3.6.1.4.1.14179.2.2.6.1.2
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RetryCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.3
+    type: counter
+    help: This counter shall increment when an MSDU is successfully transmitted after
+      one or more retransmissions. - 1.3.6.1.4.1.14179.2.2.6.1.3
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MultipleRetryCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.4
+    type: counter
+    help: This counter shall increment when an MSDU is successfully transmitted after
+      more than one retransmission. - 1.3.6.1.4.1.14179.2.2.6.1.4
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FrameDuplicateCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.5
+    type: counter
+    help: This counter shall increment when a frame is received that the Sequence
+      Control field indicates is a duplicate. - 1.3.6.1.4.1.14179.2.2.6.1.5
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RTSSuccessCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.6
+    type: counter
+    help: This counter shall increment when a CTS is received in response to an RTS.
+      - 1.3.6.1.4.1.14179.2.2.6.1.6
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RTSFailureCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.7
+    type: counter
+    help: This counter shall increment when a CTS is not received in response to an
+      RTS. - 1.3.6.1.4.1.14179.2.2.6.1.7
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11ACKFailureCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.8
+    type: counter
+    help: This counter shall increment when an ACK is not received when expected.
+      - 1.3.6.1.4.1.14179.2.2.6.1.8
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11ReceivedFragmentCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.9
+    type: counter
+    help: This counter shall be incremented for each successfully received MPDU of
+      type Data or Management. - 1.3.6.1.4.1.14179.2.2.6.1.9
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MulticastReceivedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.10
+    type: counter
+    help: This counter shall increment when a MSDU is received with the multicast
+      bit set in the destination MAC address. - 1.3.6.1.4.1.14179.2.2.6.1.10
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FCSErrorCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.11
+    type: counter
+    help: This counter shall increment when an FCS error is detected in a received
+      MPDU. - 1.3.6.1.4.1.14179.2.2.6.1.11
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11TransmittedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.12
+    type: counter
+    help: This counter shall increment for each successfully transmitted MSDU. - 1.3.6.1.4.1.14179.2.2.6.1.12
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11WEPUndecryptableCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.13
+    type: counter
+    help: This counter shall increment when a frame is received with the WEP subfield
+      of the Frame Control field set to one and the WEPOn value for the key mapped
+      to the TA's MAC address indicates that the frame should not have been encrypted
+      or that frame is discarded due to the receiving STA not implementing the privacy
+      option. - 1.3.6.1.4.1.14179.2.2.6.1.13
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FailedCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.33
+    type: counter
+    help: This counter shall increment when an MSDU is not transmitted successfully
+      due to the number of transmit attempts exceeding either the bsnAPIfDot11ShortRetryLimit
+      or dot11LongRetryLimit. - 1.3.6.1.4.1.14179.2.2.6.1.33
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+ddwrt:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.2021.10.1.1
+  - 1.3.6.1.4.1.2021.10.1.2
+  - 1.3.6.1.4.1.2021.10.1.5
+  - 1.3.6.1.4.1.2021.11
+  - 1.3.6.1.4.1.2021.4
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: laIndex
+    oid: 1.3.6.1.4.1.2021.10.1.1
+    type: gauge
+    help: reference index/row number for each observed loadave. - 1.3.6.1.4.1.2021.10.1.1
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laNames
+    oid: 1.3.6.1.4.1.2021.10.1.2
+    type: DisplayString
+    help: The list of loadave names we're watching. - 1.3.6.1.4.1.2021.10.1.2
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laLoadInt
+    oid: 1.3.6.1.4.1.2021.10.1.5
+    type: gauge
+    help: The 1,5 and 15 minute load averages as an integer - 1.3.6.1.4.1.2021.10.1.5
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: ssIndex
+    oid: 1.3.6.1.4.1.2021.11.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.11.1
+  - name: ssErrorName
+    oid: 1.3.6.1.4.1.2021.11.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.11.2
+  - name: ssSwapIn
+    oid: 1.3.6.1.4.1.2021.11.3
+    type: gauge
+    help: The average amount of memory swapped in from disk, calculated over the last
+      minute. - 1.3.6.1.4.1.2021.11.3
+  - name: ssSwapOut
+    oid: 1.3.6.1.4.1.2021.11.4
+    type: gauge
+    help: The average amount of memory swapped out to disk, calculated over the last
+      minute. - 1.3.6.1.4.1.2021.11.4
+  - name: ssIOSent
+    oid: 1.3.6.1.4.1.2021.11.5
+    type: gauge
+    help: The average amount of data written to disk or other block device, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.5
+  - name: ssIOReceive
+    oid: 1.3.6.1.4.1.2021.11.6
+    type: gauge
+    help: The average amount of data read from disk or other block device, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.6
+  - name: ssSysInterrupts
+    oid: 1.3.6.1.4.1.2021.11.7
+    type: gauge
+    help: The average rate of interrupts processed (including the clock) calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.7
+  - name: ssSysContext
+    oid: 1.3.6.1.4.1.2021.11.8
+    type: gauge
+    help: The average rate of context switches, calculated over the last minute -
+      1.3.6.1.4.1.2021.11.8
+  - name: ssCpuUser
+    oid: 1.3.6.1.4.1.2021.11.9
+    type: gauge
+    help: The percentage of CPU time spent processing user-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.9
+  - name: ssCpuSystem
+    oid: 1.3.6.1.4.1.2021.11.10
+    type: gauge
+    help: The percentage of CPU time spent processing system-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.10
+  - name: ssCpuIdle
+    oid: 1.3.6.1.4.1.2021.11.11
+    type: gauge
+    help: The percentage of processor time spent idle, calculated over the last minute
+      - 1.3.6.1.4.1.2021.11.11
+  - name: ssCpuRawUser
+    oid: 1.3.6.1.4.1.2021.11.50
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing user-level code
+      - 1.3.6.1.4.1.2021.11.50
+  - name: ssCpuRawNice
+    oid: 1.3.6.1.4.1.2021.11.51
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing reduced-priority
+      code - 1.3.6.1.4.1.2021.11.51
+  - name: ssCpuRawSystem
+    oid: 1.3.6.1.4.1.2021.11.52
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing system-level code
+      - 1.3.6.1.4.1.2021.11.52
+  - name: ssCpuRawIdle
+    oid: 1.3.6.1.4.1.2021.11.53
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent idle - 1.3.6.1.4.1.2021.11.53
+  - name: ssCpuRawWait
+    oid: 1.3.6.1.4.1.2021.11.54
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent waiting for IO - 1.3.6.1.4.1.2021.11.54
+  - name: ssCpuRawKernel
+    oid: 1.3.6.1.4.1.2021.11.55
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing kernel-level code
+      - 1.3.6.1.4.1.2021.11.55
+  - name: ssCpuRawInterrupt
+    oid: 1.3.6.1.4.1.2021.11.56
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing hardware interrupts
+      - 1.3.6.1.4.1.2021.11.56
+  - name: ssIORawSent
+    oid: 1.3.6.1.4.1.2021.11.57
+    type: counter
+    help: Number of blocks sent to a block device - 1.3.6.1.4.1.2021.11.57
+  - name: ssIORawReceived
+    oid: 1.3.6.1.4.1.2021.11.58
+    type: counter
+    help: Number of blocks received from a block device - 1.3.6.1.4.1.2021.11.58
+  - name: ssRawInterrupts
+    oid: 1.3.6.1.4.1.2021.11.59
+    type: counter
+    help: Number of interrupts processed - 1.3.6.1.4.1.2021.11.59
+  - name: ssRawContexts
+    oid: 1.3.6.1.4.1.2021.11.60
+    type: counter
+    help: Number of context switches - 1.3.6.1.4.1.2021.11.60
+  - name: ssCpuRawSoftIRQ
+    oid: 1.3.6.1.4.1.2021.11.61
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing software interrupts
+      - 1.3.6.1.4.1.2021.11.61
+  - name: ssRawSwapIn
+    oid: 1.3.6.1.4.1.2021.11.62
+    type: counter
+    help: Number of blocks swapped in - 1.3.6.1.4.1.2021.11.62
+  - name: ssRawSwapOut
+    oid: 1.3.6.1.4.1.2021.11.63
+    type: counter
+    help: Number of blocks swapped out - 1.3.6.1.4.1.2021.11.63
+  - name: ssCpuRawSteal
+    oid: 1.3.6.1.4.1.2021.11.64
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the hypervisor code to
+      run other VMs even though the CPU in the current VM had something runnable -
+      1.3.6.1.4.1.2021.11.64
+  - name: ssCpuRawGuest
+    oid: 1.3.6.1.4.1.2021.11.65
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the CPU to run a virtual
+      CPU (guest) - 1.3.6.1.4.1.2021.11.65
+  - name: ssCpuRawGuestNice
+    oid: 1.3.6.1.4.1.2021.11.66
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the CPU to run a niced
+      virtual CPU (guest) - 1.3.6.1.4.1.2021.11.66
+  - name: ssCpuNumCpus
+    oid: 1.3.6.1.4.1.2021.11.67
+    type: gauge
+    help: The number of processors, as counted by the agent - 1.3.6.1.4.1.2021.11.67
+  - name: memIndex
+    oid: 1.3.6.1.4.1.2021.4.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.4.1
+  - name: memErrorName
+    oid: 1.3.6.1.4.1.2021.4.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.4.2
+  - name: memTotalSwap
+    oid: 1.3.6.1.4.1.2021.4.3
+    type: gauge
+    help: The total amount of swap space configured for this host. - 1.3.6.1.4.1.2021.4.3
+  - name: memAvailSwap
+    oid: 1.3.6.1.4.1.2021.4.4
+    type: gauge
+    help: The amount of swap space currently unused or available. - 1.3.6.1.4.1.2021.4.4
+  - name: memTotalReal
+    oid: 1.3.6.1.4.1.2021.4.5
+    type: gauge
+    help: The total amount of real/physical memory installed on this host. - 1.3.6.1.4.1.2021.4.5
+  - name: memAvailReal
+    oid: 1.3.6.1.4.1.2021.4.6
+    type: gauge
+    help: The amount of real/physical memory currently unused or available. - 1.3.6.1.4.1.2021.4.6
+  - name: memTotalSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.7
+    type: gauge
+    help: The total amount of swap space or virtual memory allocated for text pages
+      on this host - 1.3.6.1.4.1.2021.4.7
+  - name: memAvailSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.8
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.8
+  - name: memTotalRealTXT
+    oid: 1.3.6.1.4.1.2021.4.9
+    type: gauge
+    help: The total amount of real/physical memory allocated for text pages on this
+      host - 1.3.6.1.4.1.2021.4.9
+  - name: memAvailRealTXT
+    oid: 1.3.6.1.4.1.2021.4.10
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.10
+  - name: memTotalFree
+    oid: 1.3.6.1.4.1.2021.4.11
+    type: gauge
+    help: The total amount of memory free or available for use on this host - 1.3.6.1.4.1.2021.4.11
+  - name: memMinimumSwap
+    oid: 1.3.6.1.4.1.2021.4.12
+    type: gauge
+    help: The minimum amount of swap space expected to be kept free or available during
+      normal operation of this host - 1.3.6.1.4.1.2021.4.12
+  - name: memShared
+    oid: 1.3.6.1.4.1.2021.4.13
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      shared memory - 1.3.6.1.4.1.2021.4.13
+  - name: memBuffer
+    oid: 1.3.6.1.4.1.2021.4.14
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      memory buffers - 1.3.6.1.4.1.2021.4.14
+  - name: memCached
+    oid: 1.3.6.1.4.1.2021.4.15
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      cached memory - 1.3.6.1.4.1.2021.4.15
+  - name: memUsedSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.16
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.16
+  - name: memUsedRealTXT
+    oid: 1.3.6.1.4.1.2021.4.17
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.17
+  - name: memSwapError
+    oid: 1.3.6.1.4.1.2021.4.100
+    type: gauge
+    help: Indicates whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.100
+  - name: memSwapErrorMsg
+    oid: 1.3.6.1.4.1.2021.4.101
+    type: DisplayString
+    help: Describes whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.101
+cpnr:
+  auth:
+    community: hook-pleura-apostasy
+  walk:
+  - 1.3.6.1.4.1.9.10.122.1.1.2
+  - 1.3.6.1.4.1.9.10.102.1.3
+  version: 1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.4.1.9.10.122.1.1.2
+    type: gauge
+  - name: cDhcpv4CountDiscovers
+    oid: 1.3.6.1.4.1.9.10.102.1.3.1
+    type: counter
+    help: This is a test
+  - name: cDhcpv4CountOffers
+    oid: 1.3.6.1.4.1.9.10.102.1.3.2
+    type: counter
+  - name: cDhcpv4CountRequests
+    oid: 1.3.6.1.4.1.9.10.102.1.3.3
+    type: counter
+  - name: cDhcpv4CountDeclines
+    oid: 1.3.6.1.4.1.9.10.102.1.3.4
+    type: counter
+  - name: cDhcpv4CountAcks
+    oid: 1.3.6.1.4.1.9.10.102.1.3.5
+    type: counter
+  - name: cDhcpv4CountNaks
+    oid: 1.3.6.1.4.1.9.10.102.1.3.6
+    type: counter
+  - name: cDhcpv4CountReleases
+    oid: 1.3.6.1.4.1.9.10.102.1.3.7
+    type: counter
+  - name: cDhcpv4CountInforms
+    oid: 1.3.6.1.4.1.9.10.102.1.3.8
+    type: counter
+  - name: cDhcpv4CountInvalids
+    oid: 1.3.6.1.4.1.9.10.102.1.3.10
+    type: counter
+  - name: cDhcpv4CountDropUnknownClient
+    oid: 1.3.6.1.4.1.9.10.102.1.3.11
+    type: counter
+  - name: cDhcpv4CountDropNotServingSubnet
+    oid: 1.3.6.1.4.1.9.10.102.1.3.12
+    type: counter
+if_mib:
+  version: 3
+  auth:
+    username: CLEUR
+    password: Nebraska-curlicue-hookup
+    auth_protocol: SHA
+    priv_protocol: DES
+    security_level: authPriv
+    priv_password: Nebraska-curlicue-hookup
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+if_mib_ifalias:
+  version: 3
+  auth:
+    username: CLEUR
+    password: Nebraska-curlicue-hookup
+    auth_protocol: SHA
+    priv_protocol: DES
+    security_level: authPriv
+    priv_password: Nebraska-curlicue-hookup
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+if_mib_ifdescr:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+if_mib_ifname:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+paloalto_fw:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.1
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.25.3
+  - 1.3.6.1.4.1.25461.2.1.2.1
+  - 1.3.6.1.4.1.25461.2.1.2.3
+  - 1.3.6.1.4.1.25461.2.1.2.5
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: hrSystemUptime
+    oid: 1.3.6.1.2.1.25.1.1
+    type: gauge
+    help: The amount of time since this host was last initialized - 1.3.6.1.2.1.25.1.1
+  - name: hrSystemDate
+    oid: 1.3.6.1.2.1.25.1.2
+    type: DisplayString
+    help: The host's notion of the local date and time of day. - 1.3.6.1.2.1.25.1.2
+  - name: hrSystemInitialLoadDevice
+    oid: 1.3.6.1.2.1.25.1.3
+    type: gauge
+    help: The index of the hrDeviceEntry for the device from which this host is configured
+      to load its initial operating system configuration (i.e., which operating system
+      code and/or boot parameters) - 1.3.6.1.2.1.25.1.3
+  - name: hrSystemInitialLoadParameters
+    oid: 1.3.6.1.2.1.25.1.4
+    type: OctetString
+    help: This object contains the parameters (e.g - 1.3.6.1.2.1.25.1.4
+  - name: hrSystemNumUsers
+    oid: 1.3.6.1.2.1.25.1.5
+    type: gauge
+    help: The number of user sessions for which this host is storing state information
+      - 1.3.6.1.2.1.25.1.5
+  - name: hrSystemProcesses
+    oid: 1.3.6.1.2.1.25.1.6
+    type: gauge
+    help: The number of process contexts currently loaded or running on this system.
+      - 1.3.6.1.2.1.25.1.6
+  - name: hrSystemMaxProcesses
+    oid: 1.3.6.1.2.1.25.1.7
+    type: gauge
+    help: The maximum number of process contexts this system can support - 1.3.6.1.2.1.25.1.7
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrDeviceIndex
+    oid: 1.3.6.1.2.1.25.3.2.1.1
+    type: gauge
+    help: A unique value for each device contained by the host - 1.3.6.1.2.1.25.3.2.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceDescr
+    oid: 1.3.6.1.2.1.25.3.2.1.3
+    type: DisplayString
+    help: A textual description of this device, including the device's manufacturer
+      and revision, and optionally, its serial number. - 1.3.6.1.2.1.25.3.2.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceStatus
+    oid: 1.3.6.1.2.1.25.3.2.1.5
+    type: gauge
+    help: The current operational state of the device described by this row of the
+      table - 1.3.6.1.2.1.25.3.2.1.5
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceErrors
+    oid: 1.3.6.1.2.1.25.3.2.1.6
+    type: counter
+    help: The number of errors detected on this device - 1.3.6.1.2.1.25.3.2.1.6
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrProcessorLoad
+    oid: 1.3.6.1.2.1.25.3.3.1.2
+    type: gauge
+    help: The average, over the last minute, of the percentage of time that this processor
+      was not idle - 1.3.6.1.2.1.25.3.3.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrNetworkIfIndex
+    oid: 1.3.6.1.2.1.25.3.4.1.1
+    type: gauge
+    help: The value of ifIndex which corresponds to this network device - 1.3.6.1.2.1.25.3.4.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPrinterStatus
+    oid: 1.3.6.1.2.1.25.3.5.1.1
+    type: gauge
+    help: The current status of this printer device. - 1.3.6.1.2.1.25.3.5.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPrinterDetectedErrorState
+    oid: 1.3.6.1.2.1.25.3.5.1.2
+    type: OctetString
+    help: This object represents any error conditions detected by the printer - 1.3.6.1.2.1.25.3.5.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageAccess
+    oid: 1.3.6.1.2.1.25.3.6.1.1
+    type: gauge
+    help: An indication if this long-term storage device is readable and writable
+      or only readable - 1.3.6.1.2.1.25.3.6.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageMedia
+    oid: 1.3.6.1.2.1.25.3.6.1.2
+    type: gauge
+    help: An indication of the type of media used in this long- term storage device.
+      - 1.3.6.1.2.1.25.3.6.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageRemoveble
+    oid: 1.3.6.1.2.1.25.3.6.1.3
+    type: gauge
+    help: Denotes whether or not the disk media may be removed from the drive. - 1.3.6.1.2.1.25.3.6.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageCapacity
+    oid: 1.3.6.1.2.1.25.3.6.1.4
+    type: gauge
+    help: The total size for this long-term storage device - 1.3.6.1.2.1.25.3.6.1.4
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPartitionIndex
+    oid: 1.3.6.1.2.1.25.3.7.1.1
+    type: gauge
+    help: A unique value for each partition on this long-term storage device - 1.3.6.1.2.1.25.3.7.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionLabel
+    oid: 1.3.6.1.2.1.25.3.7.1.2
+    type: OctetString
+    help: A textual description of this partition. - 1.3.6.1.2.1.25.3.7.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionID
+    oid: 1.3.6.1.2.1.25.3.7.1.3
+    type: OctetString
+    help: A descriptor which uniquely represents this partition to the responsible
+      operating system - 1.3.6.1.2.1.25.3.7.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionSize
+    oid: 1.3.6.1.2.1.25.3.7.1.4
+    type: gauge
+    help: The size of this partition. - 1.3.6.1.2.1.25.3.7.1.4
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionFSIndex
+    oid: 1.3.6.1.2.1.25.3.7.1.5
+    type: gauge
+    help: The index of the file system mounted on this partition - 1.3.6.1.2.1.25.3.7.1.5
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrFSIndex
+    oid: 1.3.6.1.2.1.25.3.8.1.1
+    type: gauge
+    help: A unique value for each file system local to this host - 1.3.6.1.2.1.25.3.8.1.1
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSMountPoint
+    oid: 1.3.6.1.2.1.25.3.8.1.2
+    type: OctetString
+    help: The path name of the root of this file system. - 1.3.6.1.2.1.25.3.8.1.2
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSRemoteMountPoint
+    oid: 1.3.6.1.2.1.25.3.8.1.3
+    type: OctetString
+    help: A description of the name and/or address of the server that this file system
+      is mounted from - 1.3.6.1.2.1.25.3.8.1.3
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSAccess
+    oid: 1.3.6.1.2.1.25.3.8.1.5
+    type: gauge
+    help: An indication if this file system is logically configured by the operating
+      system to be readable and writable or only readable - 1.3.6.1.2.1.25.3.8.1.5
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSBootable
+    oid: 1.3.6.1.2.1.25.3.8.1.6
+    type: gauge
+    help: A flag indicating whether this file system is bootable. - 1.3.6.1.2.1.25.3.8.1.6
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSStorageIndex
+    oid: 1.3.6.1.2.1.25.3.8.1.7
+    type: gauge
+    help: The index of the hrStorageEntry that represents information about this file
+      system - 1.3.6.1.2.1.25.3.8.1.7
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSLastFullBackupDate
+    oid: 1.3.6.1.2.1.25.3.8.1.8
+    type: DisplayString
+    help: The last date at which this complete file system was copied to another storage
+      device for backup - 1.3.6.1.2.1.25.3.8.1.8
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSLastPartialBackupDate
+    oid: 1.3.6.1.2.1.25.3.8.1.9
+    type: DisplayString
+    help: The last date at which a portion of this file system was copied to another
+      storage device for backup - 1.3.6.1.2.1.25.3.8.1.9
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: panAhoSw
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.1
+    type: counter
+    help: The total usage of software for AHO - 1.3.6.1.4.1.25461.2.1.2.1.19.1
+  - name: panDfaSw
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.2
+    type: counter
+    help: The total number of dfa match using software - 1.3.6.1.4.1.25461.2.1.2.1.19.2
+  - name: panFlowHostServiceAllow
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.3
+    type: counter
+    help: Device management session allowed - 1.3.6.1.4.1.25461.2.1.2.1.19.3
+  - name: panHaPathmonSent
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.4
+    type: counter
+    help: HA path-monitoring packets sent - 1.3.6.1.4.1.25461.2.1.2.1.19.4
+  - name: panAhoFpga
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.5
+    type: counter
+    help: The total requests to FPGA for AHO - 1.3.6.1.4.1.25461.2.1.2.1.19.5
+  - name: panDfaFpga
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.6
+    type: counter
+    help: The total requests to FPGA for DFA - 1.3.6.1.4.1.25461.2.1.2.1.19.6
+  - name: panFpgaPkt
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.7
+    type: counter
+    help: The packets held because of requests to FPGA - 1.3.6.1.4.1.25461.2.1.2.1.19.7
+  - name: panFlowDosAgMaxSessLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.1
+    type: counter
+    help: Session limit reached for aggregate profile, drop session - 1.3.6.1.4.1.25461.2.1.2.1.19.8.1
+  - name: panFlowDosBlkNumEntries
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.2
+    type: counter
+    help: Number of entries in DOS block table - 1.3.6.1.4.1.25461.2.1.2.1.19.8.2
+  - name: panFlowDosClMaxSessLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.3
+    type: counter
+    help: Session limit reached for classified profile, drop session - 1.3.6.1.4.1.25461.2.1.2.1.19.8.3
+  - name: panFlowDosClSyncookieAckErr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.4
+    type: counter
+    help: 'TCP SYN cookies: Invalid ACKs received, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.4'
+  - name: panFlowDosClSyncookieAckRcv
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.5
+    type: counter
+    help: 'TCP SYN cookies: ACKs to cookies received, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.5'
+  - name: panFlowDosClSyncookieBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.6
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for cl -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.6'
+  - name: panFlowDosClSyncookieMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.7
+    type: counter
+    help: 'Packet dropped: SYN cookies maximum threshold reached, classified pro -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.7'
+  - name: panFlowDosClSyncookieSent
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.8
+    type: counter
+    help: 'TCP SYN cookies: cookies sent, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.8'
+  - name: panFlowMeterVsysThrottle
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.9
+    type: counter
+    help: 'Session metering: sessions throttled by vsys configuration - 1.3.6.1.4.1.25461.2.1.2.1.19.8.9'
+  - name: panFlowPolicyDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.10
+    type: counter
+    help: 'Session setup: denied by policy - 1.3.6.1.4.1.25461.2.1.2.1.19.8.10'
+  - name: panFlowPolicyNat
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.11
+    type: counter
+    help: 'Session setup: source NAT IP/port allocation error - 1.3.6.1.4.1.25461.2.1.2.1.19.8.11'
+  - name: panFlowScanDrop
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.12
+    type: counter
+    help: 'Session setup: denied by scan detection - 1.3.6.1.4.1.25461.2.1.2.1.19.8.12'
+  - name: panFlowDosDropIpBlocked
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.13
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration by oth -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.13'
+  - name: panFlowDosRedIcmp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.14
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''icmp'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.14'
+  - name: panFlowDosRedIcmp6
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.15
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''icmpv6'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.15'
+  - name: panFlowDosRedIp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.16
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''other-ip'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.16'
+  - name: panFlowDosRedTcp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.17
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''tcp-syn'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.17'
+  - name: panFlowDosRedUdp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.18
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''udp'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.18'
+  - name: panFlowDosRuleAgBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.19
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for ag -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.19'
+  - name: panFlowDosRuleAgRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.20
+    type: counter
+    help: 'Packets dropped: Activate aggregate RED threshold reached, random ear -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.20'
+  - name: panFlowDosRuleAgRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.21
+    type: counter
+    help: 'Packets dropped: Maximal aggregate RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.21'
+  - name: panFlowDosRuleDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.22
+    type: counter
+    help: 'Packets dropped: Denied action by DoS policy - 1.3.6.1.4.1.25461.2.1.2.1.19.8.22'
+  - name: panFlowDosRuleDrop
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.23
+    type: counter
+    help: 'Packets dropped: Rate limited or IP blocked - 1.3.6.1.4.1.25461.2.1.2.1.19.8.23'
+  - name: panFlowDosRuleDropAggr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.24
+    type: counter
+    help: 'Packets dropped: due to aggregate rate limiting - 1.3.6.1.4.1.25461.2.1.2.1.19.8.24'
+  - name: panFlowDosRuleDropClBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.25
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for cl -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.25'
+  - name: panFlowDosRuleDropClRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.26
+    type: counter
+    help: 'Packets dropped: Activate classified RED threshold reached, random ea -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.26'
+  - name: panFlowDosRuleDropClRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.27
+    type: counter
+    help: 'Packets dropped: Maximal classified RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.27'
+  - name: panFlowDosRuleDropClassified
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.28
+    type: counter
+    help: 'Packets dropped: due to classified rate limiting - 1.3.6.1.4.1.25461.2.1.2.1.19.8.28'
+  - name: panFlowDosSyncookieBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.29
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for ag -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.29'
+  - name: panFlowDosSyncookieMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.30
+    type: counter
+    help: 'Packet dropped: SYN cookies maximum threshold reached, aggregate prof -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.30'
+  - name: panFlowDosZoneRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.31
+    type: counter
+    help: 'Packets dropped: Activate zone RED threshold reached, random early dr -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.31'
+  - name: panFlowDosZoneRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.32
+    type: counter
+    help: 'Packets dropped: Maximal zone RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.32'
+  - name: panFlowFwdL3TtlZero
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.1
+    type: counter
+    help: 'Packets dropped: IP TTL reaches zero - 1.3.6.1.4.1.25461.2.1.2.1.19.9.1'
+  - name: panFlowMeterHostThrottle
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.2
+    type: counter
+    help: 'Session metering: sessions throttled by management session threshold -
+      1.3.6.1.4.1.25461.2.1.2.1.19.9.2'
+  - name: panFlowHostServiceDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.3
+    type: counter
+    help: Device management session denied - 1.3.6.1.4.1.25461.2.1.2.1.19.9.3
+  - name: panFlowHostServiceUnknown
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.4
+    type: counter
+    help: 'Session discarded: unknown application to control plane - 1.3.6.1.4.1.25461.2.1.2.1.19.9.4'
+  - name: panPktAllocFailure
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.5
+    type: counter
+    help: Packet allocation error - 1.3.6.1.4.1.25461.2.1.2.1.19.9.5
+  - name: panPktAllocFailureCos
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.6
+    type: counter
+    help: Packet allocation error due to QoS control - 1.3.6.1.4.1.25461.2.1.2.1.19.9.6
+  - name: panSessionDiscard
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.7
+    type: counter
+    help: Session set to discard by security policy check - 1.3.6.1.4.1.25461.2.1.2.1.19.9.7
+  - name: panFlowIpfragFragErr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.10.1
+    type: counter
+    help: 'Packet dropped: IP fragmentation error - 1.3.6.1.4.1.25461.2.1.2.1.19.10.1'
+  - name: panFlowIpfragRecv
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.10.2
+    type: counter
+    help: IP fragments received - 1.3.6.1.4.1.25461.2.1.2.1.19.10.2
+  - name: panTcpAllocWqeFailed
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.1
+    type: counter
+    help: wqe allocation failure in tcp - 1.3.6.1.4.1.25461.2.1.2.1.19.11.1
+  - name: panTcpDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.2
+    type: counter
+    help: session denied because of failure in tcp reassembly - 1.3.6.1.4.1.25461.2.1.2.1.19.11.2
+  - name: panTcpDropOutOfWnd
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.3
+    type: counter
+    help: out-of-window packets dropped - 1.3.6.1.4.1.25461.2.1.2.1.19.11.3
+  - name: panTcpDropPacket
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.4
+    type: counter
+    help: packets dropped because of failure in tcp reassembly - 1.3.6.1.4.1.25461.2.1.2.1.19.11.4
+  - name: panFlowActionClose
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.5
+    type: counter
+    help: TCP sessions closed via injecting RST - 1.3.6.1.4.1.25461.2.1.2.1.19.11.5
+  - name: panFlowActionReset
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.6
+    type: counter
+    help: TCP clients reset via responding RST - 1.3.6.1.4.1.25461.2.1.2.1.19.11.6
+  - name: panFlowTcpNonSyn
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.7
+    type: counter
+    help: Non-SYN TCP packets without session match - 1.3.6.1.4.1.25461.2.1.2.1.19.11.7
+  - name: panTcpExceedSegLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.8
+    type: counter
+    help: packets dropped due to the limitation on global tcp out-of-order pack -
+      1.3.6.1.4.1.25461.2.1.2.1.19.11.8
+  - name: panSysSwVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.1
+    type: DisplayString
+    help: Full software version - 1.3.6.1.4.1.25461.2.1.2.1.1
+  - name: panSysHwVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.2
+    type: DisplayString
+    help: Hardware version of the unit. - 1.3.6.1.4.1.25461.2.1.2.1.2
+  - name: panSysSerialNumber
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.3
+    type: DisplayString
+    help: The serial number of the unit - 1.3.6.1.4.1.25461.2.1.2.1.3
+  - name: panSysTimeZoneOffset
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.4
+    type: gauge
+    help: The offset in seconds from UTC of the system's time zone - 1.3.6.1.4.1.25461.2.1.2.1.4
+  - name: panSysDaylightSaving
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.5
+    type: gauge
+    help: Whether daylight savings are in currently in effect for the system's time
+      zone. - 1.3.6.1.4.1.25461.2.1.2.1.5
+  - name: panSysVpnClientVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.6
+    type: DisplayString
+    help: Currently installed VPN client package version - 1.3.6.1.4.1.25461.2.1.2.1.6
+  - name: panSysAppVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.7
+    type: DisplayString
+    help: Currently installed application definition version - 1.3.6.1.4.1.25461.2.1.2.1.7
+  - name: panSysAvVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.8
+    type: DisplayString
+    help: Currently installed antivirus version - 1.3.6.1.4.1.25461.2.1.2.1.8
+  - name: panSysThreatVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.9
+    type: DisplayString
+    help: Currently installed threat definition version - 1.3.6.1.4.1.25461.2.1.2.1.9
+  - name: panSysUrlFilteringVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.10
+    type: DisplayString
+    help: Currently installed URL filtering version - 1.3.6.1.4.1.25461.2.1.2.1.10
+  - name: panSysHAState
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.11
+    type: DisplayString
+    help: Current high-availability state. - 1.3.6.1.4.1.25461.2.1.2.1.11
+  - name: panSysHAPeerState
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.12
+    type: DisplayString
+    help: Current peer high-availability state. - 1.3.6.1.4.1.25461.2.1.2.1.12
+  - name: panSysHAMode
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.13
+    type: DisplayString
+    help: Current high-availability mode (disabled, active-passive, or active-active).
+      - 1.3.6.1.4.1.25461.2.1.2.1.13
+  - name: panSysUrlFilteringDatabase
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.14
+    type: DisplayString
+    help: Current installed URL filtering database (surfcontrol, brightcloud, etc)
+      - 1.3.6.1.4.1.25461.2.1.2.1.14
+  - name: panSysGlobalProtectClientVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.15
+    type: DisplayString
+    help: Currently installed global-protect client package version - 1.3.6.1.4.1.25461.2.1.2.1.15
+  - name: panSysOpswatDatafileVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.16
+    type: DisplayString
+    help: Currently installed opswat database version - 1.3.6.1.4.1.25461.2.1.2.1.16
+  - name: panSysWildfireVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.17
+    type: DisplayString
+    help: Currently installed wildfire content version - 1.3.6.1.4.1.25461.2.1.2.1.17
+  - name: panSysWildfirePrivateCloudVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.18
+    type: DisplayString
+    help: Currently installed wildfire private cloud content version - 1.3.6.1.4.1.25461.2.1.2.1.18
+  - name: panSessionUtilization
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.1
+    type: gauge
+    help: Session table utilization percentage - 1.3.6.1.4.1.25461.2.1.2.3.1
+  - name: panSessionMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.2
+    type: gauge
+    help: Total number of sessions supported. - 1.3.6.1.4.1.25461.2.1.2.3.2
+  - name: panSessionActive
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.3
+    type: gauge
+    help: Total number of active sessions. - 1.3.6.1.4.1.25461.2.1.2.3.3
+  - name: panSessionActiveTcp
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.4
+    type: gauge
+    help: Total number of active TCP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.4
+  - name: panSessionActiveUdp
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.5
+    type: gauge
+    help: Total number of active UDP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.5
+  - name: panSessionActiveICMP
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.6
+    type: gauge
+    help: Total number of active ICMP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.6
+  - name: panSessionActiveSslProxy
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.7
+    type: gauge
+    help: Total number of active SSL proxy sessions. - 1.3.6.1.4.1.25461.2.1.2.3.7
+  - name: panSessionSslProxyUtilization
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.8
+    type: gauge
+    help: SSL proxy Session utilization percentage - 1.3.6.1.4.1.25461.2.1.2.3.8
+  - name: panVsysId
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.1
+    type: gauge
+    help: Vsys id - 1.3.6.1.4.1.25461.2.1.2.3.9.1.1
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysName
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.2
+    type: DisplayString
+    help: User assigned vsys name (empty string if not available) - 1.3.6.1.4.1.25461.2.1.2.3.9.1.2
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysSessionUtilizationPct
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.3
+    type: gauge
+    help: Vsys utilization percentage, if session limit is configured - 1.3.6.1.4.1.25461.2.1.2.3.9.1.3
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysActiveSessions
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.4
+    type: gauge
+    help: Active sessions on this Vsys - 1.3.6.1.4.1.25461.2.1.2.3.9.1.4
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysMaxSessions
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.5
+    type: gauge
+    help: Max sessions on this Vsys, if session limit is configured - 1.3.6.1.4.1.25461.2.1.2.3.9.1.5
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panGPGWUtilizationPct
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.1
+    type: gauge
+    help: GlobalProtect Gateway utilization percentage - 1.3.6.1.4.1.25461.2.1.2.5.1.1
+  - name: panGPGWUtilizationMaxTunnels
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.2
+    type: gauge
+    help: Max tunnels allowed - 1.3.6.1.4.1.25461.2.1.2.5.1.2
+  - name: panGPGWUtilizationActiveTunnels
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.3
+    type: gauge
+    help: Number of active tunnels - 1.3.6.1.4.1.25461.2.1.2.5.1.3
+servertech_sentry3:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.4.1.1718.3.2.2
+  - 1.3.6.1.4.1.1718.3.2.3
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: infeedIndex
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.1
+    type: gauge
+    help: Index for the input feed table. - 1.3.6.1.4.1.1718.3.2.2.1.1
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.2
+    type: DisplayString
+    help: The ID of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.2
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedName
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.3
+    type: DisplayString
+    help: The name of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.3
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapabilities
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.4
+    type: OctetString
+    help: The capabilities of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.4
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedStatus
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.5
+    type: gauge
+    help: The status of the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.5
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadStatus
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.6
+    type: gauge
+    help: The status of the load measured on the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.6
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadValue
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.7
+    type: gauge
+    help: The load measured on the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.7
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadHighThresh
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.8
+    type: gauge
+    help: The load high threshold value of the input feed line in Amps. - 1.3.6.1.4.1.1718.3.2.2.1.8
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedOutletCount
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.9
+    type: gauge
+    help: The number of controlled and/or monitored outlets on the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.9
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapacity
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.10
+    type: gauge
+    help: The load capacity of the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.10
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.11
+    type: gauge
+    help: The line-to-line voltage of the input feed - 1.3.6.1.4.1.1718.3.2.2.1.11
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPower
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.12
+    type: gauge
+    help: The active power consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.12
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedApparentPower
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.13
+    type: gauge
+    help: The apparent power consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.13
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPowerFactor
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.14
+    type: gauge
+    help: The power factor of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.14
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCrestFactor
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.15
+    type: gauge
+    help: The crest factor for the load of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.15
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedEnergy
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.16
+    type: gauge
+    help: The energy consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.16
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedReactance
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.17
+    type: gauge
+    help: The characterization of the phase relation between the voltage and current
+      of the input feed phase. - 1.3.6.1.4.1.1718.3.2.2.1.17
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.18
+    type: gauge
+    help: The voltage measured for the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.18
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseCurrent
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.19
+    type: gauge
+    help: The current measured for the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.19
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapacityUsed
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.20
+    type: gauge
+    help: The used percentage of the input feed line load capacity (infeedLoadValue
+      / infeedCapacity x 100) - 1.3.6.1.4.1.1718.3.2.2.1.20
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLineID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.21
+    type: DisplayString
+    help: The ID of the input feed line. - 1.3.6.1.4.1.1718.3.2.2.1.21
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLineToLineID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.22
+    type: DisplayString
+    help: The line-to-line ID of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.22
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.23
+    type: DisplayString
+    help: The ID of the input feed phase. - 1.3.6.1.4.1.1718.3.2.2.1.23
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVACapacity
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.24
+    type: gauge
+    help: The apparent power capacity of the input feed circuit - 1.3.6.1.4.1.1718.3.2.2.1.24
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVACapacityUsed
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.25
+    type: gauge
+    help: The used percentage of the input feed circuit apparent power capacity (infeedApparentPower
+      / infeedVACapacity x 100) - 1.3.6.1.4.1.1718.3.2.2.1.25
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: outletIndex
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.1
+    type: gauge
+    help: Index for the outlet table. - 1.3.6.1.4.1.1718.3.2.3.1.1
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletID
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.2
+    type: DisplayString
+    help: The ID of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.2
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletName
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.3
+    type: DisplayString
+    help: The name of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.3
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCapabilities
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.4
+    type: OctetString
+    help: The capabilities of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.4
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletStatus
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.5
+    type: gauge
+    help: The status of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.5
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadStatus
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.6
+    type: gauge
+    help: The status of the load measured on the outlet - 1.3.6.1.4.1.1718.3.2.3.1.6
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadValue
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.7
+    type: gauge
+    help: The load measured on the outlet - 1.3.6.1.4.1.1718.3.2.3.1.7
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadLowThresh
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.8
+    type: gauge
+    help: The load low threshold value of the outlet in Amps. - 1.3.6.1.4.1.1718.3.2.3.1.8
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadHighThresh
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.9
+    type: gauge
+    help: The load high threshold value of the outlet in Amps. - 1.3.6.1.4.1.1718.3.2.3.1.9
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletControlState
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.10
+    type: gauge
+    help: The control state of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.10
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletControlAction
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.11
+    type: gauge
+    help: An action to change the control state of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.11
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCapacity
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.12
+    type: gauge
+    help: The load capacity of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.12
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.13
+    type: gauge
+    help: The voltage of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.13
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPower
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.14
+    type: gauge
+    help: The active power consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.14
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletApparentPower
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.15
+    type: gauge
+    help: The apparent power consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.15
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPowerFactor
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.16
+    type: gauge
+    help: The power factor of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.16
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCrestFactor
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.17
+    type: gauge
+    help: The crest factor for the load of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.17
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletEnergy
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.18
+    type: gauge
+    help: The energy consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.18
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletWakeupState
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.19
+    type: gauge
+    help: The wakeup state of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.19
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPostOnDelay
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.20
+    type: gauge
+    help: The post-on delay of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.20
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+synology:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.2021.10.1.2
+  - 1.3.6.1.4.1.2021.10.1.5
+  - 1.3.6.1.4.1.2021.11.10
+  - 1.3.6.1.4.1.2021.11.11
+  - 1.3.6.1.4.1.2021.11.9
+  - 1.3.6.1.4.1.2021.4
+  - 1.3.6.1.4.1.6574.1
+  - 1.3.6.1.4.1.6574.101
+  - 1.3.6.1.4.1.6574.102
+  - 1.3.6.1.4.1.6574.104
+  - 1.3.6.1.4.1.6574.2
+  - 1.3.6.1.4.1.6574.3
+  - 1.3.6.1.4.1.6574.4
+  - 1.3.6.1.4.1.6574.5
+  - 1.3.6.1.4.1.6574.6
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: laNames
+    oid: 1.3.6.1.4.1.2021.10.1.2
+    type: DisplayString
+    help: The list of loadave names we're watching. - 1.3.6.1.4.1.2021.10.1.2
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laLoadInt
+    oid: 1.3.6.1.4.1.2021.10.1.5
+    type: gauge
+    help: The 1,5 and 15 minute load averages as an integer - 1.3.6.1.4.1.2021.10.1.5
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: ssCpuSystem
+    oid: 1.3.6.1.4.1.2021.11.10
+    type: gauge
+    help: The percentage of CPU time spent processing system-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.10
+  - name: ssCpuIdle
+    oid: 1.3.6.1.4.1.2021.11.11
+    type: gauge
+    help: The percentage of processor time spent idle, calculated over the last minute
+      - 1.3.6.1.4.1.2021.11.11
+  - name: ssCpuUser
+    oid: 1.3.6.1.4.1.2021.11.9
+    type: gauge
+    help: The percentage of CPU time spent processing user-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.9
+  - name: memIndex
+    oid: 1.3.6.1.4.1.2021.4.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.4.1
+  - name: memErrorName
+    oid: 1.3.6.1.4.1.2021.4.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.4.2
+  - name: memTotalSwap
+    oid: 1.3.6.1.4.1.2021.4.3
+    type: gauge
+    help: The total amount of swap space configured for this host. - 1.3.6.1.4.1.2021.4.3
+  - name: memAvailSwap
+    oid: 1.3.6.1.4.1.2021.4.4
+    type: gauge
+    help: The amount of swap space currently unused or available. - 1.3.6.1.4.1.2021.4.4
+  - name: memTotalReal
+    oid: 1.3.6.1.4.1.2021.4.5
+    type: gauge
+    help: The total amount of real/physical memory installed on this host. - 1.3.6.1.4.1.2021.4.5
+  - name: memAvailReal
+    oid: 1.3.6.1.4.1.2021.4.6
+    type: gauge
+    help: The amount of real/physical memory currently unused or available. - 1.3.6.1.4.1.2021.4.6
+  - name: memTotalSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.7
+    type: gauge
+    help: The total amount of swap space or virtual memory allocated for text pages
+      on this host - 1.3.6.1.4.1.2021.4.7
+  - name: memAvailSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.8
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.8
+  - name: memTotalRealTXT
+    oid: 1.3.6.1.4.1.2021.4.9
+    type: gauge
+    help: The total amount of real/physical memory allocated for text pages on this
+      host - 1.3.6.1.4.1.2021.4.9
+  - name: memAvailRealTXT
+    oid: 1.3.6.1.4.1.2021.4.10
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.10
+  - name: memTotalFree
+    oid: 1.3.6.1.4.1.2021.4.11
+    type: gauge
+    help: The total amount of memory free or available for use on this host - 1.3.6.1.4.1.2021.4.11
+  - name: memMinimumSwap
+    oid: 1.3.6.1.4.1.2021.4.12
+    type: gauge
+    help: The minimum amount of swap space expected to be kept free or available during
+      normal operation of this host - 1.3.6.1.4.1.2021.4.12
+  - name: memShared
+    oid: 1.3.6.1.4.1.2021.4.13
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      shared memory - 1.3.6.1.4.1.2021.4.13
+  - name: memBuffer
+    oid: 1.3.6.1.4.1.2021.4.14
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      memory buffers - 1.3.6.1.4.1.2021.4.14
+  - name: memCached
+    oid: 1.3.6.1.4.1.2021.4.15
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      cached memory - 1.3.6.1.4.1.2021.4.15
+  - name: memUsedSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.16
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.16
+  - name: memUsedRealTXT
+    oid: 1.3.6.1.4.1.2021.4.17
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.17
+  - name: memSwapError
+    oid: 1.3.6.1.4.1.2021.4.100
+    type: gauge
+    help: Indicates whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.100
+  - name: memSwapErrorMsg
+    oid: 1.3.6.1.4.1.2021.4.101
+    type: DisplayString
+    help: Describes whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.101
+  - name: systemStatus
+    oid: 1.3.6.1.4.1.6574.1.1
+    type: gauge
+    help: Synology system status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.1
+  - name: temperature
+    oid: 1.3.6.1.4.1.6574.1.2
+    type: gauge
+    help: Synology system temperature The temperature of Disk Station uses Celsius
+      degree. - 1.3.6.1.4.1.6574.1.2
+  - name: powerStatus
+    oid: 1.3.6.1.4.1.6574.1.3
+    type: gauge
+    help: Synology power status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.3
+  - name: systemFanStatus
+    oid: 1.3.6.1.4.1.6574.1.4.1
+    type: gauge
+    help: Synology system fan status Each meanings of status represented describe
+      below - 1.3.6.1.4.1.6574.1.4.1
+  - name: cpuFanStatus
+    oid: 1.3.6.1.4.1.6574.1.4.2
+    type: gauge
+    help: Synology cpu fan status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.4.2
+  - name: modelName
+    oid: 1.3.6.1.4.1.6574.1.5.1
+    type: OctetString
+    help: The Model name of this NAS - 1.3.6.1.4.1.6574.1.5.1
+  - name: serialNumber
+    oid: 1.3.6.1.4.1.6574.1.5.2
+    type: OctetString
+    help: The serial number of this NAS - 1.3.6.1.4.1.6574.1.5.2
+  - name: version
+    oid: 1.3.6.1.4.1.6574.1.5.3
+    type: OctetString
+    help: The version of this DSM - 1.3.6.1.4.1.6574.1.5.3
+  - name: upgradeAvailable
+    oid: 1.3.6.1.4.1.6574.1.5.4
+    type: gauge
+    help: This oid is for checking whether there is a latest DSM can be upgraded -
+      1.3.6.1.4.1.6574.1.5.4
+  - name: storageIOIndex
+    oid: 1.3.6.1.4.1.6574.101.1.1.1
+    type: gauge
+    help: Reference index for each observed device. - 1.3.6.1.4.1.6574.101.1.1.1
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIODevice
+    oid: 1.3.6.1.4.1.6574.101.1.1.2
+    type: DisplayString
+    help: The name of the device we are counting/checking. - 1.3.6.1.4.1.6574.101.1.1.2
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONRead
+    oid: 1.3.6.1.4.1.6574.101.1.1.3
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.3
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONWritten
+    oid: 1.3.6.1.4.1.6574.101.1.1.4
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.4
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOReads
+    oid: 1.3.6.1.4.1.6574.101.1.1.5
+    type: counter
+    help: The number of read accesses from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.5
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOWrites
+    oid: 1.3.6.1.4.1.6574.101.1.1.6
+    type: counter
+    help: The number of write accesses to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.6
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA
+    oid: 1.3.6.1.4.1.6574.101.1.1.8
+    type: gauge
+    help: The load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.8
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA1
+    oid: 1.3.6.1.4.1.6574.101.1.1.9
+    type: gauge
+    help: The 1 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.9
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA5
+    oid: 1.3.6.1.4.1.6574.101.1.1.10
+    type: gauge
+    help: The 5 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.10
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA15
+    oid: 1.3.6.1.4.1.6574.101.1.1.11
+    type: gauge
+    help: The 15 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.11
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONReadX
+    oid: 1.3.6.1.4.1.6574.101.1.1.12
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.12
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONWrittenX
+    oid: 1.3.6.1.4.1.6574.101.1.1.13
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.13
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: spaceIOIndex
+    oid: 1.3.6.1.4.1.6574.102.1.1.1
+    type: gauge
+    help: Reference index for each observed device. - 1.3.6.1.4.1.6574.102.1.1.1
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIODevice
+    oid: 1.3.6.1.4.1.6574.102.1.1.2
+    type: DisplayString
+    help: The name of the device we are counting/checking. - 1.3.6.1.4.1.6574.102.1.1.2
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONRead
+    oid: 1.3.6.1.4.1.6574.102.1.1.3
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.3
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONWritten
+    oid: 1.3.6.1.4.1.6574.102.1.1.4
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.4
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOReads
+    oid: 1.3.6.1.4.1.6574.102.1.1.5
+    type: counter
+    help: The number of read accesses from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.5
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOWrites
+    oid: 1.3.6.1.4.1.6574.102.1.1.6
+    type: counter
+    help: The number of write accesses to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.6
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA
+    oid: 1.3.6.1.4.1.6574.102.1.1.8
+    type: gauge
+    help: The load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.8
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA1
+    oid: 1.3.6.1.4.1.6574.102.1.1.9
+    type: gauge
+    help: The 1 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.9
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA5
+    oid: 1.3.6.1.4.1.6574.102.1.1.10
+    type: gauge
+    help: The 5 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.10
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA15
+    oid: 1.3.6.1.4.1.6574.102.1.1.11
+    type: gauge
+    help: The 15 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.11
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONReadX
+    oid: 1.3.6.1.4.1.6574.102.1.1.12
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.12
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONWrittenX
+    oid: 1.3.6.1.4.1.6574.102.1.1.13
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.13
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: iSCSILUNInfoIndex
+    oid: 1.3.6.1.4.1.6574.104.1.1.1
+    type: gauge
+    help: LUN info index - 1.3.6.1.4.1.6574.104.1.1.1
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNUUID
+    oid: 1.3.6.1.4.1.6574.104.1.1.2
+    type: OctetString
+    help: LUN uuid - 1.3.6.1.4.1.6574.104.1.1.2
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNName
+    oid: 1.3.6.1.4.1.6574.104.1.1.3
+    type: OctetString
+    help: LUN name - 1.3.6.1.4.1.6574.104.1.1.3
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputReadHigh
+    oid: 1.3.6.1.4.1.6574.104.1.1.4
+    type: gauge
+    help: LUN read throughput over 32 bits part - 1.3.6.1.4.1.6574.104.1.1.4
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputReadLow
+    oid: 1.3.6.1.4.1.6574.104.1.1.5
+    type: gauge
+    help: LUN read throughput in unsigned 32 bit - 1.3.6.1.4.1.6574.104.1.1.5
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputWriteHigh
+    oid: 1.3.6.1.4.1.6574.104.1.1.6
+    type: gauge
+    help: LUN write throughput over 32 bits part - 1.3.6.1.4.1.6574.104.1.1.6
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputWriteLow
+    oid: 1.3.6.1.4.1.6574.104.1.1.7
+    type: gauge
+    help: LUN write throughput in unsigned 32 bit - 1.3.6.1.4.1.6574.104.1.1.7
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIopsRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.8
+    type: gauge
+    help: LUN read iops - 1.3.6.1.4.1.6574.104.1.1.8
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIopsWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.9
+    type: gauge
+    help: LUN write iops - 1.3.6.1.4.1.6574.104.1.1.9
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNDiskLatencyRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.10
+    type: gauge
+    help: LUN disk latency when reading - 1.3.6.1.4.1.6574.104.1.1.10
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNDiskLatencyWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.11
+    type: gauge
+    help: LUN disk latency when writing - 1.3.6.1.4.1.6574.104.1.1.11
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNNetworkLatencyTx
+    oid: 1.3.6.1.4.1.6574.104.1.1.12
+    type: gauge
+    help: LUN transfer data network latency - 1.3.6.1.4.1.6574.104.1.1.12
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNNetworkLatencyRx
+    oid: 1.3.6.1.4.1.6574.104.1.1.13
+    type: gauge
+    help: LUN receive data network latency - 1.3.6.1.4.1.6574.104.1.1.13
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIoSizeRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.14
+    type: gauge
+    help: LUN average io size when reading - 1.3.6.1.4.1.6574.104.1.1.14
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIoSizeWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.15
+    type: gauge
+    help: LUN average io size when writing - 1.3.6.1.4.1.6574.104.1.1.15
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNQueueDepth
+    oid: 1.3.6.1.4.1.6574.104.1.1.16
+    type: gauge
+    help: Num of iSCSI commands in LUN queue - 1.3.6.1.4.1.6574.104.1.1.16
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNType
+    oid: 1.3.6.1.4.1.6574.104.1.1.17
+    type: OctetString
+    help: LUN type - 1.3.6.1.4.1.6574.104.1.1.17
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: diskIndex
+    oid: 1.3.6.1.4.1.6574.2.1.1.1
+    type: gauge
+    help: The index of disk table - 1.3.6.1.4.1.6574.2.1.1.1
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskID
+    oid: 1.3.6.1.4.1.6574.2.1.1.2
+    type: OctetString
+    help: Synology disk ID The ID of disk is assigned by disk Station. - 1.3.6.1.4.1.6574.2.1.1.2
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskModel
+    oid: 1.3.6.1.4.1.6574.2.1.1.3
+    type: OctetString
+    help: Synology disk model name The disk model name will be showed here. - 1.3.6.1.4.1.6574.2.1.1.3
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskType
+    oid: 1.3.6.1.4.1.6574.2.1.1.4
+    type: OctetString
+    help: Synology disk type The type of disk will be showed here, including SATA,
+      SSD and so on. - 1.3.6.1.4.1.6574.2.1.1.4
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskStatus
+    oid: 1.3.6.1.4.1.6574.2.1.1.5
+    type: gauge
+    help: Synology disk status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.2.1.1.5
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskTemperature
+    oid: 1.3.6.1.4.1.6574.2.1.1.6
+    type: gauge
+    help: Synology disk temperature The temperature of each disk uses Celsius degree.
+      - 1.3.6.1.4.1.6574.2.1.1.6
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: raidIndex
+    oid: 1.3.6.1.4.1.6574.3.1.1.1
+    type: gauge
+    help: The index of raid table - 1.3.6.1.4.1.6574.3.1.1.1
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: raidName
+    oid: 1.3.6.1.4.1.6574.3.1.1.2
+    type: OctetString
+    help: Synology raid name The name of each raid will be showed here. - 1.3.6.1.4.1.6574.3.1.1.2
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: raidStatus
+    oid: 1.3.6.1.4.1.6574.3.1.1.3
+    type: gauge
+    help: Synology Raid status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.3.1.1.3
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: upsDeviceModel
+    oid: 1.3.6.1.4.1.6574.4.1.1
+    type: DisplayString
+    help: Device model - 1.3.6.1.4.1.6574.4.1.1
+  - name: upsDeviceManufacturer
+    oid: 1.3.6.1.4.1.6574.4.1.2
+    type: DisplayString
+    help: Device manufacturer - 1.3.6.1.4.1.6574.4.1.2
+  - name: upsDeviceSerial
+    oid: 1.3.6.1.4.1.6574.4.1.3
+    type: DisplayString
+    help: Device serial number. - 1.3.6.1.4.1.6574.4.1.3
+  - name: upsDeviceType
+    oid: 1.3.6.1.4.1.6574.4.1.4
+    type: DisplayString
+    help: Device type (ups, pdu, scd, psu) - 1.3.6.1.4.1.6574.4.1.4
+  - name: upsDeviceDescription
+    oid: 1.3.6.1.4.1.6574.4.1.5
+    type: DisplayString
+    help: Device description. - 1.3.6.1.4.1.6574.4.1.5
+  - name: upsDeviceContact
+    oid: 1.3.6.1.4.1.6574.4.1.6
+    type: DisplayString
+    help: Device administrator name. - 1.3.6.1.4.1.6574.4.1.6
+  - name: upsDeviceLocation
+    oid: 1.3.6.1.4.1.6574.4.1.7
+    type: DisplayString
+    help: Device physical location. - 1.3.6.1.4.1.6574.4.1.7
+  - name: upsDevicePart
+    oid: 1.3.6.1.4.1.6574.4.1.8
+    type: DisplayString
+    help: Device part number. - 1.3.6.1.4.1.6574.4.1.8
+  - name: upsDeviceMACAddr
+    oid: 1.3.6.1.4.1.6574.4.1.9
+    type: DisplayString
+    help: Physical network address of the device. - 1.3.6.1.4.1.6574.4.1.9
+  - name: upsInfoStatus
+    oid: 1.3.6.1.4.1.6574.4.2.1
+    type: DisplayString
+    help: UPS status. - 1.3.6.1.4.1.6574.4.2.1
+  - name: upsInfoAlarm
+    oid: 1.3.6.1.4.1.6574.4.2.2
+    type: DisplayString
+    help: UPS alarms - 1.3.6.1.4.1.6574.4.2.2
+  - name: upsInfoTime
+    oid: 1.3.6.1.4.1.6574.4.2.3
+    type: DisplayString
+    help: Internal UPS clock time - 1.3.6.1.4.1.6574.4.2.3
+  - name: upsInfoDate
+    oid: 1.3.6.1.4.1.6574.4.2.4
+    type: DisplayString
+    help: Internal UPS clock date - 1.3.6.1.4.1.6574.4.2.4
+  - name: upsInfoModel
+    oid: 1.3.6.1.4.1.6574.4.2.5
+    type: DisplayString
+    help: UPS model - 1.3.6.1.4.1.6574.4.2.5
+  - name: upsInfoMfrName
+    oid: 1.3.6.1.4.1.6574.4.2.6.1
+    type: DisplayString
+    help: UPS manufacturer - 1.3.6.1.4.1.6574.4.2.6.1
+  - name: upsInfoMfrDate
+    oid: 1.3.6.1.4.1.6574.4.2.6.2
+    type: DisplayString
+    help: UPS manufacturing date - 1.3.6.1.4.1.6574.4.2.6.2
+  - name: upsInfoSerial
+    oid: 1.3.6.1.4.1.6574.4.2.7
+    type: DisplayString
+    help: UPS serial number - 1.3.6.1.4.1.6574.4.2.7
+  - name: upsInfoVendorID
+    oid: 1.3.6.1.4.1.6574.4.2.8
+    type: DisplayString
+    help: Vendor ID for USB devices - 1.3.6.1.4.1.6574.4.2.8
+  - name: upsInfoProductID
+    oid: 1.3.6.1.4.1.6574.4.2.9
+    type: DisplayString
+    help: Product ID for USB devices - 1.3.6.1.4.1.6574.4.2.9
+  - name: upsInfoFirmwareName
+    oid: 1.3.6.1.4.1.6574.4.2.10.1
+    type: DisplayString
+    help: UPS firmware - 1.3.6.1.4.1.6574.4.2.10.1
+  - name: upsInfoFirmwareAux
+    oid: 1.3.6.1.4.1.6574.4.2.10.2
+    type: DisplayString
+    help: Auxiliary device firmware - 1.3.6.1.4.1.6574.4.2.10.2
+  - name: upsInfoID
+    oid: 1.3.6.1.4.1.6574.4.2.13
+    type: DisplayString
+    help: UPS system identifier - 1.3.6.1.4.1.6574.4.2.13
+  - name: upsInfoDelayStart
+    oid: 1.3.6.1.4.1.6574.4.2.14.1
+    type: gauge
+    help: Interval to wait before restarting the load (seconds) - 1.3.6.1.4.1.6574.4.2.14.1
+  - name: upsInfoDelayReboot
+    oid: 1.3.6.1.4.1.6574.4.2.14.2
+    type: gauge
+    help: Interval to wait before rebooting the UPS (seconds) - 1.3.6.1.4.1.6574.4.2.14.2
+  - name: upsInfoDelayShutdown
+    oid: 1.3.6.1.4.1.6574.4.2.14.3
+    type: gauge
+    help: Interval to wait after shutdown with delay command (seconds) - 1.3.6.1.4.1.6574.4.2.14.3
+  - name: upsInfoTimerStart
+    oid: 1.3.6.1.4.1.6574.4.2.15.1
+    type: gauge
+    help: Time before the load will be started (seconds) - 1.3.6.1.4.1.6574.4.2.15.1
+  - name: upsInfoTimerReboot
+    oid: 1.3.6.1.4.1.6574.4.2.15.2
+    type: gauge
+    help: Time before the load will be rebooted (seconds) - 1.3.6.1.4.1.6574.4.2.15.2
+  - name: upsInfoTimerShutdown
+    oid: 1.3.6.1.4.1.6574.4.2.15.3
+    type: gauge
+    help: Time before the load will be shutdown (seconds) - 1.3.6.1.4.1.6574.4.2.15.3
+  - name: upsInfoTestInterval
+    oid: 1.3.6.1.4.1.6574.4.2.16.1
+    type: gauge
+    help: Interval between self tests - 1.3.6.1.4.1.6574.4.2.16.1
+  - name: upsInfoTestResult
+    oid: 1.3.6.1.4.1.6574.4.2.16.2
+    type: DisplayString
+    help: Results of last self test - 1.3.6.1.4.1.6574.4.2.16.2
+  - name: upsInfoDisplayLanguage
+    oid: 1.3.6.1.4.1.6574.4.2.17
+    type: DisplayString
+    help: Language to use on front panel - 1.3.6.1.4.1.6574.4.2.17
+  - name: upsInfoContacts
+    oid: 1.3.6.1.4.1.6574.4.2.18
+    type: DisplayString
+    help: UPS external contact sensors - 1.3.6.1.4.1.6574.4.2.18
+  - name: upsInfoEffciency
+    oid: 1.3.6.1.4.1.6574.4.2.19
+    type: gauge
+    help: Efficiency of the UPS (ratio of the output current on the input current)
+      (percent) - 1.3.6.1.4.1.6574.4.2.19
+  - name: upsInfoBeeperStatus
+    oid: 1.3.6.1.4.1.6574.4.2.22
+    type: DisplayString
+    help: UPS beeper status (enabled, disabled or muted) - 1.3.6.1.4.1.6574.4.2.22
+  - name: upsInfoType
+    oid: 1.3.6.1.4.1.6574.4.2.23
+    type: DisplayString
+    help: UPS type - 1.3.6.1.4.1.6574.4.2.23
+  - name: upsInfoWatchdogStatus
+    oid: 1.3.6.1.4.1.6574.4.2.24
+    type: DisplayString
+    help: UPS watchdog status (enabled or disabled) - 1.3.6.1.4.1.6574.4.2.24
+  - name: upsInfoStartAuto
+    oid: 1.3.6.1.4.1.6574.4.2.25.1
+    type: DisplayString
+    help: UPS starts when mains is (re)applied - 1.3.6.1.4.1.6574.4.2.25.1
+  - name: upsInfoStartBattery
+    oid: 1.3.6.1.4.1.6574.4.2.25.2
+    type: DisplayString
+    help: Allow to start UPS from battery - 1.3.6.1.4.1.6574.4.2.25.2
+  - name: upsInfoStartReboot
+    oid: 1.3.6.1.4.1.6574.4.2.25.3
+    type: DisplayString
+    help: UPS coldstarts from battery (enabled or disabled) - 1.3.6.1.4.1.6574.4.2.25.3
+  - name: upsBatteryRuntimeValue
+    oid: 1.3.6.1.4.1.6574.4.3.6.1
+    type: gauge
+    help: Battery runtime (seconds) - 1.3.6.1.4.1.6574.4.3.6.1
+  - name: upsBatteryRuntimeLow
+    oid: 1.3.6.1.4.1.6574.4.3.6.2
+    type: gauge
+    help: Remaining battery runtime when UPS switches to LB (seconds) - 1.3.6.1.4.1.6574.4.3.6.2
+  - name: upsBatteryRuntimeRestart
+    oid: 1.3.6.1.4.1.6574.4.3.6.3
+    type: gauge
+    help: Minimum battery runtime for UPS restart after power-off (seconds) - 1.3.6.1.4.1.6574.4.3.6.3
+  - name: upsBatteryAlarmThreshold
+    oid: 1.3.6.1.4.1.6574.4.3.7
+    type: DisplayString
+    help: Battery alarm threshold - 1.3.6.1.4.1.6574.4.3.7
+  - name: upsBatteryDate
+    oid: 1.3.6.1.4.1.6574.4.3.8
+    type: DisplayString
+    help: Battery change date - 1.3.6.1.4.1.6574.4.3.8
+  - name: upsBatteryMfrDate
+    oid: 1.3.6.1.4.1.6574.4.3.9
+    type: DisplayString
+    help: Battery manufacturing date - 1.3.6.1.4.1.6574.4.3.9
+  - name: upsBatteryPacks
+    oid: 1.3.6.1.4.1.6574.4.3.10
+    type: gauge
+    help: Number of battery packs - 1.3.6.1.4.1.6574.4.3.10
+  - name: upsBatteryPacksBad
+    oid: 1.3.6.1.4.1.6574.4.3.11
+    type: gauge
+    help: Number of bad battery packs - 1.3.6.1.4.1.6574.4.3.11
+  - name: upsBatteryType
+    oid: 1.3.6.1.4.1.6574.4.3.12
+    type: DisplayString
+    help: Battery chemistry - 1.3.6.1.4.1.6574.4.3.12
+  - name: upsBatteryProtection
+    oid: 1.3.6.1.4.1.6574.4.3.13
+    type: DisplayString
+    help: Prevent deep discharge of battery - 1.3.6.1.4.1.6574.4.3.13
+  - name: upsBatteryEnergySave
+    oid: 1.3.6.1.4.1.6574.4.3.14
+    type: DisplayString
+    help: Switch off when running on battery and no/low load - 1.3.6.1.4.1.6574.4.3.14
+  - name: upsInputVoltageExtend
+    oid: 1.3.6.1.4.1.6574.4.4.1.5
+    type: DisplayString
+    help: Extended input voltage range - 1.3.6.1.4.1.6574.4.4.1.5
+  - name: upsInputTransferReason
+    oid: 1.3.6.1.4.1.6574.4.4.2.1
+    type: DisplayString
+    help: Reason for last transfer to battery - 1.3.6.1.4.1.6574.4.4.2.1
+  - name: upsInputSensitivity
+    oid: 1.3.6.1.4.1.6574.4.4.3
+    type: DisplayString
+    help: Input power sensitivity - 1.3.6.1.4.1.6574.4.4.3
+  - name: upsInputQuality
+    oid: 1.3.6.1.4.1.6574.4.4.4
+    type: DisplayString
+    help: Input power quality - 1.3.6.1.4.1.6574.4.4.4
+  - name: upsInputFrequencyExtend
+    oid: 1.3.6.1.4.1.6574.4.4.6.5
+    type: DisplayString
+    help: Extended input frequency range - 1.3.6.1.4.1.6574.4.4.6.5
+  - name: upsAmbientTemperatureAlarm
+    oid: 1.3.6.1.4.1.6574.4.6.1.2
+    type: DisplayString
+    help: Temperature alarm (enabled/disabled) - 1.3.6.1.4.1.6574.4.6.1.2
+  - name: upsAmbientHumidityAlarm
+    oid: 1.3.6.1.4.1.6574.4.6.2.2
+    type: DisplayString
+    help: Relative humidity alarm (enabled/disabled) - 1.3.6.1.4.1.6574.4.6.2.2
+  - name: upsDriverName
+    oid: 1.3.6.1.4.1.6574.4.7.1
+    type: DisplayString
+    help: Driver name - 1.3.6.1.4.1.6574.4.7.1
+  - name: upsDriverVersion
+    oid: 1.3.6.1.4.1.6574.4.7.2
+    type: DisplayString
+    help: Driver version (NUT release) - 1.3.6.1.4.1.6574.4.7.2
+  - name: upsDriverVersionData
+    oid: 1.3.6.1.4.1.6574.4.7.3
+    type: DisplayString
+    help: Driver version data - 1.3.6.1.4.1.6574.4.7.3
+  - name: upsDriverVersionInternal
+    oid: 1.3.6.1.4.1.6574.4.7.4
+    type: DisplayString
+    help: Internal driver version (if tracked separately) - 1.3.6.1.4.1.6574.4.7.4
+  - name: upsDriverPollInterval
+    oid: 1.3.6.1.4.1.6574.4.7.5
+    type: gauge
+    help: Poll interval setup in configuration file - 1.3.6.1.4.1.6574.4.7.5
+  - name: upsDriverPort
+    oid: 1.3.6.1.4.1.6574.4.7.6
+    type: DisplayString
+    help: Port setup in configuration file - 1.3.6.1.4.1.6574.4.7.6
+  - name: upsDriverPollFrequency
+    oid: 1.3.6.1.4.1.6574.4.7.7
+    type: gauge
+    help: Poll frequency - 1.3.6.1.4.1.6574.4.7.7
+  - name: upsDriverProductID
+    oid: 1.3.6.1.4.1.6574.4.7.8
+    type: DisplayString
+    help: Product ID - 1.3.6.1.4.1.6574.4.7.8
+  - name: upsDriverSnmpVersion
+    oid: 1.3.6.1.4.1.6574.4.7.9
+    type: DisplayString
+    help: Snmp version - 1.3.6.1.4.1.6574.4.7.9
+  - name: upsServerInfo
+    oid: 1.3.6.1.4.1.6574.4.8.1
+    type: DisplayString
+    help: Server information - 1.3.6.1.4.1.6574.4.8.1
+  - name: upsServerVersion
+    oid: 1.3.6.1.4.1.6574.4.8.2
+    type: DisplayString
+    help: Server version - 1.3.6.1.4.1.6574.4.8.2
+  - name: diskSMARTInfoIndex
+    oid: 1.3.6.1.4.1.6574.5.1.1.1
+    type: gauge
+    help: SMART info index - 1.3.6.1.4.1.6574.5.1.1.1
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTInfoDevName
+    oid: 1.3.6.1.4.1.6574.5.1.1.2
+    type: OctetString
+    help: SMART info device name - 1.3.6.1.4.1.6574.5.1.1.2
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrName
+    oid: 1.3.6.1.4.1.6574.5.1.1.3
+    type: OctetString
+    help: SMART attribute name - 1.3.6.1.4.1.6574.5.1.1.3
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrId
+    oid: 1.3.6.1.4.1.6574.5.1.1.4
+    type: gauge
+    help: SMART attribute ID - 1.3.6.1.4.1.6574.5.1.1.4
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrCurrent
+    oid: 1.3.6.1.4.1.6574.5.1.1.5
+    type: gauge
+    help: SMART attribute current value - 1.3.6.1.4.1.6574.5.1.1.5
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrWorst
+    oid: 1.3.6.1.4.1.6574.5.1.1.6
+    type: gauge
+    help: SMART attribute worst value - 1.3.6.1.4.1.6574.5.1.1.6
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrThreshold
+    oid: 1.3.6.1.4.1.6574.5.1.1.7
+    type: gauge
+    help: SMART attribute threshold value - 1.3.6.1.4.1.6574.5.1.1.7
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrRaw
+    oid: 1.3.6.1.4.1.6574.5.1.1.8
+    type: gauge
+    help: SMART attribute raw value - 1.3.6.1.4.1.6574.5.1.1.8
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrStatus
+    oid: 1.3.6.1.4.1.6574.5.1.1.9
+    type: OctetString
+    help: SMART attribute status - 1.3.6.1.4.1.6574.5.1.1.9
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: serviceInfoIndex
+    oid: 1.3.6.1.4.1.6574.6.1.1.1
+    type: gauge
+    help: Service info index - 1.3.6.1.4.1.6574.6.1.1.1
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+  - name: serviceName
+    oid: 1.3.6.1.4.1.6574.6.1.1.2
+    type: OctetString
+    help: Service name - 1.3.6.1.4.1.6574.6.1.1.2
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+  - name: serviceUsers
+    oid: 1.3.6.1.4.1.6574.6.1.1.3
+    type: gauge
+    help: Number of users using this service - 1.3.6.1.4.1.6574.6.1.1.3
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+ubiquiti_airmax:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.41112.1.4
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ubntRadioIndex
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.1
+    type: gauge
+    help: Index for the ubntRadioTable - 1.3.6.1.4.1.41112.1.4.1.1.1
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioMode
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.2
+    type: gauge
+    help: Radio mode - 1.3.6.1.4.1.41112.1.4.1.1.2
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioCCode
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.3
+    type: gauge
+    help: Country code - 1.3.6.1.4.1.41112.1.4.1.1.3
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioFreq
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.4
+    type: gauge
+    help: Operating frequency - 1.3.6.1.4.1.41112.1.4.1.1.4
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioDfsEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.5
+    type: gauge
+    help: DFS status - 1.3.6.1.4.1.41112.1.4.1.1.5
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioTxPower
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.6
+    type: gauge
+    help: Transmit power - 1.3.6.1.4.1.41112.1.4.1.1.6
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioDistance
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.7
+    type: gauge
+    help: Distance - 1.3.6.1.4.1.41112.1.4.1.1.7
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioChainmask
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.8
+    type: gauge
+    help: Chainmask - 1.3.6.1.4.1.41112.1.4.1.1.8
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioAntenna
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.9
+    type: DisplayString
+    help: Antenna - 1.3.6.1.4.1.41112.1.4.1.1.9
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioRssiIndex
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.1
+    type: gauge
+    help: Index for the ubntRadioRssiTable - 1.3.6.1.4.1.41112.1.4.2.1.1
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssi
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.2
+    type: gauge
+    help: Data frames rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.2
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssiMgmt
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.3
+    type: gauge
+    help: Management frames rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.3
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssiExt
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.4
+    type: gauge
+    help: Extension channel rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.4
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntAirMaxIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.1
+    type: gauge
+    help: Index for the ubntAirMaxTable - 1.3.6.1.4.1.41112.1.4.6.1.1
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.2
+    type: gauge
+    help: airMAX status - on/off - 1.3.6.1.4.1.41112.1.4.6.1.2
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxQuality
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.3
+    type: gauge
+    help: airMAX quality - percentage - 1.3.6.1.4.1.41112.1.4.6.1.3
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.4
+    type: gauge
+    help: airMAX capacity - percentage - 1.3.6.1.4.1.41112.1.4.6.1.4
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxPriority
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.5
+    type: gauge
+    help: airMAX priority - none/high/low/medium - 1.3.6.1.4.1.41112.1.4.6.1.5
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxNoAck
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.6
+    type: gauge
+    help: airMAX NoACK mode - on/off - 1.3.6.1.4.1.41112.1.4.6.1.6
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirSyncIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.1
+    type: gauge
+    help: Index for the ubntAirSyncTable - 1.3.6.1.4.1.41112.1.4.3.1.1
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncMode
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.2
+    type: gauge
+    help: airSync mode - master/slave - 1.3.6.1.4.1.41112.1.4.3.1.2
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncCount
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.3
+    type: gauge
+    help: airSync client count - 1.3.6.1.4.1.41112.1.4.3.1.3
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncDownUtil
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.4
+    type: gauge
+    help: airSync down utilization - 1.3.6.1.4.1.41112.1.4.3.1.4
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncUpUtil
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.5
+    type: gauge
+    help: airSync up utilization - 1.3.6.1.4.1.41112.1.4.3.1.5
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSelIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.1
+    type: gauge
+    help: Index for the ubntAirSelTable - 1.3.6.1.4.1.41112.1.4.4.1.1
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntAirSelEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.2
+    type: gauge
+    help: airSelect status - on/off - 1.3.6.1.4.1.41112.1.4.4.1.2
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntAirSelInterval
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.3
+    type: gauge
+    help: airSelect hop interval (miliseconds) - 1.3.6.1.4.1.41112.1.4.4.1.3
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntWlStatIndex
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.1
+    type: gauge
+    help: Index for the ubntWlStatTable - 1.3.6.1.4.1.41112.1.4.5.1.1
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSsid
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.2
+    type: DisplayString
+    help: SSID - 1.3.6.1.4.1.41112.1.4.5.1.2
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatHideSsid
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.3
+    type: gauge
+    help: Hide SSID - on/off - 1.3.6.1.4.1.41112.1.4.5.1.3
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatApMac
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.4
+    type: PhysAddress48
+    help: AP MAC address - 1.3.6.1.4.1.41112.1.4.5.1.4
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSignal
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.5
+    type: gauge
+    help: Signal strength, dBm - 1.3.6.1.4.1.41112.1.4.5.1.5
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatRssi
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.6
+    type: gauge
+    help: RSSI, dBm - 1.3.6.1.4.1.41112.1.4.5.1.6
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatCcq
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.7
+    type: gauge
+    help: CCQ in % - 1.3.6.1.4.1.41112.1.4.5.1.7
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatNoiseFloor
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.8
+    type: gauge
+    help: Noise floor - 1.3.6.1.4.1.41112.1.4.5.1.8
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatTxRate
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.9
+    type: gauge
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.5.1.9
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatRxRate
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.10
+    type: gauge
+    help: RX rate - 1.3.6.1.4.1.41112.1.4.5.1.10
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSecurity
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.11
+    type: DisplayString
+    help: Wireless security mode - 1.3.6.1.4.1.41112.1.4.5.1.11
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatWdsEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.12
+    type: gauge
+    help: WDS - on/off - 1.3.6.1.4.1.41112.1.4.5.1.12
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatApRepeater
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.13
+    type: gauge
+    help: AP repeater - on/off - 1.3.6.1.4.1.41112.1.4.5.1.13
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatChanWidth
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.14
+    type: gauge
+    help: Channel Width - 1.3.6.1.4.1.41112.1.4.5.1.14
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatStaCount
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.15
+    type: gauge
+    help: Station count - 1.3.6.1.4.1.41112.1.4.5.1.15
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntStaMac
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.1
+    type: PhysAddress48
+    help: Station MAC address - 1.3.6.1.4.1.41112.1.4.7.1.1
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaName
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.2
+    type: DisplayString
+    help: Station name - 1.3.6.1.4.1.41112.1.4.7.1.2
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaSignal
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.3
+    type: gauge
+    help: Signal strength, dBm - 1.3.6.1.4.1.41112.1.4.7.1.3
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaNoiseFloor
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.4
+    type: gauge
+    help: Noise floor - 1.3.6.1.4.1.41112.1.4.7.1.4
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaDistance
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.5
+    type: gauge
+    help: Distance - 1.3.6.1.4.1.41112.1.4.7.1.5
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaCcq
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.6
+    type: gauge
+    help: CCQ in % - 1.3.6.1.4.1.41112.1.4.7.1.6
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmp
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.7
+    type: gauge
+    help: airMAX priority - 1.3.6.1.4.1.41112.1.4.7.1.7
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmq
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.8
+    type: gauge
+    help: airMAX quality - 1.3.6.1.4.1.41112.1.4.7.1.8
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmc
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.9
+    type: gauge
+    help: airMAX capacity - 1.3.6.1.4.1.41112.1.4.7.1.9
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaLastIp
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.10
+    type: IpAddr
+    help: Last known IP address - 1.3.6.1.4.1.41112.1.4.7.1.10
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxRate
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.11
+    type: gauge
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.7.1.11
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxRate
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.12
+    type: gauge
+    help: RX rate - 1.3.6.1.4.1.41112.1.4.7.1.12
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxBytes
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.13
+    type: counter
+    help: TX bytes - 1.3.6.1.4.1.41112.1.4.7.1.13
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxBytes
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.14
+    type: counter
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.7.1.14
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaConnTime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.15
+    type: gauge
+    help: Connection Time in seconds - 1.3.6.1.4.1.41112.1.4.7.1.15
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaLocalCINR
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.16
+    type: gauge
+    help: Local CINR - 1.3.6.1.4.1.41112.1.4.7.1.16
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.17
+    type: gauge
+    help: Uplink Capacity in Kbps - 1.3.6.1.4.1.41112.1.4.7.1.17
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.18
+    type: gauge
+    help: Downlink Capacity in Kbps - 1.3.6.1.4.1.41112.1.4.7.1.18
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxAirtime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.19
+    type: gauge
+    help: Uplink Airtime in % multiplied by 10 - 1.3.6.1.4.1.41112.1.4.7.1.19
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxAirtime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.20
+    type: gauge
+    help: Downlink Airtime in % multiplied by 10 - 1.3.6.1.4.1.41112.1.4.7.1.20
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxLatency
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.21
+    type: gauge
+    help: Uplink Latency in milliseconds - 1.3.6.1.4.1.41112.1.4.7.1.21
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntHostLocaltime
+    oid: 1.3.6.1.4.1.41112.1.4.8.1
+    type: DisplayString
+    help: Host local time - 1.3.6.1.4.1.41112.1.4.8.1
+  - name: ubntHostNetrole
+    oid: 1.3.6.1.4.1.41112.1.4.8.2
+    type: gauge
+    help: Radio mode - 1.3.6.1.4.1.41112.1.4.8.2
+  - name: ubntHostCpuLoad
+    oid: 1.3.6.1.4.1.41112.1.4.8.3
+    type: gauge
+    help: Host CPU load - 1.3.6.1.4.1.41112.1.4.8.3
+  - name: ubntHostTemperature
+    oid: 1.3.6.1.4.1.41112.1.4.8.4
+    type: gauge
+    help: Host system temperature - 1.3.6.1.4.1.41112.1.4.8.4
+ubiquiti_unifi:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.41112.1.6
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: unifiRadioIndex
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.1'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioName
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.2
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.2'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioRadio
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.3
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.3'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.4
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.4'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.5
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.5'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuTotal
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.6
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.6'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuSelfRx
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.7
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.7'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuSelfTx
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.8
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.8'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioOtherBss
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.9
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.9'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiVapIndex
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.1'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapBssId
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.2
+    type: PhysAddress48
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.2'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapCcq
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.3
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.3'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapChannel
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.4
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.4'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapExtChannel
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.5
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.5'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapEssId
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.6
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.6'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapName
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.7
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.7'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapNumStations
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.8
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.8'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRadio
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.9
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.9'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.10
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.10'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxCrypts
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.11
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.11'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.12
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.12'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxErrors
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.13
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.13'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxFrags
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.14
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.14'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.15
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.15'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.16
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.16'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.17
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.17'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxErrors
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.18
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.18'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.19
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.19'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxRetries
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.20
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.20'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxPower
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.21
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.21'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapUp
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.22
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.22'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapUsage
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.23
+    type: DisplayString
+    help: guest or regular user - 1.3.6.1.4.1.41112.1.6.1.2.1.23
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiIfIndex
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.1'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfFullDuplex
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.2
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.2'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfIp
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.3
+    type: IpAddr
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.3'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfMac
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.4
+    type: PhysAddress48
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.4'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfName
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.5
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.5'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.6
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.6'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.7
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.7'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxError
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.8
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.8'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxMulticast
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.9
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.9'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.10
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.10'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfSpeed
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.11
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.11'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.12
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.12'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.13
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.13'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxError
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.14
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.14'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.15
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.15'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfUp
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.16
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.16'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiApSystemIp
+    oid: 1.3.6.1.4.1.41112.1.6.3.1
+    type: IpAddr
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.1'
+  - name: unifiApSystemIsolated
+    oid: 1.3.6.1.4.1.41112.1.6.3.2
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.2'
+  - name: unifiApSystemModel
+    oid: 1.3.6.1.4.1.41112.1.6.3.3
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.3'
+  - name: unifiApSystemUplink
+    oid: 1.3.6.1.4.1.41112.1.6.3.4
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.4'
+  - name: unifiApSystemUptime
+    oid: 1.3.6.1.4.1.41112.1.6.3.5
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.5'
+  - name: unifiApSystemVersion
+    oid: 1.3.6.1.4.1.41112.1.6.3.6
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.6'
+

+ 9395 - 0
automation/monitoring/prometheus/snmp_ifalias.yml

@@ -0,0 +1,9395 @@
+apcups:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.4.1.318.1.1.1.12
+  - 1.3.6.1.4.1.318.1.1.1.2
+  - 1.3.6.1.4.1.318.1.1.1.3
+  - 1.3.6.1.4.1.318.1.1.1.4
+  - 1.3.6.1.4.1.318.1.1.1.7.2
+  - 1.3.6.1.4.1.318.1.1.1.8.1
+  - 1.3.6.1.4.1.318.1.1.10.2.3.2
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: upsOutletGroupStatusTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.1.1
+  - name: upsOutletGroupStatusIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+    type: DisplayString
+    help: The name of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusGroupState
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.3
+    type: gauge
+    help: Getting this variable will return the outlet group state - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.3
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusCommandPending
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.4
+    type: gauge
+    help: Getting this variable will return the command pending state of the outlet
+      group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.4
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.5
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.5
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupStatusGroupFullState
+    oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.6
+    type: DisplayString
+    help: An ASCII string containing the 32 flags representing the current state(s)
+      of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.6
+    indexes:
+    - labelname: upsOutletGroupStatusName
+      type: gauge
+    lookups:
+    - labels:
+      - upsOutletGroupStatusName
+      labelname: upsOutletGroupStatusName
+      oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2
+      type: DisplayString
+  - name: upsOutletGroupConfigTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.2.1
+  - name: upsOutletGroupConfigIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.1
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.2
+    type: DisplayString
+    help: The name of the outlet group. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.2
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigPowerOnDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.3
+    type: gauge
+    help: The amount of time (seconds) the outlet group will delay powering on when
+      the delayed on, reboot, or shutdown command is applied - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.3
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigPowerOffDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.4
+    type: gauge
+    help: The amount of time (seconds) the outlet group will delay powering off when
+      the delayed off, reboot, or shutdown command is applied - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.4
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigRebootDuration
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.5
+    type: gauge
+    help: During a reboot sequence, power is turned off and then back on - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.5
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigMinReturnRuntime
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.6
+    type: gauge
+    help: In an Outlet Group shutdown sequence, the Outlet Group cycles power off
+      then on - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.6
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.7
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.7
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlSkipOffDelay
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.8
+    type: gauge
+    help: Configures whether the outlet group's off delay setting (upsOutletGroupConfigPowerOffDelay)
+      will be used in a load shedding situation, where applicable. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.8
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlAutoRestart
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.9
+    type: gauge
+    help: Configures whether the outlet group will automatically restart after a load
+      shedding situation, where applicable. - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.9
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.10
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) after the
+      UPS's time on battery has exceeded the upsOutletGroupConfigLoadShedTimeOnBattery
+      OID setting - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.10
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlRuntimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.11
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) when the UPS
+      is on battery and the remaining runtime is less than the upsOutletGroupConfigLoadShedRuntimeRemaining
+      OID setting - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.11
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedControlInOverload
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.12
+    type: gauge
+    help: Configures whether the outlet group will load shed (turn off) when the UPS
+      is in an overload condition - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.12
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.13
+    type: gauge
+    help: When the UPS has been on battery for more time than this value, the outlet
+      group will turn off if this condition is enabled by the upsOutletGroupConfigLoadShedControlTimeOnBattery
+      OID - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.13
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupConfigLoadShedRuntimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.12.2.2.1.14
+    type: gauge
+    help: When the runtime remaining is less than this value, the outlet group will
+      turn off if this condition is enabled by the upsOutletGroupConfigLoadShedControlRuntimeRemaining
+      OID - 1.3.6.1.4.1.318.1.1.1.12.2.2.1.14
+    indexes:
+    - labelname: upsOutletGroupConfigIndex
+      type: gauge
+  - name: upsOutletGroupControlTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.1
+    type: gauge
+    help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.3.1
+  - name: upsOutletGroupControlIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.1
+    type: gauge
+    help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.1
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlName
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.2
+    type: DisplayString
+    help: The name of the outlet group - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.2
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlCommand
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.3
+    type: gauge
+    help: Getting this variable will return the outlet group state - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.3
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsOutletGroupControlOutletType
+    oid: 1.3.6.1.4.1.318.1.1.1.12.3.2.1.4
+    type: gauge
+    help: Getting this variable will return the type of outlet group - 1.3.6.1.4.1.318.1.1.1.12.3.2.1.4
+    indexes:
+    - labelname: upsOutletGroupControlIndex
+      type: gauge
+  - name: upsBasicBatteryStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.1
+    type: gauge
+    help: The status of the UPS batteries - 1.3.6.1.4.1.318.1.1.1.2.1.1
+  - name: upsBasicBatteryTimeOnBattery
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.2
+    type: gauge
+    help: The elapsed time since the UPS has switched to battery power. - 1.3.6.1.4.1.318.1.1.1.2.1.2
+  - name: upsBasicBatteryLastReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.1.3
+    type: DisplayString
+    help: The date when the UPS system's batteries were last replaced in mm/dd/yy
+      (or yyyy) format - 1.3.6.1.4.1.318.1.1.1.2.1.3
+  - name: upsAdvBatteryCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.1
+    type: gauge
+    help: The remaining battery capacity expressed in percent of full capacity. -
+      1.3.6.1.4.1.318.1.1.1.2.2.1
+  - name: upsAdvBatteryTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.2
+    type: gauge
+    help: The current internal UPS temperature expressed in Celsius. - 1.3.6.1.4.1.318.1.1.1.2.2.2
+  - name: upsAdvBatteryRunTimeRemaining
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.3
+    type: gauge
+    help: The UPS battery run time remaining before battery exhaustion. - 1.3.6.1.4.1.318.1.1.1.2.2.3
+  - name: upsAdvBatteryReplaceIndicator
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.4
+    type: gauge
+    help: Indicates whether the UPS batteries need replacing. - 1.3.6.1.4.1.318.1.1.1.2.2.4
+  - name: upsAdvBatteryNumOfBattPacks
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.5
+    type: gauge
+    help: The number of external battery packs connected to the UPS - 1.3.6.1.4.1.318.1.1.1.2.2.5
+  - name: upsAdvBatteryNumOfBadBattPacks
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.6
+    type: gauge
+    help: The number of external battery packs connected to the UPS that are defective
+      - 1.3.6.1.4.1.318.1.1.1.2.2.6
+  - name: upsAdvBatteryNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.7
+    type: gauge
+    help: The nominal battery voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.7
+  - name: upsAdvBatteryActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.8
+    type: gauge
+    help: The actual battery bus voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.8
+  - name: upsAdvBatteryCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.9
+    type: gauge
+    help: The battery current in Amps. - 1.3.6.1.4.1.318.1.1.1.2.2.9
+  - name: upsAdvTotalDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.10
+    type: gauge
+    help: The total DC current in Amps. - 1.3.6.1.4.1.318.1.1.1.2.2.10
+  - name: upsAdvBatteryFullCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.11
+    type: gauge
+    help: The full chargeable capacity of the battery which is expressed in percentage.
+      - 1.3.6.1.4.1.318.1.1.1.2.2.11
+  - name: upsAdvBatteryActualVoltageTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.1
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvBatteryActualVoltagePolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.2
+    type: gauge
+    help: The selected Battery Voltage Polarity - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.2
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvBatteryFrameActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.12.1.3
+    type: gauge
+    help: The actual battery bus voltage in Volts. - 1.3.6.1.4.1.318.1.1.1.2.2.12.1.3
+    indexes:
+    - labelname: upsAdvBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsAdvTotalDCCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.1
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvTotalDCCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.2
+    type: gauge
+    help: The selected Battery Current Polarity - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.2
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvTotalFrameDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.13.1.3
+    type: gauge
+    help: The Total DC Current of battery in Amperes. - 1.3.6.1.4.1.318.1.1.1.2.2.13.1.3
+    indexes:
+    - labelname: upsAdvTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.1
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.2
+    type: gauge
+    help: The battery frame identifier. - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.2
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.3
+    type: gauge
+    help: The selected Battery current polarity - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.3
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.14.1.4
+    type: gauge
+    help: The Battery current measured in Amperes - 1.3.6.1.4.1.318.1.1.1.2.2.14.1.4
+    indexes:
+    - labelname: upsAdvBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsAdvBatteryCurrentIndex
+      type: gauge
+  - name: upsAdvBatteryEstimatedChargeTime
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.15
+    type: gauge
+    help: The estimated remaining time required to charge the UPS to a full state
+      of charge. - 1.3.6.1.4.1.318.1.1.1.2.2.15
+  - name: upsAdvBatteryPower
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.16
+    type: gauge
+    help: The measured battery power in kW. - 1.3.6.1.4.1.318.1.1.1.2.2.16
+  - name: upsAdvBatteryChargerStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.17
+    type: gauge
+    help: The status of the battery charger - 1.3.6.1.4.1.318.1.1.1.2.2.17
+  - name: upsAdvBatteryInternalSKU
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.19
+    type: DisplayString
+    help: The SKU of the internal battery. - 1.3.6.1.4.1.318.1.1.1.2.2.19
+  - name: upsAdvBatteryExternalSKU
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.20
+    type: DisplayString
+    help: The SKU of the external battery. - 1.3.6.1.4.1.318.1.1.1.2.2.20
+  - name: upsAdvBatteryRecommendedReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.2.21
+    type: DisplayString
+    help: The recommended replacement date for the battery based on the UPS internal
+      battery life algorithm. - 1.3.6.1.4.1.318.1.1.1.2.2.21
+  - name: upsHighPrecBatteryCapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.1
+    type: gauge
+    help: The remaining battery capacity expressed in tenths of percent of full capacity.
+      - 1.3.6.1.4.1.318.1.1.1.2.3.1
+  - name: upsHighPrecBatteryTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.2
+    type: gauge
+    help: The current internal UPS temperature expressed in tenths of degrees Celsius.
+      - 1.3.6.1.4.1.318.1.1.1.2.3.2
+  - name: upsHighPrecBatteryNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.3
+    type: gauge
+    help: The nominal battery voltage in tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.3
+  - name: upsHighPrecBatteryActualVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.4
+    type: gauge
+    help: The actual battery bus voltage in tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.4
+  - name: upsHighPrecBatteryCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.5
+    type: gauge
+    help: The battery current in tenths of Amps. - 1.3.6.1.4.1.318.1.1.1.2.3.5
+  - name: upsHighPrecTotalDCCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.6
+    type: gauge
+    help: The total DC current in tenths of Amps. - 1.3.6.1.4.1.318.1.1.1.2.3.6
+  - name: upsHighPrecBatteryActualVoltageTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryActualVoltagePolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.2
+    type: gauge
+    help: The selected Battery Voltage polarity - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.7.1.3
+    type: gauge
+    help: The actual battery bus voltage expressed as tenths of Volts. - 1.3.6.1.4.1.318.1.1.1.2.3.7.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryActualVoltageTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.1
+    type: gauge
+    help: The Battery Frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.1
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.2
+    type: gauge
+    help: The selected Battery Current polarity - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.2
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecTotalDCFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.8.1.3
+    type: gauge
+    help: The total DC current in tenths of Amperes. - 1.3.6.1.4.1.318.1.1.1.2.3.8.1.3
+    indexes:
+    - labelname: upsHighPrecTotalDCCurrentTableIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentTableIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.1
+    type: gauge
+    help: The Battery frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.2
+    type: gauge
+    help: The Battery frame identifier - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryCurrentPolarity
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.3
+    type: gauge
+    help: The selected Battery Current polarity - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryFrameCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.9.1.4
+    type: gauge
+    help: The Battery current in tenths of Amperes. - 1.3.6.1.4.1.318.1.1.1.2.3.9.1.4
+    indexes:
+    - labelname: upsHighPrecBatteryCurrentTableIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCurrentIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackTableSize
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.1
+    type: gauge
+    help: The number of entries in the upsHighPrecBatteryPacks. - 1.3.6.1.4.1.318.1.1.1.2.3.10.1
+  - name: upsHighPrecBatteryPackIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.1
+    type: gauge
+    help: The battery pack identifier. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.1
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryCartridgeIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.2
+    type: gauge
+    help: The battery cartridge identifier. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.2
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackFirmwareRevision
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.3
+    type: DisplayString
+    help: The battery pack firmware revision. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.3
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackSerialNumber
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.4
+    type: DisplayString
+    help: The battery pack serial number. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.4
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.5
+    type: gauge
+    help: The battery pack temperature measured in 10ths of degree Celcius - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.5
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.6
+    type: OctetString
+    help: The battery status for the pack only - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.6
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeHealth
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.7
+    type: OctetString
+    help: The battery cartridge health - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.7
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeReplaceDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.8
+    type: DisplayString
+    help: The battery cartridge estimated battery replace date. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.8
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeInstallDate
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.9
+    type: DisplayString
+    help: The battery cartridge install date. - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.9
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryPackCartridgeStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.10
+    type: OctetString
+    help: The battery cartridge status - 1.3.6.1.4.1.318.1.1.1.2.3.10.2.1.10
+    indexes:
+    - labelname: upsHighPrecBatteryPackIndex
+      type: gauge
+    - labelname: upsHighPrecBatteryCartridgeIndex
+      type: gauge
+  - name: upsHighPrecBatteryHealth
+    oid: 1.3.6.1.4.1.318.1.1.1.2.3.11
+    type: OctetString
+    help: The battery health - 1.3.6.1.4.1.318.1.1.1.2.3.11
+  - name: upsBasicInputPhase
+    oid: 1.3.6.1.4.1.318.1.1.1.3.1.1
+    type: gauge
+    help: The current AC input phase. - 1.3.6.1.4.1.318.1.1.1.3.1.1
+  - name: upsAdvInputLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.1
+    type: gauge
+    help: The current utility line voltage in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.1
+  - name: upsAdvInputMaxLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.2
+    type: gauge
+    help: The maximum utility line voltage in VAC over the previous 1 minute period.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.2
+  - name: upsAdvInputMinLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.3
+    type: gauge
+    help: The minimum utility line voltage in VAC over the previous 1 minute period.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.3
+  - name: upsAdvInputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.4
+    type: gauge
+    help: The current input frequency to the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.4
+  - name: upsAdvInputLineFailCause
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.5
+    type: gauge
+    help: The reason for the occurrence of the last transfer to UPS battery power
+      - 1.3.6.1.4.1.318.1.1.1.3.2.5
+  - name: upsAdvInputNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.6
+    type: gauge
+    help: The nominal input frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.6
+  - name: upsAdvInputNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.7
+    type: gauge
+    help: The nominal input voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.7
+  - name: upsAdvInputBypassNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.8
+    type: gauge
+    help: The nominal bypass input frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.3.2.8
+  - name: upsAdvInputBypassNominalVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.9
+    type: gauge
+    help: The nominal bypass input voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.3.2.9
+  - name: upsAdvInputStatisticsIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.1
+    type: gauge
+    help: The input identifier. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.1
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.2
+    type: gauge
+    help: The input apparent power(sum of all of the three phases) measured in kVA.
+      - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.2
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputVoltageTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.3
+    type: gauge
+    help: The input voltage Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.3
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputBypassVoltageTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.4
+    type: gauge
+    help: The bypass input voltage Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.4
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.5
+    type: gauge
+    help: The input peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.5
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputBypassPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.6
+    type: gauge
+    help: The bypass input peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.6
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.10.1.7
+    type: gauge
+    help: The input active power measured in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.10.1.7
+    indexes:
+    - labelname: upsAdvInputStatisticsIndex
+      type: gauge
+  - name: upsAdvInputTotalApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.11
+    type: gauge
+    help: The input total apparent power(sum of all three phases) of the UPS system
+      in kVA. - 1.3.6.1.4.1.318.1.1.1.3.2.11
+  - name: upsAdvInputTotalActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.12
+    type: gauge
+    help: The input total active power(sum of all three phases) of the UPS system
+      in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.12
+  - name: upsAdvInputBypassTotalApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.13
+    type: gauge
+    help: The input bypass total apparent power(sum of all three phases) of the UPS
+      system in kVA. - 1.3.6.1.4.1.318.1.1.1.3.2.13
+  - name: upsAdvInputBypassTotalActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.14
+    type: gauge
+    help: The input bypass total active power(sum of all three phases) of the UPS
+      system in kW. - 1.3.6.1.4.1.318.1.1.1.3.2.14
+  - name: upsAdvInputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.2.15
+    type: gauge
+    help: The input energy usage of the UPS in kWh. - 1.3.6.1.4.1.318.1.1.1.3.2.15
+  - name: upsHighPrecInputLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.1
+    type: gauge
+    help: The current utility line voltage in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.3.3.1
+  - name: upsHighPrecInputMaxLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.2
+    type: gauge
+    help: The maximum utility line voltage in tenths of VAC over the previous 1 minute
+      period. - 1.3.6.1.4.1.318.1.1.1.3.3.2
+  - name: upsHighPrecInputMinLineVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.3
+    type: gauge
+    help: The minimum utility line voltage in tenths of VAC over the previous 1 minute
+      period. - 1.3.6.1.4.1.318.1.1.1.3.3.3
+  - name: upsHighPrecInputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.4
+    type: gauge
+    help: The current input frequency to the UPS system in tenths of Hz. - 1.3.6.1.4.1.318.1.1.1.3.3.4
+  - name: upsHighPrecInputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.5
+    type: gauge
+    help: The input energy usage of the UPS in hundredths of kWh. - 1.3.6.1.4.1.318.1.1.1.3.3.5
+  - name: upsHighPrecInputBypassVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.6
+    type: gauge
+    help: The current bypass line voltage in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.3.3.6
+  - name: upsHighPrecInputBypassFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.3.3.7
+    type: gauge
+    help: The current input bypass frequency to the UPS system in tenths of Hz. -
+      1.3.6.1.4.1.318.1.1.1.3.3.7
+  - name: upsBasicOutputStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.1
+    type: gauge
+    help: The current state of the UPS - 1.3.6.1.4.1.318.1.1.1.4.1.1
+  - name: upsBasicOutputPhase
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.2
+    type: gauge
+    help: The current output phase. - 1.3.6.1.4.1.318.1.1.1.4.1.2
+  - name: upsBasicSystemStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.3
+    type: gauge
+    help: Current state for the whole system (UPS and surrounding breakers) - 1.3.6.1.4.1.318.1.1.1.4.1.3
+  - name: upsBasicSystemInternalTemperature
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.4
+    type: gauge
+    help: The actual internal temperature of the UPS system in Celsius. - 1.3.6.1.4.1.318.1.1.1.4.1.4
+  - name: upsBasicSystemInverterStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.5
+    type: gauge
+    help: The current state of the UPS inverter - 1.3.6.1.4.1.318.1.1.1.4.1.5
+  - name: upsBasicSystemPFCStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.6
+    type: gauge
+    help: The general status of the power factor correction (AC input stage of the
+      UPS) - 1.3.6.1.4.1.318.1.1.1.4.1.6
+  - name: upsBasicOutputACwiringConfiguration
+    oid: 1.3.6.1.4.1.318.1.1.1.4.1.7
+    type: gauge
+    help: Indicates if neutral wire on output side of the UPS is used (load wired
+      line to neutral) - 1.3.6.1.4.1.318.1.1.1.4.1.7
+  - name: upsAdvOutputVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.1
+    type: gauge
+    help: The output voltage of the UPS system in VAC. - 1.3.6.1.4.1.318.1.1.1.4.2.1
+  - name: upsAdvOutputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.2
+    type: gauge
+    help: The current output frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.4.2.2
+  - name: upsAdvOutputLoad
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.3
+    type: gauge
+    help: The current UPS load expressed in percent of rated capacity. - 1.3.6.1.4.1.318.1.1.1.4.2.3
+  - name: upsAdvOutputCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.4
+    type: gauge
+    help: The current in amperes drawn by the load on the UPS. - 1.3.6.1.4.1.318.1.1.1.4.2.4
+  - name: upsAdvOutputRedundancy
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.5
+    type: gauge
+    help: The number of power modules which can fail or be removed without causing
+      the UPS to generate a Minimum Redundancy Lost event. - 1.3.6.1.4.1.318.1.1.1.4.2.5
+  - name: upsAdvOutputKVACapacity
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.6
+    type: gauge
+    help: The maximum load that this UPS can support. - 1.3.6.1.4.1.318.1.1.1.4.2.6
+  - name: upsAdvOutputNominalFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.7
+    type: gauge
+    help: The nominal output frequency of the UPS system in Hz. - 1.3.6.1.4.1.318.1.1.1.4.2.7
+  - name: upsAdvOutputActivePower
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.8
+    type: gauge
+    help: The total output active power of the UPS system in W - 1.3.6.1.4.1.318.1.1.1.4.2.8
+  - name: upsAdvOutputApparentPower
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.9
+    type: gauge
+    help: The total output apparent power of all phases of the UPS system in VA. -
+      1.3.6.1.4.1.318.1.1.1.4.2.9
+  - name: upsAdvOutputStatisticsIndex
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.1
+    type: gauge
+    help: The output identifier. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.1
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputPeakCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.2
+    type: gauge
+    help: The output peak current in Amperes. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.2
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputCurrentTHD
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.3
+    type: gauge
+    help: The output current Total Harmonic Distortion in percent. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.3
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputCrestFactor
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.10.1.4
+    type: gauge
+    help: The output current crest factor expressed in tenths. - 1.3.6.1.4.1.318.1.1.1.4.2.10.1.4
+    indexes:
+    - labelname: upsAdvOutputStatisticsIndex
+      type: gauge
+  - name: upsAdvOutputNeutralCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.11
+    type: gauge
+    help: The neutral current in amperes. - 1.3.6.1.4.1.318.1.1.1.4.2.11
+  - name: upsAdvOutputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.2.12
+    type: gauge
+    help: The output energy usage of the UPS in kWh. - 1.3.6.1.4.1.318.1.1.1.4.2.12
+  - name: upsHighPrecOutputVoltage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.1
+    type: gauge
+    help: The output voltage of the UPS system in tenths of VAC. - 1.3.6.1.4.1.318.1.1.1.4.3.1
+  - name: upsHighPrecOutputFrequency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.2
+    type: gauge
+    help: The current output frequency of the UPS system in tenths of Hz. - 1.3.6.1.4.1.318.1.1.1.4.3.2
+  - name: upsHighPrecOutputLoad
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.3
+    type: gauge
+    help: The current UPS load expressed in tenths of percent of rated capacity. -
+      1.3.6.1.4.1.318.1.1.1.4.3.3
+  - name: upsHighPrecOutputCurrent
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.4
+    type: gauge
+    help: The current in tenths of amperes drawn by the load on the UPS. - 1.3.6.1.4.1.318.1.1.1.4.3.4
+  - name: upsHighPrecOutputEfficiency
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.5
+    type: gauge
+    help: The positive values represent efficiency of the UPS in tenths of percent
+      - 1.3.6.1.4.1.318.1.1.1.4.3.5
+  - name: upsHighPrecOutputEnergyUsage
+    oid: 1.3.6.1.4.1.318.1.1.1.4.3.6
+    type: gauge
+    help: The output energy usage of the UPS in hundredths of kWh. - 1.3.6.1.4.1.318.1.1.1.4.3.6
+  - name: upsAdvTestDiagnosticSchedule
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.1
+    type: gauge
+    help: The UPS system's automatic battery test schedule. - 1.3.6.1.4.1.318.1.1.1.7.2.1
+  - name: upsAdvTestDiagnostics
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.2
+    type: gauge
+    help: Setting this variable to testDiagnostics(2) causes the UPS to perform a
+      diagnostic self test - 1.3.6.1.4.1.318.1.1.1.7.2.2
+  - name: upsAdvTestDiagnosticsResults
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.3
+    type: gauge
+    help: The results of the last UPS diagnostics test performed. - 1.3.6.1.4.1.318.1.1.1.7.2.3
+  - name: upsAdvTestLastDiagnosticsDate
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.4
+    type: DisplayString
+    help: The date the last UPS diagnostics test was performed in mm/dd/yy format.
+      - 1.3.6.1.4.1.318.1.1.1.7.2.4
+  - name: upsAdvTestRuntimeCalibration
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.5
+    type: gauge
+    help: Setting this variable to performCalibration(2) causes the UPS to discharge
+      to calibrate the UPS - 1.3.6.1.4.1.318.1.1.1.7.2.5
+  - name: upsAdvTestCalibrationResults
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.6
+    type: gauge
+    help: The results of the last runtime calibration - 1.3.6.1.4.1.318.1.1.1.7.2.6
+  - name: upsAdvTestCalibrationDate
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.7
+    type: DisplayString
+    help: The date the last UPS runtime calibration was performed in mm/dd/yy format.
+      - 1.3.6.1.4.1.318.1.1.1.7.2.7
+  - name: upsAdvTestDiagnosticTime
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.8
+    type: DisplayString
+    help: The time of the day to perform automatic battery test - 1.3.6.1.4.1.318.1.1.1.7.2.8
+  - name: upsAdvTestDiagnosticDay
+    oid: 1.3.6.1.4.1.318.1.1.1.7.2.9
+    type: gauge
+    help: The day of the week to perform automatic battery test. - 1.3.6.1.4.1.318.1.1.1.7.2.9
+  - name: upsCommStatus
+    oid: 1.3.6.1.4.1.318.1.1.1.8.1
+    type: gauge
+    help: The status of agent's communication with UPS. - 1.3.6.1.4.1.318.1.1.1.8.1
+  - name: iemStatusProbeNumber
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.1
+    type: gauge
+    help: The index of the probe. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.1
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeName
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.2
+    type: DisplayString
+    help: A descriptive name for the probe set by the user. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.2
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeStatus
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.3
+    type: gauge
+    help: The connected status of the probe, either disconnected(1) or connected(2).
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.3
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeCurrentTemp
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.4
+    type: gauge
+    help: The current temperature reading from the probe displayed in the units shown
+      in the 'iemStatusProbeTempUnits' OID (Celsius or Fahrenheit). - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.4
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeTempUnits
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.5
+    type: gauge
+    help: The temperature scale used to display the temperature thresholds of the
+      probe, Celsius(1) or Fahrenheit(2) - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.5
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeCurrentHumid
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.6
+    type: gauge
+    help: The current humidity reading from the probe in percent relative humidity.
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.6
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeHighTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.7
+    type: gauge
+    help: The high temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.7
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLowTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.8
+    type: gauge
+    help: The high temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.8
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeHighHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.9
+    type: gauge
+    help: The high humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.9
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLowHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.10
+    type: gauge
+    help: The low humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.10
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMaxTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.11
+    type: gauge
+    help: The max temperature violation status of the probe temperature reading -
+      1.3.6.1.4.1.318.1.1.10.2.3.2.1.11
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMinTempViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.12
+    type: gauge
+    help: The minimum temperature violation status of the probe temperature reading
+      - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.12
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMaxHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.13
+    type: gauge
+    help: The maximum humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.13
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeMinHumidViolation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.14
+    type: gauge
+    help: The minimum humidity violation status of the probe humidity reading - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.14
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  - name: iemStatusProbeLocation
+    oid: 1.3.6.1.4.1.318.1.1.10.2.3.2.1.15
+    type: DisplayString
+    help: A descriptive location for the probe set by the user. - 1.3.6.1.4.1.318.1.1.10.2.3.2.1.15
+    indexes:
+    - labelname: iemStatusProbeNumber
+      type: gauge
+  version: 1
+arista_sw:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2.3.1.6
+  - 1.3.6.1.2.1.25.3.3.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.30065.3.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrProcessorLoad
+    oid: 1.3.6.1.2.1.25.3.3.1.2
+    type: gauge
+    help: The average, over the last minute, of the percentage of time that this processor
+      was not idle - 1.3.6.1.2.1.25.3.3.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: aristaSwFwdIpStatsIPVersion
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.1
+    type: gauge
+    help: The IP version of this row. - 1.3.6.1.4.1.30065.3.1.1.1.1.1
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInReceives
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.3
+    type: counter
+    help: The total number of input IP datagrams received in software, including those
+      received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.3
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInReceives
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.4
+    type: counter
+    help: The total number of input IP datagrams received in software, including those
+      received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.4
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.5
+    type: counter
+    help: The total number of octets received in software in input IP datagrams, including
+      those received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.5
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.6
+    type: counter
+    help: The total number of octets received in software in input IP datagrams, including
+      those received in error - 1.3.6.1.4.1.30065.3.1.1.1.1.6
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInHdrErrors
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.7
+    type: counter
+    help: The number of input IP datagrams discarded in software due to errors in
+      their IP headers, including version number mismatch, other format errors, hop
+      count exceeded, errors discovered in processing their IP options, etc - 1.3.6.1.4.1.30065.3.1.1.1.1.7
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInNoRoutes
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.8
+    type: counter
+    help: The number of input IP datagrams discarded in software because no route
+      could be found to transmit them to their destination - 1.3.6.1.4.1.30065.3.1.1.1.1.8
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInAddrErrors
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.9
+    type: counter
+    help: The number of input IP datagrams discarded in software because the IP address
+      in their IP header's destination field was not a valid address to be received
+      at this entity - 1.3.6.1.4.1.30065.3.1.1.1.1.9
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInUnknownProtos
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.10
+    type: counter
+    help: The number of locally-addressed IP datagrams received successfully in software
+      but discarded because of an unknown or unsupported protocol - 1.3.6.1.4.1.30065.3.1.1.1.1.10
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInTruncatedPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.11
+    type: counter
+    help: The number of input IP datagrams discarded in software because the datagram
+      frame didn't carry enough data - 1.3.6.1.4.1.30065.3.1.1.1.1.11
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.12
+    type: counter
+    help: The number of input datagrams for which this entity was not their final
+      IP destination and for which this entity attempted in software to find a route
+      to forward them to that final destination - 1.3.6.1.4.1.30065.3.1.1.1.1.12
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.13
+    type: counter
+    help: The number of input datagrams for which this entity was not their final
+      IP destination and for which this entity attempted in software to find a route
+      to forward them to that final destination - 1.3.6.1.4.1.30065.3.1.1.1.1.13
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmReqds
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.14
+    type: counter
+    help: The number of IP fragments received that needed to be reassembled at this
+      interface - 1.3.6.1.4.1.30065.3.1.1.1.1.14
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmOKs
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.15
+    type: counter
+    help: The number of IP datagrams successfully reassembled - 1.3.6.1.4.1.30065.3.1.1.1.1.15
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsReasmFails
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.16
+    type: counter
+    help: 'The number of failures detected by the IP re-assembly algorithm (for whatever
+      reason: timed out, errors, etc.) - 1.3.6.1.4.1.30065.3.1.1.1.1.16'
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInDiscards
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.17
+    type: counter
+    help: The number of input IP datagrams received in software for which no problems
+      were encountered to prevent their continued processing, but were discarded (e.g.,
+      for lack of buffer space) - 1.3.6.1.4.1.30065.3.1.1.1.1.17
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInDelivers
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.18
+    type: counter
+    help: The total number of datagrams successfully delivered to IP user-protocols
+      (including ICMP) - 1.3.6.1.4.1.30065.3.1.1.1.1.18
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInDelivers
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.19
+    type: counter
+    help: The total number of datagrams successfully delivered to IP user-protocols
+      (including ICMP) - 1.3.6.1.4.1.30065.3.1.1.1.1.19
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutRequests
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.20
+    type: counter
+    help: The total number of IP datagrams that local IP user- protocols (including
+      ICMP) supplied to IP in requests for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.20
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutRequests
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.21
+    type: counter
+    help: The total number of IP datagrams that local IP user- protocols (including
+      ICMP) supplied to IP in requests for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.21
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutNoRoutes
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.22
+    type: counter
+    help: The number of locally generated IP datagrams discarded because no route
+      could be found to transmit them to their destination - 1.3.6.1.4.1.30065.3.1.1.1.1.22
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.23
+    type: counter
+    help: The number of datagrams for which this entity was not their final IP destination
+      and for which it was successful in finding a path to their final destination
+      in software - 1.3.6.1.4.1.30065.3.1.1.1.1.23
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutForwDatagrams
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.24
+    type: counter
+    help: The number of datagrams for which this entity was not their final IP destination
+      and for which it was successful in finding a path to their final destination
+      in software - 1.3.6.1.4.1.30065.3.1.1.1.1.24
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutDiscards
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.25
+    type: counter
+    help: The number of output IP datagrams for which no problem was encountered to
+      prevent their transmission to their destination, but were discarded in software
+      (e.g., for lack of buffer space) - 1.3.6.1.4.1.30065.3.1.1.1.1.25
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragReqds
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.26
+    type: counter
+    help: The number of IP datagrams that would require fragmentation in order to
+      be transmitted - 1.3.6.1.4.1.30065.3.1.1.1.1.26
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragOKs
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.27
+    type: counter
+    help: The number of IP datagrams that have been successfully fragmented - 1.3.6.1.4.1.30065.3.1.1.1.1.27
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragFails
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.28
+    type: counter
+    help: The number of IP datagrams that have been discarded because they needed
+      to be fragmented but could not be - 1.3.6.1.4.1.30065.3.1.1.1.1.28
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutFragCreates
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.29
+    type: counter
+    help: The number of output datagram fragments that have been generated as a result
+      of IP fragmentation - 1.3.6.1.4.1.30065.3.1.1.1.1.29
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutTransmits
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.30
+    type: counter
+    help: The total number of IP datagrams that this entity supplied by software to
+      the lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.30
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutTransmits
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.31
+    type: counter
+    help: The total number of IP datagrams that this entity supplied by software to
+      the lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.31
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.32
+    type: counter
+    help: The total number of octets in IP datagrams delivered by software to the
+      lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.32
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.33
+    type: counter
+    help: The total number of octets in IP datagrams delivered by software to the
+      lower layers for transmission - 1.3.6.1.4.1.30065.3.1.1.1.1.33
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.34
+    type: counter
+    help: The number of IP multicast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.34
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.35
+    type: counter
+    help: The number of IP multicast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.35
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.36
+    type: counter
+    help: The total number of octets received by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.36
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.37
+    type: counter
+    help: The total number of octets received by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.37
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.38
+    type: counter
+    help: The number of IP multicast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.38
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutMcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.39
+    type: counter
+    help: The number of IP multicast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.39
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.40
+    type: counter
+    help: The total number of octets transmitted by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.40
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutMcastOctets
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.41
+    type: counter
+    help: The total number of octets transmitted by software in IP multicast datagrams
+      - 1.3.6.1.4.1.30065.3.1.1.1.1.41
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsInBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.42
+    type: counter
+    help: The number of IP broadcast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.42
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCInBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.43
+    type: counter
+    help: The number of IP broadcast datagrams received by software - 1.3.6.1.4.1.30065.3.1.1.1.1.43
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsOutBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.44
+    type: counter
+    help: The number of IP broadcast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.44
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsHCOutBcastPkts
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.45
+    type: counter
+    help: The number of IP broadcast datagrams transmitted by software - 1.3.6.1.4.1.30065.3.1.1.1.1.45
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsDiscontinuityTime
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.46
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this entry's counters suffered a discontinuity - 1.3.6.1.4.1.30065.3.1.1.1.1.46
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+  - name: aristaSwFwdIpStatsRefreshRate
+    oid: 1.3.6.1.4.1.30065.3.1.1.1.1.47
+    type: gauge
+    help: The minimum reasonable polling interval for this entry - 1.3.6.1.4.1.30065.3.1.1.1.1.47
+    indexes:
+    - labelname: aristaSwFwdIpStatsIPVersion
+      type: gauge
+cisco_wlc:
+  walk:
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.14179.2.1.1.1.2
+  - 1.3.6.1.4.1.14179.2.1.1.1.38
+  - 1.3.6.1.4.1.14179.2.2.1.1.3
+  - 1.3.6.1.4.1.14179.2.2.13.1.3
+  - 1.3.6.1.4.1.14179.2.2.15.1.21
+  - 1.3.6.1.4.1.14179.2.2.2.1.15
+  - 1.3.6.1.4.1.14179.2.2.2.1.2
+  - 1.3.6.1.4.1.14179.2.2.2.1.4
+  - 1.3.6.1.4.1.14179.2.2.6.1
+  metrics:
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: bsnDot11EssNumberOfMobileStations
+    oid: 1.3.6.1.4.1.14179.2.1.1.1.38
+    type: counter
+    help: No of Mobile Stations currently associated with the WLAN. - 1.3.6.1.4.1.14179.2.1.1.1.38
+    indexes:
+    - labelname: bsnDot11EssSsid
+      type: gauge
+    lookups:
+    - labels:
+      - bsnDot11EssSsid
+      labelname: bsnDot11EssSsid
+      oid: 1.3.6.1.4.1.14179.2.1.1.1.2
+      type: DisplayString
+  - name: bsnAPIfLoadChannelUtilization
+    oid: 1.3.6.1.4.1.14179.2.2.13.1.3
+    type: gauge
+    help: Channel Utilization - 1.3.6.1.4.1.14179.2.2.13.1.3
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDBNoisePower
+    oid: 1.3.6.1.4.1.14179.2.2.15.1.21
+    type: gauge
+    help: This is the average noise power in dBm on each channel that is available
+      to Airespace AP - 1.3.6.1.4.1.14179.2.2.15.1.21
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    - labelname: bsnAPIfNoiseChannelNo
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnApIfNoOfUsers
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.15
+    type: counter
+    help: No of Users associated with this radio. - 1.3.6.1.4.1.14179.2.2.2.1.15
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfType
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.2
+    type: gauge
+    help: The type of this interface - 1.3.6.1.4.1.14179.2.2.2.1.2
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfPhyChannelNumber
+    oid: 1.3.6.1.4.1.14179.2.2.2.1.4
+    type: gauge
+    help: Current channel number of the AP Interface - 1.3.6.1.4.1.14179.2.2.2.1.4
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11TransmittedFragmentCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.1
+    type: counter
+    help: This counter shall be incremented for an acknowledged MPDU with an individual
+      address in the address 1 field or an MPDU with a multicast address in the address
+      1 field of type Data or Management. - 1.3.6.1.4.1.14179.2.2.6.1.1
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MulticastTransmittedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.2
+    type: counter
+    help: This counter shall increment only when the multicast bit is set in the destination
+      MAC address of a successfully transmitted MSDU - 1.3.6.1.4.1.14179.2.2.6.1.2
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RetryCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.3
+    type: counter
+    help: This counter shall increment when an MSDU is successfully transmitted after
+      one or more retransmissions. - 1.3.6.1.4.1.14179.2.2.6.1.3
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MultipleRetryCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.4
+    type: counter
+    help: This counter shall increment when an MSDU is successfully transmitted after
+      more than one retransmission. - 1.3.6.1.4.1.14179.2.2.6.1.4
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FrameDuplicateCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.5
+    type: counter
+    help: This counter shall increment when a frame is received that the Sequence
+      Control field indicates is a duplicate. - 1.3.6.1.4.1.14179.2.2.6.1.5
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RTSSuccessCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.6
+    type: counter
+    help: This counter shall increment when a CTS is received in response to an RTS.
+      - 1.3.6.1.4.1.14179.2.2.6.1.6
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11RTSFailureCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.7
+    type: counter
+    help: This counter shall increment when a CTS is not received in response to an
+      RTS. - 1.3.6.1.4.1.14179.2.2.6.1.7
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11ACKFailureCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.8
+    type: counter
+    help: This counter shall increment when an ACK is not received when expected.
+      - 1.3.6.1.4.1.14179.2.2.6.1.8
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11ReceivedFragmentCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.9
+    type: counter
+    help: This counter shall be incremented for each successfully received MPDU of
+      type Data or Management. - 1.3.6.1.4.1.14179.2.2.6.1.9
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11MulticastReceivedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.10
+    type: counter
+    help: This counter shall increment when a MSDU is received with the multicast
+      bit set in the destination MAC address. - 1.3.6.1.4.1.14179.2.2.6.1.10
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FCSErrorCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.11
+    type: counter
+    help: This counter shall increment when an FCS error is detected in a received
+      MPDU. - 1.3.6.1.4.1.14179.2.2.6.1.11
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11TransmittedFrameCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.12
+    type: counter
+    help: This counter shall increment for each successfully transmitted MSDU. - 1.3.6.1.4.1.14179.2.2.6.1.12
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11WEPUndecryptableCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.13
+    type: counter
+    help: This counter shall increment when a frame is received with the WEP subfield
+      of the Frame Control field set to one and the WEPOn value for the key mapped
+      to the TA's MAC address indicates that the frame should not have been encrypted
+      or that frame is discarded due to the receiving STA not implementing the privacy
+      option. - 1.3.6.1.4.1.14179.2.2.6.1.13
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+  - name: bsnAPIfDot11FailedCount
+    oid: 1.3.6.1.4.1.14179.2.2.6.1.33
+    type: counter
+    help: This counter shall increment when an MSDU is not transmitted successfully
+      due to the number of transmit attempts exceeding either the bsnAPIfDot11ShortRetryLimit
+      or dot11LongRetryLimit. - 1.3.6.1.4.1.14179.2.2.6.1.33
+    indexes:
+    - labelname: bsnAPName
+      type: PhysAddress48
+    - labelname: bsnAPIfSlotId
+      type: gauge
+    lookups:
+    - labels:
+      - bsnAPName
+      labelname: bsnAPName
+      oid: 1.3.6.1.4.1.14179.2.2.1.1.3
+      type: OctetString
+ddwrt:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.2021.10.1.1
+  - 1.3.6.1.4.1.2021.10.1.2
+  - 1.3.6.1.4.1.2021.10.1.5
+  - 1.3.6.1.4.1.2021.11
+  - 1.3.6.1.4.1.2021.4
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifDescr
+      type: gauge
+    lookups:
+    - labels:
+      - ifDescr
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+  - name: laIndex
+    oid: 1.3.6.1.4.1.2021.10.1.1
+    type: gauge
+    help: reference index/row number for each observed loadave. - 1.3.6.1.4.1.2021.10.1.1
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laNames
+    oid: 1.3.6.1.4.1.2021.10.1.2
+    type: DisplayString
+    help: The list of loadave names we're watching. - 1.3.6.1.4.1.2021.10.1.2
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laLoadInt
+    oid: 1.3.6.1.4.1.2021.10.1.5
+    type: gauge
+    help: The 1,5 and 15 minute load averages as an integer - 1.3.6.1.4.1.2021.10.1.5
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: ssIndex
+    oid: 1.3.6.1.4.1.2021.11.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.11.1
+  - name: ssErrorName
+    oid: 1.3.6.1.4.1.2021.11.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.11.2
+  - name: ssSwapIn
+    oid: 1.3.6.1.4.1.2021.11.3
+    type: gauge
+    help: The average amount of memory swapped in from disk, calculated over the last
+      minute. - 1.3.6.1.4.1.2021.11.3
+  - name: ssSwapOut
+    oid: 1.3.6.1.4.1.2021.11.4
+    type: gauge
+    help: The average amount of memory swapped out to disk, calculated over the last
+      minute. - 1.3.6.1.4.1.2021.11.4
+  - name: ssIOSent
+    oid: 1.3.6.1.4.1.2021.11.5
+    type: gauge
+    help: The average amount of data written to disk or other block device, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.5
+  - name: ssIOReceive
+    oid: 1.3.6.1.4.1.2021.11.6
+    type: gauge
+    help: The average amount of data read from disk or other block device, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.6
+  - name: ssSysInterrupts
+    oid: 1.3.6.1.4.1.2021.11.7
+    type: gauge
+    help: The average rate of interrupts processed (including the clock) calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.7
+  - name: ssSysContext
+    oid: 1.3.6.1.4.1.2021.11.8
+    type: gauge
+    help: The average rate of context switches, calculated over the last minute -
+      1.3.6.1.4.1.2021.11.8
+  - name: ssCpuUser
+    oid: 1.3.6.1.4.1.2021.11.9
+    type: gauge
+    help: The percentage of CPU time spent processing user-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.9
+  - name: ssCpuSystem
+    oid: 1.3.6.1.4.1.2021.11.10
+    type: gauge
+    help: The percentage of CPU time spent processing system-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.10
+  - name: ssCpuIdle
+    oid: 1.3.6.1.4.1.2021.11.11
+    type: gauge
+    help: The percentage of processor time spent idle, calculated over the last minute
+      - 1.3.6.1.4.1.2021.11.11
+  - name: ssCpuRawUser
+    oid: 1.3.6.1.4.1.2021.11.50
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing user-level code
+      - 1.3.6.1.4.1.2021.11.50
+  - name: ssCpuRawNice
+    oid: 1.3.6.1.4.1.2021.11.51
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing reduced-priority
+      code - 1.3.6.1.4.1.2021.11.51
+  - name: ssCpuRawSystem
+    oid: 1.3.6.1.4.1.2021.11.52
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing system-level code
+      - 1.3.6.1.4.1.2021.11.52
+  - name: ssCpuRawIdle
+    oid: 1.3.6.1.4.1.2021.11.53
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent idle - 1.3.6.1.4.1.2021.11.53
+  - name: ssCpuRawWait
+    oid: 1.3.6.1.4.1.2021.11.54
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent waiting for IO - 1.3.6.1.4.1.2021.11.54
+  - name: ssCpuRawKernel
+    oid: 1.3.6.1.4.1.2021.11.55
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing kernel-level code
+      - 1.3.6.1.4.1.2021.11.55
+  - name: ssCpuRawInterrupt
+    oid: 1.3.6.1.4.1.2021.11.56
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing hardware interrupts
+      - 1.3.6.1.4.1.2021.11.56
+  - name: ssIORawSent
+    oid: 1.3.6.1.4.1.2021.11.57
+    type: counter
+    help: Number of blocks sent to a block device - 1.3.6.1.4.1.2021.11.57
+  - name: ssIORawReceived
+    oid: 1.3.6.1.4.1.2021.11.58
+    type: counter
+    help: Number of blocks received from a block device - 1.3.6.1.4.1.2021.11.58
+  - name: ssRawInterrupts
+    oid: 1.3.6.1.4.1.2021.11.59
+    type: counter
+    help: Number of interrupts processed - 1.3.6.1.4.1.2021.11.59
+  - name: ssRawContexts
+    oid: 1.3.6.1.4.1.2021.11.60
+    type: counter
+    help: Number of context switches - 1.3.6.1.4.1.2021.11.60
+  - name: ssCpuRawSoftIRQ
+    oid: 1.3.6.1.4.1.2021.11.61
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent processing software interrupts
+      - 1.3.6.1.4.1.2021.11.61
+  - name: ssRawSwapIn
+    oid: 1.3.6.1.4.1.2021.11.62
+    type: counter
+    help: Number of blocks swapped in - 1.3.6.1.4.1.2021.11.62
+  - name: ssRawSwapOut
+    oid: 1.3.6.1.4.1.2021.11.63
+    type: counter
+    help: Number of blocks swapped out - 1.3.6.1.4.1.2021.11.63
+  - name: ssCpuRawSteal
+    oid: 1.3.6.1.4.1.2021.11.64
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the hypervisor code to
+      run other VMs even though the CPU in the current VM had something runnable -
+      1.3.6.1.4.1.2021.11.64
+  - name: ssCpuRawGuest
+    oid: 1.3.6.1.4.1.2021.11.65
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the CPU to run a virtual
+      CPU (guest) - 1.3.6.1.4.1.2021.11.65
+  - name: ssCpuRawGuestNice
+    oid: 1.3.6.1.4.1.2021.11.66
+    type: counter
+    help: The number of 'ticks' (typically 1/100s) spent by the CPU to run a niced
+      virtual CPU (guest) - 1.3.6.1.4.1.2021.11.66
+  - name: ssCpuNumCpus
+    oid: 1.3.6.1.4.1.2021.11.67
+    type: gauge
+    help: The number of processors, as counted by the agent - 1.3.6.1.4.1.2021.11.67
+  - name: memIndex
+    oid: 1.3.6.1.4.1.2021.4.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.4.1
+  - name: memErrorName
+    oid: 1.3.6.1.4.1.2021.4.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.4.2
+  - name: memTotalSwap
+    oid: 1.3.6.1.4.1.2021.4.3
+    type: gauge
+    help: The total amount of swap space configured for this host. - 1.3.6.1.4.1.2021.4.3
+  - name: memAvailSwap
+    oid: 1.3.6.1.4.1.2021.4.4
+    type: gauge
+    help: The amount of swap space currently unused or available. - 1.3.6.1.4.1.2021.4.4
+  - name: memTotalReal
+    oid: 1.3.6.1.4.1.2021.4.5
+    type: gauge
+    help: The total amount of real/physical memory installed on this host. - 1.3.6.1.4.1.2021.4.5
+  - name: memAvailReal
+    oid: 1.3.6.1.4.1.2021.4.6
+    type: gauge
+    help: The amount of real/physical memory currently unused or available. - 1.3.6.1.4.1.2021.4.6
+  - name: memTotalSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.7
+    type: gauge
+    help: The total amount of swap space or virtual memory allocated for text pages
+      on this host - 1.3.6.1.4.1.2021.4.7
+  - name: memAvailSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.8
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.8
+  - name: memTotalRealTXT
+    oid: 1.3.6.1.4.1.2021.4.9
+    type: gauge
+    help: The total amount of real/physical memory allocated for text pages on this
+      host - 1.3.6.1.4.1.2021.4.9
+  - name: memAvailRealTXT
+    oid: 1.3.6.1.4.1.2021.4.10
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.10
+  - name: memTotalFree
+    oid: 1.3.6.1.4.1.2021.4.11
+    type: gauge
+    help: The total amount of memory free or available for use on this host - 1.3.6.1.4.1.2021.4.11
+  - name: memMinimumSwap
+    oid: 1.3.6.1.4.1.2021.4.12
+    type: gauge
+    help: The minimum amount of swap space expected to be kept free or available during
+      normal operation of this host - 1.3.6.1.4.1.2021.4.12
+  - name: memShared
+    oid: 1.3.6.1.4.1.2021.4.13
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      shared memory - 1.3.6.1.4.1.2021.4.13
+  - name: memBuffer
+    oid: 1.3.6.1.4.1.2021.4.14
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      memory buffers - 1.3.6.1.4.1.2021.4.14
+  - name: memCached
+    oid: 1.3.6.1.4.1.2021.4.15
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      cached memory - 1.3.6.1.4.1.2021.4.15
+  - name: memUsedSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.16
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.16
+  - name: memUsedRealTXT
+    oid: 1.3.6.1.4.1.2021.4.17
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.17
+  - name: memSwapError
+    oid: 1.3.6.1.4.1.2021.4.100
+    type: gauge
+    help: Indicates whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.100
+  - name: memSwapErrorMsg
+    oid: 1.3.6.1.4.1.2021.4.101
+    type: DisplayString
+    help: Describes whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.101
+if_mib_ifalias:
+  version: 3
+  auth:
+    username: CLEUR
+    password: C1tyCu6eB3rl1n
+    auth_protocol: SHA
+    priv_protocol: DES
+    security_level: authPriv
+    priv_password: C1tyCu6eB3rl1n
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifAlias
+      type: gauge
+    lookups:
+    - labels:
+      - ifAlias
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+if_mib_ifdescr:
+  version: 3
+  auth:
+    username: CLEUR
+    password: C1tyCu6eB3rl1n
+    auth_protocol: SHA
+    priv_protocol: DES
+    security_level: authPriv
+    priv_password: C1tyCu6eB3rl1n
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.1.5
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: sysName
+    oid: 1.3.6.1.2.1.1.5
+    type: DisplayString
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifDescr
+      type: Integer32
+    lookups:
+    - labels: [ifDescr]
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+    - labels: [ifDescr]
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+    - labels: [sysName]
+      labelname: sysName
+      oid: 1.3.6.1.2.1.1.5.0
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifDescr
+      type: Integer32
+    lookups:
+    - labels: [ifDescr]
+      labelname: ifDescr
+      oid: 1.3.6.1.2.1.2.2.1.2
+      type: DisplayString
+    - labels: [ifDescr]
+      labelname: ifAlias
+      oid: 1.3.6.1.2.1.31.1.1.1.18
+      type: DisplayString
+    - labels: [sysName]
+      labelname: sysName
+      oid: 1.3.6.1.2.1.1.5.0
+      type: DisplayString
+
+if_mib_ifname:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+paloalto_fw:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.1
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.25.3
+  - 1.3.6.1.4.1.25461.2.1.2.1
+  - 1.3.6.1.4.1.25461.2.1.2.3
+  - 1.3.6.1.4.1.25461.2.1.2.5
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: hrSystemUptime
+    oid: 1.3.6.1.2.1.25.1.1
+    type: gauge
+    help: The amount of time since this host was last initialized - 1.3.6.1.2.1.25.1.1
+  - name: hrSystemDate
+    oid: 1.3.6.1.2.1.25.1.2
+    type: DisplayString
+    help: The host's notion of the local date and time of day. - 1.3.6.1.2.1.25.1.2
+  - name: hrSystemInitialLoadDevice
+    oid: 1.3.6.1.2.1.25.1.3
+    type: gauge
+    help: The index of the hrDeviceEntry for the device from which this host is configured
+      to load its initial operating system configuration (i.e., which operating system
+      code and/or boot parameters) - 1.3.6.1.2.1.25.1.3
+  - name: hrSystemInitialLoadParameters
+    oid: 1.3.6.1.2.1.25.1.4
+    type: OctetString
+    help: This object contains the parameters (e.g - 1.3.6.1.2.1.25.1.4
+  - name: hrSystemNumUsers
+    oid: 1.3.6.1.2.1.25.1.5
+    type: gauge
+    help: The number of user sessions for which this host is storing state information
+      - 1.3.6.1.2.1.25.1.5
+  - name: hrSystemProcesses
+    oid: 1.3.6.1.2.1.25.1.6
+    type: gauge
+    help: The number of process contexts currently loaded or running on this system.
+      - 1.3.6.1.2.1.25.1.6
+  - name: hrSystemMaxProcesses
+    oid: 1.3.6.1.2.1.25.1.7
+    type: gauge
+    help: The maximum number of process contexts this system can support - 1.3.6.1.2.1.25.1.7
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageIndex
+      type: gauge
+  - name: hrDeviceIndex
+    oid: 1.3.6.1.2.1.25.3.2.1.1
+    type: gauge
+    help: A unique value for each device contained by the host - 1.3.6.1.2.1.25.3.2.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceDescr
+    oid: 1.3.6.1.2.1.25.3.2.1.3
+    type: DisplayString
+    help: A textual description of this device, including the device's manufacturer
+      and revision, and optionally, its serial number. - 1.3.6.1.2.1.25.3.2.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceStatus
+    oid: 1.3.6.1.2.1.25.3.2.1.5
+    type: gauge
+    help: The current operational state of the device described by this row of the
+      table - 1.3.6.1.2.1.25.3.2.1.5
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDeviceErrors
+    oid: 1.3.6.1.2.1.25.3.2.1.6
+    type: counter
+    help: The number of errors detected on this device - 1.3.6.1.2.1.25.3.2.1.6
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrProcessorLoad
+    oid: 1.3.6.1.2.1.25.3.3.1.2
+    type: gauge
+    help: The average, over the last minute, of the percentage of time that this processor
+      was not idle - 1.3.6.1.2.1.25.3.3.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrNetworkIfIndex
+    oid: 1.3.6.1.2.1.25.3.4.1.1
+    type: gauge
+    help: The value of ifIndex which corresponds to this network device - 1.3.6.1.2.1.25.3.4.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPrinterStatus
+    oid: 1.3.6.1.2.1.25.3.5.1.1
+    type: gauge
+    help: The current status of this printer device. - 1.3.6.1.2.1.25.3.5.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPrinterDetectedErrorState
+    oid: 1.3.6.1.2.1.25.3.5.1.2
+    type: OctetString
+    help: This object represents any error conditions detected by the printer - 1.3.6.1.2.1.25.3.5.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageAccess
+    oid: 1.3.6.1.2.1.25.3.6.1.1
+    type: gauge
+    help: An indication if this long-term storage device is readable and writable
+      or only readable - 1.3.6.1.2.1.25.3.6.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageMedia
+    oid: 1.3.6.1.2.1.25.3.6.1.2
+    type: gauge
+    help: An indication of the type of media used in this long- term storage device.
+      - 1.3.6.1.2.1.25.3.6.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageRemoveble
+    oid: 1.3.6.1.2.1.25.3.6.1.3
+    type: gauge
+    help: Denotes whether or not the disk media may be removed from the drive. - 1.3.6.1.2.1.25.3.6.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrDiskStorageCapacity
+    oid: 1.3.6.1.2.1.25.3.6.1.4
+    type: gauge
+    help: The total size for this long-term storage device - 1.3.6.1.2.1.25.3.6.1.4
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+  - name: hrPartitionIndex
+    oid: 1.3.6.1.2.1.25.3.7.1.1
+    type: gauge
+    help: A unique value for each partition on this long-term storage device - 1.3.6.1.2.1.25.3.7.1.1
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionLabel
+    oid: 1.3.6.1.2.1.25.3.7.1.2
+    type: OctetString
+    help: A textual description of this partition. - 1.3.6.1.2.1.25.3.7.1.2
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionID
+    oid: 1.3.6.1.2.1.25.3.7.1.3
+    type: OctetString
+    help: A descriptor which uniquely represents this partition to the responsible
+      operating system - 1.3.6.1.2.1.25.3.7.1.3
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionSize
+    oid: 1.3.6.1.2.1.25.3.7.1.4
+    type: gauge
+    help: The size of this partition. - 1.3.6.1.2.1.25.3.7.1.4
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrPartitionFSIndex
+    oid: 1.3.6.1.2.1.25.3.7.1.5
+    type: gauge
+    help: The index of the file system mounted on this partition - 1.3.6.1.2.1.25.3.7.1.5
+    indexes:
+    - labelname: hrDeviceIndex
+      type: gauge
+    - labelname: hrPartitionIndex
+      type: gauge
+  - name: hrFSIndex
+    oid: 1.3.6.1.2.1.25.3.8.1.1
+    type: gauge
+    help: A unique value for each file system local to this host - 1.3.6.1.2.1.25.3.8.1.1
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSMountPoint
+    oid: 1.3.6.1.2.1.25.3.8.1.2
+    type: OctetString
+    help: The path name of the root of this file system. - 1.3.6.1.2.1.25.3.8.1.2
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSRemoteMountPoint
+    oid: 1.3.6.1.2.1.25.3.8.1.3
+    type: OctetString
+    help: A description of the name and/or address of the server that this file system
+      is mounted from - 1.3.6.1.2.1.25.3.8.1.3
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSAccess
+    oid: 1.3.6.1.2.1.25.3.8.1.5
+    type: gauge
+    help: An indication if this file system is logically configured by the operating
+      system to be readable and writable or only readable - 1.3.6.1.2.1.25.3.8.1.5
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSBootable
+    oid: 1.3.6.1.2.1.25.3.8.1.6
+    type: gauge
+    help: A flag indicating whether this file system is bootable. - 1.3.6.1.2.1.25.3.8.1.6
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSStorageIndex
+    oid: 1.3.6.1.2.1.25.3.8.1.7
+    type: gauge
+    help: The index of the hrStorageEntry that represents information about this file
+      system - 1.3.6.1.2.1.25.3.8.1.7
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSLastFullBackupDate
+    oid: 1.3.6.1.2.1.25.3.8.1.8
+    type: DisplayString
+    help: The last date at which this complete file system was copied to another storage
+      device for backup - 1.3.6.1.2.1.25.3.8.1.8
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: hrFSLastPartialBackupDate
+    oid: 1.3.6.1.2.1.25.3.8.1.9
+    type: DisplayString
+    help: The last date at which a portion of this file system was copied to another
+      storage device for backup - 1.3.6.1.2.1.25.3.8.1.9
+    indexes:
+    - labelname: hrFSIndex
+      type: gauge
+  - name: panAhoSw
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.1
+    type: counter
+    help: The total usage of software for AHO - 1.3.6.1.4.1.25461.2.1.2.1.19.1
+  - name: panDfaSw
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.2
+    type: counter
+    help: The total number of dfa match using software - 1.3.6.1.4.1.25461.2.1.2.1.19.2
+  - name: panFlowHostServiceAllow
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.3
+    type: counter
+    help: Device management session allowed - 1.3.6.1.4.1.25461.2.1.2.1.19.3
+  - name: panHaPathmonSent
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.4
+    type: counter
+    help: HA path-monitoring packets sent - 1.3.6.1.4.1.25461.2.1.2.1.19.4
+  - name: panAhoFpga
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.5
+    type: counter
+    help: The total requests to FPGA for AHO - 1.3.6.1.4.1.25461.2.1.2.1.19.5
+  - name: panDfaFpga
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.6
+    type: counter
+    help: The total requests to FPGA for DFA - 1.3.6.1.4.1.25461.2.1.2.1.19.6
+  - name: panFpgaPkt
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.7
+    type: counter
+    help: The packets held because of requests to FPGA - 1.3.6.1.4.1.25461.2.1.2.1.19.7
+  - name: panFlowDosAgMaxSessLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.1
+    type: counter
+    help: Session limit reached for aggregate profile, drop session - 1.3.6.1.4.1.25461.2.1.2.1.19.8.1
+  - name: panFlowDosBlkNumEntries
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.2
+    type: counter
+    help: Number of entries in DOS block table - 1.3.6.1.4.1.25461.2.1.2.1.19.8.2
+  - name: panFlowDosClMaxSessLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.3
+    type: counter
+    help: Session limit reached for classified profile, drop session - 1.3.6.1.4.1.25461.2.1.2.1.19.8.3
+  - name: panFlowDosClSyncookieAckErr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.4
+    type: counter
+    help: 'TCP SYN cookies: Invalid ACKs received, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.4'
+  - name: panFlowDosClSyncookieAckRcv
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.5
+    type: counter
+    help: 'TCP SYN cookies: ACKs to cookies received, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.5'
+  - name: panFlowDosClSyncookieBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.6
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for cl -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.6'
+  - name: panFlowDosClSyncookieMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.7
+    type: counter
+    help: 'Packet dropped: SYN cookies maximum threshold reached, classified pro -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.7'
+  - name: panFlowDosClSyncookieSent
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.8
+    type: counter
+    help: 'TCP SYN cookies: cookies sent, classified profile - 1.3.6.1.4.1.25461.2.1.2.1.19.8.8'
+  - name: panFlowMeterVsysThrottle
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.9
+    type: counter
+    help: 'Session metering: sessions throttled by vsys configuration - 1.3.6.1.4.1.25461.2.1.2.1.19.8.9'
+  - name: panFlowPolicyDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.10
+    type: counter
+    help: 'Session setup: denied by policy - 1.3.6.1.4.1.25461.2.1.2.1.19.8.10'
+  - name: panFlowPolicyNat
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.11
+    type: counter
+    help: 'Session setup: source NAT IP/port allocation error - 1.3.6.1.4.1.25461.2.1.2.1.19.8.11'
+  - name: panFlowScanDrop
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.12
+    type: counter
+    help: 'Session setup: denied by scan detection - 1.3.6.1.4.1.25461.2.1.2.1.19.8.12'
+  - name: panFlowDosDropIpBlocked
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.13
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration by oth -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.13'
+  - name: panFlowDosRedIcmp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.14
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''icmp'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.14'
+  - name: panFlowDosRedIcmp6
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.15
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''icmpv6'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.15'
+  - name: panFlowDosRedIp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.16
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''other-ip'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.16'
+  - name: panFlowDosRedTcp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.17
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''tcp-syn'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.17'
+  - name: panFlowDosRedUdp
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.18
+    type: counter
+    help: 'Packets dropped: Zone protection protocol ''udp'' RED - 1.3.6.1.4.1.25461.2.1.2.1.19.8.18'
+  - name: panFlowDosRuleAgBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.19
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for ag -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.19'
+  - name: panFlowDosRuleAgRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.20
+    type: counter
+    help: 'Packets dropped: Activate aggregate RED threshold reached, random ear -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.20'
+  - name: panFlowDosRuleAgRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.21
+    type: counter
+    help: 'Packets dropped: Maximal aggregate RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.21'
+  - name: panFlowDosRuleDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.22
+    type: counter
+    help: 'Packets dropped: Denied action by DoS policy - 1.3.6.1.4.1.25461.2.1.2.1.19.8.22'
+  - name: panFlowDosRuleDrop
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.23
+    type: counter
+    help: 'Packets dropped: Rate limited or IP blocked - 1.3.6.1.4.1.25461.2.1.2.1.19.8.23'
+  - name: panFlowDosRuleDropAggr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.24
+    type: counter
+    help: 'Packets dropped: due to aggregate rate limiting - 1.3.6.1.4.1.25461.2.1.2.1.19.8.24'
+  - name: panFlowDosRuleDropClBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.25
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for cl -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.25'
+  - name: panFlowDosRuleDropClRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.26
+    type: counter
+    help: 'Packets dropped: Activate classified RED threshold reached, random ea -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.26'
+  - name: panFlowDosRuleDropClRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.27
+    type: counter
+    help: 'Packets dropped: Maximal classified RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.27'
+  - name: panFlowDosRuleDropClassified
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.28
+    type: counter
+    help: 'Packets dropped: due to classified rate limiting - 1.3.6.1.4.1.25461.2.1.2.1.19.8.28'
+  - name: panFlowDosSyncookieBlkDur
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.29
+    type: counter
+    help: 'Packets dropped: Flagged for blocking and under block duration for ag -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.29'
+  - name: panFlowDosSyncookieMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.30
+    type: counter
+    help: 'Packet dropped: SYN cookies maximum threshold reached, aggregate prof -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.30'
+  - name: panFlowDosZoneRedAct
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.31
+    type: counter
+    help: 'Packets dropped: Activate zone RED threshold reached, random early dr -
+      1.3.6.1.4.1.25461.2.1.2.1.19.8.31'
+  - name: panFlowDosZoneRedMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.8.32
+    type: counter
+    help: 'Packets dropped: Maximal zone RED threshold reached - 1.3.6.1.4.1.25461.2.1.2.1.19.8.32'
+  - name: panFlowFwdL3TtlZero
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.1
+    type: counter
+    help: 'Packets dropped: IP TTL reaches zero - 1.3.6.1.4.1.25461.2.1.2.1.19.9.1'
+  - name: panFlowMeterHostThrottle
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.2
+    type: counter
+    help: 'Session metering: sessions throttled by management session threshold -
+      1.3.6.1.4.1.25461.2.1.2.1.19.9.2'
+  - name: panFlowHostServiceDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.3
+    type: counter
+    help: Device management session denied - 1.3.6.1.4.1.25461.2.1.2.1.19.9.3
+  - name: panFlowHostServiceUnknown
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.4
+    type: counter
+    help: 'Session discarded: unknown application to control plane - 1.3.6.1.4.1.25461.2.1.2.1.19.9.4'
+  - name: panPktAllocFailure
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.5
+    type: counter
+    help: Packet allocation error - 1.3.6.1.4.1.25461.2.1.2.1.19.9.5
+  - name: panPktAllocFailureCos
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.6
+    type: counter
+    help: Packet allocation error due to QoS control - 1.3.6.1.4.1.25461.2.1.2.1.19.9.6
+  - name: panSessionDiscard
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.9.7
+    type: counter
+    help: Session set to discard by security policy check - 1.3.6.1.4.1.25461.2.1.2.1.19.9.7
+  - name: panFlowIpfragFragErr
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.10.1
+    type: counter
+    help: 'Packet dropped: IP fragmentation error - 1.3.6.1.4.1.25461.2.1.2.1.19.10.1'
+  - name: panFlowIpfragRecv
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.10.2
+    type: counter
+    help: IP fragments received - 1.3.6.1.4.1.25461.2.1.2.1.19.10.2
+  - name: panTcpAllocWqeFailed
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.1
+    type: counter
+    help: wqe allocation failure in tcp - 1.3.6.1.4.1.25461.2.1.2.1.19.11.1
+  - name: panTcpDeny
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.2
+    type: counter
+    help: session denied because of failure in tcp reassembly - 1.3.6.1.4.1.25461.2.1.2.1.19.11.2
+  - name: panTcpDropOutOfWnd
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.3
+    type: counter
+    help: out-of-window packets dropped - 1.3.6.1.4.1.25461.2.1.2.1.19.11.3
+  - name: panTcpDropPacket
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.4
+    type: counter
+    help: packets dropped because of failure in tcp reassembly - 1.3.6.1.4.1.25461.2.1.2.1.19.11.4
+  - name: panFlowActionClose
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.5
+    type: counter
+    help: TCP sessions closed via injecting RST - 1.3.6.1.4.1.25461.2.1.2.1.19.11.5
+  - name: panFlowActionReset
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.6
+    type: counter
+    help: TCP clients reset via responding RST - 1.3.6.1.4.1.25461.2.1.2.1.19.11.6
+  - name: panFlowTcpNonSyn
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.7
+    type: counter
+    help: Non-SYN TCP packets without session match - 1.3.6.1.4.1.25461.2.1.2.1.19.11.7
+  - name: panTcpExceedSegLimit
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.19.11.8
+    type: counter
+    help: packets dropped due to the limitation on global tcp out-of-order pack -
+      1.3.6.1.4.1.25461.2.1.2.1.19.11.8
+  - name: panSysSwVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.1
+    type: DisplayString
+    help: Full software version - 1.3.6.1.4.1.25461.2.1.2.1.1
+  - name: panSysHwVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.2
+    type: DisplayString
+    help: Hardware version of the unit. - 1.3.6.1.4.1.25461.2.1.2.1.2
+  - name: panSysSerialNumber
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.3
+    type: DisplayString
+    help: The serial number of the unit - 1.3.6.1.4.1.25461.2.1.2.1.3
+  - name: panSysTimeZoneOffset
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.4
+    type: gauge
+    help: The offset in seconds from UTC of the system's time zone - 1.3.6.1.4.1.25461.2.1.2.1.4
+  - name: panSysDaylightSaving
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.5
+    type: gauge
+    help: Whether daylight savings are in currently in effect for the system's time
+      zone. - 1.3.6.1.4.1.25461.2.1.2.1.5
+  - name: panSysVpnClientVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.6
+    type: DisplayString
+    help: Currently installed VPN client package version - 1.3.6.1.4.1.25461.2.1.2.1.6
+  - name: panSysAppVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.7
+    type: DisplayString
+    help: Currently installed application definition version - 1.3.6.1.4.1.25461.2.1.2.1.7
+  - name: panSysAvVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.8
+    type: DisplayString
+    help: Currently installed antivirus version - 1.3.6.1.4.1.25461.2.1.2.1.8
+  - name: panSysThreatVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.9
+    type: DisplayString
+    help: Currently installed threat definition version - 1.3.6.1.4.1.25461.2.1.2.1.9
+  - name: panSysUrlFilteringVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.10
+    type: DisplayString
+    help: Currently installed URL filtering version - 1.3.6.1.4.1.25461.2.1.2.1.10
+  - name: panSysHAState
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.11
+    type: DisplayString
+    help: Current high-availability state. - 1.3.6.1.4.1.25461.2.1.2.1.11
+  - name: panSysHAPeerState
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.12
+    type: DisplayString
+    help: Current peer high-availability state. - 1.3.6.1.4.1.25461.2.1.2.1.12
+  - name: panSysHAMode
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.13
+    type: DisplayString
+    help: Current high-availability mode (disabled, active-passive, or active-active).
+      - 1.3.6.1.4.1.25461.2.1.2.1.13
+  - name: panSysUrlFilteringDatabase
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.14
+    type: DisplayString
+    help: Current installed URL filtering database (surfcontrol, brightcloud, etc)
+      - 1.3.6.1.4.1.25461.2.1.2.1.14
+  - name: panSysGlobalProtectClientVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.15
+    type: DisplayString
+    help: Currently installed global-protect client package version - 1.3.6.1.4.1.25461.2.1.2.1.15
+  - name: panSysOpswatDatafileVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.16
+    type: DisplayString
+    help: Currently installed opswat database version - 1.3.6.1.4.1.25461.2.1.2.1.16
+  - name: panSysWildfireVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.17
+    type: DisplayString
+    help: Currently installed wildfire content version - 1.3.6.1.4.1.25461.2.1.2.1.17
+  - name: panSysWildfirePrivateCloudVersion
+    oid: 1.3.6.1.4.1.25461.2.1.2.1.18
+    type: DisplayString
+    help: Currently installed wildfire private cloud content version - 1.3.6.1.4.1.25461.2.1.2.1.18
+  - name: panSessionUtilization
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.1
+    type: gauge
+    help: Session table utilization percentage - 1.3.6.1.4.1.25461.2.1.2.3.1
+  - name: panSessionMax
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.2
+    type: gauge
+    help: Total number of sessions supported. - 1.3.6.1.4.1.25461.2.1.2.3.2
+  - name: panSessionActive
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.3
+    type: gauge
+    help: Total number of active sessions. - 1.3.6.1.4.1.25461.2.1.2.3.3
+  - name: panSessionActiveTcp
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.4
+    type: gauge
+    help: Total number of active TCP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.4
+  - name: panSessionActiveUdp
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.5
+    type: gauge
+    help: Total number of active UDP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.5
+  - name: panSessionActiveICMP
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.6
+    type: gauge
+    help: Total number of active ICMP sessions. - 1.3.6.1.4.1.25461.2.1.2.3.6
+  - name: panSessionActiveSslProxy
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.7
+    type: gauge
+    help: Total number of active SSL proxy sessions. - 1.3.6.1.4.1.25461.2.1.2.3.7
+  - name: panSessionSslProxyUtilization
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.8
+    type: gauge
+    help: SSL proxy Session utilization percentage - 1.3.6.1.4.1.25461.2.1.2.3.8
+  - name: panVsysId
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.1
+    type: gauge
+    help: Vsys id - 1.3.6.1.4.1.25461.2.1.2.3.9.1.1
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysName
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.2
+    type: DisplayString
+    help: User assigned vsys name (empty string if not available) - 1.3.6.1.4.1.25461.2.1.2.3.9.1.2
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysSessionUtilizationPct
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.3
+    type: gauge
+    help: Vsys utilization percentage, if session limit is configured - 1.3.6.1.4.1.25461.2.1.2.3.9.1.3
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysActiveSessions
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.4
+    type: gauge
+    help: Active sessions on this Vsys - 1.3.6.1.4.1.25461.2.1.2.3.9.1.4
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panVsysMaxSessions
+    oid: 1.3.6.1.4.1.25461.2.1.2.3.9.1.5
+    type: gauge
+    help: Max sessions on this Vsys, if session limit is configured - 1.3.6.1.4.1.25461.2.1.2.3.9.1.5
+    indexes:
+    - labelname: panVsysId
+      type: gauge
+  - name: panGPGWUtilizationPct
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.1
+    type: gauge
+    help: GlobalProtect Gateway utilization percentage - 1.3.6.1.4.1.25461.2.1.2.5.1.1
+  - name: panGPGWUtilizationMaxTunnels
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.2
+    type: gauge
+    help: Max tunnels allowed - 1.3.6.1.4.1.25461.2.1.2.5.1.2
+  - name: panGPGWUtilizationActiveTunnels
+    oid: 1.3.6.1.4.1.25461.2.1.2.5.1.3
+    type: gauge
+    help: Number of active tunnels - 1.3.6.1.4.1.25461.2.1.2.5.1.3
+servertech_sentry3:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.4.1.1718.3.2.2
+  - 1.3.6.1.4.1.1718.3.2.3
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: infeedIndex
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.1
+    type: gauge
+    help: Index for the input feed table. - 1.3.6.1.4.1.1718.3.2.2.1.1
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.2
+    type: DisplayString
+    help: The ID of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.2
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedName
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.3
+    type: DisplayString
+    help: The name of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.3
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapabilities
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.4
+    type: OctetString
+    help: The capabilities of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.4
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedStatus
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.5
+    type: gauge
+    help: The status of the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.5
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadStatus
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.6
+    type: gauge
+    help: The status of the load measured on the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.6
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadValue
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.7
+    type: gauge
+    help: The load measured on the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.7
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLoadHighThresh
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.8
+    type: gauge
+    help: The load high threshold value of the input feed line in Amps. - 1.3.6.1.4.1.1718.3.2.2.1.8
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedOutletCount
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.9
+    type: gauge
+    help: The number of controlled and/or monitored outlets on the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.9
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapacity
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.10
+    type: gauge
+    help: The load capacity of the input feed line - 1.3.6.1.4.1.1718.3.2.2.1.10
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.11
+    type: gauge
+    help: The line-to-line voltage of the input feed - 1.3.6.1.4.1.1718.3.2.2.1.11
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPower
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.12
+    type: gauge
+    help: The active power consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.12
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedApparentPower
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.13
+    type: gauge
+    help: The apparent power consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.13
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPowerFactor
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.14
+    type: gauge
+    help: The power factor of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.14
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCrestFactor
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.15
+    type: gauge
+    help: The crest factor for the load of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.15
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedEnergy
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.16
+    type: gauge
+    help: The energy consumption of the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.16
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedReactance
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.17
+    type: gauge
+    help: The characterization of the phase relation between the voltage and current
+      of the input feed phase. - 1.3.6.1.4.1.1718.3.2.2.1.17
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.18
+    type: gauge
+    help: The voltage measured for the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.18
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseCurrent
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.19
+    type: gauge
+    help: The current measured for the input feed phase - 1.3.6.1.4.1.1718.3.2.2.1.19
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedCapacityUsed
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.20
+    type: gauge
+    help: The used percentage of the input feed line load capacity (infeedLoadValue
+      / infeedCapacity x 100) - 1.3.6.1.4.1.1718.3.2.2.1.20
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLineID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.21
+    type: DisplayString
+    help: The ID of the input feed line. - 1.3.6.1.4.1.1718.3.2.2.1.21
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedLineToLineID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.22
+    type: DisplayString
+    help: The line-to-line ID of the input feed. - 1.3.6.1.4.1.1718.3.2.2.1.22
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedPhaseID
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.23
+    type: DisplayString
+    help: The ID of the input feed phase. - 1.3.6.1.4.1.1718.3.2.2.1.23
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVACapacity
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.24
+    type: gauge
+    help: The apparent power capacity of the input feed circuit - 1.3.6.1.4.1.1718.3.2.2.1.24
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: infeedVACapacityUsed
+    oid: 1.3.6.1.4.1.1718.3.2.2.1.25
+    type: gauge
+    help: The used percentage of the input feed circuit apparent power capacity (infeedApparentPower
+      / infeedVACapacity x 100) - 1.3.6.1.4.1.1718.3.2.2.1.25
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+  - name: outletIndex
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.1
+    type: gauge
+    help: Index for the outlet table. - 1.3.6.1.4.1.1718.3.2.3.1.1
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletID
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.2
+    type: DisplayString
+    help: The ID of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.2
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletName
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.3
+    type: DisplayString
+    help: The name of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.3
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCapabilities
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.4
+    type: OctetString
+    help: The capabilities of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.4
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletStatus
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.5
+    type: gauge
+    help: The status of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.5
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadStatus
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.6
+    type: gauge
+    help: The status of the load measured on the outlet - 1.3.6.1.4.1.1718.3.2.3.1.6
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadValue
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.7
+    type: gauge
+    help: The load measured on the outlet - 1.3.6.1.4.1.1718.3.2.3.1.7
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadLowThresh
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.8
+    type: gauge
+    help: The load low threshold value of the outlet in Amps. - 1.3.6.1.4.1.1718.3.2.3.1.8
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletLoadHighThresh
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.9
+    type: gauge
+    help: The load high threshold value of the outlet in Amps. - 1.3.6.1.4.1.1718.3.2.3.1.9
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletControlState
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.10
+    type: gauge
+    help: The control state of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.10
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletControlAction
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.11
+    type: gauge
+    help: An action to change the control state of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.11
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCapacity
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.12
+    type: gauge
+    help: The load capacity of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.12
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletVoltage
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.13
+    type: gauge
+    help: The voltage of the outlet - 1.3.6.1.4.1.1718.3.2.3.1.13
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPower
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.14
+    type: gauge
+    help: The active power consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.14
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletApparentPower
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.15
+    type: gauge
+    help: The apparent power consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.15
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPowerFactor
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.16
+    type: gauge
+    help: The power factor of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.16
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletCrestFactor
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.17
+    type: gauge
+    help: The crest factor for the load of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.17
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletEnergy
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.18
+    type: gauge
+    help: The energy consumption of the device plugged into the outlet - 1.3.6.1.4.1.1718.3.2.3.1.18
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletWakeupState
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.19
+    type: gauge
+    help: The wakeup state of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.19
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+  - name: outletPostOnDelay
+    oid: 1.3.6.1.4.1.1718.3.2.3.1.20
+    type: gauge
+    help: The post-on delay of the outlet. - 1.3.6.1.4.1.1718.3.2.3.1.20
+    indexes:
+    - labelname: towerIndex
+      type: gauge
+    - labelname: infeedIndex
+      type: gauge
+    - labelname: outletIndex
+      type: gauge
+synology:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.25.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.2021.10.1.2
+  - 1.3.6.1.4.1.2021.10.1.5
+  - 1.3.6.1.4.1.2021.11.10
+  - 1.3.6.1.4.1.2021.11.11
+  - 1.3.6.1.4.1.2021.11.9
+  - 1.3.6.1.4.1.2021.4
+  - 1.3.6.1.4.1.6574.1
+  - 1.3.6.1.4.1.6574.101
+  - 1.3.6.1.4.1.6574.102
+  - 1.3.6.1.4.1.6574.104
+  - 1.3.6.1.4.1.6574.2
+  - 1.3.6.1.4.1.6574.3
+  - 1.3.6.1.4.1.6574.4
+  - 1.3.6.1.4.1.6574.5
+  - 1.3.6.1.4.1.6574.6
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: hrMemorySize
+    oid: 1.3.6.1.2.1.25.2.2
+    type: gauge
+    help: The amount of physical read-write main memory, typically RAM, contained
+      by the host. - 1.3.6.1.2.1.25.2.2
+  - name: hrStorageIndex
+    oid: 1.3.6.1.2.1.25.2.3.1.1
+    type: gauge
+    help: A unique value for each logical storage area contained by the host. - 1.3.6.1.2.1.25.2.3.1.1
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageDescr
+    oid: 1.3.6.1.2.1.25.2.3.1.3
+    type: DisplayString
+    help: A description of the type and instance of the storage described by this
+      entry. - 1.3.6.1.2.1.25.2.3.1.3
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageAllocationUnits
+    oid: 1.3.6.1.2.1.25.2.3.1.4
+    type: gauge
+    help: The size, in bytes, of the data objects allocated from this pool - 1.3.6.1.2.1.25.2.3.1.4
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageSize
+    oid: 1.3.6.1.2.1.25.2.3.1.5
+    type: gauge
+    help: The size of the storage represented by this entry, in units of hrStorageAllocationUnits
+      - 1.3.6.1.2.1.25.2.3.1.5
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageUsed
+    oid: 1.3.6.1.2.1.25.2.3.1.6
+    type: gauge
+    help: The amount of the storage represented by this entry that is allocated, in
+      units of hrStorageAllocationUnits. - 1.3.6.1.2.1.25.2.3.1.6
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: hrStorageAllocationFailures
+    oid: 1.3.6.1.2.1.25.2.3.1.7
+    type: counter
+    help: The number of requests for storage represented by this entry that could
+      not be honored due to not enough storage - 1.3.6.1.2.1.25.2.3.1.7
+    indexes:
+    - labelname: hrStorageDescr
+      type: gauge
+    lookups:
+    - labels:
+      - hrStorageDescr
+      labelname: hrStorageDescr
+      oid: 1.3.6.1.2.1.25.2.3.1.3
+      type: DisplayString
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifName
+      type: gauge
+    lookups:
+    - labels:
+      - ifName
+      labelname: ifName
+      oid: 1.3.6.1.2.1.31.1.1.1.1
+      type: DisplayString
+  - name: laNames
+    oid: 1.3.6.1.4.1.2021.10.1.2
+    type: DisplayString
+    help: The list of loadave names we're watching. - 1.3.6.1.4.1.2021.10.1.2
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: laLoadInt
+    oid: 1.3.6.1.4.1.2021.10.1.5
+    type: gauge
+    help: The 1,5 and 15 minute load averages as an integer - 1.3.6.1.4.1.2021.10.1.5
+    indexes:
+    - labelname: laNames
+      type: gauge
+    lookups:
+    - labels:
+      - laNames
+      labelname: laNames
+      oid: 1.3.6.1.4.1.2021.10.1.2
+      type: DisplayString
+  - name: ssCpuSystem
+    oid: 1.3.6.1.4.1.2021.11.10
+    type: gauge
+    help: The percentage of CPU time spent processing system-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.10
+  - name: ssCpuIdle
+    oid: 1.3.6.1.4.1.2021.11.11
+    type: gauge
+    help: The percentage of processor time spent idle, calculated over the last minute
+      - 1.3.6.1.4.1.2021.11.11
+  - name: ssCpuUser
+    oid: 1.3.6.1.4.1.2021.11.9
+    type: gauge
+    help: The percentage of CPU time spent processing user-level code, calculated
+      over the last minute - 1.3.6.1.4.1.2021.11.9
+  - name: memIndex
+    oid: 1.3.6.1.4.1.2021.4.1
+    type: gauge
+    help: Bogus Index - 1.3.6.1.4.1.2021.4.1
+  - name: memErrorName
+    oid: 1.3.6.1.4.1.2021.4.2
+    type: DisplayString
+    help: Bogus Name - 1.3.6.1.4.1.2021.4.2
+  - name: memTotalSwap
+    oid: 1.3.6.1.4.1.2021.4.3
+    type: gauge
+    help: The total amount of swap space configured for this host. - 1.3.6.1.4.1.2021.4.3
+  - name: memAvailSwap
+    oid: 1.3.6.1.4.1.2021.4.4
+    type: gauge
+    help: The amount of swap space currently unused or available. - 1.3.6.1.4.1.2021.4.4
+  - name: memTotalReal
+    oid: 1.3.6.1.4.1.2021.4.5
+    type: gauge
+    help: The total amount of real/physical memory installed on this host. - 1.3.6.1.4.1.2021.4.5
+  - name: memAvailReal
+    oid: 1.3.6.1.4.1.2021.4.6
+    type: gauge
+    help: The amount of real/physical memory currently unused or available. - 1.3.6.1.4.1.2021.4.6
+  - name: memTotalSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.7
+    type: gauge
+    help: The total amount of swap space or virtual memory allocated for text pages
+      on this host - 1.3.6.1.4.1.2021.4.7
+  - name: memAvailSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.8
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.8
+  - name: memTotalRealTXT
+    oid: 1.3.6.1.4.1.2021.4.9
+    type: gauge
+    help: The total amount of real/physical memory allocated for text pages on this
+      host - 1.3.6.1.4.1.2021.4.9
+  - name: memAvailRealTXT
+    oid: 1.3.6.1.4.1.2021.4.10
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.10
+  - name: memTotalFree
+    oid: 1.3.6.1.4.1.2021.4.11
+    type: gauge
+    help: The total amount of memory free or available for use on this host - 1.3.6.1.4.1.2021.4.11
+  - name: memMinimumSwap
+    oid: 1.3.6.1.4.1.2021.4.12
+    type: gauge
+    help: The minimum amount of swap space expected to be kept free or available during
+      normal operation of this host - 1.3.6.1.4.1.2021.4.12
+  - name: memShared
+    oid: 1.3.6.1.4.1.2021.4.13
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      shared memory - 1.3.6.1.4.1.2021.4.13
+  - name: memBuffer
+    oid: 1.3.6.1.4.1.2021.4.14
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      memory buffers - 1.3.6.1.4.1.2021.4.14
+  - name: memCached
+    oid: 1.3.6.1.4.1.2021.4.15
+    type: gauge
+    help: The total amount of real or virtual memory currently allocated for use as
+      cached memory - 1.3.6.1.4.1.2021.4.15
+  - name: memUsedSwapTXT
+    oid: 1.3.6.1.4.1.2021.4.16
+    type: gauge
+    help: The amount of swap space or virtual memory currently being used by text
+      pages on this host - 1.3.6.1.4.1.2021.4.16
+  - name: memUsedRealTXT
+    oid: 1.3.6.1.4.1.2021.4.17
+    type: gauge
+    help: The amount of real/physical memory currently being used by text pages on
+      this host - 1.3.6.1.4.1.2021.4.17
+  - name: memSwapError
+    oid: 1.3.6.1.4.1.2021.4.100
+    type: gauge
+    help: Indicates whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.100
+  - name: memSwapErrorMsg
+    oid: 1.3.6.1.4.1.2021.4.101
+    type: DisplayString
+    help: Describes whether the amount of available swap space (as reported by 'memAvailSwap(4)'),
+      is less than the desired minimum (specified by 'memMinimumSwap(12)'). - 1.3.6.1.4.1.2021.4.101
+  - name: systemStatus
+    oid: 1.3.6.1.4.1.6574.1.1
+    type: gauge
+    help: Synology system status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.1
+  - name: temperature
+    oid: 1.3.6.1.4.1.6574.1.2
+    type: gauge
+    help: Synology system temperature The temperature of Disk Station uses Celsius
+      degree. - 1.3.6.1.4.1.6574.1.2
+  - name: powerStatus
+    oid: 1.3.6.1.4.1.6574.1.3
+    type: gauge
+    help: Synology power status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.3
+  - name: systemFanStatus
+    oid: 1.3.6.1.4.1.6574.1.4.1
+    type: gauge
+    help: Synology system fan status Each meanings of status represented describe
+      below - 1.3.6.1.4.1.6574.1.4.1
+  - name: cpuFanStatus
+    oid: 1.3.6.1.4.1.6574.1.4.2
+    type: gauge
+    help: Synology cpu fan status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.1.4.2
+  - name: modelName
+    oid: 1.3.6.1.4.1.6574.1.5.1
+    type: OctetString
+    help: The Model name of this NAS - 1.3.6.1.4.1.6574.1.5.1
+  - name: serialNumber
+    oid: 1.3.6.1.4.1.6574.1.5.2
+    type: OctetString
+    help: The serial number of this NAS - 1.3.6.1.4.1.6574.1.5.2
+  - name: version
+    oid: 1.3.6.1.4.1.6574.1.5.3
+    type: OctetString
+    help: The version of this DSM - 1.3.6.1.4.1.6574.1.5.3
+  - name: upgradeAvailable
+    oid: 1.3.6.1.4.1.6574.1.5.4
+    type: gauge
+    help: This oid is for checking whether there is a latest DSM can be upgraded -
+      1.3.6.1.4.1.6574.1.5.4
+  - name: storageIOIndex
+    oid: 1.3.6.1.4.1.6574.101.1.1.1
+    type: gauge
+    help: Reference index for each observed device. - 1.3.6.1.4.1.6574.101.1.1.1
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIODevice
+    oid: 1.3.6.1.4.1.6574.101.1.1.2
+    type: DisplayString
+    help: The name of the device we are counting/checking. - 1.3.6.1.4.1.6574.101.1.1.2
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONRead
+    oid: 1.3.6.1.4.1.6574.101.1.1.3
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.3
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONWritten
+    oid: 1.3.6.1.4.1.6574.101.1.1.4
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.4
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOReads
+    oid: 1.3.6.1.4.1.6574.101.1.1.5
+    type: counter
+    help: The number of read accesses from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.5
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOWrites
+    oid: 1.3.6.1.4.1.6574.101.1.1.6
+    type: counter
+    help: The number of write accesses to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.6
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA
+    oid: 1.3.6.1.4.1.6574.101.1.1.8
+    type: gauge
+    help: The load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.8
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA1
+    oid: 1.3.6.1.4.1.6574.101.1.1.9
+    type: gauge
+    help: The 1 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.9
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA5
+    oid: 1.3.6.1.4.1.6574.101.1.1.10
+    type: gauge
+    help: The 5 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.10
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIOLA15
+    oid: 1.3.6.1.4.1.6574.101.1.1.11
+    type: gauge
+    help: The 15 minute average load of disk (%) - 1.3.6.1.4.1.6574.101.1.1.11
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONReadX
+    oid: 1.3.6.1.4.1.6574.101.1.1.12
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.101.1.1.12
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: storageIONWrittenX
+    oid: 1.3.6.1.4.1.6574.101.1.1.13
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.101.1.1.13
+    indexes:
+    - labelname: storageIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - storageIODevice
+      labelname: storageIODevice
+      oid: 1.3.6.1.4.1.6574.101.1.1.2
+      type: DisplayString
+  - name: spaceIOIndex
+    oid: 1.3.6.1.4.1.6574.102.1.1.1
+    type: gauge
+    help: Reference index for each observed device. - 1.3.6.1.4.1.6574.102.1.1.1
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIODevice
+    oid: 1.3.6.1.4.1.6574.102.1.1.2
+    type: DisplayString
+    help: The name of the device we are counting/checking. - 1.3.6.1.4.1.6574.102.1.1.2
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONRead
+    oid: 1.3.6.1.4.1.6574.102.1.1.3
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.3
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONWritten
+    oid: 1.3.6.1.4.1.6574.102.1.1.4
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.4
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOReads
+    oid: 1.3.6.1.4.1.6574.102.1.1.5
+    type: counter
+    help: The number of read accesses from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.5
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOWrites
+    oid: 1.3.6.1.4.1.6574.102.1.1.6
+    type: counter
+    help: The number of write accesses to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.6
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA
+    oid: 1.3.6.1.4.1.6574.102.1.1.8
+    type: gauge
+    help: The load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.8
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA1
+    oid: 1.3.6.1.4.1.6574.102.1.1.9
+    type: gauge
+    help: The 1 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.9
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA5
+    oid: 1.3.6.1.4.1.6574.102.1.1.10
+    type: gauge
+    help: The 5 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.10
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIOLA15
+    oid: 1.3.6.1.4.1.6574.102.1.1.11
+    type: gauge
+    help: The 15 minute average load of disk (%) - 1.3.6.1.4.1.6574.102.1.1.11
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONReadX
+    oid: 1.3.6.1.4.1.6574.102.1.1.12
+    type: counter
+    help: The number of bytes read from this device since boot. - 1.3.6.1.4.1.6574.102.1.1.12
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: spaceIONWrittenX
+    oid: 1.3.6.1.4.1.6574.102.1.1.13
+    type: counter
+    help: The number of bytes written to this device since boot. - 1.3.6.1.4.1.6574.102.1.1.13
+    indexes:
+    - labelname: spaceIODevice
+      type: gauge
+    lookups:
+    - labels:
+      - spaceIODevice
+      labelname: spaceIODevice
+      oid: 1.3.6.1.4.1.6574.102.1.1.2
+      type: DisplayString
+  - name: iSCSILUNInfoIndex
+    oid: 1.3.6.1.4.1.6574.104.1.1.1
+    type: gauge
+    help: LUN info index - 1.3.6.1.4.1.6574.104.1.1.1
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNUUID
+    oid: 1.3.6.1.4.1.6574.104.1.1.2
+    type: OctetString
+    help: LUN uuid - 1.3.6.1.4.1.6574.104.1.1.2
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNName
+    oid: 1.3.6.1.4.1.6574.104.1.1.3
+    type: OctetString
+    help: LUN name - 1.3.6.1.4.1.6574.104.1.1.3
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputReadHigh
+    oid: 1.3.6.1.4.1.6574.104.1.1.4
+    type: gauge
+    help: LUN read throughput over 32 bits part - 1.3.6.1.4.1.6574.104.1.1.4
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputReadLow
+    oid: 1.3.6.1.4.1.6574.104.1.1.5
+    type: gauge
+    help: LUN read throughput in unsigned 32 bit - 1.3.6.1.4.1.6574.104.1.1.5
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputWriteHigh
+    oid: 1.3.6.1.4.1.6574.104.1.1.6
+    type: gauge
+    help: LUN write throughput over 32 bits part - 1.3.6.1.4.1.6574.104.1.1.6
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNThroughputWriteLow
+    oid: 1.3.6.1.4.1.6574.104.1.1.7
+    type: gauge
+    help: LUN write throughput in unsigned 32 bit - 1.3.6.1.4.1.6574.104.1.1.7
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIopsRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.8
+    type: gauge
+    help: LUN read iops - 1.3.6.1.4.1.6574.104.1.1.8
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIopsWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.9
+    type: gauge
+    help: LUN write iops - 1.3.6.1.4.1.6574.104.1.1.9
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNDiskLatencyRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.10
+    type: gauge
+    help: LUN disk latency when reading - 1.3.6.1.4.1.6574.104.1.1.10
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNDiskLatencyWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.11
+    type: gauge
+    help: LUN disk latency when writing - 1.3.6.1.4.1.6574.104.1.1.11
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNNetworkLatencyTx
+    oid: 1.3.6.1.4.1.6574.104.1.1.12
+    type: gauge
+    help: LUN transfer data network latency - 1.3.6.1.4.1.6574.104.1.1.12
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNNetworkLatencyRx
+    oid: 1.3.6.1.4.1.6574.104.1.1.13
+    type: gauge
+    help: LUN receive data network latency - 1.3.6.1.4.1.6574.104.1.1.13
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIoSizeRead
+    oid: 1.3.6.1.4.1.6574.104.1.1.14
+    type: gauge
+    help: LUN average io size when reading - 1.3.6.1.4.1.6574.104.1.1.14
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNIoSizeWrite
+    oid: 1.3.6.1.4.1.6574.104.1.1.15
+    type: gauge
+    help: LUN average io size when writing - 1.3.6.1.4.1.6574.104.1.1.15
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNQueueDepth
+    oid: 1.3.6.1.4.1.6574.104.1.1.16
+    type: gauge
+    help: Num of iSCSI commands in LUN queue - 1.3.6.1.4.1.6574.104.1.1.16
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: iSCSILUNType
+    oid: 1.3.6.1.4.1.6574.104.1.1.17
+    type: OctetString
+    help: LUN type - 1.3.6.1.4.1.6574.104.1.1.17
+    indexes:
+    - labelname: iSCSILUNInfoIndex
+      type: gauge
+  - name: diskIndex
+    oid: 1.3.6.1.4.1.6574.2.1.1.1
+    type: gauge
+    help: The index of disk table - 1.3.6.1.4.1.6574.2.1.1.1
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskID
+    oid: 1.3.6.1.4.1.6574.2.1.1.2
+    type: OctetString
+    help: Synology disk ID The ID of disk is assigned by disk Station. - 1.3.6.1.4.1.6574.2.1.1.2
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskModel
+    oid: 1.3.6.1.4.1.6574.2.1.1.3
+    type: OctetString
+    help: Synology disk model name The disk model name will be showed here. - 1.3.6.1.4.1.6574.2.1.1.3
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskType
+    oid: 1.3.6.1.4.1.6574.2.1.1.4
+    type: OctetString
+    help: Synology disk type The type of disk will be showed here, including SATA,
+      SSD and so on. - 1.3.6.1.4.1.6574.2.1.1.4
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskStatus
+    oid: 1.3.6.1.4.1.6574.2.1.1.5
+    type: gauge
+    help: Synology disk status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.2.1.1.5
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: diskTemperature
+    oid: 1.3.6.1.4.1.6574.2.1.1.6
+    type: gauge
+    help: Synology disk temperature The temperature of each disk uses Celsius degree.
+      - 1.3.6.1.4.1.6574.2.1.1.6
+    indexes:
+    - labelname: diskID
+      type: gauge
+    lookups:
+    - labels:
+      - diskID
+      labelname: diskID
+      oid: 1.3.6.1.4.1.6574.2.1.1.2
+      type: OctetString
+  - name: raidIndex
+    oid: 1.3.6.1.4.1.6574.3.1.1.1
+    type: gauge
+    help: The index of raid table - 1.3.6.1.4.1.6574.3.1.1.1
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: raidName
+    oid: 1.3.6.1.4.1.6574.3.1.1.2
+    type: OctetString
+    help: Synology raid name The name of each raid will be showed here. - 1.3.6.1.4.1.6574.3.1.1.2
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: raidStatus
+    oid: 1.3.6.1.4.1.6574.3.1.1.3
+    type: gauge
+    help: Synology Raid status Each meanings of status represented describe below
+      - 1.3.6.1.4.1.6574.3.1.1.3
+    indexes:
+    - labelname: raidName
+      type: gauge
+    lookups:
+    - labels:
+      - raidName
+      labelname: raidName
+      oid: 1.3.6.1.4.1.6574.3.1.1.2
+      type: OctetString
+  - name: upsDeviceModel
+    oid: 1.3.6.1.4.1.6574.4.1.1
+    type: DisplayString
+    help: Device model - 1.3.6.1.4.1.6574.4.1.1
+  - name: upsDeviceManufacturer
+    oid: 1.3.6.1.4.1.6574.4.1.2
+    type: DisplayString
+    help: Device manufacturer - 1.3.6.1.4.1.6574.4.1.2
+  - name: upsDeviceSerial
+    oid: 1.3.6.1.4.1.6574.4.1.3
+    type: DisplayString
+    help: Device serial number. - 1.3.6.1.4.1.6574.4.1.3
+  - name: upsDeviceType
+    oid: 1.3.6.1.4.1.6574.4.1.4
+    type: DisplayString
+    help: Device type (ups, pdu, scd, psu) - 1.3.6.1.4.1.6574.4.1.4
+  - name: upsDeviceDescription
+    oid: 1.3.6.1.4.1.6574.4.1.5
+    type: DisplayString
+    help: Device description. - 1.3.6.1.4.1.6574.4.1.5
+  - name: upsDeviceContact
+    oid: 1.3.6.1.4.1.6574.4.1.6
+    type: DisplayString
+    help: Device administrator name. - 1.3.6.1.4.1.6574.4.1.6
+  - name: upsDeviceLocation
+    oid: 1.3.6.1.4.1.6574.4.1.7
+    type: DisplayString
+    help: Device physical location. - 1.3.6.1.4.1.6574.4.1.7
+  - name: upsDevicePart
+    oid: 1.3.6.1.4.1.6574.4.1.8
+    type: DisplayString
+    help: Device part number. - 1.3.6.1.4.1.6574.4.1.8
+  - name: upsDeviceMACAddr
+    oid: 1.3.6.1.4.1.6574.4.1.9
+    type: DisplayString
+    help: Physical network address of the device. - 1.3.6.1.4.1.6574.4.1.9
+  - name: upsInfoStatus
+    oid: 1.3.6.1.4.1.6574.4.2.1
+    type: DisplayString
+    help: UPS status. - 1.3.6.1.4.1.6574.4.2.1
+  - name: upsInfoAlarm
+    oid: 1.3.6.1.4.1.6574.4.2.2
+    type: DisplayString
+    help: UPS alarms - 1.3.6.1.4.1.6574.4.2.2
+  - name: upsInfoTime
+    oid: 1.3.6.1.4.1.6574.4.2.3
+    type: DisplayString
+    help: Internal UPS clock time - 1.3.6.1.4.1.6574.4.2.3
+  - name: upsInfoDate
+    oid: 1.3.6.1.4.1.6574.4.2.4
+    type: DisplayString
+    help: Internal UPS clock date - 1.3.6.1.4.1.6574.4.2.4
+  - name: upsInfoModel
+    oid: 1.3.6.1.4.1.6574.4.2.5
+    type: DisplayString
+    help: UPS model - 1.3.6.1.4.1.6574.4.2.5
+  - name: upsInfoMfrName
+    oid: 1.3.6.1.4.1.6574.4.2.6.1
+    type: DisplayString
+    help: UPS manufacturer - 1.3.6.1.4.1.6574.4.2.6.1
+  - name: upsInfoMfrDate
+    oid: 1.3.6.1.4.1.6574.4.2.6.2
+    type: DisplayString
+    help: UPS manufacturing date - 1.3.6.1.4.1.6574.4.2.6.2
+  - name: upsInfoSerial
+    oid: 1.3.6.1.4.1.6574.4.2.7
+    type: DisplayString
+    help: UPS serial number - 1.3.6.1.4.1.6574.4.2.7
+  - name: upsInfoVendorID
+    oid: 1.3.6.1.4.1.6574.4.2.8
+    type: DisplayString
+    help: Vendor ID for USB devices - 1.3.6.1.4.1.6574.4.2.8
+  - name: upsInfoProductID
+    oid: 1.3.6.1.4.1.6574.4.2.9
+    type: DisplayString
+    help: Product ID for USB devices - 1.3.6.1.4.1.6574.4.2.9
+  - name: upsInfoFirmwareName
+    oid: 1.3.6.1.4.1.6574.4.2.10.1
+    type: DisplayString
+    help: UPS firmware - 1.3.6.1.4.1.6574.4.2.10.1
+  - name: upsInfoFirmwareAux
+    oid: 1.3.6.1.4.1.6574.4.2.10.2
+    type: DisplayString
+    help: Auxiliary device firmware - 1.3.6.1.4.1.6574.4.2.10.2
+  - name: upsInfoID
+    oid: 1.3.6.1.4.1.6574.4.2.13
+    type: DisplayString
+    help: UPS system identifier - 1.3.6.1.4.1.6574.4.2.13
+  - name: upsInfoDelayStart
+    oid: 1.3.6.1.4.1.6574.4.2.14.1
+    type: gauge
+    help: Interval to wait before restarting the load (seconds) - 1.3.6.1.4.1.6574.4.2.14.1
+  - name: upsInfoDelayReboot
+    oid: 1.3.6.1.4.1.6574.4.2.14.2
+    type: gauge
+    help: Interval to wait before rebooting the UPS (seconds) - 1.3.6.1.4.1.6574.4.2.14.2
+  - name: upsInfoDelayShutdown
+    oid: 1.3.6.1.4.1.6574.4.2.14.3
+    type: gauge
+    help: Interval to wait after shutdown with delay command (seconds) - 1.3.6.1.4.1.6574.4.2.14.3
+  - name: upsInfoTimerStart
+    oid: 1.3.6.1.4.1.6574.4.2.15.1
+    type: gauge
+    help: Time before the load will be started (seconds) - 1.3.6.1.4.1.6574.4.2.15.1
+  - name: upsInfoTimerReboot
+    oid: 1.3.6.1.4.1.6574.4.2.15.2
+    type: gauge
+    help: Time before the load will be rebooted (seconds) - 1.3.6.1.4.1.6574.4.2.15.2
+  - name: upsInfoTimerShutdown
+    oid: 1.3.6.1.4.1.6574.4.2.15.3
+    type: gauge
+    help: Time before the load will be shutdown (seconds) - 1.3.6.1.4.1.6574.4.2.15.3
+  - name: upsInfoTestInterval
+    oid: 1.3.6.1.4.1.6574.4.2.16.1
+    type: gauge
+    help: Interval between self tests - 1.3.6.1.4.1.6574.4.2.16.1
+  - name: upsInfoTestResult
+    oid: 1.3.6.1.4.1.6574.4.2.16.2
+    type: DisplayString
+    help: Results of last self test - 1.3.6.1.4.1.6574.4.2.16.2
+  - name: upsInfoDisplayLanguage
+    oid: 1.3.6.1.4.1.6574.4.2.17
+    type: DisplayString
+    help: Language to use on front panel - 1.3.6.1.4.1.6574.4.2.17
+  - name: upsInfoContacts
+    oid: 1.3.6.1.4.1.6574.4.2.18
+    type: DisplayString
+    help: UPS external contact sensors - 1.3.6.1.4.1.6574.4.2.18
+  - name: upsInfoEffciency
+    oid: 1.3.6.1.4.1.6574.4.2.19
+    type: gauge
+    help: Efficiency of the UPS (ratio of the output current on the input current)
+      (percent) - 1.3.6.1.4.1.6574.4.2.19
+  - name: upsInfoBeeperStatus
+    oid: 1.3.6.1.4.1.6574.4.2.22
+    type: DisplayString
+    help: UPS beeper status (enabled, disabled or muted) - 1.3.6.1.4.1.6574.4.2.22
+  - name: upsInfoType
+    oid: 1.3.6.1.4.1.6574.4.2.23
+    type: DisplayString
+    help: UPS type - 1.3.6.1.4.1.6574.4.2.23
+  - name: upsInfoWatchdogStatus
+    oid: 1.3.6.1.4.1.6574.4.2.24
+    type: DisplayString
+    help: UPS watchdog status (enabled or disabled) - 1.3.6.1.4.1.6574.4.2.24
+  - name: upsInfoStartAuto
+    oid: 1.3.6.1.4.1.6574.4.2.25.1
+    type: DisplayString
+    help: UPS starts when mains is (re)applied - 1.3.6.1.4.1.6574.4.2.25.1
+  - name: upsInfoStartBattery
+    oid: 1.3.6.1.4.1.6574.4.2.25.2
+    type: DisplayString
+    help: Allow to start UPS from battery - 1.3.6.1.4.1.6574.4.2.25.2
+  - name: upsInfoStartReboot
+    oid: 1.3.6.1.4.1.6574.4.2.25.3
+    type: DisplayString
+    help: UPS coldstarts from battery (enabled or disabled) - 1.3.6.1.4.1.6574.4.2.25.3
+  - name: upsBatteryRuntimeValue
+    oid: 1.3.6.1.4.1.6574.4.3.6.1
+    type: gauge
+    help: Battery runtime (seconds) - 1.3.6.1.4.1.6574.4.3.6.1
+  - name: upsBatteryRuntimeLow
+    oid: 1.3.6.1.4.1.6574.4.3.6.2
+    type: gauge
+    help: Remaining battery runtime when UPS switches to LB (seconds) - 1.3.6.1.4.1.6574.4.3.6.2
+  - name: upsBatteryRuntimeRestart
+    oid: 1.3.6.1.4.1.6574.4.3.6.3
+    type: gauge
+    help: Minimum battery runtime for UPS restart after power-off (seconds) - 1.3.6.1.4.1.6574.4.3.6.3
+  - name: upsBatteryAlarmThreshold
+    oid: 1.3.6.1.4.1.6574.4.3.7
+    type: DisplayString
+    help: Battery alarm threshold - 1.3.6.1.4.1.6574.4.3.7
+  - name: upsBatteryDate
+    oid: 1.3.6.1.4.1.6574.4.3.8
+    type: DisplayString
+    help: Battery change date - 1.3.6.1.4.1.6574.4.3.8
+  - name: upsBatteryMfrDate
+    oid: 1.3.6.1.4.1.6574.4.3.9
+    type: DisplayString
+    help: Battery manufacturing date - 1.3.6.1.4.1.6574.4.3.9
+  - name: upsBatteryPacks
+    oid: 1.3.6.1.4.1.6574.4.3.10
+    type: gauge
+    help: Number of battery packs - 1.3.6.1.4.1.6574.4.3.10
+  - name: upsBatteryPacksBad
+    oid: 1.3.6.1.4.1.6574.4.3.11
+    type: gauge
+    help: Number of bad battery packs - 1.3.6.1.4.1.6574.4.3.11
+  - name: upsBatteryType
+    oid: 1.3.6.1.4.1.6574.4.3.12
+    type: DisplayString
+    help: Battery chemistry - 1.3.6.1.4.1.6574.4.3.12
+  - name: upsBatteryProtection
+    oid: 1.3.6.1.4.1.6574.4.3.13
+    type: DisplayString
+    help: Prevent deep discharge of battery - 1.3.6.1.4.1.6574.4.3.13
+  - name: upsBatteryEnergySave
+    oid: 1.3.6.1.4.1.6574.4.3.14
+    type: DisplayString
+    help: Switch off when running on battery and no/low load - 1.3.6.1.4.1.6574.4.3.14
+  - name: upsInputVoltageExtend
+    oid: 1.3.6.1.4.1.6574.4.4.1.5
+    type: DisplayString
+    help: Extended input voltage range - 1.3.6.1.4.1.6574.4.4.1.5
+  - name: upsInputTransferReason
+    oid: 1.3.6.1.4.1.6574.4.4.2.1
+    type: DisplayString
+    help: Reason for last transfer to battery - 1.3.6.1.4.1.6574.4.4.2.1
+  - name: upsInputSensitivity
+    oid: 1.3.6.1.4.1.6574.4.4.3
+    type: DisplayString
+    help: Input power sensitivity - 1.3.6.1.4.1.6574.4.4.3
+  - name: upsInputQuality
+    oid: 1.3.6.1.4.1.6574.4.4.4
+    type: DisplayString
+    help: Input power quality - 1.3.6.1.4.1.6574.4.4.4
+  - name: upsInputFrequencyExtend
+    oid: 1.3.6.1.4.1.6574.4.4.6.5
+    type: DisplayString
+    help: Extended input frequency range - 1.3.6.1.4.1.6574.4.4.6.5
+  - name: upsAmbientTemperatureAlarm
+    oid: 1.3.6.1.4.1.6574.4.6.1.2
+    type: DisplayString
+    help: Temperature alarm (enabled/disabled) - 1.3.6.1.4.1.6574.4.6.1.2
+  - name: upsAmbientHumidityAlarm
+    oid: 1.3.6.1.4.1.6574.4.6.2.2
+    type: DisplayString
+    help: Relative humidity alarm (enabled/disabled) - 1.3.6.1.4.1.6574.4.6.2.2
+  - name: upsDriverName
+    oid: 1.3.6.1.4.1.6574.4.7.1
+    type: DisplayString
+    help: Driver name - 1.3.6.1.4.1.6574.4.7.1
+  - name: upsDriverVersion
+    oid: 1.3.6.1.4.1.6574.4.7.2
+    type: DisplayString
+    help: Driver version (NUT release) - 1.3.6.1.4.1.6574.4.7.2
+  - name: upsDriverVersionData
+    oid: 1.3.6.1.4.1.6574.4.7.3
+    type: DisplayString
+    help: Driver version data - 1.3.6.1.4.1.6574.4.7.3
+  - name: upsDriverVersionInternal
+    oid: 1.3.6.1.4.1.6574.4.7.4
+    type: DisplayString
+    help: Internal driver version (if tracked separately) - 1.3.6.1.4.1.6574.4.7.4
+  - name: upsDriverPollInterval
+    oid: 1.3.6.1.4.1.6574.4.7.5
+    type: gauge
+    help: Poll interval setup in configuration file - 1.3.6.1.4.1.6574.4.7.5
+  - name: upsDriverPort
+    oid: 1.3.6.1.4.1.6574.4.7.6
+    type: DisplayString
+    help: Port setup in configuration file - 1.3.6.1.4.1.6574.4.7.6
+  - name: upsDriverPollFrequency
+    oid: 1.3.6.1.4.1.6574.4.7.7
+    type: gauge
+    help: Poll frequency - 1.3.6.1.4.1.6574.4.7.7
+  - name: upsDriverProductID
+    oid: 1.3.6.1.4.1.6574.4.7.8
+    type: DisplayString
+    help: Product ID - 1.3.6.1.4.1.6574.4.7.8
+  - name: upsDriverSnmpVersion
+    oid: 1.3.6.1.4.1.6574.4.7.9
+    type: DisplayString
+    help: Snmp version - 1.3.6.1.4.1.6574.4.7.9
+  - name: upsServerInfo
+    oid: 1.3.6.1.4.1.6574.4.8.1
+    type: DisplayString
+    help: Server information - 1.3.6.1.4.1.6574.4.8.1
+  - name: upsServerVersion
+    oid: 1.3.6.1.4.1.6574.4.8.2
+    type: DisplayString
+    help: Server version - 1.3.6.1.4.1.6574.4.8.2
+  - name: diskSMARTInfoIndex
+    oid: 1.3.6.1.4.1.6574.5.1.1.1
+    type: gauge
+    help: SMART info index - 1.3.6.1.4.1.6574.5.1.1.1
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTInfoDevName
+    oid: 1.3.6.1.4.1.6574.5.1.1.2
+    type: OctetString
+    help: SMART info device name - 1.3.6.1.4.1.6574.5.1.1.2
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrName
+    oid: 1.3.6.1.4.1.6574.5.1.1.3
+    type: OctetString
+    help: SMART attribute name - 1.3.6.1.4.1.6574.5.1.1.3
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrId
+    oid: 1.3.6.1.4.1.6574.5.1.1.4
+    type: gauge
+    help: SMART attribute ID - 1.3.6.1.4.1.6574.5.1.1.4
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrCurrent
+    oid: 1.3.6.1.4.1.6574.5.1.1.5
+    type: gauge
+    help: SMART attribute current value - 1.3.6.1.4.1.6574.5.1.1.5
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrWorst
+    oid: 1.3.6.1.4.1.6574.5.1.1.6
+    type: gauge
+    help: SMART attribute worst value - 1.3.6.1.4.1.6574.5.1.1.6
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrThreshold
+    oid: 1.3.6.1.4.1.6574.5.1.1.7
+    type: gauge
+    help: SMART attribute threshold value - 1.3.6.1.4.1.6574.5.1.1.7
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrRaw
+    oid: 1.3.6.1.4.1.6574.5.1.1.8
+    type: gauge
+    help: SMART attribute raw value - 1.3.6.1.4.1.6574.5.1.1.8
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: diskSMARTAttrStatus
+    oid: 1.3.6.1.4.1.6574.5.1.1.9
+    type: OctetString
+    help: SMART attribute status - 1.3.6.1.4.1.6574.5.1.1.9
+    indexes:
+    - labelname: diskSMARTInfoIndex
+      type: gauge
+  - name: serviceInfoIndex
+    oid: 1.3.6.1.4.1.6574.6.1.1.1
+    type: gauge
+    help: Service info index - 1.3.6.1.4.1.6574.6.1.1.1
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+  - name: serviceName
+    oid: 1.3.6.1.4.1.6574.6.1.1.2
+    type: OctetString
+    help: Service name - 1.3.6.1.4.1.6574.6.1.1.2
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+  - name: serviceUsers
+    oid: 1.3.6.1.4.1.6574.6.1.1.3
+    type: gauge
+    help: Number of users using this service - 1.3.6.1.4.1.6574.6.1.1.3
+    indexes:
+    - labelname: serviceName
+      type: gauge
+    lookups:
+    - labels:
+      - serviceName
+      labelname: serviceName
+      oid: 1.3.6.1.4.1.6574.6.1.1.2
+      type: OctetString
+ubiquiti_airmax:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.41112.1.4
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ubntRadioIndex
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.1
+    type: gauge
+    help: Index for the ubntRadioTable - 1.3.6.1.4.1.41112.1.4.1.1.1
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioMode
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.2
+    type: gauge
+    help: Radio mode - 1.3.6.1.4.1.41112.1.4.1.1.2
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioCCode
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.3
+    type: gauge
+    help: Country code - 1.3.6.1.4.1.41112.1.4.1.1.3
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioFreq
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.4
+    type: gauge
+    help: Operating frequency - 1.3.6.1.4.1.41112.1.4.1.1.4
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioDfsEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.5
+    type: gauge
+    help: DFS status - 1.3.6.1.4.1.41112.1.4.1.1.5
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioTxPower
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.6
+    type: gauge
+    help: Transmit power - 1.3.6.1.4.1.41112.1.4.1.1.6
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioDistance
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.7
+    type: gauge
+    help: Distance - 1.3.6.1.4.1.41112.1.4.1.1.7
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioChainmask
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.8
+    type: gauge
+    help: Chainmask - 1.3.6.1.4.1.41112.1.4.1.1.8
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioAntenna
+    oid: 1.3.6.1.4.1.41112.1.4.1.1.9
+    type: DisplayString
+    help: Antenna - 1.3.6.1.4.1.41112.1.4.1.1.9
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+  - name: ubntRadioRssiIndex
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.1
+    type: gauge
+    help: Index for the ubntRadioRssiTable - 1.3.6.1.4.1.41112.1.4.2.1.1
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssi
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.2
+    type: gauge
+    help: Data frames rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.2
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssiMgmt
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.3
+    type: gauge
+    help: Management frames rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.3
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntRadioRssiExt
+    oid: 1.3.6.1.4.1.41112.1.4.2.1.4
+    type: gauge
+    help: Extension channel rssi per chain - 1.3.6.1.4.1.41112.1.4.2.1.4
+    indexes:
+    - labelname: ubntRadioIndex
+      type: gauge
+    - labelname: ubntRadioRssiIndex
+      type: gauge
+  - name: ubntAirMaxIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.1
+    type: gauge
+    help: Index for the ubntAirMaxTable - 1.3.6.1.4.1.41112.1.4.6.1.1
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.2
+    type: gauge
+    help: airMAX status - on/off - 1.3.6.1.4.1.41112.1.4.6.1.2
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxQuality
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.3
+    type: gauge
+    help: airMAX quality - percentage - 1.3.6.1.4.1.41112.1.4.6.1.3
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.4
+    type: gauge
+    help: airMAX capacity - percentage - 1.3.6.1.4.1.41112.1.4.6.1.4
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxPriority
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.5
+    type: gauge
+    help: airMAX priority - none/high/low/medium - 1.3.6.1.4.1.41112.1.4.6.1.5
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirMaxNoAck
+    oid: 1.3.6.1.4.1.41112.1.4.6.1.6
+    type: gauge
+    help: airMAX NoACK mode - on/off - 1.3.6.1.4.1.41112.1.4.6.1.6
+    indexes:
+    - labelname: ubntAirMaxIfIndex
+      type: gauge
+  - name: ubntAirSyncIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.1
+    type: gauge
+    help: Index for the ubntAirSyncTable - 1.3.6.1.4.1.41112.1.4.3.1.1
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncMode
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.2
+    type: gauge
+    help: airSync mode - master/slave - 1.3.6.1.4.1.41112.1.4.3.1.2
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncCount
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.3
+    type: gauge
+    help: airSync client count - 1.3.6.1.4.1.41112.1.4.3.1.3
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncDownUtil
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.4
+    type: gauge
+    help: airSync down utilization - 1.3.6.1.4.1.41112.1.4.3.1.4
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSyncUpUtil
+    oid: 1.3.6.1.4.1.41112.1.4.3.1.5
+    type: gauge
+    help: airSync up utilization - 1.3.6.1.4.1.41112.1.4.3.1.5
+    indexes:
+    - labelname: ubntAirSyncIfIndex
+      type: gauge
+  - name: ubntAirSelIfIndex
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.1
+    type: gauge
+    help: Index for the ubntAirSelTable - 1.3.6.1.4.1.41112.1.4.4.1.1
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntAirSelEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.2
+    type: gauge
+    help: airSelect status - on/off - 1.3.6.1.4.1.41112.1.4.4.1.2
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntAirSelInterval
+    oid: 1.3.6.1.4.1.41112.1.4.4.1.3
+    type: gauge
+    help: airSelect hop interval (miliseconds) - 1.3.6.1.4.1.41112.1.4.4.1.3
+    indexes:
+    - labelname: ubntAirSelIfIndex
+      type: gauge
+  - name: ubntWlStatIndex
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.1
+    type: gauge
+    help: Index for the ubntWlStatTable - 1.3.6.1.4.1.41112.1.4.5.1.1
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSsid
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.2
+    type: DisplayString
+    help: SSID - 1.3.6.1.4.1.41112.1.4.5.1.2
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatHideSsid
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.3
+    type: gauge
+    help: Hide SSID - on/off - 1.3.6.1.4.1.41112.1.4.5.1.3
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatApMac
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.4
+    type: PhysAddress48
+    help: AP MAC address - 1.3.6.1.4.1.41112.1.4.5.1.4
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSignal
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.5
+    type: gauge
+    help: Signal strength, dBm - 1.3.6.1.4.1.41112.1.4.5.1.5
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatRssi
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.6
+    type: gauge
+    help: RSSI, dBm - 1.3.6.1.4.1.41112.1.4.5.1.6
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatCcq
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.7
+    type: gauge
+    help: CCQ in % - 1.3.6.1.4.1.41112.1.4.5.1.7
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatNoiseFloor
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.8
+    type: gauge
+    help: Noise floor - 1.3.6.1.4.1.41112.1.4.5.1.8
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatTxRate
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.9
+    type: gauge
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.5.1.9
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatRxRate
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.10
+    type: gauge
+    help: RX rate - 1.3.6.1.4.1.41112.1.4.5.1.10
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatSecurity
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.11
+    type: DisplayString
+    help: Wireless security mode - 1.3.6.1.4.1.41112.1.4.5.1.11
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatWdsEnabled
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.12
+    type: gauge
+    help: WDS - on/off - 1.3.6.1.4.1.41112.1.4.5.1.12
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatApRepeater
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.13
+    type: gauge
+    help: AP repeater - on/off - 1.3.6.1.4.1.41112.1.4.5.1.13
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatChanWidth
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.14
+    type: gauge
+    help: Channel Width - 1.3.6.1.4.1.41112.1.4.5.1.14
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntWlStatStaCount
+    oid: 1.3.6.1.4.1.41112.1.4.5.1.15
+    type: gauge
+    help: Station count - 1.3.6.1.4.1.41112.1.4.5.1.15
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+  - name: ubntStaMac
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.1
+    type: PhysAddress48
+    help: Station MAC address - 1.3.6.1.4.1.41112.1.4.7.1.1
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaName
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.2
+    type: DisplayString
+    help: Station name - 1.3.6.1.4.1.41112.1.4.7.1.2
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaSignal
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.3
+    type: gauge
+    help: Signal strength, dBm - 1.3.6.1.4.1.41112.1.4.7.1.3
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaNoiseFloor
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.4
+    type: gauge
+    help: Noise floor - 1.3.6.1.4.1.41112.1.4.7.1.4
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaDistance
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.5
+    type: gauge
+    help: Distance - 1.3.6.1.4.1.41112.1.4.7.1.5
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaCcq
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.6
+    type: gauge
+    help: CCQ in % - 1.3.6.1.4.1.41112.1.4.7.1.6
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmp
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.7
+    type: gauge
+    help: airMAX priority - 1.3.6.1.4.1.41112.1.4.7.1.7
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmq
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.8
+    type: gauge
+    help: airMAX quality - 1.3.6.1.4.1.41112.1.4.7.1.8
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaAmc
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.9
+    type: gauge
+    help: airMAX capacity - 1.3.6.1.4.1.41112.1.4.7.1.9
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaLastIp
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.10
+    type: IpAddr
+    help: Last known IP address - 1.3.6.1.4.1.41112.1.4.7.1.10
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxRate
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.11
+    type: gauge
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.7.1.11
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxRate
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.12
+    type: gauge
+    help: RX rate - 1.3.6.1.4.1.41112.1.4.7.1.12
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxBytes
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.13
+    type: counter
+    help: TX bytes - 1.3.6.1.4.1.41112.1.4.7.1.13
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxBytes
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.14
+    type: counter
+    help: TX rate - 1.3.6.1.4.1.41112.1.4.7.1.14
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaConnTime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.15
+    type: gauge
+    help: Connection Time in seconds - 1.3.6.1.4.1.41112.1.4.7.1.15
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaLocalCINR
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.16
+    type: gauge
+    help: Local CINR - 1.3.6.1.4.1.41112.1.4.7.1.16
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.17
+    type: gauge
+    help: Uplink Capacity in Kbps - 1.3.6.1.4.1.41112.1.4.7.1.17
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxCapacity
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.18
+    type: gauge
+    help: Downlink Capacity in Kbps - 1.3.6.1.4.1.41112.1.4.7.1.18
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxAirtime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.19
+    type: gauge
+    help: Uplink Airtime in % multiplied by 10 - 1.3.6.1.4.1.41112.1.4.7.1.19
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaRxAirtime
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.20
+    type: gauge
+    help: Downlink Airtime in % multiplied by 10 - 1.3.6.1.4.1.41112.1.4.7.1.20
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntStaTxLatency
+    oid: 1.3.6.1.4.1.41112.1.4.7.1.21
+    type: gauge
+    help: Uplink Latency in milliseconds - 1.3.6.1.4.1.41112.1.4.7.1.21
+    indexes:
+    - labelname: ubntWlStatIndex
+      type: gauge
+    - labelname: ubntStaMac
+      type: PhysAddress48
+  - name: ubntHostLocaltime
+    oid: 1.3.6.1.4.1.41112.1.4.8.1
+    type: DisplayString
+    help: Host local time - 1.3.6.1.4.1.41112.1.4.8.1
+  - name: ubntHostNetrole
+    oid: 1.3.6.1.4.1.41112.1.4.8.2
+    type: gauge
+    help: Radio mode - 1.3.6.1.4.1.41112.1.4.8.2
+  - name: ubntHostCpuLoad
+    oid: 1.3.6.1.4.1.41112.1.4.8.3
+    type: gauge
+    help: Host CPU load - 1.3.6.1.4.1.41112.1.4.8.3
+  - name: ubntHostTemperature
+    oid: 1.3.6.1.4.1.41112.1.4.8.4
+    type: gauge
+    help: Host system temperature - 1.3.6.1.4.1.41112.1.4.8.4
+ubiquiti_unifi:
+  walk:
+  - 1.3.6.1.2.1.1.3
+  - 1.3.6.1.2.1.2
+  - 1.3.6.1.2.1.31.1.1
+  - 1.3.6.1.4.1.41112.1.6
+  metrics:
+  - name: sysUpTime
+    oid: 1.3.6.1.2.1.1.3
+    type: gauge
+    help: The time (in hundredths of a second) since the network management portion
+      of the system was last re-initialized. - 1.3.6.1.2.1.1.3
+  - name: ifNumber
+    oid: 1.3.6.1.2.1.2.1
+    type: gauge
+    help: The number of network interfaces (regardless of their current state) present
+      on this system. - 1.3.6.1.2.1.2.1
+  - name: ifIndex
+    oid: 1.3.6.1.2.1.2.2.1.1
+    type: gauge
+    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifDescr
+    oid: 1.3.6.1.2.1.2.2.1.2
+    type: DisplayString
+    help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifType
+    oid: 1.3.6.1.2.1.2.2.1.3
+    type: gauge
+    help: The type of interface - 1.3.6.1.2.1.2.2.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifMtu
+    oid: 1.3.6.1.2.1.2.2.1.4
+    type: gauge
+    help: The size of the largest packet which can be sent/received on the interface,
+      specified in octets - 1.3.6.1.2.1.2.2.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifSpeed
+    oid: 1.3.6.1.2.1.2.2.1.5
+    type: gauge
+    help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPhysAddress
+    oid: 1.3.6.1.2.1.2.2.1.6
+    type: PhysAddress48
+    help: The interface's address at its protocol sub-layer - 1.3.6.1.2.1.2.2.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAdminStatus
+    oid: 1.3.6.1.2.1.2.2.1.7
+    type: gauge
+    help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOperStatus
+    oid: 1.3.6.1.2.1.2.2.1.8
+    type: gauge
+    help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLastChange
+    oid: 1.3.6.1.2.1.2.2.1.9
+    type: gauge
+    help: The value of sysUpTime at the time the interface entered its current operational
+      state - 1.3.6.1.2.1.2.2.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInOctets
+    oid: 1.3.6.1.2.1.2.2.1.10
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.11
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.2.2.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.12
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast or broadcast address at this sub-layer -
+      1.3.6.1.2.1.2.2.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInDiscards
+    oid: 1.3.6.1.2.1.2.2.1.13
+    type: counter
+    help: The number of inbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being deliverable to a higher-layer
+      protocol - 1.3.6.1.2.1.2.2.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInErrors
+    oid: 1.3.6.1.2.1.2.2.1.14
+    type: counter
+    help: For packet-oriented interfaces, the number of inbound packets that contained
+      errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInUnknownProtos
+    oid: 1.3.6.1.2.1.2.2.1.15
+    type: counter
+    help: For packet-oriented interfaces, the number of packets received via the interface
+      which were discarded because of an unknown or unsupported protocol - 1.3.6.1.2.1.2.2.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutOctets
+    oid: 1.3.6.1.2.1.2.2.1.16
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.2.2.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.17
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutNUcastPkts
+    oid: 1.3.6.1.2.1.2.2.1.18
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.2.2.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutDiscards
+    oid: 1.3.6.1.2.1.2.2.1.19
+    type: counter
+    help: The number of outbound packets which were chosen to be discarded even though
+      no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutErrors
+    oid: 1.3.6.1.2.1.2.2.1.20
+    type: counter
+    help: For packet-oriented interfaces, the number of outbound packets that could
+      not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutQLen
+    oid: 1.3.6.1.2.1.2.2.1.21
+    type: gauge
+    help: The length of the output packet queue (in packets). - 1.3.6.1.2.1.2.2.1.21
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifName
+    oid: 1.3.6.1.2.1.31.1.1.1.1
+    type: DisplayString
+    help: The textual name of the interface - 1.3.6.1.2.1.31.1.1.1.1
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.2
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.2
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.3
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.3
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.4
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.4
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.5
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.5
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.6
+    type: counter
+    help: The total number of octets received on the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.6
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.7
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were not addressed to a multicast or broadcast address at this sub-layer
+      - 1.3.6.1.2.1.31.1.1.1.7
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.8
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a multicast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.8
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCInBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.9
+    type: counter
+    help: The number of packets, delivered by this sub-layer to a higher (sub-)layer,
+      which were addressed to a broadcast address at this sub-layer - 1.3.6.1.2.1.31.1.1.1.9
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutOctets
+    oid: 1.3.6.1.2.1.31.1.1.1.10
+    type: counter
+    help: The total number of octets transmitted out of the interface, including framing
+      characters - 1.3.6.1.2.1.31.1.1.1.10
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutUcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.11
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were not addressed to a multicast or broadcast address at this sub-layer,
+      including those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.11
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutMulticastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.12
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a multicast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.12
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHCOutBroadcastPkts
+    oid: 1.3.6.1.2.1.31.1.1.1.13
+    type: counter
+    help: The total number of packets that higher-level protocols requested be transmitted,
+      and which were addressed to a broadcast address at this sub-layer, including
+      those that were discarded or not sent - 1.3.6.1.2.1.31.1.1.1.13
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifLinkUpDownTrapEnable
+    oid: 1.3.6.1.2.1.31.1.1.1.14
+    type: gauge
+    help: Indicates whether linkUp/linkDown traps should be generated for this interface
+      - 1.3.6.1.2.1.31.1.1.1.14
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifHighSpeed
+    oid: 1.3.6.1.2.1.31.1.1.1.15
+    type: gauge
+    help: An estimate of the interface's current bandwidth in units of 1,000,000 bits
+      per second - 1.3.6.1.2.1.31.1.1.1.15
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifPromiscuousMode
+    oid: 1.3.6.1.2.1.31.1.1.1.16
+    type: gauge
+    help: This object has a value of false(2) if this interface only accepts packets/frames
+      that are addressed to this station - 1.3.6.1.2.1.31.1.1.1.16
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifConnectorPresent
+    oid: 1.3.6.1.2.1.31.1.1.1.17
+    type: gauge
+    help: This object has the value 'true(1)' if the interface sublayer has a physical
+      connector and the value 'false(2)' otherwise. - 1.3.6.1.2.1.31.1.1.1.17
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifAlias
+    oid: 1.3.6.1.2.1.31.1.1.1.18
+    type: DisplayString
+    help: This object is an 'alias' name for the interface as specified by a network
+      manager, and provides a non-volatile 'handle' for the interface - 1.3.6.1.2.1.31.1.1.1.18
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: ifCounterDiscontinuityTime
+    oid: 1.3.6.1.2.1.31.1.1.1.19
+    type: gauge
+    help: The value of sysUpTime on the most recent occasion at which any one or more
+      of this interface's counters suffered a discontinuity - 1.3.6.1.2.1.31.1.1.1.19
+    indexes:
+    - labelname: ifIndex
+      type: gauge
+  - name: unifiRadioIndex
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.1'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioName
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.2
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.2'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioRadio
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.3
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.3'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.4
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.4'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.5
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.5'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuTotal
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.6
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.6'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuSelfRx
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.7
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.7'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioCuSelfTx
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.8
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.8'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiRadioOtherBss
+    oid: 1.3.6.1.4.1.41112.1.6.1.1.1.9
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.1.1.9'
+    indexes:
+    - labelname: unifiRadioIndex
+      type: gauge
+  - name: unifiVapIndex
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.1'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapBssId
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.2
+    type: PhysAddress48
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.2'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapCcq
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.3
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.3'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapChannel
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.4
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.4'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapExtChannel
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.5
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.5'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapEssId
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.6
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.6'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapName
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.7
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.7'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapNumStations
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.8
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.8'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRadio
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.9
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.9'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.10
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.10'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxCrypts
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.11
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.11'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.12
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.12'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxErrors
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.13
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.13'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxFrags
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.14
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.14'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.15
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.15'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.16
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.16'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.17
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.17'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxErrors
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.18
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.18'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.19
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.19'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxRetries
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.20
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.20'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapTxPower
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.21
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.21'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapUp
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.22
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.1.2.1.22'
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiVapUsage
+    oid: 1.3.6.1.4.1.41112.1.6.1.2.1.23
+    type: DisplayString
+    help: guest or regular user - 1.3.6.1.4.1.41112.1.6.1.2.1.23
+    indexes:
+    - labelname: unifiVapIndex
+      type: gauge
+  - name: unifiIfIndex
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.1
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.1'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfFullDuplex
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.2
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.2'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfIp
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.3
+    type: IpAddr
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.3'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfMac
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.4
+    type: PhysAddress48
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.4'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfName
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.5
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.5'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.6
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.6'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.7
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.7'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxError
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.8
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.8'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxMulticast
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.9
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.9'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfRxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.10
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.10'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfSpeed
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.11
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.11'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxBytes
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.12
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.12'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxDropped
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.13
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.13'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxError
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.14
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.14'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfTxPackets
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.15
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.15'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiIfUp
+    oid: 1.3.6.1.4.1.41112.1.6.2.1.1.16
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.2.1.1.16'
+    indexes:
+    - labelname: unifiIfIndex
+      type: gauge
+  - name: unifiApSystemIp
+    oid: 1.3.6.1.4.1.41112.1.6.3.1
+    type: IpAddr
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.1'
+  - name: unifiApSystemIsolated
+    oid: 1.3.6.1.4.1.41112.1.6.3.2
+    type: gauge
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.2'
+  - name: unifiApSystemModel
+    oid: 1.3.6.1.4.1.41112.1.6.3.3
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.3'
+  - name: unifiApSystemUplink
+    oid: 1.3.6.1.4.1.41112.1.6.3.4
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.4'
+  - name: unifiApSystemUptime
+    oid: 1.3.6.1.4.1.41112.1.6.3.5
+    type: counter
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.5'
+  - name: unifiApSystemVersion
+    oid: 1.3.6.1.4.1.41112.1.6.3.6
+    type: DisplayString
+    help: ' - 1.3.6.1.4.1.41112.1.6.3.6'
+

+ 61 - 0
automation/monitoring/scripts/notify-by-spark.py

@@ -0,0 +1,61 @@
+#!/usr/local/bin/python2.7
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sparker
+import sys
+import logging
+import re
+import argparse
+import CLEUCreds
+
+if __name__ == '__main__':
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s : %(message)s',
+                        filename='/var/log/spark.log', level=logging.DEBUG)
+
+    parser = argparse.ArgumentParser(
+        prog=sys.argv[0], description="Send notifications to a Spark room")
+    parser.add_argument('--team', '-t', metavar='<TEAM NAME>',
+                        help='Spark Team name to use')
+    parser.add_argument('--room', '-r', metavar='<ROOM NAME>',
+                        help='Spark Room name to use', required=True)
+
+    parser.set_defaults(team=None)
+    args = parser.parse_args()
+
+    spark = sparker.Sparker(logit=True, token=CLEUCreds.SPARK_TOKEN)
+
+    if not args.team and re.search(r':', args.room):
+        team,room = args.room.split(':')
+        args.team = team
+        args.room = room
+
+    msg = ''
+
+    for line in sys.stdin.read():
+        msg += line
+
+    spark.post_to_spark(args.team, args.room, msg)

+ 47 - 0
automation/monitoring/scripts/observium-to-spark.py

@@ -0,0 +1,47 @@
+#!/usr/local/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import os
+from subprocess import Popen, PIPE
+import shlex
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print('usage: {} <TEAM NAME>'.format(sys.argv[0]))
+        sys.exit(1)
+
+    msg = '_<a href="https://cl-monitoring.ciscolive.network:8080">Observium</a> on cl-monitoring_<br><br>**Notification Type:** {}<br><br>**Element:** {}<br>**Host:** {}<br>**State:** {}<br><br>**Date/Time:** {}<br>'.format(
+        os.environ['OBSERVIUM_ALERT_STATE'], os.environ['OBSERVIUM_ENTITY_LINK'], os.environ['OBSERVIUM_DEVICE_LINK'], os.environ['OBSERVIUM_TITLE'], os.environ['OBSERVIUM_ALERT_TIMESTAMP'], os.environ['OBSERVIUM_ALERT_TIMESTAMP'])
+    proc = Popen(shlex.split('/usr/local/bin/notify-by-spark.py -r {}'.format(
+        sys.argv[1])), stdin=PIPE, stdout=PIPE, stderr=PIPE)
+    out, err = proc.stdin.write(msg)
+    proc.communicate()
+    proc.stdin.close()
+
+    print(out)
+    print(err)

+ 68 - 0
automation/monitoring/scripts/observium-to-syslog.py

@@ -0,0 +1,68 @@
+#!/usr/local/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import os
+import netsnmp
+import syslog
+import re
+import CLEUCreds
+
+MSG = 'Needs investigation: {} (SN: {}) {}'
+
+if __name__ == '__main__':
+    syslog.openlog(facility=syslog.LOG_LOCAL3)
+
+    vars = netsnmp.VarList(netsnmp.Varbind(
+        'entPhysicalClass'), netsnmp.Varbind('entPhysicalSerialNum'))
+
+    chassis_index = -1
+    csn = ''
+
+    netsnmp.snmpwalk(vars,
+                     Version=3,
+                     DestHost=os.environ['OBSERVIUM_DEVICE_HOSTNAME'],
+                     SecLevel='authPriv',
+                     SecName='CLEUR',
+                     AuthProto='SHA',
+                     AuthPass=CLEUCreds.SNMP_AUTH_PASS,
+                     PrivProto='DES',
+                     PrivPass=CLEUCreds.SNMP_PRIV_PASS)
+
+    for var in vars:
+        if chassis_index == -1:
+            if var.tag == 'entPhysicalClass':
+                if int(var.val) == 3:
+                    chassis_index = int(var.iid)
+        elif var.tag == 'entPhysicalSerialNum':
+            if int(var.iid) == chassis_index:
+                csn = var.val
+
+    msg = MSG.format(os.environ['OBSERVIUM_DEVICE_HOSTNAME'],
+                     csn, os.environ['OBSERVIUM_ALERT_MESSAGE'])
+
+    syslog.syslog(syslog.LOG_ERR, msg)

+ 144 - 0
automation/my-diag-bridge/db_callback.py

@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+from flask import Flask
+from flask import jsonify
+from flask import request
+import sys
+import json
+from hashlib import sha1
+import hmac
+import time
+import cgi
+from sparker import Sparker
+import CLEUCreds
+
+SPARK_TEAM = 'CL18-Infra_team'
+SPARK_ROOM = 'proTACtive Alerts'
+
+MAX_DEVS = 10
+
+MSG_FORMAT = '''### {}\n
+**Severity:** {}\n
+**Details:** {}\n
+**Affects:** [{}]{}'''
+
+app = Flask('Diagnostic Bridge Spark Gateway')
+
+
+@app.route('/callback/dbridge', methods=['POST'])
+def dbridge():
+    global SPARK_TEAM, SPARK_ROOM, MAX_DEVS, MSG_FORMAT, spark
+
+    phash = None
+    j = None
+
+    try:
+        phash = request.headers.get('X-DB-Hash')
+        if phash is None:
+            raise Exception('Unable to get hash')
+    except Exception as e:
+        resp = jsonify({'error': 'Unable to get payload hash'})
+        resp.status_code = 403
+        sys.stderr.write('Unable to get payload hash\n')
+
+        return resp
+
+    req = request.get_data()
+
+    hashed = hmac.new(CLEUCreds.PROTACTIVE_KEY, req, sha1)
+    if hashed.digest().encode('hex').lower() != phash.lower():
+        resp = jsonify({'error': 'Unauthorized payload'})
+        resp.status_code = 403
+        sys.stderr.write('Unauthorized payload\n')
+
+        return resp
+
+    content_type = request.headers.get('Content-Type')
+    mimetype, ctoptions = cgi.parse_header(content_type)
+
+    if mimetype != 'application/json':
+        resp = jsonify({'error': 'Content-Type must be application/json'})
+        resp.status_code = 400
+        sys.stderr.write(
+            'Content-Type was not application/json (was {})\n'.format(content_type))
+
+        return resp
+
+    sys.stderr.write('Got "{}"\n'.format(req))
+
+    try:
+        j = json.loads(req)
+    except Exception as e:
+        resp = jsonify({'error': 'Failed to decode JSON: {}'.format(e)})
+        resp.status_code = 400
+        sys.stderr.write('Failed to decode JSON: {}\n'.format(e))
+
+        return resp
+
+    for problem in j:
+        title = problem['summary']
+        desc = problem['details']
+
+        num_devs = len(problem['instances']) if 'instances' in problem else 0
+        if num_devs == 0:
+            continue
+
+        extra_msg = ''
+        devs = []
+
+        for i in range(0, num_devs):
+            devs.append(problem['instances'][i]['hostname'])
+            if i == MAX_DEVS:
+                break
+
+        if num_devs > MAX_DEVS:
+            extra_msg = ' and {} other device(s)'.format(
+                str(num_devs - MAX_DEVS))
+
+        sres = spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, MSG_FORMAT.format(
+            title, problem['severity'], desc, ', '.join(devs), extra_msg))
+
+        if not sres:
+            resp = jsonify({'error': 'Error posting to Spark; see log'})
+            resp.status_code = 500
+
+            return resp
+
+        time.sleep(1)
+
+    resp = jsonify({'success': 'Posted to Spark successfully'})
+    resp.status_code = 200
+
+    return resp
+
+
+if __name__ == '__main__':
+
+    spark = Sparker()
+
+    app.run(host='10.100.253.13', port=8080, threaded=True)

+ 52 - 0
automation/network/dhcp_metrics.py

@@ -0,0 +1,52 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from flask import Flask
+from flask import Response
+import json
+import CLEUCreds
+from gevent.wsgi import WSGIServer
+
+
+CACHE_FILE = '/home/jclarke/dhcp_metrics.dat'
+
+app = Flask('DHCP Stats Fetcher')
+
+
+@app.route('/metrics')
+def get_metrics():
+    global CACHE_FILE
+
+    fd = open(CACHE_FILE, 'r')
+    macs = json.load(fd)
+    fd.close()
+
+    return Response('\n'.join(macs), mimetype='text/plain')
+
+if __name__ == '__main__':
+#    app.run(host='10.100.253.13', port=8081, threaded=True)
+    http_server = WSGIServer(('10.100.253.13', 8083), app)
+    http_server.serve_forever()

+ 116 - 0
automation/network/diff-route-tables.py

@@ -0,0 +1,116 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import paramiko
+import os
+from sparker import Sparker
+import time
+from subprocess import Popen, PIPE
+import shlex
+import re
+import json
+import CLEUCreds
+
+routers = {}
+
+commands = {
+    'ip_route': 'show ip route',
+    'ipv6_route': 'show ipv6 route'
+}
+
+cache_dir = '/home/jclarke/routing-tables'
+ROUTER_FILE = '/home/jclarke/routers.json'
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Core Alarms'
+
+if __name__ == '__main__':
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+    ssh_client = paramiko.SSHClient()
+    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+    try:
+        fd = open(ROUTER_FILE, 'r')
+        routers = json.load(fd)
+        fd.close()
+    except:
+        pass
+
+    for router, ip in routers.items():
+        try:
+            ssh_client.connect(ip, username=CLEUCreds.NET_USER, password=CLEUCreds.NET_PASS,
+                               timeout=60, allow_agent=False, look_for_keys=False)
+            chan = ssh_client.invoke_shell()
+            for fname, command in commands.items():
+                output = ''
+                try:
+                    chan.sendall("term length 0\n")
+                    chan.sendall("term width 0\n")
+                    chan.sendall("{}\n".format(command))
+                    i = 0
+                    while i < 10:
+                        if chan.recv_ready():
+                            break
+                        time.sleep(.5)
+                        i += 1
+                    while chan.recv_ready():
+                        output = output + chan.recv(65535)
+                except Exception as ie:
+                    print('Failed to get {} from {}: {}'.format(
+                        command, router, ie))
+                    continue
+
+                fpath = '{}/{}-{}'.format(cache_dir, fname, router)
+                curr_path = fpath + '.curr'
+                prev_path = fpath + '.prev'
+                fd = open(curr_path, 'w')
+                output = re.sub(r'\r', '', output)
+                output = re.sub(r'([\d\.]+) (\[[^\n]+)',
+                                '\\1\n          \\2', output)
+                fd.write(
+                    re.sub(r'(via [\d\.]+), [^,\n]+([,\n])', '\\1\\2', output))
+                fd.close()
+
+                if os.path.exists(prev_path):
+                    proc = Popen(
+                        shlex.split('/usr/bin/diff -E -b -B -w -u {} {}'.format(prev_path, curr_path)), stdout=PIPE, stderr=PIPE)
+                    out, err = proc.communicate()
+                    rc = proc.returncode
+
+                    if rc != 0:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, '**ALERT**: Routing table diff ({}) on **{}**:\n```\n{}\n```'.format(command, router, re.sub(cache_dir + '/', '', out)))
+                        time.sleep(1)
+                        #print('XXX: Out = \'{}\''.format(out))
+
+                os.rename(curr_path, prev_path)
+
+        except Exception as e:
+            ssh_client.close()
+            print('Failed to get routing tables from {}: {}'.format(router, e))
+            continue
+
+        ssh_client.close()

+ 67 - 0
automation/network/gen_ip_stats.sh

@@ -0,0 +1,67 @@
+#!/bin/sh
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+i41=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ipIfStatsHCInOctets.ipv4.1`
+i61=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ipIfStatsHCInOctets.ipv6.1`
+o41=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ipIfStatsHCOutOctets.ipv4.1`
+o61=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ipIfStatsHCOutOctets.ipv6.1`
+i42=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ipIfStatsHCInOctets.ipv4.1`
+i62=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ipIfStatsHCInOctets.ipv6.1`
+o42=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ipIfStatsHCOutOctets.ipv4.1`
+o62=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ipIfStatsHCOutOctets.ipv6.1`
+
+in41=`echo ${i41} | cut -f2 -d' '`
+in61=`echo ${i61} | cut -f2 -d' '`
+out41=`echo ${o41} | cut -f2 -d' '`
+out61=`echo ${o61} | cut -f2 -d' '`
+in42=`echo ${i42} | cut -f2 -d' '`
+in62=`echo ${i62} | cut -f2 -d' '`
+out42=`echo ${o42} | cut -f2 -d' '`
+out62=`echo ${o62} | cut -f2 -d' '`
+
+#echo "${in1} ${out1} ${in2} ${out2}"
+
+total4=$(expr \( ${in41} + ${out41} + ${in42} + ${out42} \))
+total6=$(expr \( ${in61} + ${out61} + ${in62} + ${out62} \))
+
+ototal4=0
+ototal6=0
+if [ -f /home/jclarke/cached_ip_stats.dat ]; then
+    cache=$(cat /home/jclarke/cached_util.dat)
+    ototal4=$(echo ${cache} | cut -f5 -d' ')
+    ototal6=$(echo ${cache} | cut -f5 -d' ')
+    cp -f /home/jclarke/cached_ip_stats.dat /home/jclarke/cached_ip_stats.dat.old
+fi
+
+if [ ${total4} -lt ${ototal4} ]; then
+    total=$(expr ${total4} + ${ototal4})
+fi
+if [ ${total6} -lt ${ototal6} ]; then
+    total=$(expr ${total6} + ${ototal6})
+fi
+
+echo "${total4} ${total6}" > /home/jclarke/cached_ip_stats.dat

+ 171 - 0
automation/network/gen_util.sh

@@ -0,0 +1,171 @@
+#!/bin/sh
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+i1=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ifHCInOctets.1`
+o1=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.161 ifHCOutOctets.1`
+i2=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ifHCInOctets.1`
+o2=`/usr/local/bin/snmpget -Oq -v3 -l authPriv -u USER -a SHA -A PW -x AES -X PW 10.66.201.162 ifHCOutOctets.1`
+
+bi1=1099215991115
+bo1=187042593328
+bi2=677250570
+bo2=218486766
+
+in1=`echo ${i1} | cut -f2 -d' '`
+out1=`echo ${o1} | cut -f2 -d' '`
+in2=`echo ${i2} | cut -f2 -d' '`
+out2=`echo ${o2} | cut -f2 -d' '`
+
+#echo "${in1} ${out1} ${in2} ${out2}"
+
+btotal=1287
+total=$(expr \( ${in1} + ${out1} + ${in2} + ${out2} \) / 1000000000)
+
+in1=$(expr ${in1} - ${bi1})
+out1=$(expr ${out1} - ${bo1})
+in2=$(expr ${in2} - ${bi2})
+out2=$(expr ${out2} - ${bo2})
+total=$(expr ${total} - ${btotal})
+
+oi1=0
+oi2=0
+oo1=0
+oo2=0
+ototal=0
+if [ -f /home/jclarke/cached_util.dat ]; then
+    cache=$(cat /home/jclarke/cached_util.dat)
+    oi1=$(echo ${cache} | cut -f1 -d' ')
+    oi2=$(echo ${cache} | cut -f2 -d' ')
+    oo1=$(echo ${cache} | cut -f3 -d' ')
+    oo2=$(echo ${cache} | cut -f4 -d' ')
+    ototal=$(echo ${cache} | cut -f5 -d' ')
+    cp -f /home/jclarke/cached_util.dat /home/jclarke/cached_util.dat.old
+fi
+
+if [ ${in1} -lt ${oi1} ]; then
+    in1=$(expr ${in1} + ${oi1})
+fi
+if [ ${in2} -lt ${oi2} ]; then
+    in2=$(expr ${in2} + ${oi2})
+fi
+if [ ${out1} -lt ${oo1} ]; then
+    out1=$(expr ${out1} + ${oo1})
+fi
+if [ ${out2} -lt ${oo2} ]; then
+    out2=$(expr ${out2} + ${oo2})
+fi
+if [ ${total} -lt ${ototal} ]; then
+    total=$(expr ${total} + ${ototal})
+fi
+
+echo "${in1} ${in2} ${out1} ${out2} ${total}" > /home/jclarke/cached_util.dat
+
+#echo "total = ${total}"
+
+date=`date`
+
+total=`/usr/local/bin/perl -MNumber::Format -e "\\\$x = new Number::Format(THOUSANDS_SEP => ' '); print \\\$x->format_number(${total})"`
+
+cat <<EOF > /usr/local/www/apache24/data/utilization.html
+<html>
+  <head>
+    <meta http-equiv="content-type" a="" content="text/html; charset=UTF-8">
+    <meta http-equiv="refresh" content="15">
+    <title>Cisco Live Melbourne Internet Usage (GigaBytes Transfered)</title>
+    <style type="text/css">
+p.rightpar {text-align: right; color: white;}
+p.tabletitle {font-size: 30pt; color: white;}
+p.headtitle {font-size: 30pt; color: white; text-align: center;}
+body {font-family: "Trebuchet MS", Helvetica, sans-serif; background-color: black;}
+.BannerTable {color: black; table-layout: fixed;}
+.CLTable td {text-align: center; font-size: 10pt; width: 100px;}
+.MainTable {color: white; table-layout: fixed; border: 0px; width: 75%; background-color: #269E7A; }
+.MainTable td.bignum { font-size: 144pt; text-align: right; vertical-align: text-bottom;}
+.MainTable td.smallnum { font-size: 50pt; text-align: left; vertical-align: text-bottom;}
+.MainTable td.unit { font-size: 50pt; text-align: left; vertical-align: text-bottom;}
+.DeviceTable { color: white; table-layout: fixed; }
+    </style>
+  </head>
+  <body>
+    <center>
+      <table class="BannerTable" align="center" border="0" cellpadding="2" cellspacing="2" width="100%">
+	<tbody>
+	  <tr>
+	    <td valign="top" width="15%">
+	      <br/>
+	    </td>
+	    <td align="center" style="background-color: white;" valign="top"><img alt="NOCHeader" src="cl_logo.png" width="211" height="88">
+	    </td>
+	    <td valign="top" width="15%">
+	      <p class="rightpar">Dashboard Generated: ${date}<br/>Updated
+	        every FIVE minutes</p>
+	    </td>
+	  </tr>
+	</tbody>
+      </table>
+    </center>
+    <p class="headtitle">CiscoLive Internet WAN Traffic (Total Traffic
+    Amount In+Out)</p>
+    <center>
+      <table class="MainTable">
+	<tbody>
+	  <tr>
+	    <td class="bignum" style="width: 30%">${total}</td>
+	    <td class="smallnum" style="width: 10%"></td>
+	    <td class="unit" style="width: 20%">Gigabytes</td>
+	  </tr>
+	</tbody>
+      </table>
+    </center>
+    <br/>
+    <br/>
+    <br/>
+    <table class="DeviceTable" align="center" border="1"
+					      cellpadding="2" cellspacing="2" width="40%">
+      <tr>
+	<th>WAN Router</th>
+	<th>Input Bytes</th>
+	<th>Output Bytes</th>
+      </tr>
+      <tr>
+	<td align="left">liveau-wan-gw1</td>
+	<td align="right">${in1}</td>
+	<td align="right">${out1}</td>
+      </tr>
+      <tr>
+	<td align="left">liveau-wan-gw2</td>
+	<td align="right">${in2}</td>
+	<td align="right">${out2}</td>
+      </tr>
+    </table>
+    <br/>
+    <br/>
+    <p class="headtitle">Counter began on Monday, March 6 at 16:00
+    AEDT when Registration opened.</p>
+  </body>
+</html>
+EOF

+ 165 - 0
automation/network/get-devs.py

@@ -0,0 +1,165 @@
+#!/usr/bin/env python2.7
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import json
+import sys
+import time
+import os
+from subprocess import call
+from sparker import Sparker
+import pprint
+import re
+from multiprocessing import Pool
+import socket
+import CLEUCreds
+
+TOOL = 'tool.ciscolive.network'
+CACHE_FILE = '/home/jclarke/cached_devs.dat'
+PING_DEVS_FILE = '/home/jclarke/ping-devs.json'
+
+TEXT_BAD = "**DANGER! DANGER!**: Pinger detected that device %s (IP: %s)%s is no longer reachable"
+TEXT_GOOD = "_RELAX_: Pinger has detected that device %s (IP: %s)%s is now reachable again"
+
+ROOM_NAME = 'Device Alarms'
+TEAM_NAME = 'CL19 NOC Team'
+
+excluded_devices = [r'^VHS-']
+
+additional_devices = []
+
+
+def check_prev(dev_dic, prev_devs, pstate='REACHABLE'):
+    send_msg = False
+    for pd in prev_devs:
+        if pd['name'] == dev_dic['name']:
+            if pd['reachability'] != pstate:
+                send_msg = True
+            break
+    return send_msg
+
+
+def know_device(dev_dic, prev_devs):
+    for pd in prev_devs:
+        if pd['name'] == dev_dic['name']:
+            return True
+
+    return False
+
+
+def ping_device(dev):
+    global TEAM_NAME, ROOM_NAME, TEXT_BAD, TEXT_GOOD, prev_devs, spark, excluded_devices
+
+    dev_dic = {}
+
+    dev_dic['name'] = dev['Hostname']
+    dev_dic['ip'] = dev['IPAddress']
+    if dev_dic['ip'] == '0.0.0.0':
+        return None
+    for exc in excluded_devices:
+        if re.search(exc, dev_dic['name']) or re.search(exc, dev_dic['ip']):
+            return None
+    #print('Pinging {}'.format(dev_dic['name']))
+    msg_text = TEXT_BAD
+    send_msg = True
+    if not dev['Reachable']:
+        send_msg = know_device(dev_dic, prev_devs)
+    for i in range(2):
+        res = call(["/usr/local/sbin/fping",
+                    "-q", "-r0", dev_dic['ip']])
+        time.sleep(.5)
+    if res != 0:
+        dev_dic['reachability'] = 'UNREACHABLE'
+        send_msg = check_prev(dev_dic, prev_devs, 'UNREACHABLE')
+    else:
+        dev_dic['reachability'] = 'REACHABLE'
+        msg_text = TEXT_GOOD
+        send_msg = check_prev(dev_dic, prev_devs)
+
+    if send_msg:
+        loc = ''
+        if 'LocationDetail' in dev:
+            loc = ' (Location: {})'.format(dev['LocationDetail'])
+        message = msg_text % (dev_dic['name'], dev_dic['ip'], loc)
+        spark.post_to_spark(TEAM_NAME, ROOM_NAME, message)
+
+    return dev_dic
+
+
+def get_devs(p):
+    global TOOL, additional_devices
+
+    url = "http://{}/get/switches/json".format(TOOL)
+
+    devices = []
+#    response = requests.request('GET', url)
+    code = 200
+#   code = response.status_code
+    if code == 200:
+        #j = json.loads(response.text)
+        j = []
+
+        for dev in additional_devices:
+            ip = dev
+            try:
+                ip = socket.gethostbyname(dev)
+            except:
+                pass
+            j.append({'Hostname': dev, 'IPAddress': ip, 'Reachable': True})
+
+        results = [pool.apply_async(ping_device, [d]) for d in j]
+        for res in results:
+            retval = res.get()
+            if retval is not None:
+                devices.append(retval)
+
+    return devices
+
+
+if __name__ == '__main__':
+    prev_devs = []
+    if os.path.exists(CACHE_FILE):
+        fd = open(CACHE_FILE, 'r')
+        prev_devs = json.load(fd)
+        fd.close()
+
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    try:
+        fd = open(PING_DEVS_FILE, 'r')
+        additional_devices = json.load(fd)
+        fd.close()
+    except:
+        pass
+
+    pool = Pool(20)
+    devs = get_devs(pool)
+    fd = open(CACHE_FILE, 'w')
+    json.dump(devs, fd, ensure_ascii=False, indent=4)
+    fd.close()

+ 135 - 0
automation/network/get-sw-inv.py

@@ -0,0 +1,135 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import requests
+import json
+import sys
+import time
+import os
+import re
+from subprocess import call
+
+PI_USER = ''
+PI_PASS = ''
+PI = '10.66.200.11'
+PAGE_SIZE = 1000
+
+
+def get_devs():
+    global PI_USER, PI_PASS, PI, PAGE_SIZE, room_id, SPARK_API, SPARK_TOKEN, TEXT_BAD, TEXT_GOOD
+
+    url = "https://%s/webacs/api/v1/data/InventoryDetails.json?.full=true&.maxResults=%d" % (
+        PI, PAGE_SIZE)
+    headers = {
+        'Connection': 'close'
+    }
+
+    devices = []
+    dets = []
+    done = False
+    first = 0
+    while not done:
+        code = 401
+        i = 0
+        nurl = url + "&.firstResult=" + str(first * PAGE_SIZE)
+        while code != 200 and i < 40:
+            response = requests.request("GET", nurl, auth=(
+                PI_USER, PI_PASS), headers=headers, verify=False)
+            code = response.status_code
+            if code != 200:
+                i += 1
+                time.sleep(3)
+        if code == 200:
+            j = json.loads(response.text)
+            if int(j['queryResponse']['@last']) + 1 == int(j['queryResponse']['@count']):
+                done = True
+            else:
+                first += 1
+
+            for dev in j['queryResponse']['entity']:
+                det_dic = {}
+                if 'ipAddress' not in dev['inventoryDetailsDTO']['summary']:
+                    continue
+                det_dic['ip'] = dev['inventoryDetailsDTO'][
+                    'summary']['ipAddress']
+                det_dic['serial'] = 'N/A'
+                if 'udiDetails' in dev['inventoryDetailsDTO']:
+                    for udi in dev['inventoryDetailsDTO']['udiDetails']['udiDetail']:
+                        if 'productId' in udi:
+                            if re.search(r'^WS-C', udi['productId']):
+                                det_dic['serial'] = udi['udiSerialNr']
+
+                dets.append(det_dic)
+
+    first = 0
+    done = False
+    url = "https://%s/webacs/api/v1/data/Devices.json?.full=true&.maxResults=%d" % (
+        PI, PAGE_SIZE)
+
+    while not done:
+        code = 401
+        i = 0
+        nurl = url + "&.firstResult=" + str(first * PAGE_SIZE)
+        while code != 200 and i < 40:
+            response = requests.request("GET", nurl, auth=(
+                PI_USER, PI_PASS), headers=headers, verify=False)
+            code = response.status_code
+            if code != 200:
+                i += 1
+                time.sleep(3)
+        if code == 200:
+            j = json.loads(response.text)
+            if int(j['queryResponse']['@last']) + 1 == int(j['queryResponse']['@count']):
+                done = True
+            else:
+                first += 1
+
+            for dev in j['queryResponse']['entity']:
+                dev_dic = {}
+                if 'ipAddress' not in dev['devicesDTO']:
+                    continue
+                if 'deviceName' in dev['devicesDTO']:
+                    dev_dic['name'] = dev['devicesDTO']['deviceName']
+                else:
+                    dev_dic['name'] = dev['devicesDTO']['ipAddress']
+                dev_dic['ip'] = dev['devicesDTO']['ipAddress']
+                if 'deviceType' not in dev['devicesDTO']:
+                    continue
+                dev_dic['serial'] = 'N/A'
+                for det in dets:
+                    if det['ip'] == dev_dic['ip']:
+                        dev_dic['serial'] = det['serial']
+                dev_dic['type'] = dev['devicesDTO']['deviceType']
+
+                devices.append(dev_dic)
+
+    return devices
+
+devs = get_devs()
+print "Name,IP,Type,Serial Number"
+for dev in devs:
+    print dev['name'] + "," + dev['ip'] + "," + dev['type'] + "," + dev['serial']

+ 52 - 0
automation/network/mac_metrics.py

@@ -0,0 +1,52 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from flask import Flask
+from flask import Response
+import json
+import CLEUCreds
+from gevent.wsgi import WSGIServer
+
+
+CACHE_FILE = '/home/jclarke/mac_counts.dat'
+
+app = Flask('MAC Address Count Fetcher')
+
+
+@app.route('/metrics')
+def get_metrics():
+    global CACHE_FILE
+
+    fd = open(CACHE_FILE, 'r')
+    macs = json.load(fd)
+    fd.close()
+
+    return Response('\n'.join(macs), mimetype='text/plain')
+
+if __name__ == '__main__':
+#    app.run(host='10.100.253.13', port=8081, threaded=True)
+    http_server = WSGIServer(('10.100.253.13', 8081), app)
+    http_server.serve_forever()

+ 81 - 0
automation/network/poll_dhcp.py

@@ -0,0 +1,81 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import os
+import re
+import sys
+import time
+import json
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+import CLEUCreds
+
+DHCP_SERVERS = ['10.100.253.9', '10.100.253.109']
+CACHE_FILE = '/home/jclarke/dhcp_metrics.dat'
+CACHE_FILE_TMP = CACHE_FILE + '.tmp'
+
+CNR_HEADERS = {
+    'Authorization': CLEUCreds.JCLARKE_BASIC,
+    'Accept': 'application/json'
+}
+
+
+def get_metrics():
+    global DHCP_SERVERS, CNR_HEADERS
+
+    res = []
+
+    for server in DHCP_SERVERS:
+        url = 'https://{}:8443/web-services/rest/stats/DHCPServer'.format(
+            server)
+
+        try:
+            response = requests.request('GET', url, params={
+                                        'nrClass': 'DHCPServerActivityStats'}, headers=CNR_HEADERS, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            print('Failed to get stats {}'.format(e))
+            continue
+
+        j = response.json()
+        for key in j.keys():
+            if type(j[key]) is not dict:
+                res.append('{}{{server="{}"}} {}'.format(key, server, j[key]))
+
+    return res
+
+
+if __name__ == '__main__':
+    response = get_metrics()
+
+    fd = open(CACHE_FILE_TMP, 'w')
+    json.dump(response, fd, indent=4)
+    fd.close()
+
+    os.rename(CACHE_FILE_TMP, CACHE_FILE)

+ 130 - 0
automation/network/poll_errors.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import netsnmp
+import os
+import json
+from sparker import Sparker
+import CLEUCreds
+
+CACHE_FILE = '/home/jclarke/errors_cache.dat'
+THRESHOLD = 1
+WINDOW = 12
+REARM = 6
+
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Data Center Alarms'
+
+devices = ['dc1-fcsw-1', 'dc1-fcsw-2', 'dc2-fcsw-1', 'dc2-fcsw-2',
+           'dc1-ethsw-1', 'dc1-ethsw-2', 'dc2-ethsw-1', 'dc2-ethsw-2']
+
+ignore_interfaces = {}
+
+prev_state = {}
+curr_state = {}
+
+if __name__ == '__main__':
+
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    if os.path.exists(CACHE_FILE):
+        fd = open(CACHE_FILE, 'r')
+        prev_state = json.load(fd)
+        fd.close()
+
+    for device in devices:
+
+        swent = {}
+
+        vars = netsnmp.VarList(netsnmp.Varbind('ifDescr'), netsnmp.Varbind('ifInErrors'), netsnmp.Varbind(
+            'ifOutErrors'), netsnmp.Varbind('ifInDiscards'), netsnmp.Varbind('ifOutDiscards'), netsnmp.Varbind('ifAlias'))
+        netsnmp.snmpwalk(vars,
+                         Version=3,
+                         DestHost=device,
+                         SecLevel='authPriv',
+                         SecName='CLEUR',
+                         AuthProto='SHA',
+                         AuthPass=CLEUCreds.SNMP_AUTH_PASS,
+                         PrivProto='DES',
+                         PrivPass=CLEUCreds.SNMP_PRIV_PASS)
+        for var in vars:
+            if var.iid not in swent:
+                swent[var.iid] = {}
+                swent[var.iid]['count'] = 0
+                swent[var.iid]['suppressed'] = False
+
+            swent[var.iid][var.tag] = var.val
+
+        curr_state[device] = swent
+        if not device in prev_state:
+            continue
+
+        for ins, vard in curr_state[device].items():
+            if not ins in prev_state[device]:
+                continue
+            if not 'ifDescr' in vard:
+                continue
+            if not 'ifAlias' in vard:
+                vard['ifAlias'] = ''
+            if 'count' in prev_state[device][ins]:
+                curr_state[device][ins]['count'] = prev_state[device][ins]['count']
+
+            if 'suppressed' in prev_state[device][ins]:
+                curr_state[device][ins]['suppressed'] = prev_state[
+                    device][ins]['suppressed']
+            if_descr = vard['ifDescr']
+            if_alias = vard['ifAlias']
+            if device in ignore_interfaces and if_descr in ignore_interfaces[device]:
+                continue
+            found_error = False
+            for k, v in vard.items():
+                if k == 'ifDescr' or k == 'ifAlias' or k == 'count' or k == 'suppressed':
+                    continue
+                if k in prev_state[device][ins]:
+                    diff = int(v) - int(prev_state[device][ins][k])
+                    if diff >= THRESHOLD:
+                        found_error = True
+                        if curr_state[device][ins]['count'] < WINDOW and not curr_state[device][ins]['suppressed']:
+                            spark.post_to_spark(
+                                SPARK_TEAM, SPARK_ROOM, '**WARNING**: Interface **{}** ({}) on device _{}_ has seen an increase of **{}** {} since the last poll (previous: {}, current: {}).'.format(if_descr, if_alias, device, diff, k, prev_state[device][ins][k], v))
+                        elif not curr_state[device][ins]['suppressed']:
+                            curr_state[device][ins]['suppressed'] = True
+                            spark.post_to_spark(
+                                SPARK_TEAM, SPARK_ROOM, 'Suppressing alarms for interface **{}** ({}) on device _{}_'.format(if_descr, if_alias, device))
+            if not found_error:
+                if curr_state[device][ins]['count'] > 0:
+                    curr_state[device][ins]['count'] -= 1
+                    if curr_state[device][ins]['count'] < REARM and curr_state[device][ins]['suppressed']:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Interface **{}** ({}) on device _{}_ is no longer seeing an increase of errors'.format(if_descr, if_alias, device))
+                        curr_state[device][ins]['suppressed'] = False
+            else:
+                curr_state[device][ins]['count'] += 1
+
+    fd = open(CACHE_FILE, 'w')
+    json.dump(curr_state, fd, indent=4)
+    fd.close()

+ 151 - 0
automation/network/poll_macs.py

@@ -0,0 +1,151 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import os
+import re
+import sys
+import time
+import json
+import paramiko
+import CLEUCreds
+
+
+IDF_COUNT = 60
+IDF_PATTERN = '10.127.0.{}'
+CACHE_FILE = '/home/jclarke/mac_counts.dat'
+CACHE_FILE_TMP = CACHE_FILE + '.tmp'
+
+commands = [
+  {
+    'command': 'show mac address-table count | inc Dynamic Address Count',
+    'pattern': r'Dynamic Address Count:\s+(\d+)',
+    'metric': 'totalMacs',
+    'devices': ['core1-l3c', 'core2-l3c']
+  },
+  {
+    'command': 'show mac address-table dynamic | inc Total',
+    'pattern': r'Total.*: (\d+)',
+    'metric': 'totalMacs',
+    'devicePatterns': [
+      {
+        'pattern': '10.127.0.{}',
+        'range': {
+          'min': 1,
+          'max': 60
+        }
+      }
+    ]
+  },
+  {
+    'command': 'show ip arp summary | inc IP ARP',
+    'pattern': r'(\d+) IP ARP entries',
+    'metric': 'arpEntries',
+    'devicePatterns': [
+      {
+        'pattern': '10.127.0.{}',
+        'range': {
+          'min': 1,
+          'max': 60
+        }
+      }
+    ]
+  }
+]
+
+
+def get_results(ssh_client, ip, command, pattern, metric):
+    response = ''
+    try:
+        ssh_client.connect(ip, username=CLEUCreds.NET_USER, password=CLEUCreds.NET_PASS,
+                           timeout=5, allow_agent=False, look_for_keys=False)
+        chan = ssh_client.invoke_shell()
+        output = ''
+        try:
+            chan.sendall('term length 0\n')
+            chan.sendall('term width 0\n')
+            chan.sendall('{}\n'.format(command))
+            j = 0
+            while j < 10:
+                if chan.recv_ready():
+                    break
+                time.sleep(.5)
+                j += 1
+            while chan.recv_ready():
+                output += chan.recv(65535)
+        except Exception as ie:
+            response = '{}{{idf="{}"}}'.format(metric, ip)
+            sys.stderr.write(
+                'Failed to get MACs from {}: {}\n'.format(ip, ie))
+            return response
+
+        m = re.search(pattern, output)
+        if m:
+            response = '{}{{idf="{}"}} {}'.format(metric, ip, m.group(1))
+        else:
+            response = '{}{{idf="{}"}} 0'.format(metric, ip)
+    except Exception as e:
+        ssh_client.close()
+        sys.stderr.write('Failed to connect to {}: {}\n'.format(ip, e))
+        return ''
+
+    ssh_client.close()
+
+    return response
+
+
+def get_metrics():
+
+    response = []
+
+    ssh_client = paramiko.SSHClient()
+    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+    for command in commands:
+        if 'devices' in command:
+            for device in command['devices']:
+                response.append(get_results(ssh_client, device, command['command'], command['pattern'], command['metric']))
+        else:
+            for pattern in command['devicePatterns']:
+                if 'range' in pattern:
+                    for i in range(pattern['range']['min'], pattern['range']['max']):
+                        response.append(get_results(ssh_client, pattern['pattern'].format(str(i)), command[
+                                        'command'], command['pattern'], command['metric']))
+                else:
+                    for sub in pattern['subs']:
+                        response.append(get_results(ssh_client, pattern['pattern'].format(sub), command[
+                                        'command'], command['pattern'], command['metric']))
+
+    return response
+
+if __name__ == '__main__':
+    response=get_metrics()
+
+    fd=open(CACHE_FILE_TMP, 'w')
+    json.dump(response, fd, indent=4)
+    fd.close()
+
+    os.rename(CACHE_FILE_TMP, CACHE_FILE)

+ 135 - 0
automation/network/poll_tcam.py

@@ -0,0 +1,135 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import os
+import re
+import sys
+import time
+import json
+import paramiko
+import sparker
+from multiprocessing import Pool
+import traceback
+import CLEUCreds
+
+
+devices = ['CORE1-WA', 'CORE2-WA']
+TEAM_NAME = 'CL19 NOC Team'
+ROOM_NAME = 'Core Alarms'
+CACHE_FILE = '/home/jclarke/tcam_util.json'
+
+spark = None
+
+
+def exec_command(chan, cmd, dev):
+    output = ''
+    chan.send(cmd + '\n')
+    time.sleep(1)
+    output += chan.recv(65535)
+
+    return output
+
+
+def get_results(dev, cache):
+    global TEAM_NAME, ROOM_NAME, spark
+    commands = [
+        'show platform hardware fed active fwd-asic resource tcam utilization']
+
+    ssh_client = paramiko.SSHClient()
+    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+    output = ''
+
+    try:
+        ssh_client.connect(dev, username=CLEUCreds.NET_USER, password=CLEUCreds.NET_PASS,
+                           timeout=5, allow_agent=False, look_for_keys=False)
+        chan = ssh_client.invoke_shell()
+        try:
+            exec_command(chan, 'term width 0', dev)
+            exec_command(chan, 'term length 0', dev)
+            for cmd in commands:
+                try:
+                    output = exec_command(chan, cmd, dev)
+                except Exception as iie:
+                    sys.stderr.write(
+                        'Failed to get result for {} from {}: {}\n'.format(cmd, dev, iie))
+                    traceback.print_exc()
+
+        except Exception as ie:
+            sys.stderr.write(
+                'Failed to setup SSH on {}: {}\n'.format(dev, ie))
+            traceback.print_exc()
+    except Exception as e:
+        sys.stderr.write(
+            'Failed to connect to {}: {}\n'.format(dev, e))
+
+    ssh_client.close()
+
+    ready = False
+
+    cache[dev] = {}
+
+    for line in output.split('\n'):
+        line = line.strip()
+        if re.search(r'^-+$', line):
+            ready = True
+            continue
+        if not ready:
+            continue
+        if len(line) == 0:
+            break
+        line = re.sub(r'\s+', ' ', line)
+        elements = line.split(' ')
+        used = elements[-1]
+        max = elements[-2]
+        metric = ' '.join(elements[0:-2])
+        metric = metric.strip()
+        m = re.search(r'(\d+)(/\d+)?', used)
+        used = float(m.group(1))
+        m = re.search(r'(\d+)(/\d+)?', max)
+        max = float(m.group(1))
+        perc = float(used / max) * 100.0
+        # if metric == 'Directly or indirectly connected routes':
+        #    perc = 76.0
+        if perc >= 75.0:
+            msg = '**!!! DANGER DANGER DANGER DANGER !!!**<br>{} on {} is {}% used'.format(
+                metric, dev, perc)
+            spark.post_to_spark(TEAM_NAME, ROOM_NAME, msg)
+
+        cache[dev][metric] = perc
+
+
+if __name__ == '__main__':
+    spark = sparker.Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    cache = {}
+
+    for dev in devices:
+        get_results(dev, cache)
+
+    fd = open(CACHE_FILE, 'w')
+    json.dump(cache, fd, indent=4)
+    fd.close()

+ 139 - 0
automation/network/show_ip_stats.php

@@ -0,0 +1,139 @@
+<?php
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+$contents = file_get_contents("/home/jclarke/cached_ip_stats.dat");
+
+$contents = trim($contents);
+$stats = explode(" ", $contents);
+
+$total = $stats[0] + $stats[1];
+$p4 = ($stats[0] / $total) * 100;
+$p6 = ($stats[1] / $total) * 100;
+
+$p4 = number_format($p4, 2);
+$p6 = number_format($p6, 2);
+
+$g4 = ($stats[0] / (1000*1000*1000));
+$g6 = ($stats[1] / (1000*1000*1000));
+
+$mtime = date ("F d Y H:i:s", filemtime("/home/jclarke/cached_ip_stats.dat"));
+?>
+<html>
+<head>
+  <link href="/c3.css" rel="stylesheet" type="text/css">
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
+  <script src="/d3.min.js" charset="utf-8"></script>
+  <script src="/c3.min.js"></script>
+  <script>
+setTimeout("location.reload(true);", 300000);
+  </script>
+  <style type="text/css">
+.c3-grid line {
+	stroke: none;
+}
+
+.c3-axis-x > path.domain, .tick > line[x2="-6"] {
+	visibility: hidden;
+}
+
+.c3 svg {
+	font-size: 16pt;
+}
+
+.DeviceTable { table-layout: fixed; }
+
+  </style>
+</head>
+<body>
+<h1 style="text-align: center">IPv4 / IPv6 Traffic Ratio</h1>
+<div style="text-align: right; font-size: 10pt;"><b>Last Updated: <?=$mtime?></b></div>
+  <div id="chart_div" class="rChart uvcharts"></div>
+  <div align="center" style="margin-top: 10px; font-size: 18pt; font-weight: bold;">% of Traffic</div>
+  <script language="javascript">
+var chart = c3.generate({
+	bindto: '#chart_div',
+	bar: {
+		width: 40,
+		units: ' %'
+
+	},
+	padding: {
+		left: 120
+	},
+	color: {
+		pattern: ['#006666', '#666699']
+	},
+	data: {
+	        x: 'x',
+		columns: [
+			['x', 'IPv4 Traffic', 'IPv6 Traffic'],
+			['value', <?=$p4?>, <?=$p6?>],
+		],
+		type: 'bar',
+		labels: {
+			format: {
+				value: function (v, id, i, j) { return v + "%"; }
+			}
+		},
+		color: function(inColor, data) {
+			var colors = ['#006666', '#666699']
+			if (data.index !== undefined) {
+				return colors[data.index];
+			}
+
+			return inColor;
+		}
+	},
+	axis: {
+		rotated: true,
+		x: {
+			type: 'category'
+		}
+	},
+	legend: {
+		show: false
+	}
+});
+</script>
+
+    <table class="DeviceTable" align="center" border="1"
+					      cellpadding="2" cellspacing="2" width="40%" style="margin-top: 20px;">
+      <tr>
+	<th>Protocol</th>
+	<th>Total Gigabytes</th>
+      </tr>
+      <tr>
+	<td align="left">IPv4</td>
+	<td align="right"><?=number_format($g4, 2, '.', ' ')?> GB</td>
+      </tr>
+      <tr>
+	<td align="left">IPv6</td>
+	<td align="right"><?=number_format($g6, 2, '.', ' ')?> GB</td>
+      </tr>
+    </table>
+</body>
+</html>

+ 189 - 0
automation/op-insights/fridge-alarm.py

@@ -0,0 +1,189 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import sys
+import sparker
+import re
+import requests
+import json
+import logging
+import traceback
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import CLEUCreds
+
+TEAM_NAME = 'CL18-Infra_team'
+BEER_ROOM_NAME = 'Beer Alarms'
+OPI_ROOM_NAME = 'CL18 - Operational Insights Demo'
+
+LOGIN_URL_1 = 'https://am-api.cmxcisco.com/api/tm/v1/account/local/login'
+LOGIN_URL_2 = 'https://am-api.cmxcisco.com/api/tm/v1/account/registered/apps/31'
+LOGIN_URL_3 = 'https://opinsights.cisco.com/api/am/v1/auth/user/current/user'
+
+CMX_URL = 'http://10.100.253.13:8002/api/v0.1/cmx'
+
+SENSOR_URL = 'https://opinsights.cisco.com/api/am/v1/entities/tags/30'
+
+HEADERS = {
+    'Authorization': 'Basic {}'.format(CLEUCreds.OPINSIGHT_BASIC)
+}
+
+OUR_TENANT = 31
+
+if __name__ == '__main__':
+    spark = sparker.Sparker(True)
+
+    print('Content-type: application/json\r\n\r\n')
+
+    output = sys.stdin.read()
+
+    j = json.loads(output)
+
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s : %(message)s',
+                        filename='/var/log/fridge-alarm.log', level=logging.DEBUG)
+    logging.debug(json.dumps(j, indent=4))
+
+    message = j['message']
+    us = 'Anonymous'
+
+    noc_fridge = 'NOC Fridge'
+
+    if 'name' in j['assets'][0]:
+        us = j['assets'][0]['name']
+
+    if us == noc_fridge:
+        try:
+            response = requests.request(
+                'POST', LOGIN_URL_1, headers=HEADERS, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            logging.error('Failed to login to {}: {}'.format(LOGIN_URL_1, e))
+            print(json.dumps({'result': 'fail'}))
+            sys.exit(1)
+
+        login1 = response.json()
+        token1 = None
+
+        for account in login1['accountDetails']:
+            if account['tenantId'] == OUR_TENANT:
+                token1 = account['token']
+                break
+
+        if token1 is None:
+            logging.error('Failed to get token from {}'.format(response.text))
+            print(json.dumps({'result': 'fail'}))
+            sys.exit(1)
+
+        headers = {
+            'Authorization': 'JWT {}'.format(token1)
+        }
+
+        try:
+            response = requests.request(
+                'GET', LOGIN_URL_2, headers=headers, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            logging.error('Failed to login to {}: {}'.format(LOGIN_URL_2, e))
+            print(json.dumps({'result': 'fail'}))
+            sys.exit(1)
+
+        try:
+            response = requests.request(
+                'GET', LOGIN_URL_3, headers=headers, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            logging.error('Failed to login to {}: {}'.format(LOGIN_URL_3, e))
+            print(json.dumps({'result': 'fail'}))
+            sys.exit(1)
+
+        login3 = response.json()
+        token2 = login3['token']
+
+        headers = {
+            'Authorization': 'JWT {}'.format(token2)
+        }
+
+        try:
+            response = requests.request(
+                'GET', SENSOR_URL, headers=headers, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            logging.error(
+                'Failed to get sensor info from {}: {}'.format(SENSOR_URL, e))
+            print(json.dumps({'result': 'fail'}))
+            sys.exit(1)
+
+        sensor_data = response.json()
+        logging.debug('Read {}'.format(json.dumps(sensor_data, indent=4)))
+
+        temperature = None
+        for datum in sensor_data['data']:
+            if datum['data']['units'] == 'Degrees Celsius':
+                temperature = datum['data']['measurement']
+                break
+
+        msg = 'Hey, all!  Your friendly **{}** sent a message: _{}_.'
+        if temperature is not None:
+            msg += '  Additionally, the temperature of your beer is now **{}** &#176;C'
+
+        spark.post_to_spark(TEAM_NAME, BEER_ROOM_NAME,
+                            msg.format(us, message, temperature))
+    else:
+        mac_address = j['assets'][0]['macAddresses'][0]
+
+        url = CMX_URL
+
+        headers = {
+            'Accept': 'image/jpeg, application/json'
+        }
+
+        loc_image = None
+
+        response = None
+
+        try:
+            response = requests.request(
+                'GET', url, headers=headers, params={'tag': mac_address.lower(), 'marker': 'green', 'size': 1440}, stream=True)
+            response.raise_for_status()
+        except Exception:
+            logging.error('Encountered error getting data from cmx: {}'.format(
+                traceback.format_exc()))
+
+        if response is not None and response.headers.get('content-type') == 'application/json':
+            loc_image = None
+        elif response is not None:
+            loc_image = response.raw.data
+
+        msg = '{} {}'.format(message, us)
+        spark.post_to_spark(TEAM_NAME, OPI_ROOM_NAME, msg)
+
+        if loc_image is not None:
+            spark.post_to_spark_with_attach(TEAM_NAME, OPI_ROOM_NAME, '{}\'s location from CMX'.format(
+                us), loc_image, '{}_location.jpg'.format(us), 'image/jpeg')
+
+    print(json.dumps({'result': 'success'}))

+ 102 - 0
automation/op-insights/lost-device.py

@@ -0,0 +1,102 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import sys
+import sparker
+import re
+import requests
+import json
+import logging
+import traceback
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import CLEUCreds
+
+TEAM_NAME = 'CL18-Infra_team'
+ROOM_NAME = 'Lost Devices'
+
+CMX_URL = 'http://10.100.253.13:8002/api/v0.1/cmx'
+
+HEADERS = {
+    'Accept': 'image/jpeg, application/json'
+}
+
+OUR_TENANT = 31
+
+if __name__ == '__main__':
+    spark = sparker.Sparker(True)
+
+    print('Content-type: application/json\r\n\r\n')
+
+    output = sys.stdin.read()
+
+    j = json.loads(output)
+
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s : %(message)s',
+                        filename='/var/log/lost-device.log', level=logging.DEBUG)
+    logging.debug(json.dumps(j, indent=4))
+
+    if not 'rule' in j or j['rule']['name'] != 'LostDevicesAlert':
+        logging.debug('Dropping message for {}'.format(j['rule']['name']))
+        print(json.dumps({'result': 'ignore'}))
+        sys.exit(0)
+
+    message = j['message'] + '\n\n'
+    cmxres = {}
+
+    msg = message
+    for asset in j['assets']:
+        location = 'UNKNOWN'
+        for state in asset['state']:
+            if state['key'] == 'location':
+                if 'hierarchy' in state['value']:
+                    location = state['value']['hierarchy'].replace('!', ' > ')
+                break
+
+        msg += '* Device **{}** with MAC _{}_ is back in **{}**\n'.format(
+            asset['name'], asset['macAddresses'][0].lower(), location)
+
+        try:
+            response = requests.request('GET', CMX_URL, params={'mac': asset['macAddresses'][
+                                        0].lower(), 'marker': 'green', 'size': 1440}, headers=HEADERS, stream=True)
+            response.raise_for_status()
+        except Exception as e:
+            logging.error('Failed to get result from CMX: {}'.format(e))
+            continue
+
+        if response.headers.get('content-type') == 'application/json':
+            continue
+
+        cmxres[asset['name']] = response.raw.data
+
+    spark.post_to_spark(TEAM_NAME, ROOM_NAME, msg)
+    for cmx in cmxres:
+        spark.post_to_spark_with_attach(TEAM_NAME, ROOM_NAME, 'Location of {}'.format(
+            cmx), cmxres[cmx], '{}_location.jpg'.format(cmx.replace(' ', '_')), 'image/jpeg')
+
+    print(json.dumps({'result': 'success'}))

+ 106 - 0
automation/services/AD/add_ad_users.py

@@ -0,0 +1,106 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+from pyad import *
+import sys
+import re
+import time
+import smtplib
+import random
+import string
+from email.mime.text import MIMEText
+
+
+AD_DN_BASE = 'cn=Users, dc=ad, dc=ciscolive, dc=network'
+DEFAULT_GROUP = 'NOC Users'
+AD_DOMAIN = 'ad.ciscolive.network'
+
+if __name__ == '__main__':
+    if len(sys.argv) != 3:
+        sys.stderr.write('usage: {} GROUP FILE\n'.format(sys.argv[0]))
+        sys.exit(1)
+
+    #pyad.set_defaults(ldap_server=AD_DC, username=AD_USERNAME, password=AD_PASSWORD, ssl=True)
+    ou = adcontainer.ADContainer.from_dn(AD_DN_BASE)
+    fd = open(sys.argv[2])
+    contents = fd.readlines()
+    fd.close()
+    group = sys.argv[1]
+
+    MSG = 'Created CLEU account for {}.\r\n\r\n'
+    MSG += 'Login to the CL-NOC SSID and https://tool.ciscolive.network with the following:\r\n\r\n'
+    MSG += 'Username: {}\r\n'
+    MSG += 'Password: {}\r\n'
+
+    SUBJECT = 'New CLEU network account'
+
+    for line in contents:
+        line = line.strip()
+        name, email, username = line.split(',')
+        try:
+            ad_user = aduser.ADUser.from_dn('cn={}, {}'.format(
+                name, AD_DN_BASE))
+            if ad_user is not None:
+                sys.stderr.write(
+                    'Not creating {} as they already exist.\n'.format(username))
+                continue
+        except Exception:
+            pass
+        password = ''.join(random.choice(string.ascii_uppercase + string.digits +
+                           string.ascii_lowercase + '@!%^#:*') for _ in range(8))
+        try:
+            new_user = aduser.ADUser.create(
+                name, ou, password=password)
+        except Exception as e:
+            sys.stderr.write(
+                "Failed to create user {}: {}\n".format(username, e))
+            continue
+        new_user.update_attribute('mail', email)
+        try:
+            new_user.update_attribute('sAMAccountName', username)
+            new_user.update_attribute(
+                'userPrincipalName', '{}@{}'.format(username, AD_DOMAIN))
+        except Exception as e:
+            new_user.delete()
+            sys.stderr.write(
+                'Error adding user {} (maybe duplicate?) ({})\n'.format(username, e))
+            continue
+
+        def_group = adgroup.ADGroup.from_cn(group)
+        def_group.add_members([new_user])
+        print('Added user {}'.format(username))
+        msg = MIMEText(MSG.format(name, username, password))
+        msg['Subject'] = SUBJECT
+        msg['From'] = 'jclarke@cisco.com'
+        msg['To'] = email
+        msg['Bcc'] = ','.join(['jclarke@cisco.com'])
+
+        sm = smtplib.SMTP('10.100.253.13')
+        sm.sendmail('jclarke@cisco.com', [
+                    email, 'jclarke@cisco.com'], msg.as_string())
+        sm.quit()
+        time.sleep(1)

+ 92 - 0
automation/services/AD/create_users.py

@@ -0,0 +1,92 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from pyad import *
+import sys
+import re
+import sparker
+import CLEUCreds
+import time
+
+
+AD_DN_BASE = 'cn=Users, dc=ad, dc=ciscolive, dc=network'
+DEFAULT_GROUP = 'NOC Users'
+AD_DOMAIN = 'ad.ciscolive.network'
+
+SPARK_TEAM = 'CL19 NOC Team'
+
+if __name__ == '__main__':
+    spark = sparker.Sparker(token=CLEUCreds.SPARK_TOKEN)
+    members = spark.get_members(SPARK_TEAM)
+    #pyad.set_defaults(ldap_server=AD_DC, username=AD_USERNAME, password=AD_PASSWORD, ssl=True)
+    ou = adcontainer.ADContainer.from_dn(AD_DN_BASE)
+    if members is not None:
+        for member in members['items']:
+            m = re.search(r'([^@]+)@cisco.com$', member['personEmail'])
+            if m:
+                names = member['personDisplayName'].split(' ')
+                fullname = names[0] + ' ' + names[-1]
+                try:
+                    ad_user = aduser.ADUser.from_dn('cn={}, {}'.format(
+                        fullname, AD_DN_BASE))
+                    if ad_user is not None:
+                        sys.stderr.write(
+                            'Not creating {} as they already exist.\n'.format(m.group(1)))
+                        continue
+                except Exception:
+                    pass
+                try:
+                    new_user = aduser.ADUser.create(
+                        fullname, ou, password=CLEUCreds.DEFAULT_USER_PASSWORD)
+                except Exception as e:
+                    sys.stderr.write(
+                        "Failed to create user {}: {}\n".format(m.group(1), e))
+                    continue
+                new_user.update_attribute('mail', member['personEmail'])
+                try:
+                    new_user.update_attribute('sAMAccountName', m.group(1))
+                    new_user.update_attribute(
+                        'userPrincipalName', '{}@{}'.format(m.group(1), AD_DOMAIN))
+                except Exception:
+                    try:
+                        new_user.delete()
+                        sys.stderr.write(
+                            'Error adding user {} (maybe duplicate?)\n'.format(m.group(1)))
+                        continue
+                    except:
+                        pass
+
+                try:
+                    new_user.force_pwd_change_on_login()
+                except Exception as e:
+                    sys.stderr.write('Error setting password policy for user {}: {}'.format(m.group(1), e))
+                def_group = adgroup.ADGroup.from_cn(DEFAULT_GROUP)
+                def_group.add_members([new_user])
+                print('Added user {}'.format(m.group(1)))
+                time.sleep(1)
+    else:
+        sys.stderr.write(
+            'Unable to get members from Spark.\nMake sure the bot is part of the Spark team.\n')

+ 248 - 0
automation/services/AD/reset_password.py

@@ -0,0 +1,248 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from pyad import *
+import sys
+import re
+from functools import wraps
+from flask import request, Response, session
+from flask import Flask
+import pythoncom
+import CLEUCreds
+
+
+AD_DN_BASE = 'cn=Users, dc=ad, dc=ciscolive, dc=network'
+AD_DOMAIN = 'ad.ciscolive.network'
+AD_DC = 'dc1-ad.ad.ciscolive.network'
+
+app = Flask('CLEU Password Reset')
+
+
+def query_user(username, password, target_user):
+    global AD_DC, AD_DN_BASE
+
+    try:
+        adcontainer.ADContainer.from_dn(AD_DN_BASE, options={
+                                        'ldap_server': AD_DC, 'username': username, 'password': password})
+    except Exception as e:
+        print(e)
+        return None
+
+    try:
+        q = adquery.ADQuery(
+            options={'ldap_server': AD_DC, 'username': username, 'password': password})
+        q.execute_query(attributes=['distinguishedName'], where_clause="sAMAccountName='{}'".format(
+            target_user), base_dn=AD_DN_BASE, options={'ldap_server': AD_DC, 'username': username, 'password': password})
+        for row in q.get_results():
+            return row['distinguishedName']
+    except Exception as e:
+        print(e)
+        return None
+
+
+def check_auth(username, password):
+    global AD_DOMAIN
+
+    pythoncom.CoInitialize()
+    if 'dn' in session:
+        return True
+
+    if not re.search(r'@{}$'.format(AD_DOMAIN), username):
+        username += '@{}'.format(AD_DOMAIN)
+
+    target_username = username.replace('@{}'.format(AD_DOMAIN), '')
+
+    try:
+        dn = query_user(username, password, target_username)
+        if dn is not None:
+            session['dn'] = dn
+            return True
+        else:
+            try:
+                dn = None
+                dn = query_user(CLEUCreds.AD_ADMIN,
+                                CLEUCreds.AD_PASSWORD, target_username)
+                if dn is None:
+                    return False
+
+                adu = aduser.ADUser.from_dn(dn, options={
+                                            'ldap_server': AD_DC, 'username': CLEUCreds.AD_ADMIN, 'password': CLEUCreds.AD_PASSWORD})
+                obj = adu.get_attribute('pwdLastSet', False)
+                if password == CLEUCreds.DEFAULT_USER_PASSWORD and int(obj.highpart) == 0 and int(obj.lowpart) == 0:
+                    session['dn'] = dn
+                    return True
+
+            except Exception as ie:
+                print(ie)
+                return False
+    except Exception as e:
+        print(e)
+        return False
+
+    return False
+
+
+def authenticate():
+    return Response(
+        'Failed to verify credentials for password reset.\n'
+        'You have to login with proper credentials.', 401,
+        {'WWW-Authenticate': 'Basic realm="CLEU Password Reset"'})
+
+
+def requires_auth(f):
+    @wraps(f)
+    def decorated(*args, **kwargs):
+        auth = request.authorization
+        if not auth or not check_auth(auth.username, auth.password):
+            return authenticate()
+        return f(*args, **kwargs)
+    return decorated
+
+
+@app.route('/reset-password', methods=['POST'])
+@requires_auth
+def reset_password():
+    new_pw = request.form.get('new_pass')
+    new_pw_confirm = request.form.get('new_pass_confirm')
+    if new_pw.strip() == '' or new_pw_confirm.strip() == '':
+        return Response('''
+<html>
+  <head>
+    <title>Bad Password</title>
+  </head>
+  <body>
+  <p>You must specify a new password.</p>
+  </body>
+</html>''', mimetype='text/html')
+
+    if new_pw != new_pw_confirm:
+        return Response('''
+<html>
+  <head>
+    <title>Bad Password</title>
+  </head>
+  <body>
+    <p>Passwords did not match</p>
+  </body>
+</html>''', mimetype='text/html')
+
+    adu = aduser.ADUser.from_dn(session['dn'], options={
+                                'ldap_server': AD_DC, 'username': CLEUCreds.AD_ADMIN, 'password': CLEUCreds.AD_PASSWORD})
+    try:
+        adu.set_password(new_pw)
+    except Exception as e:
+        return Response('''
+<html>
+  <head>
+    <title>Failed to Reset Password</title>
+  </head>
+  <body>
+  <h1>Password Reset Failed!</h1>
+  <p>{}</p>
+  </body>
+</html>'''.format(e), mimetype='text/html')
+
+    adu.grant_password_lease()
+    del session['dn']
+
+    return Response('''
+<html>
+  <head>
+    <title>Password Changed Successfully!</title>
+  </head>
+  <body>
+    <h1>Password Changed Successfully!</h1>
+  </body>
+</html>''', mimetype='text/html')
+
+
+@app.route('/')
+@requires_auth
+def get_main():
+    page = '''
+<html>
+  <head>
+    <title>Password Reset Form</title>
+    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
+      <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">      <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/css/dataTables.bootstrap.min.css" integrity="sha256-7MXHrlaY+rYR1p4jeLI23tgiUamQVym2FWmiUjksFDc=" crossorigin="anonymous" />
+
+      <meta name="viewport" content="width=device-width, initial-scale=1">
+      <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
+  		<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>      <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/jquery.dataTables.min.js" integrity="sha256-TX6POJQ2u5/aJmHTJ/XUL5vWCbuOw0AQdgUEzk4vYMc=" crossorigin="anonymous"></script>
+<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/dataTables.bootstrap.min.js" integrity="sha256-90YqnHom4j8OhcEQgyUI2IhmGYTBO54Adcf3YDZU9xM=" crossorigin="anonymous"></script>
+    <script>
+    function verify() {
+	if (!$('#new_pass').val().trim()) {
+		alert('Please specify a new password.');
+		return false;
+	}
+    if (!$('#new_pass_confirm').val().trim()) {
+        alert('Please confirm the new password.');
+        return false;
+    }
+    if ($('#new_pass_confirm').val().trim() != $('#new_pass').val().trim()) {
+        alert('Passwords do not match.');
+        return false;
+    }
+	return true;
+	}
+    </script>
+    </head>
+    <body>
+    <div class="container" role="main" style="width: 100%;">
+      <div class="page-header">
+        <h3>Password Reset Form</h3>
+      </div>
+
+      <div class="row">
+        <div class="col-sm-8">
+
+          <form method="POST" onSubmit="return verify();" action="/reset-password">
+            <div class="form-group">
+              <label for="new_pass">New Password:</label>
+              <input type="password" name="new_pass" id="new_pass" class="form-control" placeholder="New Password">
+           </div>
+           <div class="form-group">
+             <label for="new_pass_confirm">Confirm New Password:</label>
+             <input type="password" name="new_pass_confirm" id="new_pass_confirm" class="form-control" placeholder="Confirm New Password">
+           </div>
+           <div class="form-group">
+             <input type="submit" name="submit" value="Reset My Password!" class="btn btn-primary">
+             <input type="reset" name="reset" value="Start Over" class="btn btn-default">
+           </div>
+         </form>
+       </div>
+     </div>
+     </div>
+  </body>
+</html>'''
+
+    return Response(page, mimetype='text/html')
+
+if __name__ == '__main__':
+    app.secret_key = CLEUCreds.AD_PASSWORD
+    app.run(host='10.100.253.25', port=8443,
+            threaded=True, ssl_context=('chain.pem', 'privkey.pem'))

+ 66 - 0
automation/services/add-to-observium.py

@@ -0,0 +1,66 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import json
+from subprocess import Popen, PIPE
+import shlex
+import CLEUCreds
+
+MONITORING = 'cl-monitoring.ciscolive.network'
+DEV_FILE = '/home/jclarke/ping-devs.json'
+
+if __name__ == '__main__':
+    if len(sys.argv) < 2:
+        print('usage: {} <DEV> [<DEV> [...]]'.format(sys.argv[0]))
+        sys.exit(1)
+
+    devs = []
+    changed_devs = False
+    try:
+        fd = open(DEV_FILE, 'r')
+        devs = json.load(fd)
+        fd.close()
+    except:
+        pass
+
+    for dev in sys.argv[1:]:
+        if dev not in devs:
+            devs.append(dev)
+            changed_devs = True
+
+            print('=== Adding device {} to Observium ==='.format(dev))
+            proc = Popen(shlex.split(
+                'ssh -2 {} /usr/local/www/observium/add_device.php {} ap v3 CLEUR {} {} sha des'.format(MONITORING, dev, CLEUCreds.SNMP_AUTH_PASS, CLEUCreds.SNMP_PRIV_PASS)), stdout=PIPE, stderr=PIPE)
+            out, err = proc.communicate()
+            print(out)
+            print(err)
+            print('=== DONE. ===')
+
+    if changed_devs:
+        fd = open(DEV_FILE, 'w')
+        json.dump(devs, fd)
+        fd.close()

+ 79 - 0
automation/services/add_cnames.py

@@ -0,0 +1,79 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import sys
+import re
+import CLEUCreds
+
+DNS_BASE = 'https://dc1-dns.ciscolive.local:8443/web-services/rest/resource/'
+DOMAIN_ORIG = 'ciscolive.local'
+DOMAIN_NEW = 'ciscolive.network'
+
+HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+if __name__ == '__main__':
+    url = DNS_BASE + 'CCMHost'
+
+    try:
+        response = requests.request(
+            'GET', url, params={'zoneOrigin': DOMAIN_ORIG}, headers=HEADERS, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        sys.stderr.write(
+            'Failed to get hosts from {}: {}\n'.format(DOMAIN_ORIG, e))
+        sys.exit(1)
+
+    hosts = []
+
+    for host in response.json():
+        hosts.append(host['name'])
+        if 'aliases' in host and 'stringItem' in host['aliases']:
+            hosts += host['aliases']['stringItem']
+
+    for host in hosts:
+        hname = host.replace('.{}.'.format(DOMAIN_ORIG), '')
+        hname = host.replace('.', '')
+        if re.search(r'{}\.$'.format(DOMAIN_NEW), hname):
+            continue
+
+        url = DNS_BASE + 'CCMRRSet/{}'.format(hname)
+
+        try:
+            response = requests.request('PUT', url, json={'name': hname, 'rrs': {'stringItem': [
+                                        'IN CNAME {}.{}.'.format(hname, DOMAIN_ORIG)]}, 'zoneOrigin': '{}.'.format(DOMAIN_NEW)}, headers=HEADERS, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            sys.stderr.write(
+                'Failed to add alias for {}: {}\n'.format(hname, e))

+ 70 - 0
automation/services/clean_reservation.py

@@ -0,0 +1,70 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import json
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import sys
+import re
+from netaddr import IPAddress
+import CLEUCreds
+
+DHCP_BASE = 'https://dc1-dhcp.ciscolive.network:8443/web-services/rest/resource/Reservation'
+
+HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+if __name__ == '__main__':
+    url = DHCP_BASE
+    ans = raw_input('Are you sure you want to clean reservations (y/N): ')
+    if not re.search(r'^[yY]', ans):
+        print('Exiting...')
+        sys.exit(0)
+    try:
+        response = requests.request('GET', url, headers=HEADERS, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        sys.stderr.write('Failed to get list of reservations: {}\n'.format(e))
+        sys.exit(1)
+
+    reservations = response.json()
+    for lease in reservations:
+        url = '{}/{}'.format(DHCP_BASE, lease['ipaddr'])
+        try:
+            response = requests.request(
+                'DELETE', url, headers=HEADERS, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            sys.stderr.write(
+                'Error deleting reservation for {}: {}\n'.format(lease['ipaddr'], e))
+            continue
+
+        print('Deleted reservation for {}.'.format(lease['ipaddr']))

+ 622 - 0
automation/services/dhcp-hook.py

@@ -0,0 +1,622 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import json
+from sparker import Sparker
+import re
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import time
+import traceback
+import socket
+import logging
+import CLEUCreds
+
+PI = 'cl-pi.ciscolive.network'
+
+CMX_GW = 'http://cl-freebsd.ciscolive.network:8002/api/v0.1/cmx'
+DHCP_BASE = 'https://dc1-dhcp.ciscolive.network:8443/web-services/rest/resource'
+TOOL_BASE = 'https://tool.ciscolive.network/n/static/port.html?'
+AT_MACADDR = 9
+AD_DOMAIN = 'ad.ciscolive.network'
+
+CNR_HEADERS = {
+    'Accept': 'application/json',
+    'Authorization': CLEUCreds.JCLARKE_BASIC
+}
+
+DEFAULT_INT_TYPE = 'GigabitEthernet'
+
+ALLOWED_TO_DELETE = ['jclarke@cisco.com',
+                     'ksekula@cisco.com', 'anjesani@cisco.com']
+
+
+def is_ascii(s):
+    return all(ord(c) < 128 for c in s)
+
+
+def get_from_cmx(**kwargs):
+    global CMX_GW
+
+    marker = 'green'
+    if 'user' in kwargs and kwargs['user'] == 'gru':
+        marker = 'gru'
+
+    if 'ip' in kwargs:
+        url = '{}?ip={}&marker={}&size=1440'.format(
+            CMX_GW, kwargs['ip'], marker)
+    elif 'mac' in kwargs:
+        url = '{}?mac={}&marker={}&size=1440'.format(
+            CMX_GW, kwargs['mac'], marker)
+    else:
+        return None
+
+    headers = {
+        'Accept': 'image/jpeg, application/json'
+    }
+
+    try:
+        response = requests.request(
+            'GET', url, headers=headers, stream=True)
+        response.raise_for_status()
+    except Exception:
+        logging.error('Encountered error getting data from cmx: {}'.format(
+            traceback.format_exc()))
+        return None
+
+    if response.headers.get('content-type') == 'application/json':
+        return None
+
+    return response.raw.data
+
+
+def get_from_pi(**kwargs):
+    global PI
+
+    if 'user' in kwargs:
+        url = 'https://{}/webacs/api/v2/data/ClientDetails.json?.full=true&userName="{}"&status=ASSOCIATED'.format(
+            PI, kwargs['user'])
+    elif 'mac' in kwargs:
+        url = 'https://{}/webacs/api/v2/data/ClientDetails.json?.full=true&macAddress="{}"&status=ASSOCIATED'.format(
+            PI, kwargs['mac'])
+    elif 'ip' in kwargs:
+        url = 'https://{}/webacs/api/v2/data/ClientDetails.json?.full=true&ipAddress="{}"&status=ASSOCIATED'.format(
+            PI, kwargs['ip'])
+    else:
+        return None
+
+    headers = {
+        'Connection': 'close'
+    }
+
+    done = False
+    first = 0
+    code = 401
+    i = 0
+    while code != 200 and i < 10:
+        response = requests.request(
+            "GET", url, auth=(CLEUCreds.PI_USER, CLEUCreds.PI_PASS), headers=headers, verify=False)
+        code = response.status_code
+        if code != 200:
+            i += 1
+            time.sleep(3)
+    if code == 200:
+        j = json.loads(response.text)
+        if j['queryResponse']['@count'] == 0:
+            return None
+        return j['queryResponse']['entity']
+    else:
+        logging.error('Failed to get a response from PI for {}: {}'.format(
+            kwargs['user'], response.text))
+
+    return None
+
+
+def parse_relay_info(outd):
+    res = {}
+    if 'relayAgentCircuitId' in outd:
+        octets = outd['relayAgentCircuitId'].split(':')
+        res['vlan'] = int(''.join(octets[2:4]), 16)
+        first_part = int(octets[4], 16)
+        port = str(first_part)
+        if first_part != 0:
+            port = str(first_part) + '/0'
+        res['port'] = DEFAULT_INT_TYPE + port + '/' + str(int(octets[5], 16))
+    else:
+        res['vlan'] = 'N/A'
+        res['port'] = 'N/A'
+
+    if 'relayAgentRemoteId' in outd:
+        octets = outd['relayAgentRemoteId'].split(':')
+        res['switch'] = ''.join(octets[2:]).decode('hex')
+        if not is_ascii(res['switch']):
+            res['switch'] = 'N/A'
+    else:
+        res['switch'] = 'N/A'
+
+    return res
+
+
+def check_for_reservation(ip):
+    global DHCP_BASE, CNR_HEADERS
+
+    res = {}
+
+    url = '{}/Reservation/{}'.format(DHCP_BASE, ip)
+    try:
+        response = requests.request(
+            'GET', url, headers=CNR_HEADERS, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        logging.warning(
+            'Did not get a good response from CNR for reservation {}: {}'.format(ip, e))
+        return None
+    rsvp = response.json()
+    res['mac'] = ':'.join(rsvp['lookupKey'].split(':')[-6:])
+    res['scope'] = rsvp['scope']
+
+    return res
+
+
+def check_for_reservation_by_mac(mac):
+    global DHCP_BASE, CNR_HEADERS
+
+    res = {}
+
+    url = '{}/Reservation'.format(DHCP_BASE)
+    try:
+        response = requests.request(
+            'GET', url, headers=CNR_HEADERS, params={'lookupKey': mac}, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        logging.warning(
+            'Did not get a good response from CNR for reservation {}: {}'.format(ip, e))
+        return None
+    j = response.json()
+    if len(j) == 0:
+        return None
+    rsvp = j[0]
+    res['mac'] = ':'.join(rsvp['lookupKey'].split(':')[-6:])
+    res['scope'] = rsvp['scope']
+
+    return res
+
+
+def create_reservation(ip, mac):
+    global DHCP_BASE, CNR_HEADERS, AT_MACADDR
+
+    url = '{}/Reservation'.format(DHCP_BASE)
+    payload = {
+        'ipaddr': ip,
+        'lookupKey': '01:06:' + mac,
+        'lookupKeyType': AT_MACADDR
+    }
+    response = requests.request(
+        'POST', url, headers=CNR_HEADERS, json=payload, verify=False)
+    response.raise_for_status()
+
+
+def delete_reservation(ip):
+    global DHCP_BASE, CNR_HEADERS
+
+    url = '{}/Reservation/{}'.format(DHCP_BASE, ip)
+    response = requests.request(
+        'DELETE', url, headers=CNR_HEADERS, verify=False)
+    response.raise_for_status()
+
+
+def check_for_lease(ip):
+    global DHCP_BASE, CNR_HEADERS
+
+    res = {}
+    url = '{}/Lease/{}'.format(DHCP_BASE, ip)
+    try:
+        response = requests.request(
+            'GET', url, headers=CNR_HEADERS, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        logging.warning(
+            'Did not get a good response from CNR for IP {}: {}'.format(ip, e))
+        return None
+
+    lease = response.json()
+
+    if not 'clientMacAddr' in lease:
+        return None
+    relay = parse_relay_info(lease)
+    if 'clientHostName' in lease:
+        res['name'] = lease['clientHostName']
+    elif 'client-dns-name' in lease:
+        res['name'] = lease['clientDnsName']
+    else:
+        res['name'] = 'UNKNOWN'
+
+    res['mac'] = lease['clientMacAddr'][lease['clientMacAddr'].rfind(',') + 1:]
+    res['scope'] = lease['scopeName']
+    res['state'] = lease['state']
+    res['relay-info'] = relay
+
+    return res
+
+
+def check_for_mac(mac):
+    global DHCP_BASE, CNR_HEADERS
+
+    res = {}
+    url = '{}/Lease'.format(DHCP_BASE)
+
+    try:
+        response = requests.request(
+            'GET', url, headers=CNR_HEADERS, verify=False, params={'clientMacAddr': mac})
+        response.raise_for_status()
+    except Exception as e:
+        logging.warning(
+            'Did not get a good response from CNR for MAC {}: {}'.format(mac, e))
+        return None
+
+    j = response.json()
+    if len(j) == 0:
+        return None
+    lease = j[0]
+    relay = parse_relay_info(lease)
+    if 'address' not in lease:
+        return None
+    res['ip'] = lease['address']
+    if 'clientHostName' in lease:
+        res['name'] = lease['clientHostName']
+    elif 'clientDnsName' in lease:
+        res['name'] = lease['clientDnsName']
+    else:
+        res['name'] = 'UNKNOWN'
+    res['scope'] = lease['scopeName']
+    res['state'] = lease['state']
+    res['relay-info'] = relay
+
+    return res
+
+
+def print_pi(spark, what, ents, msg):
+    for ent in ents:
+        res = ent['clientDetailsDTO']
+        apdet = ''
+        condet = ''
+        vendet = ''
+        if 'apName' in res:
+            apdet = '**{}** via '.format(res['apName'])
+        if 'connectionType' in res:
+            condet = 'is a **{}** client'.format(res['connectionType'])
+        if 'vendor' in res:
+            vendet = 'of vendor type **{}**'.format(res['vendor'])
+        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '{} {} {} {}, connected to {}**{}** on interface **{}** with MAC address **{}** and IP address **{}** in **VLAN {}** located in **{}**.'.format(
+            msg, what, condet, vendet, apdet, res['deviceName'], res['clientInterface'], res['macAddress'], res['ipAddress']['address'], res['vlan'], res['location']))
+
+
+spark = Sparker(token=CLEUCreds.SPARK_TOKEN, logit=True)
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'DHCP Queries'
+
+if __name__ == '__main__':
+    print('Content-type: application/json\r\n\r\n')
+
+    output = sys.stdin.read()
+
+    j = json.loads(output)
+
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s : %(message)s',
+                        filename='/var/log/dhcp-hook.log', level=logging.DEBUG)
+    logging.debug(json.dumps(j, indent=4))
+
+    message_from = j['data']['personEmail']
+
+    if message_from == 'livenocbot@sparkbot.io':
+        logging.debug('Person email is our bot')
+        print('{"result":"success"}')
+        sys.exit(0)
+
+    tid = spark.get_team_id(SPARK_TEAM)
+    if tid is None:
+        logging.error('Failed to get Spark Team ID')
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    rid = spark.get_room_id(tid, SPARK_ROOM)
+    if rid is None:
+        logging.error('Failed to get Spark Room ID')
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    if rid != j['data']['roomId']:
+        logging.error('Spark Room ID is not the same as in the message ({} vs. {})'.format(
+            rid, j['data']['roomId']))
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    mid = j['data']['id']
+
+    msg = spark.get_message(mid)
+    if msg is None:
+        logging.error('Did not get a message')
+        print('{"result":"error"}')
+        sys.exit(0)
+
+    txt = msg['text']
+    found_hit = False
+
+    if re.search(r'\bhelp\b', txt, re.I):
+        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'To lookup a reservation, type `@Live NOC Bot reservation IP`.  To lookup a lease by MAC, ask about the MAC.  To lookup a lease by IP ask about the IP.  To look up a user, ask about "user USERNAME".<br>Some question might be, `@Live NOC Bot who has lease 1.2.3.4` or `@Live NOC Bot what lease does 00:11:22:33:44:55 have` or `@Live NOC Bot tell me about user jsmith`.')
+        found_hit = True
+
+    try:
+        m = re.search(
+            r'user(name)?\s+\b(?P<uname>[A-Za-z][\w\-\.\d]+)([\s\?\.]|$)', txt, re.I)
+        if not found_hit and not m:
+            m = re.search(
+                r'(who|where)\s+is\s+\b(?P<uname>[A-Za-z][\w\-\.\d]+)([\s\?\.]|$)', txt, re.I)
+
+        if not found_hit and m:
+            found_hit = True
+            uname = m.group('uname')
+            usecret = ''
+            if re.search(r'gru', m.group('uname'), re.I):
+                uname = 'rkamerma'
+                usecret = 'gru'
+            res = get_from_pi(user=uname)
+            if res is None:
+                res = get_from_pi(user=uname + '@{}'.format(AD_DOMAIN))
+
+            if res is not None:
+                print_pi(spark, m.group('uname'), res, '')
+                for ent in res:
+                    cmxres = get_from_cmx(
+                        mac=ent['clientDetailsDTO']['macAddress'].lower(), user=usecret)
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, '{}\'s location from CMX'.format(m.group('uname')), cmxres, '{}_location.jpg'.format(m.group('uname')), 'image/jpeg')
+            else:
+                spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                    'Sorry, I can\'t find {}.'.format(m.group('uname')))
+
+        m = re.search(
+            r'(remove|delete)\s+reservation.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', txt, re.I)
+        if not m:
+            m = re.search(
+                r'(unreserve).*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', txt, re.I)
+
+        if not found_hit and m:
+            found_hit = True
+            if message_from not in ALLOWED_TO_DELETE:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I\'m sorry, {}.  I can\'t do that for you.'.format(message_from))
+            else:
+                res = check_for_reservation(m.group(2))
+                if res is None:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, 'I didn\'t find a reservation for {}.'.format(m.group(2)))
+                else:
+                    try:
+                        delete_reservation(m.group(2))
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Reservation for {} deleted successfully.'.format(m.group(2)))
+                    except Exception as e:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Failed to delete reservation for {}: {}'.format(m.group(2)))
+
+        m = re.search(
+            r'(make|create|add)\s+reservation.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', txt, re.I)
+        if not found_hit and m:
+            found_hit = True
+            res = check_for_reservation(m.group(2))
+            if res is not None:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '_{}_ is already reserved by a client with MAC **{}**'.format(m.group(2), res['mac']))
+            else:
+                lres = check_for_lease(m.group(2))
+                if lres is None:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, 'Did not find an existing lease for {}'.format(m.group(2)))
+                else:
+                    try:
+                        rres = check_for_reservation_by_mac(lres['mac'])
+                        if rres is not None:
+                            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '_{}_ already has a reservation for {} in scope {}.'.format(
+                                lres['mac'], rres['ip'], lres['scope']))
+                        else:
+                            create_reservation(m.group(2), lres['mac'])
+                            spark.post_to_spark(
+                                SPARK_TEAM, SPARK_ROOM, 'Successfully added reservation for {}.'.format(m.group(2)))
+                    except Exception as e:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Failed to add reservation for {}: {}'.format(m.group(2), e))
+
+        m = re.search(
+            r'reservation.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', txt, re.I)
+        if not found_hit and m:
+            found_hit = True
+            res = check_for_reservation(m.group(1))
+            if res is not None:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '_{}_ is reserved by a client with MAC **{}** in scope **{}**.'.format(m.group(1), res['mac'], res['scope']))
+            else:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I did not find a reservation for {}.'.format(m.group(1)))
+
+        m = re.findall(r'\b([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\b', txt)
+        if not found_hit and len(m) > 0:
+            found_hit = True
+            for hit in m:
+                res = check_for_lease(hit)
+                pires = get_from_pi(ip=hit)
+                cmxres = None
+                if res is not None:
+                    cmxres = get_from_cmx(
+                        mac=re.sub(r'(\d+,)+', '', res['mac']))
+                elif pires is not None:
+                    cmxres = get_from_cmx(
+                        mac=pires[0]['clientDetailsDTO']['macAddress'])
+                if res is not None:
+                    if re.search(r'available', res['state']):
+                        port_info = res['relay-info']['port']
+                        if port_info != 'N/A':
+                            port_info = '<a href="{}switch_name={}&port_name={}">**{}**</a>'.format(
+                                TOOL_BASE, res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['port'])
+
+                        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '_{}_ is no longer leased, but _WAS_ leased by a client with name **{}** and MAC **{}** in scope **{}** (state: **{}**) and was connected to switch **{}** on port {} in VLAN **{}**.'.format(
+                            hit, res['name'], res['mac'], res['scope'], res['state'], res['relay-info']['switch'], port_info, res['relay-info']['vlan']))
+                    else:
+                        port_info = res['relay-info']['port']
+                        if port_info != 'N/A':
+                            port_info = '<a href="{}switch_name={}&port_name={}">**{}**</a>'.format(
+                                TOOL_BASE, res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['port'])
+
+                        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '_{}_ is leased by a client with name **{}** and MAC **{}** in scope **{}** (state: **{}**) and is connected to switch **{}** on port {} in VLAN **{}**.'.format(
+                            hit, res['name'], res['mac'], res['scope'], res['state'], res['relay-info']['switch'], port_info, res['relay-info']['vlan']))
+                    if pires is not None:
+                        print_pi(spark, hit, pires,
+                                 'I also found this from Prime Infra:')
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit), 'image/jpeg')
+                else:
+                    spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                        'I did not find a lease for {}.'.format(hit))
+                    if pires is not None:
+                        print_pi(spark, hit, pires,
+                                 'But I did get this from Prime Infra:')
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit), 'image/jpeg')
+
+        m = re.findall('\\b(?:(?:[0-9A-Fa-f]{1,4}:){6}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|::(?:[0-9A-Fa-f]{1,4}:){5}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,4}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){,6}[0-9A-Fa-f]{1,4})?::)\\b', txt)
+        if not found_hit and len(m) > 0:
+            found_hit = True
+            for hit in m:
+                pires = get_from_pi(ip=hit)
+                if pires is not None:
+                    print_pi(spark, hit, pires, '')
+                    cmxres = get_from_cmx(
+                        mac=pires[0]['clientDetailsDTO']['macAddress'])
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit), 'image/jpeg')
+
+                else:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, 'I did not find anything about {} in Prime Infra.'.format(hit))
+
+        m = re.findall(r'\b(([a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2})|([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4})|([a-fA-F0-9]{1,2}-[a-fA-F0-9]{1,2}-[a-fA-F0-9]{1,2}-[a-fA-F0-9]{1,2}-[a-fA-F0-9]{1,2}-[a-fA-F0-9]{1,2}))\b', txt)
+        if not found_hit and len(m) > 0:
+            found_hit = True
+            for hit in m:
+                res = check_for_mac(hit[0])
+                pires = get_from_pi(mac=hit[0])
+                cmxres = get_from_cmx(mac=re.sub(r'(\d+,)+', '', hit[0]))
+                if res is not None:
+                    if re.search(r'available', res['state']):
+                        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'Client with MAC _{}_ no longer has a lease, but _USED TO HAVE_ lease **{}** (hostname: **{}**) in scope **{}** (state: **{}**) and was connected to switch **{}** on port **{}** in VLAN **{}**.'.format(
+                            hit[0], res['ip'], res['name'], res['scope'], res['state'], res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['vlan']))
+                    else:
+                        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'Client with MAC _{}_ has lease **{}** (hostname: **{}**) in scope **{}** (state: **{}**) and is connected to switch **{}** on port **{}** in VLAN **{}**.'.format(
+                            hit[0], res['ip'], res['name'], res['scope'], res['state'], res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['vlan']))
+                    if pires is not None:
+                        #spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '```\n{}\n```'.format(json.dumps(pires, indent=4)))
+                        print_pi(spark, hit[0], pires,
+                                 'I also found this from Prime Infra:')
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit[0]), 'image/jpeg')
+                else:
+                    spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                        'I did not find a lease for {}.'.format(hit[0]))
+                    if pires is not None:
+                        print_pi(spark, hit[0], pires,
+                                 'But I did get this from Prime Infra:')
+                    if cmxres is not None:
+                        spark.post_to_spark_with_attach(
+                            SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit[0]), 'image/jpeg')
+
+        m = re.search(r'answer', txt, re.I)
+        if not found_hit and m:
+            found_hit = True
+            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'The answer is 42.')
+
+        m = re.findall(r'([\w\d\-\.]+)', txt)
+        if not found_hit and len(m) > 0:
+            found_hit = False
+            for hit in m:
+                ip = None
+                try:
+                    ip = socket.gethostbyname(hit)
+                except:
+                    pass
+                if ip:
+                    res = check_for_lease(ip)
+                    pires = get_from_pi(ip=ip)
+                    if res is not None:
+                        if re.search(r'available', res['state']):
+                            found_hit = True
+                            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'Client with hostname _{}_ no longer has a lease, but _USED TO HAVE_ lease **{}** (hostname: **{}**) in scope **{}** (state: **{}**) and was connected to switch **{}** on port **{}** in VLAN **{}**.'.format(
+                                hit, ip, res['name'], res['scope'], res['state'], res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['vlan']))
+                        else:
+                            found_hit = True
+                            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, 'Client with hostname _{}_ has lease **{}** (hostname: **{}**) in scope **{}** (state: **{}**) and is connected to switch **{}** on port **{}** in VLAN **{}**.'.format(
+                                hit, ip, res['name'], res['scope'], res['state'], res['relay-info']['switch'], res['relay-info']['port'], res['relay-info']['vlan']))
+                        if pires is not None:
+                            found_hit = True
+                            #spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '```\n{}\n```'.format(json.dumps(pires, indent=4)))
+                            print_pi(spark, hit, pires,
+                                     'I also found this from Prime Infra:')
+                            cmxres = get_from_cmx(
+                                mac=pires[0]['clientDetailsDTO']['macAddress'])
+                            if cmxres is not None:
+                                spark.post_to_spark_with_attach(
+                                    SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit), 'image/jpeg')
+                    else:
+                        found_hit = True
+                        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                            'I did not find a lease for {}.'.format(hit))
+                        if pires is not None:
+                            print_pi(spark, hit, pires,
+                                     'But I did get this from Prime Infra:')
+                            cmxres = get_from_cmx(
+                                mac=pires[0]['clientDetailsDTO']['macAddress'])
+                            if cmxres is not None:
+                                spark.post_to_spark_with_attach(
+                                    SPARK_TEAM, SPARK_ROOM, 'Location from CMX', cmxres, '{}_location.jpg'.format(hit), 'image/jpeg')
+
+        if not found_hit:
+            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                'Sorry, I didn\'t get that.  Please give me a MAC or IP (or "reservation IP" or "user USER") or just ask for "help".')
+    except Exception as e:
+        logging.error('Error in obtaining data: {}'.format(
+            traceback.format_exc()))
+        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                            'Whoops, I encountered an error:<br>\n```\n{}\n```'.format(traceback.format_exc()))
+
+    print('{"result":"success"}')

+ 134 - 0
automation/services/dhcp_scope_watch.py

@@ -0,0 +1,134 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import json
+from sparker import Sparker
+from subprocess import Popen, PIPE
+import re
+import shlex
+import requests
+import os
+from multiprocessing import Pool
+import CLEUCreds
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'DHCP Scope Alarms'
+
+THRESHOLD = '75'
+CACHE_FILE = '/home/jclarke/dhcp_scope.dat'
+STATS_FILE = '/home/jclarke/dhcp_scope_stats.dat'
+
+DHCP_SERVER = '10.100.253.9'
+
+
+def parse_result(out):
+    matches = re.findall(r'([\w-]+=[^;]+);(?=\s|$)', out)
+    res = {}
+    for m in matches:
+        if m == '':
+            continue
+        k, v = m.split('=')
+        res[k] = v
+    return res
+
+
+def get_results(scope):
+    global DHCP_SERVER
+
+    if scope != '100 Ok' and scope != '':
+        proc = Popen(shlex.split(
+            'ssh -2 root@{} /root/nrcmd.sh -r scope {} getUtilization'.format(DHCP_SERVER, scope)), stdout=PIPE, stderr=PIPE)
+        out, err = proc.communicate()
+        if not re.search(r'^100', out):
+            return None
+        outd = parse_result(out)
+        if 'active-dynamic' not in outd or 'total-dynamic' not in outd or 'free-dynamic' not in outd:
+            return None
+
+        util = (float(outd['active-dynamic']) /
+                float(outd['total-dynamic'])) * 100.0
+        #print('Util for {0} is {1:.2f}% utilized'.format(scope, util))
+
+        return (scope, {'util': util, 'active-dynamic': outd['active-dynamic'], 'total-dynamic': outd['total-dynamic']})
+
+
+def get_metrics(pool):
+    global DHCP_SERVER
+
+    response = {}
+
+    proc = Popen(shlex.split(
+        'ssh -2 root@{} /root/nrcmd.sh -r scope listnames'.format(DHCP_SERVER)), stdout=PIPE, stderr=PIPE)
+    out, err = proc.communicate()
+    if not re.search(r'^100', out):
+        sys.exit(0)
+    scopes = out.split('\n')
+
+    results = [pool.apply_async(get_results, [s]) for s in scopes]
+    for res in results:
+        retval = res.get()
+        if retval is not None:
+            response[retval[0]] = retval[1]
+
+    return response
+
+
+if __name__ == '__main__':
+    prev_state = {}
+    curr_state = {}
+    stats = {}
+
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    if os.path.exists(CACHE_FILE):
+        fd = open(CACHE_FILE, 'r')
+        prev_state = json.load(fd)
+        fd.close()
+
+    pool = Pool(20)
+    metrics = get_metrics(pool)
+
+    for scope, stat in metrics.items():
+        stats[scope] = {'perc': stat['util']}
+        if stat['util'] >= float(THRESHOLD):
+            curr_state[scope] = True
+            if scope not in prev_state or (scope in prev_state and not prev_state[scope]):
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '**WARNING**: Scope **{0}** is now **{1:.2f}%** utilized ({2} of {3} free addresses remain); suppressing future alerts until resolved'.format(scope, stat['util'], stat['free-dynamic'], stat['total-dynamic']))
+        else:
+            curr_state[scope] = False
+            if scope in prev_state and prev_state[scope]:
+                spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, '_INFO_: Scope **{0}** is now only **{1:.2f}%** utilized ({2} free addresses out of {3})'.format(
+                    scope, stat['util'], stat['free-dynamic'], stat['total-dynamic']))
+
+    fd = open(CACHE_FILE, 'w')
+    json.dump(curr_state, fd, indent=4)
+    fd.close()
+
+    fd = open(STATS_FILE, 'w')
+    json.dump(stats, fd, indent=4)
+    fd.close()

+ 346 - 0
automation/services/dns-hook.py

@@ -0,0 +1,346 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import json
+from sparker import Sparker
+import re
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import time
+import traceback
+import socket
+import logging
+import CLEUCreds
+
+CMX_GW = 'http://cl-freebsd.ciscolive.network:8002/api/v0.1/cmx'
+DNS_BASE = 'https://dc1-dns.ciscolive.network:8443/web-services/rest/resource/'
+DOMAIN = 'ciscolive.network'
+
+CNR_HEADERS = {
+    'Accept': 'application/json',
+    'Content-Type': 'application/json',
+    'Authorization': CLEUCreds.JCLARKE_BASIC
+}
+
+ALLOWED_TO_CREATE = ['jclarke@cisco.com',
+                     'ksekula@cisco.com', 'ayourtch@cisco.com', 'rkamerma@cisco.com', 'thulsdau@cisco.com',
+                     'lhercot@cisco.com', 'pweijden@cisco.com', 'udiedric@cisco.com']
+
+spark = Sparker(token=CLEUCreds.SPARK_TOKEN, logit=True)
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'DNS Queries'
+
+
+def check_for_alias(alias):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMRRSet' + '/{}'.format(alias)
+
+    response = requests.request(
+        'GET', url, params={'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+    if response.status_code == 404:
+        return None
+
+    res = {}
+    j = response.json()
+
+    hostname = ''
+
+    for rr in j['rrs']['stringItem']:
+        m = re.search(r'^IN CNAME (.+)', rr)
+        if m:
+            hostname = m.group(1)
+            break
+
+    res['hostname'] = hostname
+
+    return res
+
+
+def create_alias(hostname, alias):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMRRSet' + '/{}'.format(alias)
+
+    if re.search(r'\.', hostname) and not hostname.endswith('.'):
+        hostname += '.'
+
+    if not hostname.endswith('.'):
+        hostname += '.' + DOMAIN + '.'
+
+    rr_obj = {
+        'name': alias,
+        'zoneOrigin': DOMAIN,
+        'rrs': {
+            'stringItem': [
+                'IN CNAME {}'.format(hostname)
+            ]
+        }
+    }
+
+    response = requests.request(
+        'PUT', url, headers=CNR_HEADERS, json=rr_obj, verify=False)
+    response.raise_for_status()
+
+
+def delete_alias(alias):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMRRSet' + '/{}'.format(alias)
+
+    response = requests.request('DELETE', url, params={
+                                'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+    response.raise_for_status()
+
+
+def delete_record(hostname):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMHost' + '/{}'.format(hostname)
+
+    response = requests.request('DELETE', url, params={
+                                'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+    response.raise_for_status()
+
+
+def check_for_record(hostname):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMHost' + '/{}'.format(hostname)
+
+    response = requests.request(
+        'GET', url, params={'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+    if response.status_code == 404:
+        return None
+
+    res = {}
+    j = response.json()
+
+    res['ip'] = j['addrs']['stringItem'][0]
+
+    return res
+
+
+def create_record(hostname, ip, aliases):
+    global DNS_BASE, DOMAIN, CNR_HEADERS
+
+    url = DNS_BASE + 'CCMHost' + '/{}'.format(hostname)
+    host_obj = {
+        'addrs': {
+            'stringItem': [
+                ip
+            ]
+        },
+        'name': hostname,
+        'zoneOrigin': DOMAIN
+    }
+
+    if aliases is not None:
+        aliases = re.sub(r'\s+', '', aliases)
+        alist = aliases.split(',')
+
+        alist = [x + '.' + DOMAIN +
+                 '.' if not x.endswith('.') else x for x in alist]
+        host_obj['aliases'] = {
+            'stringItem': alist
+        }
+
+    response = requests.request(
+        'PUT', url, headers=CNR_HEADERS, json=host_obj, verify=False)
+    response.raise_for_status()
+
+
+if __name__ == '__main__':
+    print('Content-type: application/json\r\n\r\n')
+
+    output = sys.stdin.read()
+
+    j = json.loads(output)
+
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s : %(message)s',
+                        filename='/var/log/dns-hook.log', level=logging.DEBUG)
+    logging.debug(json.dumps(j, indent=4))
+
+    message_from = j['data']['personEmail']
+
+    if message_from == 'livenocbot@sparkbot.io':
+        logging.debug('Person email is our bot')
+        print('{"result":"success"}')
+        sys.exit(0)
+
+    tid = spark.get_team_id(SPARK_TEAM)
+    if tid is None:
+        logging.error('Failed to get Spark Team ID')
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    rid = spark.get_room_id(tid, SPARK_ROOM)
+    if rid is None:
+        logging.error('Failed to get Spark Room ID')
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    if rid != j['data']['roomId']:
+        logging.error('Spark Room ID is not the same as in the message ({} vs. {})'.format(
+            rid, j['data']['roomId']))
+        print('{"result":"fail"}')
+        sys.exit(0)
+
+    mid = j['data']['id']
+
+    msg = spark.get_message(mid)
+    if msg is None:
+        logging.error('Did not get a message')
+        print('{"result":"error"}')
+        sys.exit(0)
+
+    txt = msg['text']
+    found_hit = False
+
+    if re.search(r'\bhelp\b', txt, re.I):
+        spark.post_to_spark(
+            SPARK_TEAM, SPARK_ROOM, 'To create a new DNS entry, tell me things like, `Create record for HOST with IP and alias ALIAS`, `Create entry for HOST with IP`, `Add a DNS record for HOST with IP`')
+        found_hit = True
+
+    try:
+        m = re.search(
+            r'(remove|delete)\s+.*?(alias|cname)\s+([\w\-\.]+)', txt, re.I)
+
+        if not found_hit and m:
+            found_hit = True
+            if message_from not in ALLOWED_TO_CREATE:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I\'m sorry, {}.  I can\'t do that for you.'.format(message_from))
+            else:
+                res = check_for_alias(m.group(3))
+                if res is None:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, 'I didn\'t find an alias {}'.format(m.group(3)))
+                else:
+                    try:
+                        delete_alias(m.group(3))
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Alias {} deleted successfully.'.format(m.group(3)))
+                    except Exception as e:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Failed to delete alias {}: {}'.format(m.group(3), e))
+
+        m = re.search(
+            r'(remove|delete)\s+.*?for\s+([\w\-\.]+)', txt, re.I)
+
+        if not found_hit and m:
+            found_hit = True
+            if message_from not in ALLOWED_TO_CREATE:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I\'m sorry, {}.  I can\'t do that for you.'.format(message_from))
+            else:
+                res = check_for_record(m.group(2))
+                if res is None:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, 'I didn\'t find a DNS record for {}.'.format(m.group(2)))
+                else:
+                    try:
+                        delete_record(m.group(2))
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'DNS record for {} deleted successfully.'.format(m.group(2)))
+                    except Exception as e:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Failed to delete DNS record for {}: {}'.format(m.group(2), e))
+
+        m = re.search(
+            r'(make|create|add)\s+.*?for\s+([\w\-\.]+)\s+.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(\s+.*?(alias(es)?|cname(s)?)\s+([\w\-\.]+(\s*,\s*[\w\-\.,\s]+)?))?', txt, re.I)
+        if not found_hit and m:
+            found_hit = True
+            if message_from not in ALLOWED_TO_CREATE:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I\'m sorry, {}.  I can\'t do that for you.'.format(message_from))
+            else:
+                res = check_for_record(m.group(2))
+                if res is not None:
+                    spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, '_{}_ is already in DNS as **{}**'.format(m.group(2), res['ip']))
+                else:
+                    hostname = re.sub(r'\.{}'.format(DOMAIN), '', m.group(2))
+                    try:
+                        create_record(m.group(2), m.group(3), m.group(8))
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Successfully created record for {}.'.format(m.group(2)))
+                    except Exception as e:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Failed to create record for {}: {}'.format(m.group(2), e))
+
+        m = re.search(
+            r'(make|create|add)\s+(alias(es)?|cname(s)?)\s+([\w\-\.]+(\s*,\s*[\w\-\.,\s]+)?)\s+(for|to)\s+([\w\-\.]+)', txt, re.I)
+        if not found_hit and m:
+            found_hit = True
+            if message_from not in ALLOWED_TO_CREATE:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'I\'m sorry, {}.  I can\'t do that for you.'.format(message_from))
+            else:
+                aliases = m.group(5)
+                aliases = re.sub(r'\s+', '', aliases)
+                alist = aliases.split(',')
+                already_exists = False
+                for alias in alist:
+                    res = check_for_alias(alias)
+                    if res is not None:
+                        already_exists = True
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, '_{}_ is already an alias for **{}**'.format(alias, res['hostname']))
+                    res = check_for_record(alias)
+                    if res is not None:
+                        already_exists = True
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, '_{}_ is already a hostname with IP **{}**'.format(alias, res['ip']))
+
+                if not already_exists:
+                    success = True
+                    for alias in alist:
+                        try:
+                            create_alias(m.group(8), alias)
+                        except Exception as e:
+                            spark.post_to_spark(
+                                SPARK_TEAM, SPARK_ROOM, 'Failed to create alias {}: {}'.format(alias, e))
+                            success = False
+
+                    if success:
+                        spark.post_to_spark(
+                            SPARK_TEAM, SPARK_ROOM, 'Successfully created alias(es) {} for {}'.format(aliases, m.group(8)))
+
+        if not found_hit:
+            spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                                'Sorry, I didn\'t get that.  Please ask me to create or delete a DNS entry; or just ask for "help".')
+    except Exception as e:
+        logging.error('Error in obtaining data: {}'.format(
+            traceback.format_exc()))
+        spark.post_to_spark(SPARK_TEAM, SPARK_ROOM,
+                            'Whoops, I encountered an error:<br>\n```\n{}\n```'.format(traceback.format_exc()))
+
+    print('{"result":"success"}')

+ 116 - 0
automation/services/dns-tester.py

@@ -0,0 +1,116 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import dns
+import dns.resolver
+from sparker import Sparker
+import os
+from subprocess import Popen, PIPE
+import shlex
+import json
+
+SPARK_ROOM = 'Core Alarms'
+SPARK_TEAM = 'CL17-Infra_team'
+CACHE_FILE = '/home/jclarke/dns_cache.dat'
+
+
+def report_error(server, obj):
+    global SPARK_ROOM, SPARK_TEAM
+    spark = Sparker()
+
+    msg = 'DNS failure to {}\n\n'
+    msg += '```\n'
+    msg += '{}\n'
+    msg += '```'
+
+    res = spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, msg.format(server, obj))
+    if not res:
+        print('Error posting to Spark!')
+
+
+def report_good(msg):
+    global SPARK_ROOM, SPARK_TEAM
+    spark = Sparker()
+
+    res = spark.post_to_spark(SPARK_TEAM, SPARK_ROOM, msg)
+    if not res:
+        print('Error posting to Spark!')
+
+
+dns_servers = ['10.100.253.6', '10.100.253.106']
+rdns = '2a01:4f8:120:7261:216:3eff:fe44:2015'
+
+curr_state = {}
+
+prev_state = {}
+if os.path.exists(CACHE_FILE):
+    fd = open(CACHE_FILE, 'r')
+    prev_state = json.load(fd)
+    fd.close()
+
+res = os.system('/usr/local/sbin/fping6 -q -r0 {}'.format(rdns))
+if res != 0:
+    if rdns in prev_state and prev_state[rdns]:
+        proc = Popen(shlex.split(
+            '/usr/sbin/traceroute6 -q 1 -n -m 30 {}'.format(rdns)), stdout=PIPE, stderr=PIPE)
+        out, err = proc.communicate()
+        report_error(
+            rdns, 'Remote DNS server is not pingable; current traceroute:\n{}'.format(out))
+    curr_state[rdns] = False
+else:
+    curr_state[rdns] = True
+    if rdns in prev_state and not prev_state[rdns]:
+        proc = Popen(shlex.split(
+            '/usr/sbin/traceroute6 -q 1 -n -m 30 {}'.format(rdns)), stdout=PIPE, stderr=PIPE)
+        out, err = proc.communicate()
+        report_good('{} is pingable again; current traceroute:\n```\n{}\n```'.format(rdns, out))
+
+
+for ds in dns_servers:
+    resolv = dns.resolver.Resolver()
+    resolv.timeout = 2
+    resolv.lifetime = 2
+    resolv.nameservers = [ds]
+
+    try:
+        ans = resolv.query('ciscolive-test.local', 'AAAA')
+        if ans.response.rcode() != dns.rcode.NOERROR:
+            curr_state[ds] = False
+            if ds in prev_state and prev_state[ds]:
+                report_error(ds, ans.response)
+        else:
+            curr_state[ds] = True
+            if ds in prev_state and not prev_state[ds]:
+                report_good('{} is now resolving fine'.format(ds, ds))
+    except Exception as e:
+        curr_state[ds] = False
+        if ds in prev_state and prev_state[ds]:
+            report_error(ds, e)
+
+fd = open(CACHE_FILE, 'w')
+json.dump(curr_state, fd, indent=4)
+fd.close()

+ 136 - 0
automation/services/extend_scope.py

@@ -0,0 +1,136 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import json
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import sys
+import CLEUCreds
+
+DHCP_BASE = 'https://dc1-dhcp.ciscolive.network:8443/web-services/rest/resource/Scope'
+IDF_CNT = 98
+
+HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+if __name__ == '__main__':
+    if len(sys.argv) != 4:
+        sys.stderr.write(
+            "usage: {} VLAN <IDF|CORE> START\n".format(sys.argv[0]))
+        sys.exit(1)
+
+    vlan = sys.argv[1]
+    type = sys.argv[2].upper()
+    start = sys.argv[3]
+
+    if type != 'CORE' and type != 'IDF':
+        sys.stderr.write("usage: {} VLAN <IDF|CORE> START\n".format(sys.argv[0]))
+        sys.exit(1)
+
+    istart = 1
+    prefix = 'IDF-' + str(istart).zfill(3)
+    rs = 1
+    cnt = IDF_CNT
+
+    if type == 'CORE':
+        prefix = 'CORE-'
+        rs = 0
+        cnt = 0
+
+    first_scope_name = '{}-{}'.format(prefix, vlan.upper())
+
+    url = '{}/{}'.format(DHCP_BASE, first_scope_name)
+
+    try:
+        response = requests.request('GET', url, headers=HEADERS, verify=False)
+        response.raise_for_status()
+    except Exception as e:
+        sys.stderr.write(
+            'Failed to get first scope details for {}: {}\n'.format(first_scope_name, e))
+        sys.exit(1)
+
+    first_scope = response.json()
+    end = first_scope['rangeList']['RangeItem'][0]['end'].split('.')[3]
+    subnet = '.'.join(first_scope['subnet'].split('.')[0:2])
+
+    policy = first_scope['policy']
+    embedded_policy = None
+    if 'embeddedPolicy' in first_scope:
+        embedded_policy = first_scope['embeddedPolicy']
+
+    for i in range(rs, cnt + 1):
+        rstart = '{}.{}.{}'.format(subnet, i, start)
+        eoctet = i
+        if type == 'CORE':
+            eoctet = 255
+
+        rend = '{}.{}.{}'.format(subnet, eoctet, end)
+
+        prefix = 'IDF-' + str(i).zfill(3)
+
+        if embedded_policy is not None:
+            embedded_policy = {
+                'optionList': {
+                    'OptionItem': [
+                        {
+                            'number': '3',
+                            'value': '{}.{}.{}'.format(subnet, eoctet, str(254))
+                        }
+                    ]
+                }
+            }
+
+        if type == 'CORE':
+            prefix = 'CORE-'
+
+        scope_name = '{}-{}'.format(prefix, vlan.upper())
+
+        url = '{}/{}'.format(DHCP_BASE, scope_name)
+
+        try:
+            # print('Changing {} to start: {}, end: {}'.format(
+            #    scope_name, start, end))
+
+            payload = {
+                'rangeList': {'RangeItem': [
+                    {'start': rstart, 'end': rend}]},
+                'policy': policy
+            }
+            if embedded_policy is not None:
+                payload['embeddedPolicy'] = embedded_policy
+
+            response = requests.request(
+                'PUT', url, json=payload, headers=HEADERS, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            sys.stderr.write(
+                'Failed to update scope details for {}: {}\n'.format(scope_name, e))
+            continue

+ 70 - 0
automation/services/remove_scopes.py

@@ -0,0 +1,70 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+import json
+from subprocess import Popen, PIPE
+import re
+import shlex
+import os
+
+DHCP_SERVER = '10.100.253.9'
+
+if __name__ == '__main__':
+    match = None
+    ans = None
+    if len(sys.argv) == 2:
+        match = sys.argv[1]
+        ans = raw_input(
+            'Really delete all scopes that match "{}" (y/N): '.format(match))
+    else:
+        ans = raw_input('Really delete all scopes (y/N): ')
+
+    if not re.search(r'^[yY]', ans):
+        print('Exiting...')
+        sys.exit(0)
+
+    proc = Popen(shlex.split(
+        'ssh -2 root@{} /root/nrcmd.sh -r scope listnames'.format(DHCP_SERVER)), stdout=PIPE, stderr=PIPE)
+    out, err = proc.communicate()
+    if not re.search(r'^100', out):
+        print('Query for scopes failed: "{}"'.format(out))
+        sys.exit(1)
+    scopes = out.split('\n')
+    for scope in scopes:
+        if scope != '100 Ok' and re.search(r'^\w', scope):
+            scope = scope.strip()
+            delete = True
+            if match is not None and not re.search(match, scope):
+                delete = False
+            if delete:
+                print('Deleting scope {}'.format(scope))
+                proc = Popen(shlex.split(
+                    'ssh -2 root@{} /root/nrcmd.sh -r scope {} delete'.format(DHCP_SERVER, scope)), stdout=PIPE, stderr=PIPE)
+                if not re.search(r'^100', out):
+                    print('ERROR: Deleting scope {} failed: {}'.format(scope, out))
+            else:
+                print('Skipping scope {} as it did not match "{}"'.format(scope, match))

+ 120 - 0
automation/services/show_dhcp_stats.php

@@ -0,0 +1,120 @@
+<?php
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+$contents = file_get_contents("/home/jclarke/dhcp_scope_stats.dat");
+
+$sarr = json_decode($contents, true);
+$scopes = array();
+
+foreach ($sarr as $k => $v) {
+	$scopes[$k] = $v['perc'];
+}
+
+arsort($scopes, SORT_NUMERIC);
+$mtime = date ("F d Y H:i:s", filemtime("/home/jclarke/dhcp_scope_stats.dat"));
+?>
+<html>
+<head>
+  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.min.css" integrity="sha256-rp5Udclt95vV/qBRPHck2jUp/0xytxZgbHCCVRqV9vc=" crossorigin="anonymous" />
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js" integrity="sha256-dsOXGNHAo/syFnazt+KTBsCQeRmlcW1XKL0bCK4Baec=" crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.min.js" integrity="sha256-rx6BHKxiLgSA2BslVk0Gq+bclIxvxBm4eDKxvpS+7wI=" crossorigin="anonymous"></script>
+  <script>
+setTimeout("location.reload(true);", 600000);
+  </script>
+</head>
+<body>
+<h1 style="text-align: center">DHCP Scope Statistics</h1>
+<div style="text-align: right; font-size: 10pt;"><b>Last Updated: <?=$mtime?></b></div>
+  <table border="0" style="/*table-layout: fixed*/" align="center" width="100%">
+    <tbody>
+<?php
+$max = 3;
+$i = 0;
+$topn = 9;
+foreach ($scopes as $scope => $perc) {
+	if ($i % $max == 0) {
+		echo "<tr>\n";
+	}
+	echo "<td style=\"text-align: center; width: 33%; font-size: 14pt;\">\n";
+	echo "<div id=\"chart_div_$i\"></div>\n";
+	echo "$scope\n";
+	echo "</td>\n";
+	$i++;
+	if ($i % $max == 0) {
+		echo "</tr>\n";
+	}
+	if (!isset($_GET['show_all']) && $i == $topn) {
+		break;
+	}
+}
+?>
+    </tbody>
+  </table>
+  <script language="javascript">
+<?php
+$i = 0;
+foreach ($scopes as $scope => $perc) {
+?>
+var chart<?=$i?> = c3.generate({
+	bindto: '#chart_div_<?=$i?>',
+	data: {
+		columns: [
+			['<?=$scope?>', <?=$perc?>]
+	        ],
+	        type: 'gauge'
+        },
+	gauge: { },
+	color: {
+		pattern: ['#60B044', '#F6C600', '#FF0000'],
+		threshold: {
+			values: [75, 90]
+		}
+	},
+	size: {
+		height: 180
+	}
+});
+<?php
+	$i++;
+}
+?>
+</script>
+<?php
+if (!isset($_GET['show_all'])) {
+?>
+<p style="text-align: left; font-size: 9pt;"><a href="<?=$_SERVER['PHP_SELF']?>?show_all=1">Show All</a></p>
+<?php
+} else {
+?>
+<p style="text-align: left; font-size: 9pt;"><a href="<?=$_SERVER['PHP_SELF']?>">Show Top 9</a></p>
+<?php
+}
+?>
+
+</body>
+</html>

+ 144 - 0
automation/services/tool-to-observium.py

@@ -0,0 +1,144 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import json
+import sys
+import time
+import os
+from subprocess import Popen, PIPE, call
+import shlex
+from sparker import Sparker
+import pprint
+import re
+import socket
+import CLEUCreds
+
+MONITORING = 'cl-monitoring.ciscolive.network'
+CACHE_FILE = '/home/jclarke/monitored_devs.json'
+TOOL = 'tool.ciscolive.network'
+
+
+def get_devs():
+    global TOOL
+
+    url = "http://{}/get/switches/json".format(TOOL)
+
+    devs = []
+    response = requests.request('GET', url)
+    code = 200
+    code = response.status_code
+    if code == 200:
+        devs = json.loads(response.text)
+
+    return devs
+
+
+def delete_device(dev):
+    global MONITORING
+
+    res = call(shlex.split(
+        'ssh -2 {} /usr/local/www/observium/delete_device.php {} rrd'.format(MONITORING, dev)))
+
+    return res
+
+
+if __name__ == '__main__':
+    devs = {}
+    force = False
+    changed_devs = False
+
+    if len(sys.argv) == 2:
+        if sys.argv[1] == '-f':
+            force = True
+    try:
+        fd = open(CACHE_FILE, 'r')
+        devs = json.load(fd)
+        fd.close()
+    except:
+        pass
+
+    tdevs = get_devs()
+
+    i = 0
+    for tdev in tdevs:
+        i += 1
+        if not tdev['Reachable']:
+            continue
+        if re.search(r'.*CORE.*', tdev['Hostname'], flags=re.I) or re.search(r'.*MDF.*', tdev['Hostname'], flags=re.I):
+            continue
+        if tdev['AssetTag'] in devs.keys() and devs[tdev['AssetTag']] != tdev['Hostname']:
+            print('=== Deleting device {} from Observium ({} / {}) ==='.format(
+                tdev['Hostname'], i, len(tdevs)))
+            res = delete_device(devs[tdev['AssetTag']])
+            if res != 0:
+                print(
+                    '\n\n***WARNING: Failed to remove Observium device for {}'.format(devs[tdev['AssetTag']]))
+            print('=== DONE. ===')
+            changed_devs = True
+            del devs[tdev['AssetTag']]
+
+        print('=== Adding DNS record for {} > {} ({} / {}) ==='.format(
+            tdev['Hostname'], tdev['IPAddress'], i, len(tdevs)))
+        res = call(shlex.split(
+            '/home/jclarke/update_dns.py --ip {} --host {}'.format(tdev['IPAddress'], tdev['Hostname'])))
+        if res != 0:
+            print('\n\n***ERROR: Failed to add DNS record')
+            continue
+        print('=== DONE. ===')
+
+        if tdev['AssetTag'] not in devs.keys() or force:
+            if force:
+                print('=== Deleting device {} from Observium ({} / {}) ==='.format(
+                    tdev['Hostname'], i, len(tdevs)))
+                res = delete_device(tdev['Hostname'])
+                if res != 0:
+                    print(
+                        '\n\n***WARNING: Failed to remove Observium device {}'.format(tdev['Hostname']))
+                print('=== DONE. ===')
+
+            time.sleep(3)
+
+            print('=== Adding device {} to Observium ({} / {}) ==='.format(
+                tdev['Hostname'], i, len(tdevs)))
+            res = call(shlex.split(
+                'ssh -2 {} /usr/local/www/observium/add_device.php {} ap v3 CLEUR {} {} sha des'.format(MONITORING, tdev['Hostname'], CLEUCreds.SNMP_TOOL_AUTH_PASS, CLEUCreds.SNMP_TOOL_PRIV_PASS)), stdout=PIPE, stderr=PIPE)
+            if res != 0:
+                print(
+                    '\n\n***ERROR: Failed to add {} to Observium'.format(tdev['Hostname']))
+                continue
+            print('=== DONE. ===')
+
+            changed_devs = True
+            devs[tdev['AssetTag']] = tdev['Hostname']
+
+    if changed_devs:
+        fd = open(CACHE_FILE, 'w')
+        json.dump(devs, fd)
+        fd.close()

+ 209 - 0
automation/services/update-dns-pi.py

@@ -0,0 +1,209 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import json
+import sys
+import re
+import CLEUCreds
+
+PI = '10.100.253.22'
+DNS_BASE = 'https://dc1-dns.ciscolive.local:8443/web-services/rest/resource/'
+DOMAIN = 'ciscolive.local'
+CNR_HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+PAGE_SIZE = 1000
+
+
+def get_devs():
+    global PI, PAGE_SIZE, DOMAIN
+
+    url = "https://{}/webacs/api/v1/data/Devices.json?.full=true&.maxResults={}".format(
+        PI, PAGE_SIZE)
+    headers = {
+        'Connection': 'close'
+    }
+
+    devices = []
+    done = False
+    first = 0
+    while not done:
+        code = 401
+        i = 0
+        nurl = url + "&.firstResult=" + str(first * PAGE_SIZE)
+        while code != 200 and i < 10:
+            response = requests.request(
+                "GET", nurl, auth=(CLEUCreds.PI_USER, CLEUCreds.PI_PASS), headers=headers, verify=False)
+            code = response.status_code
+            if code != 200:
+                i += 1
+                time.sleep(3)
+        if code == 200:
+            j = json.loads(response.text)
+            if int(j['queryResponse']['@last']) + 1 == int(j['queryResponse']['@count']):
+                done = True
+            else:
+                first += 1
+
+            for dev in j['queryResponse']['entity']:
+                dev_dic = {}
+                if 'deviceName' in dev['devicesDTO']:
+                    dev_dic['name'] = dev['devicesDTO']['deviceName']
+                else:
+                    continue
+                if not re.search(r'^0', dev_dic['name']):
+                    continue
+                dev_dic['ip'] = dev['devicesDTO']['ipAddress']
+                nparts = dev_dic['name'].split('-')
+                if len(nparts) == 3:
+                    dev_dic['aliases'] = []
+                    dev_dic['name'] = dev_dic['name'].replace(
+                        '.{}'.format(DOMAIN), '')
+                    dev_dic['aliases'].append('-'.join(nparts[0:2]) + '.{}.'.format(DOMAIN))
+                    dev_dic['aliases'].append(nparts[2] + '.{}.'.format(DOMAIN))
+
+                devices.append(dev_dic)
+
+    return devices
+
+
+def add_entry(url, hname, dev):
+    global CNR_HEADERS, DOMAIN
+
+    aliases = []
+
+    if 'aliases' in dev:
+        aliases = dev['aliases']
+
+    try:
+        host_obj = {
+            'addrs': {
+                'stringItem': [
+                    dev['ip']
+                ]
+            },
+            'aliases': {
+                'stringItem': [
+
+                ]
+            },
+            'name': hname,
+            'zoneOrigin': DOMAIN
+        }
+        for alias in aliases:
+            host_obj['aliases']['stringItem'].append(alias)
+
+        response = requests.request(
+            'PUT', url, headers=CNR_HEADERS, json=host_obj, verify=False)
+        response.raise_for_status()
+        print('Added entry for {} ==> {} with aliases {}'.format(
+            hname, dev['ip'], str(aliases)))
+    except Exception as e:
+        sys.stderr.write(
+            'Error adding entry for {}: {}\n'.format(hname, e))
+
+if __name__ == '__main__':
+
+    devs = get_devs()
+    for dev in devs:
+        hname = dev['name'].replace('.{}'.format(DOMAIN), '')
+        url = DNS_BASE + 'CCMHost' + '/{}'.format(hname)
+        response = requests.request('GET', url, headers=CNR_HEADERS, params={
+                                    'zoneOrigin': DOMAIN}, verify=False)
+        if response.status_code == 404:
+            iurl = DNS_BASE + 'CCMHost'
+            response = requests.request('GET', iurl, params={'zoneOrigin': DOMAIN, 'addrs': dev[
+                                        'ip'] + '$'}, headers=CNR_HEADERS, verify=False)
+            cur_entry = []
+            if response.status_code != 404:
+                cur_entry = response.json()
+
+            if len(cur_entry) > 0:
+                print('Found entry for {}: {}'.format(
+                    dev['ip'], response.status_code))
+                cur_entry = response.json()
+                if len(cur_entry) > 1:
+                    print(
+                        'ERROR: Found multiple entries for IP {}'.format(dev['ip']))
+                    continue
+
+                print('Found old entry for IP {} => {}'.format(
+                    dev['ip'], cur_entry[0]['name']))
+
+                durl = DNS_BASE + 'CCMHost' + \
+                    '/{}'.format(cur_entry[0]['name'])
+                try:
+                    response = requests.request('DELETE', durl, params={
+                                                'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write('Failed to delete stale entry for {} ({})\n'.format(
+                        cur_entry[0]['name'], dev['ip']))
+                    continue
+
+            add_entry(url, hname, dev)
+        else:
+            cur_entry = response.json()
+            create_new = True
+            for addr in cur_entry['addrs']['stringItem']:
+                if addr == dev['ip']:
+                    if 'aliases' in dev and 'aliases' in cur_entry:
+                        if (len(dev['aliases']) > 0 and 'stringItem' not in cur_entry['aliases']) or (len(dev['aliases']) != len(cur_entry['aliases']['stringItem'])):
+                            break
+                        common = set(dev['aliases']) & set(
+                            cur_entry['aliases']['stringItem'])
+                        if len(common) != len(dev['aliases']):
+                            break
+                        create_new = False
+                        break
+                    elif ('aliases' in dev and 'aliases' not in cur_entry) or ('aliases' in cur_entry and 'aliases' not in dev):
+                        break
+                    else:
+                        create_new = False
+                        break
+
+            if create_new:
+                print('Deleting entry for {}'.format(hname))
+                try:
+                    response = requests.request('DELETE', url, headers=CNR_HEADERS, params={
+                                                'zoneOrigin': DOMAIN}, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write(
+                        'Error deleting entry for {}: {}\n'.format(hname, e))
+
+                add_entry(url, hname, dev)
+            else:
+                print('Not creating a new entry for {} as it already exists'.format(
+                      dev['name']))

+ 212 - 0
automation/services/update-dns-tool.py

@@ -0,0 +1,212 @@
+#!/usr/bin/env python2
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import json
+import sys
+import re
+import os
+import CLEUCreds
+
+TOOL = 'tool.ciscolive.local'
+DNS_BASE = 'https://dc1-dns.ciscolive.local:8443/web-services/rest/resource/'
+DOMAIN = 'ciscolive.local'
+CNR_HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+CACHE_FILE = 'dns_records.dat'
+
+
+def get_devs():
+    global DOMAIN
+
+    url = "http://{}/get/switches/json".format(TOOL)
+
+    devices = []
+    response = requests.request('GET', url)
+    code = response.status_code
+    if code == 200:
+        j = response.json()
+
+        for dev in j:
+            dev_dic = {}
+            if dev['IPAddress'] == '0.0.0.0':
+                continue
+            if not re.search(r'^0', dev['Hostname']):
+                continue
+            dev_dic['name'] = dev['Hostname']
+            dev_dic['aliases'] = [unicode('{}.{}.'.format(
+                dev['Name'], DOMAIN)), unicode('{}.{}.'.format(dev['AssetTag'], DOMAIN))]
+
+            dev_dic['ip'] = dev['IPAddress']
+
+            devices.append(dev_dic)
+
+    return devices
+
+
+def add_entry(url, hname, dev):
+    global CNR_HEADERS, DOMAIN
+
+    try:
+        host_obj = {
+            'addrs': {
+                'stringItem': [
+                    dev['ip']
+                ]
+            },
+            'aliases': {
+                'stringItem': [
+
+                ]
+            },
+            'name': hname,
+            'zoneOrigin': DOMAIN
+        }
+        for alias in dev['aliases']:
+            host_obj['aliases']['stringItem'].append(alias)
+
+        response = requests.request(
+            'PUT', url, headers=CNR_HEADERS, json=host_obj, verify=False)
+        response.raise_for_status()
+        print('Added entry for {} ==> {} with aliases {}'.format(
+            hname, dev['ip'], str(dev['aliases'])))
+    except Exception as e:
+        sys.stderr.write(
+            'Error adding entry for {}: {}\n'.format(hname, e))
+
+if __name__ == '__main__':
+
+    prev_records = []
+
+    if os.path.exists(CACHE_FILE):
+        fd = open(CACHE_FILE, 'r')
+        prev_records = json.load(fd)
+        fd.close()
+
+    devs = get_devs()
+    for record in prev_records:
+        found_record = False
+        for dev in devs:
+            hname = dev['name'].replace('.{}'.format(DOMAIN), '')
+            if record == hname:
+                found_record = True
+                break
+        if found_record:
+            continue
+
+        url = DNS_BASE + 'CCMHost' + '/{}'.format(record)
+        try:
+            response = requests.request('DELETE', url, headers=CNR_HEADERS, params={
+                                        'zoneOrigin': DOMAIN}, verify=False)
+            response.raise_for_status()
+        except Exception as e:
+            sys.stderr.write('Failed to delete entry for {}'.format(record))
+
+    records = []
+    for dev in devs:
+        hname = dev['name'].replace('.{}'.format(DOMAIN), '')
+
+        records.append(hname)
+        url = DNS_BASE + 'CCMHost' + '/{}'.format(hname)
+        response = requests.request('GET', url, headers=CNR_HEADERS, params={
+                                    'zoneOrigin': DOMAIN}, verify=False)
+        if response.status_code == 404:
+            iurl = DNS_BASE + 'CCMHost'
+            response = requests.request('GET', iurl, params={'zoneOrigin': DOMAIN, 'addrs': dev[
+                                        'ip'] + '$'}, headers=CNR_HEADERS, verify=False)
+            cur_entry = []
+            if response.status_code != 404:
+                cur_entry = response.json()
+
+            if len(cur_entry) > 0:
+                print('Found entry for {}: {}'.format(
+                    dev['ip'], response.status_code))
+                cur_entry = response.json()
+                if len(cur_entry) > 1:
+                    print(
+                        'ERROR: Found multiple entries for IP {}'.format(dev['ip']))
+                    continue
+
+                print('Found old entry for IP {} => {}'.format(
+                    dev['ip'], cur_entry[0]['name']))
+
+                durl = DNS_BASE + 'CCMHost' + \
+                    '/{}'.format(cur_entry[0]['name'])
+                try:
+                    response = requests.request('DELETE', durl, params={
+                                                'zoneOrigin': DOMAIN}, headers=CNR_HEADERS, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write('Failed to delete stale entry for {} ({})\n'.format(
+                        cur_entry[0]['name'], dev['ip']))
+                    continue
+
+            add_entry(url, hname, dev)
+        else:
+            cur_entry = response.json()
+            create_new = True
+            for addr in cur_entry['addrs']['stringItem']:
+                if addr == dev['ip']:
+                    if 'aliases' in dev and 'aliases' in cur_entry:
+                        if (len(dev['aliases']) > 0 and 'stringItem' not in cur_entry['aliases']) or (len(dev['aliases']) != len(cur_entry['aliases']['stringItem'])):
+                            break
+                        common = set(dev['aliases']) & set(
+                            cur_entry['aliases']['stringItem'])
+                        if len(common) != len(dev['aliases']):
+                            break
+                        create_new = False
+                        break
+                    elif ('aliases' in dev and 'aliases' not in cur_entry) or ('aliases' in cur_entry and 'aliases' not in dev):
+                        break
+                    else:
+                        create_new = False
+                        break
+
+            if create_new:
+                print('Deleting entry for {}'.format(hname))
+                try:
+                    response = requests.request('DELETE', url, headers=CNR_HEADERS, params={
+                                                'zoneOrigin': DOMAIN}, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write(
+                        'Error deleting entry for {}: {}\n'.format(hname, e))
+
+                add_entry(url, hname, dev)
+            else:
+                print('Not creating a new entry for {} as it already exists'.format(
+                      dev['name']))
+
+    fd = open(CACHE_FILE, 'w')
+    json.dump(records, fd, indent=4)
+    fd.close()

+ 142 - 0
automation/services/update_dhcp.py

@@ -0,0 +1,142 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import json
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import sys
+import re
+from netaddr import IPAddress
+import CLEUCreds
+
+IDF_CNT = 98
+FIRST_IP = 31
+LAST_IP = 253
+
+DHCP_BASE = 'https://dc1-dhcp.ciscolive.network:8443/web-services/rest/resource/Scope'
+
+DHCP_TEMPLATE = {
+    "optionList": {
+        "OptionItem": []
+    }
+}
+
+HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+
+def mtoc(mask):
+    return IPAddress(mask).netmask_bits()
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        sys.stderr.write("usage: {} INPUT_FILE\n".format(sys.argv[0]))
+        sys.exit(1)
+
+    contents = None
+
+    try:
+        fd = open(sys.argv[1], 'r')
+        contents = fd.read()
+        fd.close()
+    except Exception as e:
+        sys.stderr.write("Failed to open {}: {}\n".format(sys.argv[1], str(e)))
+        sys.exit(1)
+
+    for row in contents.split('\n'):
+        row = row.strip()
+        if re.search(r'^#', row):
+            continue
+        if row == '':
+            continue
+        [vlan, mask, name, policy] = row.split(',')
+        if vlan == '' or mask == '' or name == '' or policy == '':
+            sys.stderr.write("Skipping malformed row '{}'\n".format(row))
+            continue
+
+        start = 1
+        cnt = IDF_CNT
+
+        if mask == '255.255.0.0':
+            start = 0
+            cnt = 0
+
+        for i in range(start, cnt + 1):
+            prefix = 'IDF-{}'.format(str(i).zfill(3))
+            if i == 0:
+                prefix = 'CORE'
+
+            scope = ('{}-{}'.format(prefix, name)).upper()
+            ip = '10.{}.{}.0'.format(vlan, i)
+            octets = ['10', vlan, str(i), '0']
+            roctets = list(octets)
+            roctets[3] = '254'
+
+            url = '{}/{}'.format(DHCP_BASE, scope)
+
+            response = requests.request(
+                'GET', url, headers=HEADERS, verify=False)
+            if response.status_code != 404:
+                sys.stderr.write("Scope {} already exists: {}\n".format(
+                    scope, response.status_code))
+                continue
+
+            template = {'optionList': {'OptionItem': []}}
+            if mask == '255.255.0.0':
+                roctets[2] = '255'
+            template['optionList']['OptionItem'].append(
+                {'number': '3', 'value': '.'.join(roctets)})
+            sipa = list(octets)
+            sipa[3] = str(FIRST_IP)
+            eipa = list(octets)
+            eipa[3] = str(LAST_IP)
+            if mask == '255.255.0.0':
+                eipa[2] = '255'
+
+            sip = '.'.join(sipa)
+            eip = '.'.join(eipa)
+
+            rlist = {'RangeItem': [{'end': eip, 'start': sip}]}
+            cidr = mtoc(mask)
+
+            payload = {'embeddedPolicy': template, 'name': scope, 'policy': policy,
+                       'rangeList': rlist, 'subnet': '{}/{}'.format(ip, cidr), 'tenantId': '0', 'vpnId': '0'}
+
+            try:
+                response = requests.request('PUT', url, data=json.dumps(
+                    payload), headers=HEADERS, verify=False)
+                response.raise_for_status()
+            except Exception as e:
+                sys.stderr.write("Error adding scope {} ({}/{}) with range sip:{} eip:{}: {} ({})\n".format(
+                    scope, ip, cidr, sip, eip, response.text, str(e)))
+                sys.stderr.write("Request: {}\n".format(
+                    json.dumps(payload, indent=4)))
+                continue

+ 109 - 0
automation/services/update_dns.py

@@ -0,0 +1,109 @@
+#!/usr/local/bin/python2
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+import sys
+import re
+from argparse import ArgumentParser
+import CLEUCreds
+
+DNS_BASE = 'https://dc1-dns.ciscolive.network:8443/web-services/rest/resource/'
+DOMAIN = 'ciscolive.network'
+
+HEADERS = {
+    'authorization': CLEUCreds.JCLARKE_BASIC,
+    'accept': 'application/json',
+    'content-type': 'application/json'
+}
+
+if __name__ == '__main__':
+
+    parser = ArgumentParser(description='Usage:')
+
+    # script arguments
+    parser.add_argument('-i', '--input', type=str,
+                        help='Path to input CSV file')
+    parser.add_argument('--host', type=str, help='Hostname for a single add')
+    parser.add_argument('--ip', type=str, help='IP address for a single add')
+    args = parser.parse_args()
+
+    hosts = []
+
+    if not args.input:
+        if not args.ip or not args.host:
+            print('Single addition requires both a hostname and an IP address.')
+            sys.exit(1)
+        hosts.append((args.host, args.ip))
+    else:
+
+        contents = None
+        try:
+            fd = open(args.input, 'r')
+            contents = fd.read()
+            fd.close()
+        except Exception as e:
+            print("Failed to open {} for reading: {}".format(args.input, e))
+            sys.exit(1)
+
+        for row in contents.split('\n'):
+            row = row.strip()
+            if re.search(r'^#', row):
+                continue
+            if row == '':
+                continue
+
+            [hostname, ip] = row.split(',')
+            hostname = hostname.strip().upper()
+            ip = ip.strip()
+
+            hosts.append((hostname, ip))
+
+    for h in hosts:
+        hostname = h[0]
+        ip = h[1]
+
+        url = DNS_BASE + 'CCMHost' + '/{}'.format(hostname)
+
+        response = requests.request(
+            'GET', url, params={'zoneOrigin': DOMAIN}, headers=HEADERS, verify=False)
+        if response.status_code != 404:
+            host_obj = response.json()
+            a = host_obj['addrs']['stringItem'][0]
+
+            if a != ip:
+                try:
+                    response = requests.request('DELETE', url, params={
+                                                'zoneOrigin': DOMAIN}, headers=HEADERS, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write(
+                        'Failed to remove host {}: {}'.format(hostname, e))
+                    continue
+
+                try:
+                    host_obj['addrs']['stringItem'][0] = ip
+                    response = requests.request(
+                        'PUT', url, json=host_obj, headers=HEADERS, verify=False)
+                    response.raise_for_status()
+                except Exception as e:
+                    sys.stderr.write(
+                        'Error adding entry for {}: {}'.format(hostname, e))
+        else:
+            try:
+                host_obj = {
+                    'addrs': {
+                        'stringItem': [
+                            ip
+                        ]
+                    },
+                    'name': hostname,
+                    'zoneOrigin': DOMAIN
+                }
+                response = requests.request(
+                    'PUT', url, headers=HEADERS, json=host_obj, verify=False)
+                response.raise_for_status()
+            except Exception as e:
+                sys.stderr.write(
+                    'Error adding entry for {}: {}\n'.format(hostname, e))

+ 285 - 0
automation/spark/sparker.py

@@ -0,0 +1,285 @@
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import requests
+from requests_toolbelt import MultipartEncoder
+from io import BytesIO
+import logging
+import time
+
+
+class Sparker():
+    SPARK_API = "https://api.ciscospark.com/v1/"
+
+    RETRIES = 3
+
+    _headers = {
+        'authorization': None,
+        'content-type': 'application/json'
+    }
+
+    _logit = False
+
+    def __init__(self, **kwargs):
+        if 'logit' in kwargs:
+            self._logit = kwargs['logit']
+        if 'token' in kwargs:
+            self._headers['authorization'] = 'Bearer ' + kwargs['token']
+        self._team_cache = {}
+        self._room_cache = {}
+
+    @staticmethod
+    def _request_with_retry(*args, **kwargs):
+        backoff = 1
+        i = 0
+        while True:
+            try:
+                response = requests.request(*args, **kwargs)
+                response.raise_for_status()
+                return response
+            except Exception as e:
+                if (response.status_code != 429 and response.status_code != 503 and response.status_code != 400) or i == Sparker.RETRIES:
+                    return response
+
+                time.sleep(backoff)
+                backoff *= 2
+                i += 1
+
+    def set_token(self, token):
+        self._headers['authorization'] = 'Bearer ' + token
+
+    def check_token(self):
+        if self._headers['authorization'] is None:
+            if self._logit:
+                logging.error('Spark token is not set!')
+            else:
+                print('Spark token is not set!')
+
+            return False
+
+        return True
+
+
+    def get_message(self, mid):
+        if not self.check_token():
+            return None
+
+        url = self.SPARK_API + 'messages' + '/' + mid
+
+        try:
+            response = Sparker._request_with_retry(
+                'GET', url, headers=self._headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error getting message with ID {}: {}'.format(mid, e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return None
+
+        return response.json()
+
+    def get_team_id(self, team):
+        if not self.check_token():
+            return None
+
+        if team in self._team_cache:
+            return self._team_cache[team]
+
+        url = self.SPARK_API + 'teams'
+
+        try:
+            response = Sparker._request_with_retry(
+                'GET', url, headers=self._headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error retrieving teams: {}'.format(e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return None
+
+        team_id = None
+        for t in response.json()['items']:
+            if t['name'] == team:
+                self._team_cache[team] = t['id']
+                return t['id']
+
+        if team_id is None:
+            msg = 'Error finding team ID for {}'.format(team)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+
+        return None
+
+    def get_room_id(self, team_id, room):
+        if not self.check_token():
+            return None
+
+        if team_id is None:
+            team_id = ''
+
+        if '{}:{}'.format(team_id, room) in self._room_cache:
+            return self._room_cache['{}:{}'.format(team_id, room)]
+
+        url = self.SPARK_API + 'rooms'
+        params = {}
+
+        if team_id != '':
+            params['teamId'] = team_id
+
+        try:
+            response = Sparker._request_with_retry(
+                'GET', url, headers=self._headers, params=params)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error retrieving room {}: {}'.format(room, e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return None
+
+        room_id = None
+        for r in response.json()['items']:
+            if r['title'] == room:
+                self._room_cache['{}:{}'.format(team_id, room)] = r['id']
+                return r['id']
+
+        if room_id is None:
+            msg = 'Failed to find room ID for {}'.format(room)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+
+        return None
+
+    def get_members(self, team):
+        if not self.check_token():
+            return None
+
+        team_id = None
+
+        team_id = self.get_team_id(team)
+        if team_id is None:
+            return None
+
+        url = self.SPARK_API + 'team/memberships'
+
+        payload = {'teamId': team_id}
+
+        try:
+            response = Sparker._request_with_retry(
+                'GET', url, params=payload, headers=self._headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error getting team membership: {}'.format(e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return None
+
+        return response.json()
+
+    def post_to_spark(self, team, room, msg):
+        if not self.check_token():
+            return None
+
+        team_id = None
+
+        if team is not None:
+            team_id = self.get_team_id(team)
+            if team_id is None:
+                return False
+
+        room_id = self.get_room_id(team_id, room)
+        if room_id is None:
+            return False
+
+        url = self.SPARK_API + 'messages'
+
+        payload = {'roomId': room_id,
+                   'markdown': msg}
+
+        try:
+            response = Sparker._request_with_retry(
+                'POST', url, json=payload, headers=self._headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error posting message: {}'.format(e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return False
+
+        return True
+
+    def post_to_spark_with_attach(self, team, room, msg, attach, fname, ftype):
+        if not self.check_token():
+            return None
+
+        team_id = None
+
+        if team is not None:
+            team_id = self.get_team_id(team)
+        if team_id is None:
+            return False
+
+        room_id = self.get_room_id(team_id, room)
+        if room_id is None:
+            return False
+
+        url = self.SPARK_API + 'messages'
+
+        bio = BytesIO(attach)
+
+        payload = {'roomId': room_id,
+                   'markdown': msg,
+                   'files': (fname, bio, ftype)}
+        m = MultipartEncoder(fields=payload)
+
+        headers = self._headers
+        headers['content-type'] = m.content_type
+
+        try:
+            response = Sparker._request_with_retry(
+                'POST', url, data=m, headers=headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = 'Error posting message: {}'.format(e)
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+            return False
+
+        return True

+ 60 - 0
automation/syslog-ng-filters/err_disable.py

@@ -0,0 +1,60 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+sys.path.append('/home/jclarke')
+from sparker import Sparker
+import CLEUCreds
+import re
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Err Disable Alarms'
+
+if __name__ == '__main__':
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    while True:
+        output = ''
+        for line in sys.stdin.readline():
+            output += line
+
+        host, msghdr, msg = output.split('~')
+        hname = msghdr.replace(': ', '')
+        hpart = ''
+        if hname != '' and hname != 'GMT':
+            hpart = '({}) '.format(hname)
+
+
+        m = re.search(r': ([^,]+), putting ([^\s]+) in err-disable state', msg)
+        if m:
+            spark.post_to_spark(
+                SPARK_TEAM, SPARK_ROOM, 'Port **{}** on **{}** **{}**has been put in an err-disable state because {}'.format(m.group(2), host, hpart, m.group(1)))
+        else:
+            m = re.search(
+                r'recover from .+? err-disable state on (\S+)', msg)
+            if m:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, 'Port **{}** on **{}** **{}**is recovering from err-disable'.format(m.group(1), host, hpart))

+ 57 - 0
automation/syslog-ng-filters/ipsla_timeout.py

@@ -0,0 +1,57 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+sys.path.append('/home/jclarke')
+from sparker import Sparker
+import CLEUCreds
+import re
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Core Alarms'
+
+if __name__ == '__main__':
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    while True:
+        output = ''
+        for line in sys.stdin.readline():
+            output += line
+
+        host, msg = output.split('~')
+
+        m = re.search(
+            r'RTT-3-IPSLATHRESHOLD: IP SLAs\(([0-9])\): Threshold (Occurred|Cleared) for timeout', msg)
+        if m:
+            type = 'IPv4'
+            if m.group(1) == '2':
+                type = 'IPv6'
+            if m.group(2) == 'Occurred':
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '**DANGER**: {} connectivity is down to Google\'s DNS from {} (lost 3 consecutive pings)'.format(type, host))
+            else:
+                spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '_RELAX_: {} connectivity to Google\'s DNS from {} has been restored'.format(type, host))

+ 49 - 0
automation/syslog-ng-filters/ps_fail.py

@@ -0,0 +1,49 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+sys.path.append('/home/jclarke')
+from sparker import Sparker
+import CLEUCreds
+import re
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Data Center Alarms'
+
+if __name__ == '__main__':
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    while True:
+        output = ''
+        for line in sys.stdin.readline():
+            output += line
+
+        host, msg = output.split('~')
+
+        m = re.search(r'Power supply (\d+) has failed or shutdown', msg)
+        if m:
+            spark.post_to_spark(
+                SPARK_TEAM, SPARK_ROOM, 'Power supply **{}** on **{}** has failed or shutdown'.format(m.group(1), host))

+ 55 - 0
automation/syslog-ng-filters/qfp_alerts.py

@@ -0,0 +1,55 @@
+#!/usr/local/bin/python2
+#
+# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import sys
+sys.path.append('/home/jclarke')
+from sparker import Sparker
+import CLEUCreds
+import re
+
+SPARK_TEAM = 'CL19 NOC Team'
+SPARK_ROOM = 'Core Alarms'
+
+if __name__ == '__main__':
+    spark = Sparker(token=CLEUCreds.SPARK_TOKEN)
+
+    while True:
+        output = ''
+        for line in sys.stdin.readline():
+            output += line
+
+        host, msg = output.split('~')
+
+        m = re.search(r'MCPRP-QFP-ALERT: Slot: (\d+), QFP:(\d+), Load (\d+%) exceeds the setting threshold.(\d+%).', msg)
+        if m:
+            spark.post_to_spark(
+                    SPARK_TEAM, SPARK_ROOM, '**DANGER**: Slot {}, QFP {} on device **{}** has a load of {} which exceeds the threshold of {}'.format(m.group(1), m.group(2), host, m.group(3), m.group(4)))
+        else:
+            m = re.search(
+                r'Slot: (\d+), QFP:(\d+), Load (\d+%) recovered', msg)
+            if m:
+                spark.post_to_spark(
+                        SPARK_TEAM, SPARK_ROOM, '_RELAX_: Slot {}, QFP {} on device **{}** is now recovered at load {}'.format(m.group(1), m.group(2), host, m.group(3)))

+ 120 - 0
brknms-3021/mdt-ipsla/ipsla_pro.json

@@ -0,0 +1,120 @@
+{
+  "id": 2,
+  "title": "IPSLA Stats",
+  "originalTitle": "IPSLA Stats",
+  "tags": [],
+  "style": "dark",
+  "timezone": "browser",
+  "editable": true,
+  "hideControls": false,
+  "sharedCrosshair": false,
+  "rows": [{
+    "collapse": false,
+    "editable": true,
+    "height": "250px",
+    "panels": [{
+      "aliasColors": {},
+      "bars": false,
+      "datasource": null,
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null,
+        "threshold1": null,
+        "threshold1Color": "rgba(216, 200, 27, 0.27)",
+        "threshold2": null,
+        "threshold2Color": "rgba(234, 112, 112, 0.22)"
+      },
+      "id": 1,
+      "isNew": true,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "span": 12,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [{
+        "expr": "rtt",
+        "intervalFactor": 2,
+        "legendFormat": "rtt in ms",
+        "metric": "rtt",
+        "refId": "A",
+        "step": 21
+      }],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "RTT to Google",
+      "tooltip": {
+        "shared": true,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "y-axis": true,
+      "y_formats": [
+        "short",
+        "short"
+      ]
+    }],
+    "title": "New row"
+  }],
+  "time": {
+    "from": "now-6h",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "templating": {
+    "list": []
+  },
+  "annotations": {
+    "list": []
+  },
+  "schemaVersion": 8,
+  "version": 4,
+  "links": []
+}

+ 128 - 0
brknms-3021/mdt-ipsla/yp-to-pro.py

@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2017-2018  Joe Clarke <jclarke@cisco.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+from flask import Flask
+from flask import Response
+from ncclient import manager
+from ncclient.operations import RPCError
+import xmltodict
+import sys
+import lxml.etree as ET
+from argparse import ArgumentParser
+import json
+
+app = Flask(__name__)
+
+CONFIG_VERBOSE = False
+CONFIG_OPER_ID = 0
+
+curr_rtt = -1
+
+
+@app.route('/')
+def get_stats():
+    global curr_rtt
+
+    return Response('rtt {}\n'.format(curr_rtt), mimetype='text/plain')
+
+
+def callback(notif):
+    global curr_rtt, CONFIG_OPER_ID, CONFIG_VERBOSE
+
+    d = xmltodict.parse(notif.xml)
+    if CONFIG_VERBOSE:
+        print(json.dumps(d, indent=4))
+    opers = []
+    if isinstance(d['notification']['push-update']['datastore-contents-xml']['ip-sla-stats']['sla-oper-entry'], list):
+        opers = d['notification'][
+            'push-update']['datastore-contents-xml']['ip-sla-stats']['sla-oper-entry']
+    else:
+        opers.append(d['notification']['push-update']
+                     ['datastore-contents-xml']['ip-sla-stats']['sla-oper-entry'])
+    found_rtt = False
+    for oper in opers:
+        if CONFIG_VERBOSE:
+            print('Notif oper-id: {}'.format(oper['oper-id']))
+        if int(oper['oper-id']) == CONFIG_OPER_ID:
+            if CONFIG_VERBOSE:
+                print('Setting curr_rtt to {}'.format(
+                    oper['rtt-info']['latest-rtt']['rtt']))
+            curr_rtt = int(oper['rtt-info']['latest-rtt']['rtt'])
+            found_rtt = True
+            break
+
+    if not found_rtt:
+        curr_rtt = -1
+
+
+def errback(e):
+    print('Error : {}'.format(e))
+
+
+def subscribe(dev, user, password, port=830, timeout=90, period=1000):
+    global app, CONFIG_VERBOSE
+
+    with manager.connect(host=dev, port=port, username=user, password=password, timeout=timeout, hostkey_verify=False) as m:
+        try:
+            response = m.establish_subscription(
+                callback, errback, '/ip-sla-ios-xe-oper:ip-sla-stats/sla-oper-entry', period).xml
+            data = ET.fromstring(response.encode('utf-8'))
+            if CONFIG_VERBOSE:
+                print(ET.tostring(data, pretty_print=True))
+            app.run()
+        except RPCError as e:
+            print('RPC Error subscribing to stream: {}'.format(e._raw))
+            sys.exit(1)
+
+if __name__ == '__main__':
+    parser = ArgumentParser(description='usage:')
+
+    parser.add_argument('-a', '--host', type=str, required=True,
+                        help='Device IP address or hostname')
+    parser.add_argument('-u', '--username', type=str, required=True,
+                        help='Device username (NETCONF server username)')
+    parser.add_argument('-p', '--password', type=str, required=True,
+                        help='Device password (NETCONF server password)')
+    parser.add_argument('-t', '--timeout', type=int, default=90,
+                        help='NETCONF server connection timeout')
+    parser.add_argument('-o', '--oper-id', type=int,
+                        required=True, help='IP SLA operation ID to monitor')
+    parser.add_argument('--period', type=int, default=1000,
+                        help='Period to wait for notification pushes')
+    parser.add_argument('-v', '--verbose', action='store_true',
+                        help='Enable verbose output')
+    parser.add_argument('--port', type=int, default=830,
+                        help='NETCONF server port')
+    args = parser.parse_args()
+
+    CONFIG_VERBOSE = args.verbose
+    CONFIG_OPER_ID = args.oper_id
+
+    if CONFIG_VERBOSE:
+        print('Oper ID: {}'.format(CONFIG_OPER_ID))
+
+    subscribe(args.host, args.username, args.password,
+              args.port, args.timeout, args.period)

+ 170 - 0
patches/loganalyzer/logstreamlineparsersyslog.class.php

@@ -0,0 +1,170 @@
+<?php
+/*
+	*********************************************************************
+	* LogAnalyzer - http://loganalyzer.adiscon.com
+	* -----------------------------------------------------------------	*
+	* LogStream Parser is used to split syslog messages into fields		*
+	*																	*
+	* All directives are explained within this file						*
+	*
+	* Copyright (C) 2008-2010 Adiscon GmbH.
+	*
+	* This file is part of LogAnalyzer.
+	*
+	* LogAnalyzer is free software: you can redistribute it and/or modify
+	* it under the terms of the GNU General Public License as published by
+	* the Free Software Foundation, either version 3 of the License, or
+	* (at your option) any later version.
+	*
+	* LogAnalyzer is distributed in the hope that it will be useful,
+	* but WITHOUT ANY WARRANTY; without even the implied warranty of
+	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	* GNU General Public License for more details.
+	*
+	* You should have received a copy of the GNU General Public License
+	* along with LogAnalyzer. If not, see <http://www.gnu.org/licenses/>.
+	*
+	* A copy of the GPL can be found in the file "COPYING" in this
+	* distribution.
+	* 
+	* Adiscon LogAnalyzer is also available under a commercial license.
+	* For details, contact info@adiscon.com or visit
+	* http://loganalyzer.adiscon.com/commercial
+	*********************************************************************
+*/
+
+// --- Avoid directly accessing this file! 
+if ( !defined('IN_PHPLOGCON') )
+{
+	die('Hacking attempt');
+	exit;
+}
+// --- 
+
+// --- Basic Includes
+require_once($gl_root_path . 'classes/enums.class.php');
+require_once($gl_root_path . 'include/constants_errors.php');
+require_once($gl_root_path . 'include/constants_logstream.php');
+// --- 
+
+
+class LogStreamLineParsersyslog extends LogStreamLineParser {
+//	protected $_arrProperties = null;
+
+	// Constructor
+	public function LogStreamLineParsersyslog() {
+		return; // Nothing
+	}
+
+	/**
+	* ParseLine
+	*
+	* @param arrArguments array in&out: properties of interest. There can be no guarantee the logstream can actually deliver them.
+	* @return integer Error stat
+	*/
+	public function ParseLine($szLine, &$arrArguments)
+	{
+		// Set IUT Property first!
+		$arrArguments[SYSLOG_MESSAGETYPE] = IUT_Syslog;
+
+		// Sample (Syslog): Mar 10 14:45:44 debandre anacron[3226]: Job `cron.daily' terminated (mailing output)
+		if ( preg_match("/^(\w+)  ?(\d{1,2})\s+([\d:]+)\s+([\w\d\.-]+) %(\w+-((\d*[a-zA-Z]+\d*)?))-?(\d)-([^:]+): (.*?)$/", $szLine, $out) ) {
+			$arrArguments[SYSLOG_FACILITY] = rtrim($out[5], "-");
+			$arrArguments[SYSLOG_SEVERITY] = $out[8];
+			$sTS = $out[1] . " " . $out[2] . " " . $out[3];
+			$sDate = strtotime($sTS);
+			$sFT = strftime("%b %d %H:%M:%S %Z", $sDate);
+			$arrArguments[SYSLOG_DATE] = GetEventTime($sFT);
+$			$arrArguments[SYSLOG_DATE] = GetEventTime($sTS);
+			$sIP = gethostbyname($out[4]);
+			$arrArguments[SYSLOG_HOST] = $out[4] . " / " . $sIP;
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[9];
+			$arrArguments[SYSLOG_MESSAGE] = $out[10];
+		}
+
+		else if ( preg_match("/^(\w+)  ?(\d{1,2})\s+([\d:]+)\s+([\w\d\.-]+) ?(.*?) ([A-Za-z]{3,4})?:\s*%(\w+-((\d*[a-zA-Z]+\d*)?))-?(\d)-([^:]+): (.*?)$/", $szLine, $out ) )
+		{
+			$arrArguments[SYSLOG_FACILITY] = rtrim($out[7], "-");
+			$arrArguments[SYSLOG_SEVERITY] = $out[10];
+			$sTS = $out[1] . " " . $out[2] . " " . $out[3] . " " . $out[6];
+			$sDate = strtotime($sTS);
+			$sFT = strftime("%b %d %H:%M:%S %Z", $sDate);
+			$arrArguments[SYSLOG_DATE] = GetEventTime($sFT);
+$			$arrArguments[SYSLOG_DATE] = GetEventTime($sTS);
+			$sIP = gethostbyname($out[4]);
+			$arrArguments[SYSLOG_HOST] = $out[4] . " / " . $sIP;
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[11];
+			$arrArguments[SYSLOG_MESSAGE] = $out[12];
+		}
+		// Sample (Syslog): Mar 10 14:45:39 debandre syslogd 1.4.1#18: restart
+		else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}):(.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
+			$arrArguments[SYSLOG_HOST] = $out[3];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[4];
+			$arrArguments[SYSLOG_MESSAGE] = $out[5];
+		}
+		// Sample (Syslog): Mar 10 14:45:39 debandre syslogd restart
+		else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}) (.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
+			$arrArguments[SYSLOG_HOST] = $out[3];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[4];
+			$arrArguments[SYSLOG_MESSAGE] = $out[5];
+		}
+		// Sample (Syslog): Mar 7 17:18:35 debandre exiting on signal 15
+		else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
+			$arrArguments[SYSLOG_HOST] = $out[3];
+			$arrArguments[SYSLOG_MESSAGE] = $out[4];
+		}
+		// Sample (RSyslog): 2008-03-28T11:07:40+01:00 localhost rger: test 1
+		else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1]);
+			$arrArguments[SYSLOG_HOST] = $out[2];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[3];
+			$arrArguments[SYSLOG_MESSAGE] = $out[4];
+		}
+		// Sample (RSyslog): 2008-03-28T11:07:40.591633+01:00 localhost rger: test 1
+		else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1]);
+			$arrArguments[SYSLOG_HOST] = $out[2];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[3];
+			$arrArguments[SYSLOG_MESSAGE] = $out[4];
+		}
+		// Sample: 2008-03-28T15:17:05.480876+01:00,**NO MATCH**
+		else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}),(.*?)$/", $szLine, $out ) )
+		{
+			// Some kind of debug message or something ...
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1]);
+			$arrArguments[SYSLOG_MESSAGE] = $out[2];
+		}
+		else
+		{
+			if ( isset($arrArguments[SYSLOG_MESSAGE]) && strlen($arrArguments[SYSLOG_MESSAGE]) > 0 ) 
+				OutputDebugMessage("Unparseable syslog msg - '" . $arrArguments[SYSLOG_MESSAGE] . "'", DEBUG_ERROR);
+		}
+
+		// If SyslogTag is set, we check for MessageType!
+		if ( isset($arrArguments[SYSLOG_SYSLOGTAG]) )
+		{
+			if ( strpos($arrArguments[SYSLOG_SYSLOGTAG], "EvntSLog" ) !== false ) 
+				$arrArguments[SYSLOG_MESSAGETYPE] = IUT_NT_EventReport;
+		}
+		
+		// Return success!
+		return SUCCESS;
+	}
+
+
+}
+
+?>

+ 126 - 0
patches/loganalyzer/logstreamlineparsersyslog23.class.php

@@ -0,0 +1,126 @@
+<?php
+/*
+	*********************************************************************
+	* LogAnalyzer - http://loganalyzer.adiscon.com
+	* -----------------------------------------------------------------	*
+	* LogStream Parser is used to split syslog messages into fields		*
+	*																	*
+	* All directives are explained within this file						*
+	*
+	* Copyright (C) 2008-2011 Adiscon GmbH.
+	*
+	* This file is part of LogAnalyzer.
+	*
+	* LogAnalyzer is free software: you can redistribute it and/or modify
+	* it under the terms of the GNU General Public License as published by
+	* the Free Software Foundation, either version 3 of the License, or
+	* (at your option) any later version.
+	*
+	* LogAnalyzer is distributed in the hope that it will be useful,
+	* but WITHOUT ANY WARRANTY; without even the implied warranty of
+	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	* GNU General Public License for more details.
+	*
+	* You should have received a copy of the GNU General Public License
+	* along with LogAnalyzer. If not, see <http://www.gnu.org/licenses/>.
+	*
+	* A copy of the GPL can be found in the file "COPYING" in this
+	* distribution.
+	* 
+	* Adiscon LogAnalyzer is also available under a commercial license.
+	* For details, contact info@adiscon.com or visit
+	* http://loganalyzer.adiscon.com/commercial
+	*********************************************************************
+*/
+
+// --- Avoid directly accessing this file! 
+if ( !defined('IN_PHPLOGCON') )
+{
+	die('Hacking attempt');
+	exit;
+}
+// --- 
+
+// --- Basic Includes
+require_once($gl_root_path . 'classes/enums.class.php');
+require_once($gl_root_path . 'include/constants_errors.php');
+require_once($gl_root_path . 'include/constants_logstream.php');
+// --- 
+
+
+class LogStreamLineParsersyslog23 extends LogStreamLineParser {
+//	protected $_arrProperties = null;
+
+	// Constructor
+	public function LogStreamLineParsersyslog23() {
+		return; // Nothing
+	}
+
+	/**
+	* ParseLine
+	*
+	* @param arrArguments array in&out: properties of interest. There can be no guarantee the logstream can actually deliver them.
+	* @return integer Error stat
+	*/
+	public function ParseLine($szLine, &$arrArguments)
+	{
+		// Set IUT Property first!
+		$arrArguments[SYSLOG_MESSAGETYPE] = IUT_Syslog;
+
+		// Sample: <22>1 2011-03-03T15:27:06+01:00 debian507x64 postfix 2454 - -  daemon started -- version 2.5.5, configuration /etc/postfix
+		// Sample: <46>1 2011-03-03T15:27:05+01:00 debian507x64 rsyslogd - - -  [origin software="rsyslogd" swVersion="4.6.4" x-pid="2344" x-info="http://www.rsyslog.com"] (re)start
+		// Sample (RSyslog): 2008-03-28T11:07:40+01:00 localhost rger: test 1
+		if ( preg_match("/^(\w+)  ?(\d{1,2})\s+([\d:]+)\s+([\d\.]+) [\d\.]+ (\w{3})?\s*:\s*%(\w+-((\d*[a-zA-Z]+\d*)?))-?(\d)-([^:]+): (.*?)$/", $szLine, $out ) )
+		{
+			$arrArguments[SYSLOG_FACILITY] = $out[6];
+			$arrArguments[SYSLOG_SEVERITY] = $out[9];
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[3] . " " . $out[3] . " " . $out[5]);
+			$arrArguments[SYSLOG_HOST] = $out[4];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[10];
+			$arrArguments[SYSLOG_MESSAGE] = $out[11];
+		}
+		else if ( preg_match("/<([0-9]{1,3})>([0-9]) ([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?) (.*?) (.*?) (.*?) (.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_FACILITY] = $out[1] >> 3;
+			$arrArguments[SYSLOG_SEVERITY] = $out[1] & 0x0007;
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[3]);
+			$arrArguments[SYSLOG_HOST] = $out[4];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[5];
+			$arrArguments[SYSLOG_PROCESSID] = $out[6];
+			$arrArguments[SYSLOG_MESSAGE] = $out[9];
+		}
+		// Sample: <22>1 2011-03-03T15:27:06.501740+01:00 debian507x64 postfix 2454 - -  daemon started -- version 2.5.5, configuration /etc/postfix
+		// Sample: <46>1 2011-03-03T15:27:05.366981+01:00 debian507x64 rsyslogd - - -  [origin software="rsyslogd" swVersion="4.6.4" x-pid="2344" x-info="http://www.rsyslog.com"] (re)start
+		else if ( preg_match("/<([0-9]{1,3})>([0-9]) ([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?) (.*?) (.*?) (.*?) (.*?)$/", $szLine, $out ) )
+		{
+			// Copy parsed properties!
+			$arrArguments[SYSLOG_FACILITY] = $out[1] >> 3;
+			$arrArguments[SYSLOG_SEVERITY] = $out[1] & 0x0007;
+			$arrArguments[SYSLOG_DATE] = GetEventTime($out[3]);
+			$arrArguments[SYSLOG_HOST] = $out[4];
+			$arrArguments[SYSLOG_SYSLOGTAG] = $out[5];
+			$arrArguments[SYSLOG_PROCESSID] = $out[6];
+			$arrArguments[SYSLOG_MESSAGE] = $out[9];
+		}
+		else
+		{
+			if ( isset($arrArguments[SYSLOG_MESSAGE]) && strlen($arrArguments[SYSLOG_MESSAGE]) > 0 ) 
+				OutputDebugMessage("Unparseable syslog msg - '" . $arrArguments[SYSLOG_MESSAGE] . "'", DEBUG_ERROR);
+		}
+
+		// If SyslogTag is set, we check for MessageType!
+		if ( isset($arrArguments[SYSLOG_SYSLOGTAG]) )
+		{
+			if ( strpos($arrArguments[SYSLOG_SYSLOGTAG], "EvntSLog" ) !== false ) 
+				$arrArguments[SYSLOG_MESSAGETYPE] = IUT_NT_EventReport;
+		}
+		
+		// Return success!
+		return SUCCESS;
+	}
+
+
+}
+
+?>