summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2025-01-19 00:12:03 +0100
committerChristian Breunig <christian@breunig.cc>2025-01-19 00:17:12 +0100
commit20f0deb28d3d88537171f869234520ceb4f67f01 (patch)
treec4ba36e2e5295ec8f158814cef88ea3fb6804180
parente455ac5909456328f62000fa054de2ad7700ff39 (diff)
downloadvyos-1x-20f0deb28d3d88537171f869234520ceb4f67f01.tar.gz
vyos-1x-20f0deb28d3d88537171f869234520ceb4f67f01.zip
wireguard: T4930: use get_config_dict() rather then individual config queries
Extend ConfigTreeQuery().get_config_dict() with arguments to read in default CLI values, too. This removes the need for hardcoded default values at multiple places like: if max_dns_retry is None: max_dns_retry = 3 in this case.
-rw-r--r--python/vyos/configquery.py9
-rw-r--r--python/vyos/ifconfig/wireguard.py73
2 files changed, 32 insertions, 50 deletions
diff --git a/python/vyos/configquery.py b/python/vyos/configquery.py
index 5d6ca9be9..4c4ead0a3 100644
--- a/python/vyos/configquery.py
+++ b/python/vyos/configquery.py
@@ -1,4 +1,4 @@
-# Copyright 2021-2024 VyOS maintainers and contributors <maintainers@vyos.io>
+# Copyright 2021-2025 VyOS maintainers and contributors <maintainers@vyos.io>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -120,11 +120,14 @@ class ConfigTreeQuery(GenericConfigQuery):
def get_config_dict(self, path=[], effective=False, key_mangling=None,
get_first_key=False, no_multi_convert=False,
- no_tag_node_value_mangle=False):
+ no_tag_node_value_mangle=False, with_defaults=False,
+ with_recursive_defaults=False):
return self.config.get_config_dict(path, effective=effective,
key_mangling=key_mangling, get_first_key=get_first_key,
no_multi_convert=no_multi_convert,
- no_tag_node_value_mangle=no_tag_node_value_mangle)
+ no_tag_node_value_mangle=no_tag_node_value_mangle,
+ with_defaults=with_defaults,
+ with_recursive_defaults=with_recursive_defaults)
class VbashOpRun(GenericOpRun):
def __init__(self):
diff --git a/python/vyos/ifconfig/wireguard.py b/python/vyos/ifconfig/wireguard.py
index 9d0bd1a6c..f5217aecb 100644
--- a/python/vyos/ifconfig/wireguard.py
+++ b/python/vyos/ifconfig/wireguard.py
@@ -1,4 +1,4 @@
-# Copyright 2019-2024 VyOS maintainers and contributors <maintainers@vyos.io>
+# Copyright 2019-2025 VyOS maintainers and contributors <maintainers@vyos.io>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -22,6 +22,7 @@ from tempfile import NamedTemporaryFile
from hurry.filesize import size
from hurry.filesize import alternative
+from vyos.configquery import ConfigTreeQuery
from vyos.ifconfig import Interface
from vyos.ifconfig import Operational
from vyos.template import is_ipv6
@@ -181,53 +182,40 @@ class WireGuardOperational(Operational):
return output
def reset_peer(self, peer_name=None, public_key=None):
- from vyos.configquery import ConfigTreeQuery
-
c = ConfigTreeQuery()
-
- max_dns_retry = c.value(
- ['interfaces', 'wireguard', self.ifname, 'max-dns-retry']
- )
- if max_dns_retry is None:
- max_dns_retry = 3
+ tmp = c.get_config_dict(['interfaces', 'wireguard', self.ifname],
+ effective=True, get_first_key=True,
+ key_mangling=('-', '_'), with_defaults=True)
current_peers = self._dump().get(self.ifname, {}).get('peers', {})
- for peer in c.list_nodes(['interfaces', 'wireguard', self.ifname, 'peer']):
- peer_public_key = c.value(
- ['interfaces', 'wireguard', self.ifname, 'peer', peer, 'public-key']
- )
+ for peer, peer_config in tmp['peer'].items():
+ peer_public_key = peer_config['public_key']
if peer_name is None or peer == peer_name or public_key == peer_public_key:
- address = c.value(
- ['interfaces', 'wireguard', self.ifname, 'peer', peer, 'address']
- )
- host_name = c.value(
- ['interfaces', 'wireguard', self.ifname, 'peer', peer, 'host-name']
- )
- port = c.value(
- ['interfaces', 'wireguard', self.ifname, 'peer', peer, 'port']
- )
-
- if (not address and not host_name) or not port:
+ if ('address' not in peer_config and 'host_name' not in peer_config) or 'port' not in peer_config:
if peer_name is not None:
- print(f'Peer {peer_name} endpoint not set')
+ print(f'WireGuard interface "{self.ifname}" peer "{peer_name}" address/host-name unset!')
continue
+ # As we work with an effective config, a port CLI node is always
+ # available when an address/host-name is defined on the CLI
+ port = peer_config['port']
+
# address has higher priority than host-name
- if address:
+ if 'address' in peer_config:
+ address = peer_config['address']
new_endpoint = f'{address}:{port}'
else:
+ host_name = peer_config['host_name']
new_endpoint = f'{host_name}:{port}'
- if c.exists(
- ['interfaces', 'wireguard', self.ifname, 'peer', peer, 'disable']
- ):
+ if 'disable' in peer_config:
+ print(f'WireGuard interface "{self.ifname}" peer "{peer_name}" disabled!')
continue
cmd = f'wg set {self.ifname} peer {peer_public_key} endpoint {new_endpoint}'
try:
- if (
- peer_public_key in current_peers
+ if (peer_public_key in current_peers
and 'endpoint' in current_peers[peer_public_key]
and current_peers[peer_public_key]['endpoint'] is not None
):
@@ -235,14 +223,10 @@ class WireGuardOperational(Operational):
message = f'Resetting {self.ifname} peer {peer_public_key} from {current_endpoint} endpoint to {new_endpoint} ... '
else:
message = f'Resetting {self.ifname} peer {peer_public_key} endpoint to {new_endpoint} ... '
- print(
- message,
- end='',
- )
-
- self._cmd(
- cmd, env={'WG_ENDPOINT_RESOLUTION_RETRIES': str(max_dns_retry)}
- )
+ print(message, end='')
+
+ self._cmd(cmd, env={'WG_ENDPOINT_RESOLUTION_RETRIES':
+ tmp['max_dns_retry']})
print('done')
except:
print(f'Error\nPlease try to run command manually:\n{cmd}\n')
@@ -272,15 +256,12 @@ class WireGuardIf(Interface):
get_config_dict(). It's main intention is to consolidate the scattered
interface setup code and provide a single point of entry when workin
on any interface."""
-
tmp_file = NamedTemporaryFile('w')
tmp_file.write(config['private_key'])
tmp_file.flush()
# Wireguard base command is identical for every peer
- base_cmd = 'wg set ' + config['ifname']
- max_dns_retry = config['max_dns_retry'] if 'max_dns_retry' in config else 3
-
+ base_cmd = f'wg set {self.ifname}'
interface_cmd = base_cmd
if 'port' in config:
interface_cmd += ' listen-port {port}'
@@ -347,10 +328,8 @@ class WireGuardIf(Interface):
elif {'host_name', 'port'} <= set(peer_config):
cmd += ' endpoint {host_name}:{port}'
- self._cmd(
- cmd.format(**peer_config),
- env={'WG_ENDPOINT_RESOLUTION_RETRIES': str(max_dns_retry)},
- )
+ self._cmd(cmd.format(**peer_config), env={
+ 'WG_ENDPOINT_RESOLUTION_RETRIES': config['max_dns_retry']})
except:
# todo: logging
pass