From c4cdf682ed5c9d5bb2834aa43a51e5e6ab328389 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Thu, 4 May 2023 13:32:30 -0400 Subject: [PATCH] [fix] Fixed multiple wireguard peers bug #253 Closes #253 --- .../openwrt/converters/wireguard_peers.py | 11 +++-- tests/openwrt/test_wireguard.py | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/netjsonconfig/backends/openwrt/converters/wireguard_peers.py b/netjsonconfig/backends/openwrt/converters/wireguard_peers.py index 99b7e201e..edbf52e06 100644 --- a/netjsonconfig/backends/openwrt/converters/wireguard_peers.py +++ b/netjsonconfig/backends/openwrt/converters/wireguard_peers.py @@ -12,12 +12,15 @@ class WireguardPeers(OpenWrtConverter): def to_intermediate_loop(self, block, result, index=None): result.setdefault('network', []) - result['network'].append(self.__intermediate_peer(block)) + result['network'].append(self.__intermediate_peer(block, index)) return result - def __intermediate_peer(self, peer): - interface = peer.pop("interface") - peer.update({'.type': f'wireguard_{interface}', '.name': f'wgpeer_{interface}'}) + def __intermediate_peer(self, peer, index): + interface = peer.pop('interface') + uci_name = f'wgpeer_{interface}' + if index > 1: + uci_name = f'{uci_name}_{index}' + peer.update({'.type': f'wireguard_{interface}', '.name': uci_name}) if not peer.get('endpoint_host') and 'endpoint_port' in peer: del peer['endpoint_port'] return self.sorted_dict(peer) diff --git a/tests/openwrt/test_wireguard.py b/tests/openwrt/test_wireguard.py index a89dc5795..4c1498e40 100644 --- a/tests/openwrt/test_wireguard.py +++ b/tests/openwrt/test_wireguard.py @@ -254,3 +254,50 @@ def test_parse_wireguard_peer(self): } o = OpenWrt(native=native) self.assertEqual(o.config, expected) + + _multiple_peers_netjson = { + "wireguard_peers": [ + { + "interface": "wg0", + "public_key": "rn+isMBpyQ4HX6ZzE709bKnZw5IaLZoIS3hIjmfKCkk=", + "allowed_ips": ["10.0.0.1/32"], + "preshared_key": "oPZmGdHBseaV1TF0julyElNuJyeKs2Eo+o62R/09IB4=", + "persistent_keepalive": 30, + "route_allowed_ips": True, + }, + { + "interface": "wg0", + "public_key": "e8yh3kIrMjLVZPi5DS1BU3j3mWkYWrCXvnLSvNkW7HM=", + "allowed_ips": ["10.0.0.2/32"], + "preshared_key": "oPZmGdHBseaV1TF0julyElNuJyeKs2Eo+o62R/09IB4=", + "persistent_keepalive": 30, + "route_allowed_ips": True, + }, + ] + } + + _multiple_peers_uci = """package network + +config wireguard_wg0 'wgpeer_wg0' + list allowed_ips '10.0.0.1/32' + option persistent_keepalive '30' + option preshared_key 'oPZmGdHBseaV1TF0julyElNuJyeKs2Eo+o62R/09IB4=' + option public_key 'rn+isMBpyQ4HX6ZzE709bKnZw5IaLZoIS3hIjmfKCkk=' + option route_allowed_ips '1' + +config wireguard_wg0 'wgpeer_wg0_2' + list allowed_ips '10.0.0.2/32' + option persistent_keepalive '30' + option preshared_key 'oPZmGdHBseaV1TF0julyElNuJyeKs2Eo+o62R/09IB4=' + option public_key 'e8yh3kIrMjLVZPi5DS1BU3j3mWkYWrCXvnLSvNkW7HM=' + option route_allowed_ips '1' +""" + + def test_render_multiple_wireguard_peers(self): + o = OpenWrt(self._multiple_peers_netjson) + expected = self._tabs(self._multiple_peers_uci) + self.assertEqual(o.render(), expected) + + def test_parse_multiple_wireguard_peers(self): + o = OpenWrt(native=self._multiple_peers_uci) + self.assertEqual(o.config, self._multiple_peers_netjson)