diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-11-18 12:50:53 -0600 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-11-18 12:50:53 -0600 |
commit | b6098ddf2e634b95f0255fbba78ae047199da4d4 (patch) | |
tree | 8c639535d9a9aa221a3fd7888dce9da47c3ec0f0 /ncserver/module/interfaces.py | |
parent | 340a6a9c4198ff0d2907768580088fa6486c1a08 (diff) | |
download | netconfapk-b6098ddf2e634b95f0255fbba78ae047199da4d4.tar.gz netconfapk-b6098ddf2e634b95f0255fbba78ae047199da4d4.tar.bz2 netconfapk-b6098ddf2e634b95f0255fbba78ae047199da4d4.tar.xz netconfapk-b6098ddf2e634b95f0255fbba78ae047199da4d4.zip |
ncserver: Add draft NMSA mod for ifupdown-ng
Diffstat (limited to 'ncserver/module/interfaces.py')
-rw-r--r-- | ncserver/module/interfaces.py | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/ncserver/module/interfaces.py b/ncserver/module/interfaces.py index b244bfc..959436c 100644 --- a/ncserver/module/interfaces.py +++ b/ncserver/module/interfaces.py @@ -11,12 +11,11 @@ SPDX-License-Identifier: NCSA """ import logging -import os import pathlib import subprocess from lxml import etree -from netconf import error, util +from netconf import util from ncserver.base.util import _, yang_dt_for_timestamp @@ -107,11 +106,8 @@ def running(node): _add_running_contents(ifaces) -def operational(node): - """Retrieve the service state for this device.""" - ifaces = util.subelm(node, 'if:interfaces') - _add_running_contents(ifaces) - +def _add_stats_to(iface, name: str): + """Add the statistics node to +iface+.""" counter_tags = { 'rx.octets': 'if:in-octets', 'rx.discard': 'if:in-discards', @@ -121,6 +117,33 @@ def operational(node): 'tx.errors': 'if:out-errors' } + stats = util.subelm(iface, 'if:statistics') + # XXX BAD vvv + stats.append(util.leaf_elm('if:discontinuity-time', '2020-01-01T01:01:01.011Z')) + # XXX BAD ^^^ + + result = subprocess.run(['/sbin/ifupdown', 'ifctrstat', name], + stdout=subprocess.PIPE, check=False) + if result.returncode != 0: + LOGGER.error(_('ifctrstat failed for %s: %s'), + name, result.returncode) + return + + counters = result.stdout.decode('utf-8').split('\n') + counters.pop() + for counter, value in [data.split(': ') for data in counters]: + if counter not in counter_tags.keys(): + LOGGER.warning(_('unhandled ifctrstat counter for %s: %s'), + name, counter) + continue + stats.append(util.leaf_elm(counter_tags[counter], value)) + + +def operational(node): + """Retrieve the service state for this device.""" + ifaces = util.subelm(node, 'if:interfaces') + _add_running_contents(ifaces) + for iface in ifaces.iterchildren(): name = iface.find('{'+M_NS+'}name').text ifpath = pathlib.Path("/sys/class/net/" + name) @@ -151,7 +174,7 @@ def operational(node): pass # if the interface does not have measurable speed, omit except ValueError: LOGGER.warning("%s has non-integral speed; kernel bug?", name) - + # phys-address if (ifpath / "address").exists(): addr_file = open(ifpath / "address", 'r') @@ -160,26 +183,7 @@ def operational(node): addr_file.close() # statistics - stats = util.subelm(iface, 'if:statistics') - # XXX BAD vvv - stats.append(util.leaf_elm('if:discontinuity-time', '2020-01-01T01:01:01.011Z')) - # XXX BAD ^^^ - - result = subprocess.run(['/sbin/ifupdown', 'ifctrstat', name], - stdout=subprocess.PIPE) - if result.returncode != 0: - LOGGER.error(_('ifctrstat failed for %s: %s'), - name, result.returncode) - continue - - counters = result.stdout.decode('utf-8').split('\n') - counters.pop() - for counter, value in [data.split(': ') for data in counters]: - if counter not in counter_tags.keys(): - LOGGER.warning(_('unhandled ifctrstat counter for %s: %s'), - name, counter) - continue - stats.append(util.leaf_elm(counter_tags[counter], value)) + _add_stats_to(iface, name) def edit(session, rpc, node, def_op): |