diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-02-10 11:48:09 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-10 11:48:09 -0600 |
| commit | 4824a493701180b2d9eb37bce6420cf5ccf602c8 (patch) | |
| tree | 009c8b124bc3851917341098a67edb4ecab3c229 | |
| parent | d9aa7405a3e0259370b86caa7ea704f0022faf32 (diff) | |
| parent | 8262f78e0013291f747203e0b3768bb412bf1aed (diff) | |
| download | vyos-1x-4824a493701180b2d9eb37bce6420cf5ccf602c8.tar.gz vyos-1x-4824a493701180b2d9eb37bce6420cf5ccf602c8.zip | |
Merge pull request #4980 from alexandr-san4ez/T7945-current
update-check: T7945: Improve reliability during early boot and error handling
| -rw-r--r-- | python/vyos/version.py | 12 | ||||
| -rwxr-xr-x | src/conf_mode/system_update-check.py | 17 | ||||
| -rwxr-xr-x | src/system/vyos-system-update-check.py | 2 |
3 files changed, 29 insertions, 2 deletions
diff --git a/python/vyos/version.py b/python/vyos/version.py index 01986e4da..d62778c4b 100644 --- a/python/vyos/version.py +++ b/python/vyos/version.py @@ -34,6 +34,7 @@ import os import requests import vyos.defaults from vyos.system.image import is_live_boot +from urllib3.util import retry from vyos.utils.file import read_file from vyos.utils.file import read_json @@ -124,9 +125,18 @@ def get_remote_version(url): } ] """ + headers = {} + session = requests.Session() + + # By default, `requests` lib. does not retry failed connections + # and this code implements automatic retries using the next wait time range: + # - 0.15, 0.30, 0.60, 1.20 and 2.40 seconds. + for adapter in session.adapters.values(): + adapter.max_retries = retry.Retry(total=5, backoff_factor=0.15) + try: - remote_data = requests.get(url=url, headers=headers) + remote_data = session.get(url=url, headers=headers) remote_data.raise_for_status() if remote_data.status_code != 200: return False diff --git a/src/conf_mode/system_update-check.py b/src/conf_mode/system_update-check.py index 7ed736eac..6a07d93a6 100755 --- a/src/conf_mode/system_update-check.py +++ b/src/conf_mode/system_update-check.py @@ -15,10 +15,12 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import json +import requests from pathlib import Path from sys import exit +from vyos.base import Warning from vyos.config import Config from vyos.utils.process import call from vyos import ConfigError @@ -54,6 +56,21 @@ def verify(config): if 'url' not in config: raise ConfigError('URL is required!') + url = config['url'] + + # Make sure that provided URL is available and responses a valid JSON + # otherwise print warning and display type of error (connection, timeout and etc.) + try: + response = requests.get(url, timeout=10) + response.raise_for_status() + response.json() + except requests.exceptions.RequestException as e: + error_type = type(e).__name__ + Warning( + '"system update-check url" has a valid URL but ' + f'unable to retrieve data from the server: {error_type}' + ) + def generate(config): # bail out early - looks like removal from running config diff --git a/src/system/vyos-system-update-check.py b/src/system/vyos-system-update-check.py index 66a8b0d02..b7d1fc7c5 100755 --- a/src/system/vyos-system-update-check.py +++ b/src/system/vyos-system-update-check.py @@ -60,7 +60,7 @@ if __name__ == '__main__': remote_version = jmespath.search('[0].version', remote_data) if local_version != remote_version and remote_version: call(f'wall -n "Update available: {remote_version} \nUpdate URL: {url}"') - # MOTD used in /run/motd.d/10-update + # MOTD used in /run/motd.d/10-vyos-update motd_file.parent.mkdir(exist_ok=True) motd_file.write_text(f'---\n' f'Current version: {local_version}\n' |
