Skip to content

Commit 4baf96d

Browse files
author
Ritwick DSouza
committed
[raspbian] Further modified static routes implementation
1 parent 8ad013d commit 4baf96d

3 files changed

Lines changed: 97 additions & 13 deletions

File tree

netjsonconfig/backends/raspbian/converters/interfaces.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ def to_intermediate(self):
2424
new_interface.update({
2525
'address': addresses
2626
})
27+
if routes:
28+
for route in routes:
29+
if ip_network(route.get('next')).version == 4:
30+
route['version'] = 4
31+
destination = IPv4Interface(route['destination']).with_netmask
32+
dest, dest_mask = destination.split('/')
33+
route['dest'] = dest
34+
route['dest_mask'] = dest_mask
35+
del route['destination']
36+
new_interface.update({'route': route})
2737
mac = interface.get('mac', False)
2838
if mac:
2939
new_interface.update({'mac': mac})
@@ -59,15 +69,6 @@ def _get_address(self, interface, routes):
5969
address_mask = str(address.get('address')) + '/' + str(address.get('mask'))
6070
address['netmask'] = IPv4Interface(address_mask).with_netmask.split('/')[1]
6171
del address['mask']
62-
if routes:
63-
for route in routes:
64-
if ip_network(route.get('next')).version == 4:
65-
destination = IPv4Interface(route['destination']).with_netmask
66-
dest, dest_mask = destination.split('/')
67-
route['dest'] = dest
68-
route['dest_mask'] = dest_mask
69-
del route['destination']
70-
address['route'] = route
7172
if address.get('family') == 'ipv6':
7273
address['netmask'] = address['mask']
7374
del address['mask']

netjsonconfig/backends/raspbian/templates/interfaces.jinja2

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
{% if address.get('gateway', None) != None %}
1616
gateway {{ address.get('gateway')}}
1717
{% endif %}
18-
{% if address.get('route') != None %}
19-
{% set route = address.get('route')%}
18+
{% if interface.get('route') != None %}
19+
{% set route = interface.get('route')%}
2020
post-up route add -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
2121
pre-up route del -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
2222
{% endif %}
@@ -34,7 +34,7 @@
3434
address {{ address.get('address') }}
3535
netmask {{ address.get('netmask') }}
3636
{% if address.get('gateway', None) != None %}
37-
gateway {{ address.get('ipv6gateway') }}
37+
gateway {{ address.get('gateway') }}
3838
{% endif %}
3939
{% if interface.get('mtu', None) != None %}
4040
mtu {{ interface.get('mtu') }}
@@ -49,6 +49,11 @@
4949
{% elif address.get('proto') == 'dhcp' %}
5050
{% if address.get('family') == 'ipv4'%}
5151
iface {{ interface.get('ifname') }} inet {{ address.get('proto') }}
52+
{% if interface.get('route') != None %}
53+
{% set route = interface.get('route')%}
54+
post-up route add -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
55+
pre-up route del -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
56+
{% endif %}
5257
{% if interface.get('mtu', None) != None %}
5358
pre-up /sbin/ifconfig $IFACE mtu {{ interface.get('mtu') }}
5459
{% endif %}
@@ -69,8 +74,13 @@
6974
{% else %}
7075

7176
auto {{ interface.get('ifname') }}
72-
{% if interface.get('iftype') == 'wireless' and interface.get('mode') != 'adhoc' %}
77+
{% if interface.get('iftype') in ['ethernet', 'wireless'] and interface.get('mode') != 'adhoc' %}
7378
iface {{ interface.get('ifname') }} inet manual
79+
{% if interface.get('route') != None %}
80+
{% set route = interface.get('route')%}
81+
post-up route add -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
82+
pre-up route del -net {{ route.get('dest') }} netmask {{ route.get('dest_mask') }} gw {{ route.get('next') }}
83+
{% endif %}
7484
{% endif %}
7585
{% if interface.get('iftype') == 'bridge' %}
7686
bridge_ports {{ interface.get('bridge_members')[0] }} {{ interface.get('bridge_members')[1] }}

tests/raspbian/test_routes.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import unittest
2+
3+
from netjsonconfig import Raspbian
4+
from netjsonconfig.utils import _TabsMixin
5+
6+
7+
class TestStaticRouteRenderer(unittest.TestCase, _TabsMixin):
8+
9+
def test_ipv4_manual_route(self):
10+
o = Raspbian({
11+
"interfaces": [
12+
{
13+
"name": "eth0",
14+
"type": "ethernet"
15+
}
16+
],
17+
"routes": [
18+
{
19+
"device": "eth0",
20+
"destination": "192.168.4.1/24",
21+
"next": "192.168.2.2",
22+
"cost": 2,
23+
},
24+
]
25+
})
26+
27+
expected = '''# config: /etc/network/interfaces
28+
29+
auto eth0
30+
iface eth0 inet manual
31+
post-up route add -net 192.168.4.1 netmask 255.255.255.0 gw 192.168.2.2
32+
pre-up route del -net 192.168.4.1 netmask 255.255.255.0 gw 192.168.2.2
33+
34+
'''
35+
self.assertEqual(o.render(), expected)
36+
37+
def test_ipv4_static_route(self):
38+
o = Raspbian({
39+
"interfaces": [
40+
{
41+
"name": "eth0",
42+
"type": "ethernet",
43+
"addresses": [
44+
{
45+
"family": "ipv4",
46+
"proto": "static",
47+
"address": "10.0.0.1",
48+
"mask": 28
49+
}
50+
]
51+
}
52+
],
53+
"routes": [
54+
{
55+
"device": "eth0",
56+
"destination": "192.168.4.1/24",
57+
"next": "192.168.2.2",
58+
"cost": 2,
59+
},
60+
]
61+
})
62+
63+
expected = '''# config: /etc/network/interfaces
64+
65+
auto eth0
66+
iface eth0 inet static
67+
address 10.0.0.1
68+
netmask 255.255.255.240
69+
post-up route add -net 192.168.4.1 netmask 255.255.255.0 gw 192.168.2.2
70+
pre-up route del -net 192.168.4.1 netmask 255.255.255.0 gw 192.168.2.2
71+
72+
'''
73+
self.assertEqual(o.render(), expected)

0 commit comments

Comments
 (0)