summaryrefslogtreecommitdiff
path: root/ncserver/module/interfaces.py
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-11-18 12:50:53 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-11-18 12:50:53 -0600
commitb6098ddf2e634b95f0255fbba78ae047199da4d4 (patch)
tree8c639535d9a9aa221a3fd7888dce9da47c3ec0f0 /ncserver/module/interfaces.py
parent340a6a9c4198ff0d2907768580088fa6486c1a08 (diff)
downloadnetconfapk-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.py60
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):