summaryrefslogtreecommitdiff
path: root/plugins/module_utils
diff options
context:
space:
mode:
authoromnom62 <75066712+omnom62@users.noreply.github.com>2026-08-21 19:22:19 +1000
committerGitHub <noreply@github.com>2026-08-21 12:22:19 +0300
commit7005e961d92af1a999db3796629ad0cc9acfc1b6 (patch)
tree1b09c5aa59a7f0e2b9222a3920103a3723c85dc4 /plugins/module_utils
parent2dfb42aa6f213a353199c77792bbbb82d1e76f38 (diff)
downloadvyos.vyos-7005e961d92af1a999db3796629ad0cc9acfc1b6.tar.gz
vyos.vyos-7005e961d92af1a999db3796629ad0cc9acfc1b6.zip
T8983: vyos logging global module 1.5.0 support (#486)
* T8983: logging_global facts, rm_templates, config updates * T8983: new v150 template and changelog * T8983 UAT for 1.5.0 * T8983: logging_global SIT * T8983: SIT logging_global and doc * T8983: doc updates
Diffstat (limited to 'plugins/module_utils')
-rw-r--r--plugins/module_utils/network/vyos/config/logging_global/logging_global.py67
-rw-r--r--plugins/module_utils/network/vyos/facts/logging_global/logging_global.py20
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/logging_global_15.py241
3 files changed, 310 insertions, 18 deletions
diff --git a/plugins/module_utils/network/vyos/config/logging_global/logging_global.py b/plugins/module_utils/network/vyos/config/logging_global/logging_global.py
index 35a2624a..73828109 100644
--- a/plugins/module_utils/network/vyos/config/logging_global/logging_global.py
+++ b/plugins/module_utils/network/vyos/config/logging_global/logging_global.py
@@ -32,6 +32,13 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.logging_global import (
Logging_globalTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.logging_global_15 import (
+ Logging_globalTemplate15,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import (
+ LooseVersion,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version
class Logging_global(ResourceModule):
@@ -47,22 +54,25 @@ class Logging_global(ResourceModule):
resource="logging_global",
tmplt=Logging_globalTemplate(),
)
- self.parsers = [
- "console.facilities",
- "global_params.archive.file_num",
- "global_params.archive.size",
- "global_params.marker_interval",
- "global_params.preserve_fqdn",
- "global_params.facilities",
- "files.archive.size",
- "files.archive.file_num",
- "files",
- "hosts.port",
- "hosts.facility.protocol", # 1.3 and below
- "hosts.protocol",
- "hosts",
- "users",
- ]
+
+ def _validate_template(self):
+ version = get_os_version(self._module)
+ if LooseVersion(version) >= LooseVersion("1.5"):
+ self._tmplt = Logging_globalTemplate15()
+ else:
+ self._tmplt = Logging_globalTemplate()
+
+ self.parsers = [p["name"] for p in self._tmplt.PARSERS if not p["name"].endswith(".state")]
+
+ def parse(self):
+ """override parse to check template"""
+ self._validate_template()
+ return super().parse()
+
+ def get_parser(self, name):
+ """get_parsers"""
+ self._validate_template()
+ return super().get_parser(name)
def execute_module(self):
"""Execute the module
@@ -70,11 +80,31 @@ class Logging_global(ResourceModule):
:rtype: A dictionary
:returns: The result from module execution
"""
+ self._validate_template()
if self.state not in ["parsed", "gathered"]:
self.generate_commands()
self.run_commands()
return self.result
+ def _strip_unsupported_15(self, data):
+ """Remove 1.4-only keys from a list_to_dict result for 1.5 devices."""
+ if not data:
+ return data
+ warnings = []
+ for key in ("files", "users"):
+ if data.pop(key, None) is not None:
+ warnings.append(
+ "'{0}' is not supported on VyOS 1.5+, ignoring.".format(key),
+ )
+ if "global_params" in data:
+ if data["global_params"].pop("archive", None) is not None:
+ warnings.append(
+ "'global_params.archive' is not supported on VyOS 1.5+, ignoring.",
+ )
+ for warning in warnings:
+ self._module.warn(warning)
+ return data
+
def generate_commands(self):
"""Generate configuration commands to send based on
want, have and desired state.
@@ -88,6 +118,11 @@ class Logging_global(ResourceModule):
else:
haved = dict()
+ version = get_os_version(self._module)
+ if LooseVersion(version) >= LooseVersion("1.5"):
+ wantd = self._strip_unsupported_15(wantd)
+ haved = self._strip_unsupported_15(haved)
+
if self.state in ["overridden", "replaced"]:
if wantd != haved:
wantx, havex = self.call_op(wantd, haved, "overridden")
diff --git a/plugins/module_utils/network/vyos/facts/logging_global/logging_global.py b/plugins/module_utils/network/vyos/facts/logging_global/logging_global.py
index da80d967..0364a656 100644
--- a/plugins/module_utils/network/vyos/facts/logging_global/logging_global.py
+++ b/plugins/module_utils/network/vyos/facts/logging_global/logging_global.py
@@ -23,6 +23,13 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.log
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.logging_global import (
Logging_globalTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.logging_global_15 import (
+ Logging_globalTemplate15,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import (
+ LooseVersion,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version
class Logging_globalFacts(object):
@@ -80,8 +87,17 @@ class Logging_globalFacts(object):
if not data:
data = self.get_logging_data(connection)
- # parse native config using the Logging_global template
- logging_global_parser = Logging_globalTemplate(lines=data.splitlines(), module=self._module)
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.5"):
+ logging_global_parser = Logging_globalTemplate15(
+ lines=data.splitlines(),
+ module=self._module,
+ )
+ else:
+ logging_global_parser = Logging_globalTemplate(
+ lines=data.splitlines(),
+ module=self._module,
+ )
+
objs = logging_global_parser.parse()
ansible_facts["ansible_network_resources"].pop("logging_global", None)
objs = self.process_facts(objs)
diff --git a/plugins/module_utils/network/vyos/rm_templates/logging_global_15.py b/plugins/module_utils/network/vyos/rm_templates/logging_global_15.py
new file mode 100644
index 00000000..3216747d
--- /dev/null
+++ b/plugins/module_utils/network/vyos/rm_templates/logging_global_15.py
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+# Copyright 2021 Red Hat
+# GNU General Public License v3.0+
+# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+
+__metaclass__ = type
+
+import re
+
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import (
+ NetworkTemplate,
+)
+
+
+def tmplt_params(config_data):
+ def templt_common(val, tmplt):
+ if val.get("facility"):
+ tmplt += " facility {facility}".format(facility=val["facility"])
+ if val.get("severity"):
+ tmplt += " level {level}".format(level=val["severity"])
+ return tmplt
+
+ tmplt = ""
+ if config_data.get("global_params"):
+ val = config_data.get("global_params")
+ tmplt += "system syslog local"
+ tmplt = templt_common(val.get("facilities", {}), tmplt)
+ elif config_data.get("console"):
+ val = config_data.get("console")
+ tmplt += "system syslog console"
+ tmplt = templt_common(val.get("facilities", {}), tmplt)
+ elif config_data.get("hosts"):
+ val = config_data.get("hosts")
+ if val.get("hostname") and not val.get("port") and not val.get("protocol"):
+ tmplt += "system syslog remote {hostname}".format(hostname=val["hostname"])
+ if val.get("facilities"):
+ tmplt = templt_common(val.get("facilities"), tmplt)
+ return tmplt
+
+
+class Logging_globalTemplate15(NetworkTemplate):
+ def __init__(self, lines=None, module=None):
+ prefix = {"set": "set", "remove": "delete"}
+ super(Logging_globalTemplate15, self).__init__(
+ lines=lines,
+ tmplt=self,
+ prefix=prefix,
+ module=module,
+ )
+
+ # fmt: off
+ PARSERS = [
+ {
+ "name": "syslog.state",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem
+ (\s(?P<syslog>syslog))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog",
+ "result": {
+ "syslog": {
+ "state": "{{ 'enabled' if syslog is defined else 'disabled' }}",
+ },
+ },
+ },
+ {
+ "name": "console.state",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog
+ (\s(?P<console>console))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog console",
+ "result": {
+ "console": {
+ "state": "{{ 'enabled' if console is defined else 'disabled' }}",
+ },
+ },
+ },
+ {
+ "name": "console.facilities",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\sconsole\sfacility
+ (\s(?P<facility>all|auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local[0-7]))?
+ (\slevel\s(?P<level>'(emerg|alert|crit|err|warning|notice|info|debug|all)'))?
+ $""", re.VERBOSE,
+ ),
+ "setval": tmplt_params,
+ "remval": "system syslog console facility {{ console.facilities.facility }}",
+ "result": {
+ "console": {
+ "facilities": [
+ {
+ "facility": "{{ facility }}",
+ "severity": "{{ level }}",
+ },
+ ],
+ },
+ },
+ },
+ {
+ "name": "global_params.state",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog
+ (\s(?P<local>local))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog local",
+ "result": {
+ "global_params": {
+ "state": "{{ 'enabled' if local is defined else 'disabled' }}",
+ },
+ },
+ },
+ {
+ "name": "global_params.marker_interval",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\smarker\sinterval
+ (\s(?P<marker_interval>'(\d+)'))?
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog marker interval {{ global_params.marker_interval }}",
+ "remval": "system syslog marker",
+ "result": {
+ "global_params": {
+ "marker_interval": "{{ marker_interval }}",
+ },
+ },
+ },
+ {
+ "name": "global_params.preserve_fqdn",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog
+ (\s(?P<preserve_fqdn>preserve-fqdn))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog preserve-fqdn",
+ "result": {
+ "global_params": {
+ "preserve_fqdn": "{{ True if preserve_fqdn is defined }}",
+ },
+ },
+ },
+ {
+ "name": "global_params.facilities",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\slocal\sfacility
+ (\s(?P<facility>all|auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local[0-7]))?
+ (\slevel\s(?P<level>'(emerg|alert|crit|err|warning|notice|info|debug|all)'))?
+ $""", re.VERBOSE,
+ ),
+ "setval": tmplt_params,
+ "remval": "system syslog local facility {{ global_params.facilities.facility }}",
+ "result": {
+ "global_params": {
+ "facilities": [
+ {
+ "facility": "{{ facility }}",
+ "severity": "{{ level }}",
+ },
+ ],
+ },
+ },
+ },
+ {
+ "name": "hosts.port",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\sremote
+ (\s(?P<hostname>\S+))
+ (\sport\s(?P<port>'(\d+)'))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog remote {{ hosts.hostname }} port {{ hosts.port }}",
+ "result": {
+ "hosts": {
+ "{{ hostname }}": {
+ "hostname": "{{ hostname }}",
+ "port": "{{ port }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "hosts.protocol",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\sremote
+ (\s(?P<hostname>\S+))
+ (\sprotocol\s(?P<protocol>'(udp|tcp)'))
+ $""", re.VERBOSE,
+ ),
+ "setval": "system syslog remote {{ hosts.hostname }} protocol {{ hosts.protocol }}",
+ "result": {
+ "hosts": {
+ "{{ hostname }}": {
+ "hostname": "{{ hostname }}",
+ "protocol": "{{ protocol }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "hosts",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\ssyslog\sremote
+ (\s(?P<hostname>\S+))
+ (\sfacility\s(?P<facility>all|auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local[0-7]))
+ (\slevel\s(?P<level>'(emerg|alert|crit|err|warning|notice|info|debug|all)'))?
+ $""", re.VERBOSE,
+ ),
+ "setval": tmplt_params,
+ "remval": "system syslog remote {{ hosts.hostname }}",
+ "result": {
+ "hosts": {
+ "{{ hostname }}": {
+ "hostname": "{{ hostname }}",
+ "facilities": [
+ {
+ "facility": "{{ facility }}",
+ "severity": "{{ level }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ ]
+ # fmt: on