summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2025-07-31 19:18:51 +0300
committerGitHub <noreply@github.com>2025-07-31 19:18:51 +0300
commit8c34aa09954f4b266478d48d8a0256e695f4e666 (patch)
tree84c6314eb18a3a9fc3d6717f29b66df446c1c5c7
parentebd16523072e39848d32e88b13c9b8ff72e86aad (diff)
parentfba27cac855cf196a394ac4bb955f9f7402982cb (diff)
downloadvyos-1x-8c34aa09954f4b266478d48d8a0256e695f4e666.tar.gz
vyos-1x-8c34aa09954f4b266478d48d8a0256e695f4e666.zip
Merge pull request #4638 from c-po/is-a-tty
serial: T7484: treat unavailable serial console devices as non-fatal
-rw-r--r--python/vyos/utils/serial.py13
-rwxr-xr-xsrc/conf_mode/system_console.py9
2 files changed, 20 insertions, 2 deletions
diff --git a/python/vyos/utils/serial.py b/python/vyos/utils/serial.py
index 68aad676e..36b483e91 100644
--- a/python/vyos/utils/serial.py
+++ b/python/vyos/utils/serial.py
@@ -116,3 +116,16 @@ def restart_login_consoles(prompt_user=False, quiet=True, devices: List[str]=[])
cmd(f'systemctl stop {unit_name}')
return True
+
+def is_tty(name: str) -> bool:
+ """ Check if a given device file (e.g. /dev/ttyS0) is a TTY (teletypewriter)
+ device in Linux
+ """
+ import os
+ path_tty = f'/dev/{name}'
+ if os.path.exists(path_tty):
+ with open(path_tty, 'rb') as f:
+ fd = f.fileno()
+ # True if filename is a TTY
+ return os.isatty(fd)
+ return False
diff --git a/src/conf_mode/system_console.py b/src/conf_mode/system_console.py
index 90648e2b8..fe910c1b0 100755
--- a/src/conf_mode/system_console.py
+++ b/src/conf_mode/system_console.py
@@ -17,9 +17,11 @@
import os
from pathlib import Path
+from vyos.base import Warning
from vyos.config import Config
from vyos.utils.process import call
from vyos.utils.serial import restart_login_consoles
+from vyos.utils.serial import is_tty
from vyos.system import grub_util
from vyos.template import render
from vyos import ConfigError
@@ -66,6 +68,8 @@ def verify(console):
# and it can not be used as a serial interface
if not os.path.isdir(by_bus_dir) or not os.path.exists(by_bus_device):
raise ConfigError(f'Device {device} does not support beeing used as tty')
+ if not is_tty(device):
+ Warning(f'Device "{device}" used for console is not a TTY!')
return None
@@ -98,6 +102,9 @@ def generate(console):
raise ConfigError(f'Device {device} does not support beeing used as tty')
for device, device_config in console['device'].items():
+ # Do not render getty configuration if specified device is not a TTY.
+ if not is_tty(device):
+ continue
config_file = base_dir + f'/serial-getty@{device}.service'
Path(f'{base_dir}/getty.target.wants').mkdir(exist_ok=True)
getty_wants_symlink = base_dir + f'/getty.target.wants/serial-getty@{device}.service'
@@ -119,8 +126,6 @@ def generate(console):
def apply(console):
# Reset screen blanking
call('/usr/bin/setterm -blank 0 -powersave off -powerdown 0 -term linux </dev/tty1 >/dev/tty1 2>&1')
- # Reload systemd manager configuration
- call('systemctl daemon-reload')
# Service control moved to vyos.utils.serial to unify checks and prompts.
# If users are connected, we want to show an informational message on completing