diff options
author | Christian Poessinger <christian@poessinger.com> | 2022-08-24 19:24:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-24 19:24:23 +0200 |
commit | 04096a1abc98d57b1ee5d6eb8b5904988bee69ff (patch) | |
tree | d7265b1b886345dfc9189b5b7023d8e520c41056 /src/conf_mode/https.py | |
parent | a87e4fcc351295fb27fb781b042fc6f798e5cd0e (diff) | |
parent | ecaafaa26f85ba4ae3f34b5382fe0ebbe38bf13b (diff) | |
download | vyos-1x-04096a1abc98d57b1ee5d6eb8b5904988bee69ff.tar.gz vyos-1x-04096a1abc98d57b1ee5d6eb8b5904988bee69ff.zip |
Merge pull request #1488 from sever-sever/T4597
https: T4597: Verify bind port before apply HTTPS API service
Diffstat (limited to 'src/conf_mode/https.py')
-rwxr-xr-x | src/conf_mode/https.py | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/conf_mode/https.py b/src/conf_mode/https.py index 3057357fc..7cd7ea42e 100755 --- a/src/conf_mode/https.py +++ b/src/conf_mode/https.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# Copyright (C) 2019-2021 VyOS maintainers and contributors +# Copyright (C) 2019-2022 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 @@ -29,6 +29,8 @@ from vyos.pki import wrap_certificate from vyos.pki import wrap_private_key from vyos.template import render from vyos.util import call +from vyos.util import check_port_availability +from vyos.util import is_listen_port_bind_service from vyos.util import write_file from vyos import airbag @@ -107,6 +109,31 @@ def verify(https): raise ConfigError("At least one 'virtual-host <id> server-name' " "matching the 'certbot domain-name' is required.") + server_block_list = [] + + # organize by vhosts + vhost_dict = https.get('virtual-host', {}) + + if not vhost_dict: + # no specified virtual hosts (server blocks); use default + server_block_list.append(default_server_block) + else: + for vhost in list(vhost_dict): + server_block = deepcopy(default_server_block) + data = vhost_dict.get(vhost, {}) + server_block['address'] = data.get('listen-address', '*') + server_block['port'] = data.get('listen-port', '443') + server_block_list.append(server_block) + + for entry in server_block_list: + _address = entry.get('address') + _address = '0.0.0.0' if _address == '*' else _address + _port = entry.get('port') + proto = 'tcp' + if check_port_availability(_address, int(_port), proto) is not True and \ + not is_listen_port_bind_service(int(_port), 'nginx'): + raise ConfigError(f'"{proto}" port "{_port}" is used by another service') + verify_vrf(https) return None |