diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/vpn_ipsec.py | 17 | ||||
| -rwxr-xr-x | src/migration-scripts/ipsec/10-to-11 | 85 | 
2 files changed, 101 insertions, 1 deletions
diff --git a/src/conf_mode/vpn_ipsec.py b/src/conf_mode/vpn_ipsec.py index 3af2af4d9..ce4f13d27 100755 --- a/src/conf_mode/vpn_ipsec.py +++ b/src/conf_mode/vpn_ipsec.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2021-2022 VyOS maintainers and contributors +# Copyright (C) 2021-2023 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -17,6 +17,7 @@  import ipaddress  import os  import re +import jmespath  from sys import exit  from time import sleep @@ -219,6 +220,12 @@ def verify(ipsec):      if not ipsec:          return None +    if 'authentication' in ipsec: +        if 'psk' in ipsec['authentication']: +            for psk, psk_config in ipsec['authentication']['psk'].items(): +                if 'id' not in psk_config or 'secret' not in psk_config: +                    raise ConfigError(f'Authentication psk "{psk}" missing "id" or "secret"') +      if 'interfaces' in ipsec :          for ifname in ipsec['interface']:              verify_interface_exists(ifname) @@ -602,6 +609,14 @@ def generate(ipsec):                      ipsec['site_to_site']['peer'][peer]['tunnel'][tunnel]['passthrough'] = passthrough +        # auth psk <tag> dhcp-interface <xxx> +        if jmespath.search('authentication.psk.*.dhcp_interface', ipsec): +            for psk, psk_config in ipsec['authentication']['psk'].items(): +                if 'dhcp_interface' in psk_config: +                    for iface in psk_config['dhcp_interface']: +                        id = get_dhcp_address(iface) +                        if id: +                            ipsec['authentication']['psk'][psk]['id'].append(id)      render(ipsec_conf, 'ipsec/ipsec.conf.j2', ipsec)      render(ipsec_secrets, 'ipsec/ipsec.secrets.j2', ipsec) diff --git a/src/migration-scripts/ipsec/10-to-11 b/src/migration-scripts/ipsec/10-to-11 new file mode 100755 index 000000000..ec38d0034 --- /dev/null +++ b/src/migration-scripts/ipsec/10-to-11 @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2023 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +import re + +from sys import argv +from sys import exit + +from vyos.configtree import ConfigTree + + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name = argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +base = ['vpn', 'ipsec'] +config = ConfigTree(config_file) + +if not config.exists(base): +    # Nothing to do +    exit(0) + +# PEER changes +if config.exists(base + ['site-to-site', 'peer']): +    for peer in config.list_nodes(base + ['site-to-site', 'peer']): +        peer_base = base + ['site-to-site', 'peer', peer] + +        # replace: 'ipsec site-to-site peer <tag> authentication pre-shared-secret xxx' +        #       => 'ipsec authentication psk <tag> secret xxx' +        if config.exists(peer_base + ['authentication', 'pre-shared-secret']): +            tmp = config.return_value(peer_base + ['authentication', 'pre-shared-secret']) +            config.delete(peer_base + ['authentication', 'pre-shared-secret']) +            config.set(base + ['authentication', 'psk', peer, 'secret'], value=tmp) +            # format as tag node to avoid loading problems +            config.set_tag(base + ['authentication', 'psk']) + +            # Get id's from peers for "ipsec auth psk <tag> id xxx" +            if config.exists(peer_base + ['authentication', 'local-id']): +                local_id = config.return_value(peer_base + ['authentication', 'local-id']) +                config.set(base + ['authentication', 'psk', peer, 'id'], value=local_id, replace=False) +            if config.exists(peer_base + ['authentication', 'remote-id']): +                remote_id = config.return_value(peer_base + ['authentication', 'remote-id']) +                config.set(base + ['authentication', 'psk', peer, 'id'], value=remote_id, replace=False) + +            if config.exists(peer_base + ['local-address']): +                tmp = config.return_value(peer_base + ['local-address']) +                config.set(base + ['authentication', 'psk', peer, 'id'], value=tmp, replace=False) +            if config.exists(peer_base + ['remote-address']): +                tmp = config.return_value(peer_base + ['remote-address']) +                if tmp: +                    for remote_addr in tmp: +                        if remote_addr == 'any': +                            remote_addr = '%any' +                        config.set(base + ['authentication', 'psk', peer, 'id'], value=remote_addr, replace=False) + +            # get DHCP peer interface as psk dhcp-interface +            if config.exists(peer_base + ['dhcp-interface']): +                tmp = config.return_value(peer_base + ['dhcp-interface']) +                config.set(base + ['authentication', 'psk', peer, 'dhcp-interface'], value=tmp) + + +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print(f'Failed to save the modified config: {e}') +    exit(1)  | 
