Wheelhouse docs

The console banner#

/etc/issue is what agetty prints above the login prompt, and on a Wheelhouse box it is rewritten at boot and every 20 seconds afterwards with the URL of the web UI on every address the router has. On a brand new router it also carries the first-boot password.

  Wheelhouse 0.5.1 -- edge  [live image, not installed]
  ==========================================================================
  Web UI:    https://192.0.2.1:8443  (eth1)
             https://[2001:db8::1]:8443  (eth1)
  Sign in:   admin / 3f9c1a72b8e4
             first-boot password; you will be asked to change it
  Console:   vyos / vyos on the live image; the installer sets yours
  Install:   on the first console; elsewhere run: sudo wheelhouse-install
  --------------------------------------------------------------------------
  Built on VyOS 1.5-rolling-202608220006
  Licences and corresponding source: /usr/share/doc/wheelhouse
  ==========================================================================

That is a live boot. On an installed router the same script prints:

  Wheelhouse 0.5.1 -- edge
  ==========================================================================
  Web UI:    https://192.0.2.1:8443  (eth1)
             https://[2001:db8::1]:8443  (eth1)
  Sign in:   with your Wheelhouse admin account
  Console:   wheelhouse, with the password chosen at install
             vyos is kept for recovery
  --------------------------------------------------------------------------
  Built on VyOS 1.5-rolling-202608220006
  Licences and corresponding source: /usr/share/doc/wheelhouse
  ==========================================================================

Every line fits an 80-column console.

Line by line#

LineValueSource
Wheelhouse <version> -- <host>The package version and the host name. [live image, not installed] is appended on a live boot.dpkg-query -W -f='${Version}' wheelhouse-agent; /proc/sys/kernel/hostname
Web UI:https://<address>:<port> for every globally-scoped address, IPv4 first, with the interface in brackets after it. IPv6 literals are bracketed so the port does not read as another hextet.ip -4/ip -6 -o addr show scope global; the port is parsed out of --addr in the unit file, defaulting to 8443
At most five addresses, then and N more address(es), so the login prompt stays on a 25-line console.
waiting for an address on any interface when there are none.
Agent:Printed only when the agent is not active, with the command to look at: journalctl -u wheelhouse-agent.systemctl is-active wheelhouse-agent
Sign in:admin / <password> plus a second line saying it is the first-boot password — only while /config/wheelhouse/initial-password exists. Otherwise with your Wheelhouse admin account.the agent writes that file at bootstrap and removes it when the password is changed
Console:On a live image, vyos / vyos on the live image; the installer sets yours. On an installed system where the configuration has a wheelhouse login user, two lines: wheelhouse, with the password chosen at install and vyos is kept for recovery. On an installed system without it — a box installed by an older installer, or a plain base box carrying only the package — the single line vyos, with the password chosen at install.the live check below; the account is read by scanning /etc/passwd for a wheelhouse user
Install:Live images only: on the first console; elsewhere run: sudo wheelhouse-install.
Built on VyOS <version>The base version, under a rule. Prints as a bare Built on VyOS where the base version cannot be determined.VYOS_VERSION in /etc/os-release; on a plain base box, VERSION_ID when ID=vyos
Licences and corresponding source:/usr/share/doc/wheelhouse on an image, /usr/share/doc/wheelhouse-agent when only the package is installed.whichever directory exists

Live or installed#

boot=live is on an installed system's kernel command line too, so it cannot be the test. The live image is the one with a mounted medium, which is what the base platform's own check looks at:

bash
[ -e /usr/lib/live/mount/medium/live/filesystem.squashfs ] ||
  python3 -c 'from vyos.system import image; raise SystemExit(0 if image.is_live_boot() else 1)'

The cache#

Three of the values cannot change within a boot except through a package upgrade: the agent version, the base version, and the live-or-installed answer. Resolving them costs a dpkg-query and a Python interpreter, so they are cached in /run/wheelhouse/banner-facts, keyed on the mtime of /var/lib/dpkg/status so an in-place upgrade invalidates the cache. /run is a tmpfs, so it dies with the boot.

When it is redrawn#

wheelhouse-console.service writes it at boot, ordered before the getty units by name. wheelhouse-console.timer runs the same script every 20 seconds (OnBootSec=0, OnUnitActiveSec=20s, AccuracySec=5s).

The script writes the file only when the text has changed, and only then considers restarting anything.

When the getty restarts#

agetty reads /etc/issue once, when it opens the terminal, so a banner written afterwards is invisible until somebody presses enter. When the text changes, the script restarts the login prompt on every console where all four of these hold:

  • the unit is one of getty@*.service or serial-getty@*.service, and active;
  • its MainPID really is an agetty (checked through /proc/<pid>/comm), so a console running something else is left alone;
  • not tty1 while /run/wheelhouse-install.lock exists — on a live boot tty1's getty unit is the installer, and restarting it would throw the operator back to the welcome screen;
  • nobody is logged in on that terminal, per who.

The permission rule#

bash
mode=644
[ -n "$initpw" ] && mode=600

/etc/issue is world-readable by convention, but while it carries the first-boot password it is a credential. agetty reads it as root, so 0600 costs nothing and keeps a local account from reading the password off the file. It returns to 0644 as soon as the agent removes initial-password.

Turning it off#

The banner is a service and a timer, so:

bash
sudo systemctl disable --now wheelhouse-console.timer
sudo systemctl disable wheelhouse-console.service

/etc/issue keeps whatever text was last written. VyOS rewrites it from system login banner on the next boot configuration load.

See also#

Updated 2026-09-02 console banner boot