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
|
#!/usr/bin/env python3
# De-nest PPPoE interfaces
# Migrate boolean nodes to valueless
import sys
from vyos.configtree import ConfigTree
def migrate_dialer(config, tree, intf):
for pppoe in config.list_nodes(tree):
# assemble string, 0 -> pppoe0
new_base = ['interfaces', 'pppoe', 'pppoe' + pppoe]
config.set(new_base)
# format as tag node to avoid loading problems
config.set_tag(['interfaces', 'pppoe'])
# We need to assign a real interface to our dialer
config.set(new_base + ['link'], value=intf)
default_route = tree + [pppoe, 'default-route']
if config.exists(default_route):
tmp = config.return_value(default_route)
config.set(new_base + ['default-route'], value=tmp)
disable = tree + [pppoe, 'disable']
if config.exists(disable):
tmp = config.return_value(disable)
config.set(new_base + ['disable'], value=tmp)
mtu = tree + [pppoe, 'mtu']
if config.exists(mtu):
tmp = config.return_value(mtu)
config.set(new_base + ['mtu'], value=tmp)
nameserver = tree + [pppoe, 'name-server']
if config.exists(nameserver):
tmp = config.return_value(nameserver)
config.set(new_base + ['name-server'], value=tmp)
password = tree + [pppoe, 'password']
if config.exists(password):
tmp = config.return_value(password)
config.set(new_base + ['password'], value=tmp)
userid = tree + [pppoe, 'user-id']
if config.exists(userid):
tmp = config.return_value(userid)
config.set(new_base + ['user-id'], value=tmp)
ipv6_enable = tree + [pppoe, 'enable-ipv6']
if config.exists(ipv6_enable):
config.set(new_base + ['ipv6', 'enable'])
ipv6_slaac = tree + [pppoe, 'ipv6', 'address', 'autoconf']
if config.exists(ipv6_slaac):
config.set(new_base + ['ipv6', 'address', 'autoconf'])
# Delete old PPPoE interface
config.delete(tree + [pppoe])
if __name__ == '__main__':
if (len(sys.argv) < 1):
print("Must specify file name!")
exit(1)
file_name = sys.argv[1]
with open(file_name, 'r') as f:
config_file = f.read()
config = ConfigTree(config_file)
pppoe_links = ['bonding', 'ethernet']
for link_type in pppoe_links:
if not config.exists(['interfaces', link_type]):
continue
for interface in config.list_nodes(['interfaces', link_type]):
# check if PPPoE exists
pppoe_if = ['interfaces', link_type, interface, 'pppoe']
if config.exists(pppoe_if):
for dialer in config.list_nodes(pppoe_if):
migrate_dialer(config, pppoe_if, interface)
# also migrate VLANs
if not config.exists(['interfaces', link_type, interface, 'vif']):
continue
for vlan in config.list_nodes(['interfaces', link_type, interface, 'vif']):
pppoe_if = ['interfaces', link_type, interface, 'vif', vlan, 'pppoe']
if config.exists(pppoe_if):
for dialer in config.list_nodes(pppoe_if):
intf = "{}.{}".format(interface, vlan)
migrate_dialer(config, pppoe_if, intf)
try:
with open(file_name, 'w') as f:
f.write(config.to_string())
except OSError as e:
print("Failed to save the modified config: {}".format(e))
sys.exit(1)
|