summaryrefslogtreecommitdiff
path: root/src/migration-scripts/ipoe-server/1-to-2
blob: 034eacb10ceefc9e97eba49806929a0c29a550bf (plain)
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
# Copyright 2023-2024 VyOS maintainers and contributors <maintainers@vyos.io>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this library.  If not, see <http://www.gnu.org/licenses/>.

# - T4703: merge vlan-id and vlan-range to vlan CLI node
# L2|L3 -> l2|l3
# mac-address -> mac
# network-mode -> mode

# - changed cli of all named pools
# - moved gateway-address from pool to global configuration with / netmask
#   gateway can exist without pool if radius is used
#   and Framed-ip-address is transmited
# - There are several gateway-addresses in ipoe
# - default-pool by migration.
#       1. The first pool that contains next-poll.
#       2. Else, the first pool in the list

from vyos.configtree import ConfigTree

base = ['service', 'ipoe-server']

def migrate(config: ConfigTree) -> None:
    if not config.exists(base):
        return

    if config.exists(base + ['authentication', 'interface']):
        for interface in config.list_nodes(base + ['authentication', 'interface']):
            config.rename(base + ['authentication', 'interface', interface, 'mac-address'], 'mac')

            mac_base = base + ['authentication', 'interface', interface, 'mac']
            for mac in config.list_nodes(mac_base):
                vlan_config = mac_base + [mac, 'vlan-id']
                if config.exists(vlan_config):
                    config.rename(vlan_config, 'vlan')

    for interface in config.list_nodes(base + ['interface']):
        base_path = base + ['interface', interface]
        for vlan in ['vlan-id', 'vlan-range']:
            if config.exists(base_path + [vlan]):
                for tmp in config.return_values(base_path + [vlan]):
                    config.set(base_path + ['vlan'], value=tmp, replace=False)
                config.delete(base_path + [vlan])

        if config.exists(base_path + ['network-mode']):
            tmp = config.return_value(base_path + ['network-mode'])
            config.delete(base_path + ['network-mode'])
            # Change L2|L3 to lower case l2|l3
            config.set(base_path + ['mode'], value=tmp.lower())

    pool_base = base + ['client-ip-pool']
    if config.exists(pool_base):
        default_pool = ''
        gateway = ''

        #named pool migration
        namedpools_base = pool_base + ['name']

        for pool_name in config.list_nodes(namedpools_base):
            pool_path = namedpools_base + [pool_name]
            if config.exists(pool_path + ['subnet']):
                subnet = config.return_value(pool_path + ['subnet'])
                config.set(pool_base + [pool_name, 'range'], value=subnet, replace=False)
                # Get netmask from subnet
                mask = subnet.split("/")[1]
            if config.exists(pool_path + ['next-pool']):
                next_pool = config.return_value(pool_path + ['next-pool'])
                config.set(pool_base + [pool_name, 'next-pool'], value=next_pool)
                if not default_pool:
                    default_pool = pool_name
            if config.exists(pool_path + ['gateway-address']) and mask:
                gateway = f'{config.return_value(pool_path + ["gateway-address"])}/{mask}'
                config.set(base + ['gateway-address'], value=gateway, replace=False)

        if not default_pool and config.list_nodes(namedpools_base):
            default_pool = config.list_nodes(namedpools_base)[0]

        config.delete(namedpools_base)

        if default_pool:
            config.set(base + ['default-pool'], value=default_pool)
        # format as tag node
        config.set_tag(pool_base)