diff options
| -rw-r--r-- | data/templates/grub/grub_common.j2 | 6 | ||||
| -rw-r--r-- | data/templates/grub/grub_compat.j2 | 12 | ||||
| -rw-r--r-- | python/vyos/system/compat.py | 10 | ||||
| -rw-r--r-- | python/vyos/system/grub.py | 17 | ||||
| -rw-r--r-- | python/vyos/system/grub_util.py | 42 | ||||
| -rwxr-xr-x | src/conf_mode/system_console.py | 26 | ||||
| -rw-r--r-- | src/system/grub_update.py | 2 | 
7 files changed, 80 insertions, 35 deletions
| diff --git a/data/templates/grub/grub_common.j2 b/data/templates/grub/grub_common.j2 index 29c2ab879..5e9b95cc0 100644 --- a/data/templates/grub/grub_common.j2 +++ b/data/templates/grub/grub_common.j2 @@ -8,7 +8,11 @@ fi  function setup_serial {      # initialize the first serial port by default      if [ "${console_type}" == "ttyS" ]; then -        serial --unit=${console_num} --speed=${console_speed} +        if [ "${console_num}" == "0" ]; then +          serial --unit=0 --speed=${console_speed} +        else +          serial --unit=${console_num} --speed=115200 +        fi      else          serial --unit=0 --speed=${console_speed}      fi diff --git a/data/templates/grub/grub_compat.j2 b/data/templates/grub/grub_compat.j2 index 887d5d0bd..d1085eec8 100644 --- a/data/templates/grub/grub_compat.j2 +++ b/data/templates/grub/grub_compat.j2 @@ -22,13 +22,13 @@  {%- endmacro %}  {% macro console_opts(type) -%}  {% if type == 'tty' -%} -    console=ttyS0,115200 console=tty0 +    console=ttyS0,{{ console_speed }} console=tty0  {%- elif type == 'ttyS' -%} -    console=tty0 console=ttyS0,115200 +    console=tty0 console=ttyS0,{{ console_speed }}  {%- elif type == 'ttyUSB' -%}      console=tty0 console=ttyUSB0,115200  {%- else -%} -    console=tty0 console=ttyS0,115200 +    console=tty0 console=ttyS0,{{ console_speed }}  {%- endif %}  {%- endmacro %}  {% macro passwd_opts(mode) -%} @@ -39,9 +39,13 @@  set default={{ default }}  set timeout={{ timeout }}  {% if console_type == 'ttyS' %} +{%     if console_num == '0' %} +serial --unit=0 --speed={{ console_speed }} +{%     else %}  serial --unit={{ console_num }} --speed=115200 +{%     endif %}  {% else %} -serial --unit=0 --speed=115200 +serial --unit=0 --speed={{ console_speed }}  {% endif %}  terminal_output --append serial  terminal_input serial console diff --git a/python/vyos/system/compat.py b/python/vyos/system/compat.py index 319c3dabf..436da14e8 100644 --- a/python/vyos/system/compat.py +++ b/python/vyos/system/compat.py @@ -27,7 +27,7 @@ TMPL_GRUB_COMPAT: str = 'grub/grub_compat.j2'  # define regexes and variables  REGEX_VERSION = r'^menuentry "[^\n]*{\n[^}]*\s+linux /boot/(?P<version>\S+)/[^}]*}'  REGEX_MENUENTRY = r'^menuentry "[^\n]*{\n[^}]*\s+linux /boot/(?P<version>\S+)/vmlinuz (?P<options>[^\n]+)\n[^}]*}' -REGEX_CONSOLE = r'^.*console=(?P<console_type>[^\s\d]+)(?P<console_num>[\d]+).*$' +REGEX_CONSOLE = r'^.*console=(?P<console_type>[^\s\d]+)(?P<console_num>[\d]+)(,(?P<console_speed>[\d]+))?.*$'  REGEX_SANIT_CONSOLE = r'\ ?console=[^\s\d]+[\d]+(,\d+)?\ ?'  REGEX_SANIT_INIT = r'\ ?init=\S*\ ?'  REGEX_SANIT_QUIET = r'\ ?quiet\ ?' @@ -131,6 +131,8 @@ def parse_entry(entry: tuple) -> dict:      # find console type and number      regex_filter = compile(REGEX_CONSOLE)      entry_dict.update(regex_filter.match(entry[1]).groupdict()) +    speed = entry_dict.get('console_speed', None) +    entry_dict['console_speed'] = speed if speed is not None else '115200'      entry_dict['boot_opts'] = sanitize_boot_opts(entry[1])      return entry_dict @@ -271,9 +273,11 @@ def grub_cfg_fields(root_dir: str = '') -> dict:          root_dir = disk.find_persistence()      grub_cfg_main = f'{root_dir}/{grub.GRUB_CFG_MAIN}' +    grub_vars = f'{root_dir}/{grub.CFG_VYOS_VARS}' -    fields = {'default': 0, 'timeout': 5} -    # 'default' and 'timeout' from legacy grub.cfg +    fields = grub.vars_read(grub_vars) +    # 'default' and 'timeout' from legacy grub.cfg resets 'default' to +    # index, rather than uuid      fields |= grub.vars_read(grub_cfg_main)      fields['tools_version'] = SYSTEM_CFG_VER diff --git a/python/vyos/system/grub.py b/python/vyos/system/grub.py index a94729964..781962dd0 100644 --- a/python/vyos/system/grub.py +++ b/python/vyos/system/grub.py @@ -354,5 +354,18 @@ 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_raid(root_dir: str = '') -> None: -    pass +def set_console_speed(console_speed: str, root_dir: str = '') -> None: +    """Write default console speed to GRUB configuration + +    Args: +        console_speed (str): default console speed +        root_dir (str, optional): an optional path to the root directory. +        Defaults to empty. +    """ +    if not root_dir: +        root_dir = disk.find_persistence() + +    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_write(vars_file, vars_current) diff --git a/python/vyos/system/grub_util.py b/python/vyos/system/grub_util.py new file mode 100644 index 000000000..9e79d41d4 --- /dev/null +++ b/python/vyos/system/grub_util.py @@ -0,0 +1,42 @@ +# Copyright 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/>. + +from vyos.system import disk, grub, compat + +@compat.grub_cfg_update +def set_console_speed(console_speed: str, root_dir: str = '') -> None: +    """Write default console speed to GRUB configuration + +    Args: +        console_speed (str): default console speed +        root_dir (str, optional): an optional path to the root directory. +        Defaults to empty. +    """ +    if not root_dir: +        root_dir = disk.find_persistence() + +    grub.set_console_speed(console_speed, root_dir) + +def update_console_speed(console_speed: str, root_dir: str = '') -> None: +    """Update console_speed if different from current value""" + +    if not root_dir: +        root_dir = disk.find_persistence() + +    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) diff --git a/src/conf_mode/system_console.py b/src/conf_mode/system_console.py index ebf9a113b..a888b125e 100755 --- a/src/conf_mode/system_console.py +++ b/src/conf_mode/system_console.py @@ -22,6 +22,7 @@ from vyos.config import Config  from vyos.utils.process import call  from vyos.utils.file import read_file  from vyos.utils.file import write_file +from vyos.system import grub_util  from vyos.template import render  from vyos import ConfigError  from vyos import airbag @@ -114,30 +115,7 @@ def generate(console):          return None      speed = console['device']['ttyS0']['speed'] -    grub_config = '/boot/grub/grub.cfg' -    if not os.path.isfile(grub_config): -        return None - -    lines = read_file(grub_config).split('\n') -    p = re.compile(r'^(.* console=ttyS0),[0-9]+(.*)$') -    write = False -    newlines = [] -    for line in lines: -        if line.startswith('serial --unit'): -            newline = f'serial --unit=0 --speed={speed}' -        elif p.match(line): -            newline = '{},{}{}'.format(p.search(line)[1], speed, p.search(line)[2]) -        else: -            newline = line - -        if newline != line: -            write = True - -        newlines.append(newline) -    newlines.append('') - -    if write: -        write_file(grub_config, '\n'.join(newlines)) +    grub_util.update_console_speed(speed)      return None diff --git a/src/system/grub_update.py b/src/system/grub_update.py index 4d5e0b6ae..5a7d8eb72 100644 --- a/src/system/grub_update.py +++ b/src/system/grub_update.py @@ -69,7 +69,7 @@ if __name__ == '__main__':          'bootmode': default_entry['bootmode'],          'console_type': default_entry['console_type'],          'console_num': default_entry['console_num'], -        'console_speed': '115200' +        'console_speed': default_entry['console_speed']      }      vars.update(default_settings) | 
