Skip to content

Commit

Permalink
[changes] Rendered ZeroTier configuration in JSON format
Browse files Browse the repository at this point in the history
  • Loading branch information
Aryamanz29 committed Jun 5, 2023
1 parent 6270334 commit 15ae24e
Show file tree
Hide file tree
Showing 4 changed files with 226 additions and 91 deletions.
21 changes: 0 additions & 21 deletions netjsonconfig/backends/zerotier/converters.py
Expand Up @@ -14,25 +14,4 @@ def to_intermediate_loop(self, block, result, index=None):
return result

def __intermediate_vpn(self, config, remove=[False, 0, '']):
# The Zerotier network configuration keys taken from:
# https://github.com/zerotier/ZeroTierOne/blob/dev/node/NetworkConfig.hpp
config['nwid'] = config.pop('id')
config['t'] = config.pop('objtype')
config['r'] = config.pop('revision')
config['ts'] = config.pop('creationTime')
config['n'] = config.pop('name')
config['p'] = config.pop('private')
config['eb'] = config.pop('enableBroadcast')
config['v4s'] = config.pop('v4AssignMode')
config['v6s'] = config.pop('v6AssignMode')
config['mtu'] = config.pop('mtu')
config['ml'] = config.pop('multicastLimit')
config['I'] = config.pop('ipAssignmentPools')
config['RT'] = config.pop('routes')
config['DNS'] = config.pop('dns')
config['R'] = config.pop('rules')
config['CAP'] = config.pop('capabilities')
config['TAG'] = config.pop('tags')
config['tt'] = config.pop('remoteTraceTarget')
config['tl'] = config.pop('remoteTraceLevel')
return self.sorted_dict(config)
4 changes: 2 additions & 2 deletions netjsonconfig/backends/zerotier/parser.py
Expand Up @@ -2,9 +2,9 @@

from ..base.parser import BaseParser

vpn_pattern = re.compile('^# zerotier config:\s', flags=re.MULTILINE)
vpn_pattern = re.compile('^// zerotier config:\s', flags=re.MULTILINE)
config_pattern = re.compile('^([^\s]*) ?(.*)$')
config_suffix = '.conf'
config_suffix = '.json'


class ZeroTierParser(BaseParser):
Expand Down
15 changes: 2 additions & 13 deletions netjsonconfig/backends/zerotier/templates/zerotier.jinja2
@@ -1,17 +1,6 @@
{% for vpn in data.zerotier %}
# zerotier config: {{ vpn.nwid }}
// zerotier config: {{ vpn.nwid }}

{% for key, value in vpn.items() %}
{% set key = key.replace('_', '-') %}
{% if key != 'name' %}
{% if value is string or value is number %}
{{ key }}={{ value }}
{% elif value is iterable %}
{% for element in value %}
{{ key }}={{ element }}
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
{{ vpn | tojson(indent=2)}}

{% endfor %}
277 changes: 222 additions & 55 deletions tests/zerotier/test_backend.py
Expand Up @@ -14,8 +14,8 @@ class TestBackend(unittest.TestCase):
_TEST_CONFIG = {
"zerotier": [
{
"id": "9536600adf0af076",
"nwid": "9536600adf0af076",
"id": "9536600adf654321",
"nwid": "9536600adf654321",
"objtype": "network",
"revision": 1,
"creationTime": 1632012345,
Expand Down Expand Up @@ -57,7 +57,29 @@ class TestBackend(unittest.TestCase):
"tags": [{"default": 1, "id": 1}],
"remoteTraceTarget": "7f5d90eb87",
"remoteTraceLevel": 1,
}
},
{
"id": "9536600adf654322",
"nwid": "9536600adf654322",
"objtype": "network",
"revision": 1,
"creationTime": 1632012345,
"name": "zerotier-openwisp-network-2",
"private": True,
"enableBroadcast": True,
"v4AssignMode": {"zt": True},
"v6AssignMode": {"6plane": False, "rfc4193": True, "zt": True},
"mtu": 2700,
"multicastLimit": 16,
"routes": [{"target": "10.0.0.0/24", "via": "10.0.0.1"}],
"ipAssignmentPools": [
{"ipRangeStart": "10.0.0.10", "ipRangeEnd": "10.0.0.100"}
],
"dns": {"domain": "zerotier.openwisp.io", "servers": ["10.147.20.3"]},
"tags": [{"default": 1, "id": 1}],
"remoteTraceTarget": "7f5d90eb87",
"remoteTraceLevel": 1,
},
]
}

Expand All @@ -70,71 +92,216 @@ def test_test_schema(self):

