-
-
Notifications
You must be signed in to change notification settings - Fork 214
/
Copy pathvpn_backends.py
106 lines (84 loc) · 3.62 KB
/
vpn_backends.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from copy import deepcopy
from netjsonconfig import OpenVpn as BaseOpenVpn
from netjsonconfig import VxlanWireguard as BaseVxlanWireguard
from netjsonconfig import Wireguard as BaseWireguard
from netjsonconfig import ZeroTier as BaseZeroTier
from netjsonconfig.backends.vxlan.schema import base_vxlan_properties
# adapt OpenVPN schema in order to limit it to 1 item only
limited_schema = deepcopy(BaseOpenVpn.schema)
limited_schema['properties']['openvpn'].update(
{'additionalItems': False, 'minItems': 1, 'maxItems': 1}
)
# server mode only
limited_schema['properties']['openvpn']['items'].update(
{
'oneOf': [
{'$ref': '#/definitions/server_bridged'},
{'$ref': '#/definitions/server_routed'},
{'$ref': '#/definitions/server_manual'},
]
}
)
limited_schema['required'] = limited_schema.get('required', [])
limited_schema['required'].append('openvpn')
# default values for ca, cert and key
limited_schema['definitions']['tunnel']['properties']['ca']['default'] = 'ca.pem'
limited_schema['definitions']['tunnel']['properties']['cert']['default'] = 'cert.pem'
limited_schema['definitions']['tunnel']['properties']['key']['default'] = 'key.pem'
limited_schema['definitions']['server']['properties']['dh']['default'] = 'dh.pem'
limited_schema['properties']['files']['default'] = [
{'path': 'ca.pem', 'mode': '0644', 'contents': '{{ ca }}'},
{'path': 'cert.pem', 'mode': '0644', 'contents': '{{ cert }}'},
{'path': 'key.pem', 'mode': '0644', 'contents': '{{ key }}'},
{'path': 'dh.pem', 'mode': '0644', 'contents': '{{ dh }}'},
]
class OpenVpn(BaseOpenVpn):
"""
modified OpenVpn backend
its schema is adapted to be used as a VPN Server backend:
* shows server only
* allows only 1 vpn
* adds default values for ca, cert, key and dh
"""
schema = limited_schema
limited_wireguard_schema = deepcopy(BaseWireguard.schema)
wireguard_properties = limited_wireguard_schema['properties']['wireguard']
wireguard_properties.update({'maxItems': 1, 'minItems': 1})
# private key is handled automatically without the need of user input
del wireguard_properties['items']['properties']['private_key']
wireguard_properties['items']['required'].remove('private_key')
class Wireguard(BaseWireguard):
"""
WireGuard
"""
schema = limited_wireguard_schema
limited_vxlan_wireguard_schema = deepcopy(limited_wireguard_schema)
limited_vxlan_properties = deepcopy(base_vxlan_properties)
limited_vxlan_properties['vxlan'].update({'maxItems': 1, 'minItems': 1})
limited_vxlan_wireguard_schema['properties'].update(limited_vxlan_properties)
class VxlanWireguard(BaseVxlanWireguard):
"""
VXLAN over WireGuard
"""
schema = limited_vxlan_wireguard_schema
limited_zerotier_schema = deepcopy(BaseZeroTier.schema)
zerotier_server_properties = limited_zerotier_schema['definitions']['zerotier_server'][
'properties'
]
# these properties handled automatically without the need of user input
del zerotier_server_properties['name']
del zerotier_server_properties['id']
del zerotier_server_properties['nwid']
del zerotier_server_properties['objtype']
del zerotier_server_properties['routes']
del zerotier_server_properties['revision']
del zerotier_server_properties['creationTime']
del zerotier_server_properties['ipAssignmentPools']
limited_zerotier_schema['definitions']['zerotier_server']['required'].remove('name')
zerotier_properties = limited_zerotier_schema['properties']['zerotier']
zerotier_properties.update({'additionalItems': False, 'maxItems': 1, 'minItems': 1})
class ZeroTier(BaseZeroTier):
"""
ZeroTier
"""
schema = limited_zerotier_schema