diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/flavor.py | 68 | ||||
| -rw-r--r-- | python/vyos/system/compat.py | 6 | ||||
| -rw-r--r-- | python/vyos/system/grub.py | 12 | ||||
| -rw-r--r-- | python/vyos/system/grub_util.py | 20 | ||||
| -rw-r--r-- | python/vyos/utils/serial.py | 5 |
5 files changed, 101 insertions, 10 deletions
diff --git a/python/vyos/flavor.py b/python/vyos/flavor.py new file mode 100644 index 000000000..46c1775f5 --- /dev/null +++ b/python/vyos/flavor.py @@ -0,0 +1,68 @@ +# Copyright (C) VyOS Inc. +# +# 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/>. + +""" +VyOS flavor data access library. + +VyOS stores its flavor specific data in a JSON file. This module provides a +convenient interface to reading it. + +Example of the version data dict:: + { + 'console_type': 'ttyS0', + 'console_speed': '115200' + } +""" + +import os +import vyos.defaults + +from vyos.utils.file import read_json + +flavor_file = os.path.join(vyos.defaults.directories['data'], 'flavor.json') + +def get_flavor_data(fname=flavor_file): + """ + Get complete flavor data + + Args: + file (str): path to the flavor file + + Returns: + dict: flavor data, if it can not be found and empty dict + + The optional ``file`` argument comes in handy in upgrade scripts + that need to retrieve information from images other than the running image. + It should not be used on a running system since the location of that file + is an implementation detail and may change in the future, while the interface + of this module will stay the same. + """ + return read_json(flavor_file, {}) + +def get_image_serial_console(fname=flavor_file): + """ + Get serial console parameters baked into the image flavor. + + Args: + file (str): path to the flavor file + + Returns: + dict: serial interface data baked into the image flavor. Example: + {"console_type": "ttyS", "console_speed": "115200", "console_num":"0"} + """ + console_type = get_flavor_data(fname=fname).get('console_type', '') + console_num = get_flavor_data(fname=fname).get('console_num', '') + console_speed = get_flavor_data(fname=fname).get('console_speed', '') + return (console_type, console_num, console_speed) diff --git a/python/vyos/system/compat.py b/python/vyos/system/compat.py index 24cad7041..40b38b366 100644 --- a/python/vyos/system/compat.py +++ b/python/vyos/system/compat.py @@ -134,11 +134,15 @@ def parse_entry(entry: tuple) -> dict: entry_dict['bootmode'] = 'pw_reset' else: entry_dict['bootmode'] = 'normal' + (_, _, default_speed) = get_image_serial_console() # find console type and number regex_filter = compile(REGEX_CONSOLE) entry_dict.update(regex_filter.match(entry[1]).groupdict()) + # Set new or default console speed - this line must always be present to + # keep backward compatibility. It is needed to boot into old images and + # use the serial console speed speed = entry_dict.get('console_speed', None) - entry_dict['console_speed'] = speed if speed is not None else '115200' + entry_dict['console_speed'] = speed if speed is not None else default_speed entry_dict['boot_opts'] = sanitize_boot_opts(entry[1]) return entry_dict diff --git a/python/vyos/system/grub.py b/python/vyos/system/grub.py index 50651d20e..1bae0d5fb 100644 --- a/python/vyos/system/grub.py +++ b/python/vyos/system/grub.py @@ -23,6 +23,7 @@ from uuid import uuid5 from uuid import NAMESPACE_URL from uuid import UUID +from vyos.flavor import get_image_serial_console from vyos.system import disk from vyos.template import render from vyos.utils.process import cmd @@ -401,10 +402,13 @@ def set_console_type(console_type: str, root_dir: str = '') -> None: vars_current['console_type'] = str(console_type) vars_write(vars_file, vars_current) -def set_console_speed(console_speed: str, root_dir: str = '') -> None: +def set_serial_console(console_type: str, console_num: str, + console_speed: str, root_dir: str = '') -> None: """Write default console speed to GRUB configuration Args: + console_type (str): console device, e.g. 'ttyS' or 'ttyAMA' + console_num (str): console instance, e.g. '0' console_speed (str): default console speed root_dir (str, optional): an optional path to the root directory. Defaults to empty. @@ -412,9 +416,13 @@ def set_console_speed(console_speed: str, root_dir: str = '') -> None: if not root_dir: root_dir = disk.find_persistence() + (default_type, default_num, default_speed) = get_image_serial_console() + vars_file: str = f'{root_dir}/{CFG_VYOS_VARS}' vars_current: dict[str, str] = vars_read(vars_file) - vars_current['console_speed'] = str(console_speed) + vars_current['console_type'] = console_type if console_type else default_type + vars_current['console_num'] = console_num if console_num else default_num + vars_current['console_speed'] = console_speed if console_speed else default_speed vars_write(vars_file, vars_current) def set_kernel_cmdline_options(cmdline_options: str, version_name: str, diff --git a/python/vyos/system/grub_util.py b/python/vyos/system/grub_util.py index 344569168..edaea8ad3 100644 --- a/python/vyos/system/grub_util.py +++ b/python/vyos/system/grub_util.py @@ -19,7 +19,8 @@ from vyos.system import image from vyos.system import compat @compat.grub_cfg_update -def set_console_speed(console_speed: str, root_dir: str = '') -> None: +def set_serial_console(console_type: str, console_num: str, + console_speed: str, root_dir: str = '') -> None: """Write default console speed to GRUB configuration Args: @@ -30,10 +31,11 @@ def set_console_speed(console_speed: str, root_dir: str = '') -> None: if not root_dir: root_dir = disk.find_persistence() - grub.set_console_speed(console_speed, root_dir) + grub.set_serial_console(console_type, console_num, console_speed, root_dir) @image.if_not_live_boot -def update_console_speed(console_speed: str, root_dir: str = '') -> None: +def update_serial_console(console_type: str, console_num: str, + console_speed: str, root_dir: str = '') -> None: """Update console_speed if different from current value""" if not root_dir: @@ -41,9 +43,15 @@ def update_console_speed(console_speed: str, root_dir: str = '') -> None: vars_file: str = f'{root_dir}/{grub.CFG_VYOS_VARS}' vars_current: dict[str, str] = grub.vars_read(vars_file) - console_speed_current = vars_current.get('console_speed', None) - if console_speed != console_speed_current: - set_console_speed(console_speed, root_dir) + + console_type_current = vars_current.get('console_type') + console_num_current = vars_current.get('console_num') + console_speed_current = vars_current.get('console_speed') + + if console_type != console_type_current or \ + console_num != console_num_current or \ + console_speed != console_speed_current: + set_serial_console(console_type, console_num, console_speed, root_dir) @compat.grub_cfg_update def set_kernel_cmdline_options(cmdline_options: str, version: str = '', diff --git a/python/vyos/utils/serial.py b/python/vyos/utils/serial.py index 5d276fb17..fcb7a21c9 100644 --- a/python/vyos/utils/serial.py +++ b/python/vyos/utils/serial.py @@ -119,7 +119,7 @@ def restart_login_consoles(prompt_user=False, quiet=True, devices: List[str]=[]) return True -def is_tty(name: str) -> bool: +def is_tty(name: str, warning=False) -> bool: """ Check if a given device file (e.g. /dev/ttyS0) is a TTY (teletypewriter) device in Linux """ @@ -130,4 +130,7 @@ def is_tty(name: str) -> bool: fd = f.fileno() # True if filename is a TTY return os.isatty(fd) + elif warning: + from vyos.base import Warning + Warning(f'Device "{name}" does not exist!') return False |