def test_confs(self):
c = ZeroTier(self._TEST_CONFIG)
expected = """# zerotier config: 9536600adf0af076
expected = """// zerotier config: 9536600adf654321
{
"capabilities": [
{
"default": true,
"id": 1,
"rules": [
{
"etherType": 2048,
"not": true,
"or": false,
"type": "MATCH_ETHERTYPE"
}
]
}
],
"creationTime": 1632012345,
"dns": {
"domain": "zerotier.openwisp.io",
"servers": [
"10.147.20.3"
]
},
"enableBroadcast": true,
"id": "9536600adf654321",
"ipAssignmentPools": [
{
"ipRangeEnd": "10.0.0.100",
"ipRangeStart": "10.0.0.10"
}
],
"mtu": 2700,
"multicastLimit": 16,
"name": "zerotier-openwisp-network",
"nwid": "9536600adf654321",
"objtype": "network",
"private": true,
"remoteTraceLevel": 1,
"remoteTraceTarget": "7f5d90eb87",
"revision": 1,
"routes": [
{
"target": "10.0.0.0/24",
"via": "10.0.0.1"
}
],
"rules": [
{
"etherType": 2048,
"not": true,
"or": false,
"type": "MATCH_ETHERTYPE"
},
{
"type": "ACTION_DROP"
}
],
"tags": [
{
"default": 1,
"id": 1
}
],
"v4AssignMode": {
"zt": true
},
"v6AssignMode": {
"6plane": false,
"rfc4193": true,
"zt": true
}
}
// zerotier config: 9536600adf654322
CAP={'default': True, 'id': 1, 'rules': [{'etherType': 2048, 'not': True, 'or': False, 'type': 'MATCH_ETHERTYPE'}]}
DNS=domain
DNS=servers
I={'ipRangeStart': '10.0.0.10', 'ipRangeEnd': '10.0.0.100'}
R={'etherType': 2048, 'not': True, 'or': False, 'type': 'MATCH_ETHERTYPE'}
R={'type': 'ACTION_DROP'}
RT={'target': '10.0.0.0/24', 'via': '10.0.0.1'}
TAG={'default': 1, 'id': 1}
eb=True
ml=16
mtu=2700
n=zerotier-openwisp-network
nwid=9536600adf0af076
p=True
r=1
t=network
tl=1
ts=1632012345
tt=7f5d90eb87
v4s=zt
v6s=6plane
v6s=rfc4193
v6s=zt
""" # noqa
{
"creationTime": 1632012345,
"dns": {
"domain": "zerotier.openwisp.io",
"servers": [
"10.147.20.3"
]
},
"enableBroadcast": true,
"id": "9536600adf654322",
"ipAssignmentPools": [
{
"ipRangeEnd": "10.0.0.100",
"ipRangeStart": "10.0.0.10"
}
],
"mtu": 2700,
"multicastLimit": 16,
"name": "zerotier-openwisp-network-2",
"nwid": "9536600adf654322",
"objtype": "network",
"private": true,
"remoteTraceLevel": 1,
"remoteTraceTarget": "7f5d90eb87",
"revision": 1,
"routes": [
{
"target": "10.0.0.0/24",
"via": "10.0.0.1"
}
],
"tags": [
{
"default": 1,
"id": 1
}
],
"v4AssignMode": {
"zt": true
},
"v6AssignMode": {
"6plane": false,
"rfc4193": true,
"zt": true
}
}
"""
self.assertEqual(c.render(), expected)

def test_generate(self):
c = ZeroTier(self._TEST_CONFIG)
expected = """CAP={'default': True, 'id': 1, 'rules': [{'etherType': 2048, 'not': True, 'or': False, 'type': 'MATCH_ETHERTYPE'}]}
DNS=domain
DNS=servers
I={'ipRangeStart': '10.0.0.10', 'ipRangeEnd': '10.0.0.100'}
R={'etherType': 2048, 'not': True, 'or': False, 'type': 'MATCH_ETHERTYPE'}
R={'type': 'ACTION_DROP'}
RT={'target': '10.0.0.0/24', 'via': '10.0.0.1'}
TAG={'default': 1, 'id': 1}
eb=True
ml=16
mtu=2700
n=zerotier-openwisp-network
nwid=9536600adf0af076
p=True
r=1
t=network
tl=1
ts=1632012345
tt=7f5d90eb87
v4s=zt
v6s=6plane
v6s=rfc4193
v6s=zt
""" # noqa
expected = """{
"capabilities": [
{
"default": true,
"id": 1,
"rules": [
{
"etherType": 2048,
"not": true,
"or": false,
"type": "MATCH_ETHERTYPE"
}
]
}
],
"creationTime": 1632012345,
"dns": {
"domain": "zerotier.openwisp.io",
"servers": [
"10.147.20.3"
]
},
"enableBroadcast": true,
"id": "9536600adf654321",
"ipAssignmentPools": [
{
"ipRangeEnd": "10.0.0.100",
"ipRangeStart": "10.0.0.10"
}
],
"mtu": 2700,
"multicastLimit": 16,
"name": "zerotier-openwisp-network",
"nwid": "9536600adf654321",
"objtype": "network",
"private": true,
"remoteTraceLevel": 1,
"remoteTraceTarget": "7f5d90eb87",
"revision": 1,
"routes": [
{
"target": "10.0.0.0/24",
"via": "10.0.0.1"
}
],
"rules": [
{
"etherType": 2048,
"not": true,
"or": false,
"type": "MATCH_ETHERTYPE"
},
{
"type": "ACTION_DROP"
}
],
"tags": [
{
"default": 1,
"id": 1
}
],
"v4AssignMode": {
"zt": true
},
"v6AssignMode": {
"6plane": false,
"rfc4193": true,
"zt": true
}
}
"""
tar = tarfile.open(fileobj=c.generate(), mode="r")
self.assertEqual(len(tar.getmembers()), 1)
vpn = tar.getmember("9536600adf0af076.conf")
self.assertEqual(len(tar.getmembers()), 2)
vpn = tar.getmember("9536600adf654321.json")
contents = tar.extractfile(vpn).read().decode()
self.assertEqual(contents, expected)

def test_auto_client(self):
expected = {
"zerotier": [
{
"id": "9536600adf0af076",
"id": "9536600adf654321",
"name": "zerotier-openwisp-network",
}
]
Expand Down

0 comments on commit 15ae24e

Please sign in to comment.