diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-11-20 10:54:27 -0600 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-11-20 10:54:27 -0600 |
commit | 0fb6a466f8fd7a292bb840245da1c13ea1cbe836 (patch) | |
tree | 0f90d58c56c776fdd16fcea6ca40dd35e27f09cd /ncserver | |
parent | b3003c63562cc5e45c59ff4278da11815474910f (diff) | |
download | netconfapk-0fb6a466f8fd7a292bb840245da1c13ea1cbe836.tar.gz netconfapk-0fb6a466f8fd7a292bb840245da1c13ea1cbe836.tar.bz2 netconfapk-0fb6a466f8fd7a292bb840245da1c13ea1cbe836.tar.xz netconfapk-0fb6a466f8fd7a292bb840245da1c13ea1cbe836.zip |
NMSA: Add ability to read 'live' values
This allows us to have a true picture of the system for the
operational datastore, separate from the config datastore.
Diffstat (limited to 'ncserver')
-rw-r--r-- | ncserver/module/nms_ifupdownng.py | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/ncserver/module/nms_ifupdownng.py b/ncserver/module/nms_ifupdownng.py index 1b71051..5a06f47 100644 --- a/ncserver/module/nms_ifupdownng.py +++ b/ncserver/module/nms_ifupdownng.py @@ -12,6 +12,7 @@ SPDX-License-Identifier: NCSA import ipaddress import logging +import pathlib import socket import subprocess import yaml @@ -162,6 +163,11 @@ def _remove_one(iface: str, key: str): return +def _iface_path(iface: str) -> pathlib.Path: + """Retrieve the system device path for the specified interface.""" + return pathlib.Path("/sys/class/net/" + iface) + + ############################# # P A R A M E T E R S # ############################# @@ -187,6 +193,16 @@ def get_auto(iface: str, _): return _find_one(iface, 'auto') +def live_enabled(iface: str, _): + """Determine if the interface is enabled or not.""" + statepath = _iface_path(iface) / "operstate" + if statepath.exists(): + with open(statepath, 'r') as state_file: + return state_file.read().strip() == "up" + + return False + + def set_auto(iface: str, _, value: bool): """Set the auto flag for the specified interface.""" _replace_one(iface, 'auto', value) @@ -198,9 +214,9 @@ def unset_auto(iface: str, _): _PARAMETERS = { - # "name": (getter, setter, unsetter) - "description": (get_desc, set_desc, unset_desc), - "enabled": (get_auto, set_auto, unset_auto) + # "name": (getter, live getter, setter, unsetter) + "description": (get_desc, get_desc, set_desc, unset_desc), + "enabled": (get_auto, live_enabled, set_auto, unset_auto) } """Describes all supported parameters and their methods.""" @@ -267,6 +283,27 @@ def get_param(iface: str, parameter: str): return _PARAMETERS[parameter][0](iface, parameter) +def curr_param(iface: str, parameter: str): + """Retrieve the current parameter value for the specified interface.""" + _load_config() + + # XXX how do we want to handle interfaces that are missing from /e/n/i + # but are still present in the system? + if iface not in _CONFIG.keys(): + LOGGER.warning( + _("requested parameter %s for non-existent interface %s"), + parameter, iface + ) + return None + + if parameter not in _PARAMETERS.keys(): + LOGGER.error(_("requested non-existent parameter %s for interface %s"), + parameter, iface) + return None + + return _PARAMETERS[parameter][1](iface, parameter) + + def set_param(iface: str, parameter: str, value): """Set the parameter for the specified interface.""" _load_config() @@ -282,7 +319,7 @@ def set_param(iface: str, parameter: str, value): if iface not in _CONFIG.keys(): _CONFIG[iface] = list() - _PARAMETERS[parameter][1](iface, parameter, value) + _PARAMETERS[parameter][2](iface, parameter, value) def unset_param(iface: str, parameter: str): @@ -303,7 +340,7 @@ def unset_param(iface: str, parameter: str): ) return - _PARAMETERS[parameter][2](iface, parameter) + _PARAMETERS[parameter][3](iface, parameter) def list_addresses(iface: str) -> list: |