SmartOS/live 660a14c —

Merge previous rfd-0189-console-access history

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_019GjJri3QtFN4DpaQhSo4ZE
DeltaFile
+0-00 files

SmartOS/live 6ac3aa2 — src/vm/node_modules console_broker.js, src/vm/tests test-console-broker.js

Destroy console connections after an ERR reply

A client that never closed its end could keep rejected connections open
without counting against the pending limit.

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_019GjJri3QtFN4DpaQhSo4ZE
DeltaFile
+32-0src/vm/tests/test-console-broker.js
+16-3src/vm/node_modules/console_broker.js
+48-32 files

SmartOS/live 36ad05e — src/vm/sbin vmadmd.js

update comments for Zoneadmd Console Handshake Protocol
DeltaFile
+18-1src/vm/sbin/vmadmd.js
+18-11 files

SmartOS/live fee85e2 — src/vm/man vmadmd.8.md, src/vm/node_modules console_broker.js

Bound console tickets and session lifetime

Stop the listener once no tickets remain, even with unauthenticated
connections open, cap outstanding tickets, and end sessions after 8 hours.

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_019GjJri3QtFN4DpaQhSo4ZE
DeltaFile
+55-1src/vm/tests/test-console-broker.js
+27-6src/vm/node_modules/console_broker.js
+2-2src/vm/man/vmadmd.8.md
+84-93 files

SmartOS/live d97f549 — src/vm/man vmadm.8.md vmadmd.8.md, src/vm/node_modules proptable.js

Replace always-on console proxy with ticketed sessions

vmadm info <uuid> console now issues a single-use ticket instead of
reporting a permanent unauthenticated listener. Tickets and sessions are
revoked for all brands when a VM leaves running.

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_019GjJri3QtFN4DpaQhSo4ZE
DeltaFile
+57-237src/vm/sbin/vmadmd.js
+26-0src/vm/man/vmadmd.8.md
+12-7src/vm/man/vmadm.8.md
+4-4src/vm/node_modules/proptable.js
+99-2484 files

SmartOS/live feb91e5 — src manifest Makefile, src/vm/node_modules console_broker.js

Add ticketed console broker for remote console access

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_019GjJri3QtFN4DpaQhSo4ZE
DeltaFile
+593-0src/vm/node_modules/console_broker.js
+475-0src/vm/tests/test-console-broker.js
+2-0src/Makefile
+1-0src/manifest
+1,071-04 files

SmartOS/live 22b0eef — src/vm/sbin vmadmd.js

Add named constants and improve protocol validation

- Add CONSOLE_HANDSHAKE_TIMEOUT (5000ms) and CONSOLE_LOG_TRUNCATE_LEN (100)
  named constants to replace magic numbers
- Use stricter protocol validation: data.toString().trim() === 'OK'
  instead of indexOf('OK') === 0 for more robust handshake checking

The stricter validation prevents false positives if the response contains
"OK" as a substring of a different message.

Addresses PR review feedback from https://github.com/TritonDataCenter/smartos-live/pull/1159

Co-Authored-By: Claude Opus 4.5 <noreply at anthropic.com>
DeltaFile
+7-3src/vm/sbin/vmadmd.js
+7-31 files

SmartOS/live 9bb17cd — src/vm/sbin vmadmd.js

Fix resource leaks and add handshake timeout in console proxy

Critical fixes for console connection handler:

1. Replace deprecated net.Stream() with new net.Socket()
2. Add cleanup() function with idempotent guard to prevent double-cleanup
3. Add 5-second timeout for zone console handshake
4. Ensure socket.destroy() called on all error paths:
   - Client close
   - Console socket error
   - Client error
   - Handshake timeout
   - Handshake failure
5. Rename 'console' variable to 'consoleSocket' to avoid shadowing global
6. Truncate handshake error messages to prevent log spam

These fixes prevent file descriptor leaks and hanging connections that
could exhaust system resources under error conditions.


    [3 lines not shown]
DeltaFile
+51-14src/vm/sbin/vmadmd.js
+51-141 files

SmartOS/live c34cc8c — src/vm/sbin vmadmd.js

Use zoneadmd console socket instead of /dev/zcons device

The correct console socket for zlogin -C is managed by zoneadmd at
/var/run/zones/<zonename>.console_sock, not the /dev/zcons device.

All brands now use unix sockets:
- KVM: /zones/<uuid>/root/tmp/vm.console (serial console)
- Others: /var/run/zones/<zonename>.console_sock (zoneadmd console)

This allows simple net.Stream() connection for all brands.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+15-59src/vm/sbin/vmadmd.js
+15-591 files

SmartOS/live 6eea141 — src/vm/sbin vmadmd.js

Fix console proxy to use fs streams for device files

Zone console devices (/dev/zcons/*/zoneconsole) are character devices,
not unix sockets. net.connect() fails with ENOTSOCK when trying to
connect to them.

Fix by using different connection methods based on brand:
- KVM: net.Stream().connect() for unix socket
- Others: fs.createReadStream/WriteStream for device file

This allows proper bidirectional data flow for zone console devices.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+43-11src/vm/sbin/vmadmd.js
+43-111 files

SmartOS/live 07e2e36 — src/vm/sbin vmadmd.js

Spawn console proxy for all running VMs at startup

Fix issue where non-KVM/Bhyve VMs (Joyent, LX) were not getting console
proxies spawned at vmadmd startup. Previously only KVM/Bhyve called loadVM()
which spawned the console proxy.

Now all running VMs get console proxies regardless of brand.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+4-0src/vm/sbin/vmadmd.js
+4-01 files

SmartOS/live 23716b5 — src/vm/sbin vmadmd.js

Add console proxy support to vmadmd

Implement TCP proxy for console access across all VM brands:
- KVM: Proxy to unix socket at /tmp/vm.console (serial console)
- Bhyve/Joyent/LX: Proxy to zone console device at /dev/zcons/<zonename>/zoneconsole

Changes:
- Add CONSOLE object to track console proxy state
- Add spawnConsoleProxy() to create TCP listeners for console access
- Add clearConsoleProxy() and reloadConsoleProxy() for lifecycle management
- Add infoConsole() to return console connection details via vm.info()
- Add console proxy spawning alongside VNC/SPICE in VM lifecycle
- Add vm.info() support for joyent, joyent-minimal, and lx brands (console only)

Console proxies are automatically created when VMs start and cleaned up when VMs stop.
Connection details (host, port, type) are available via vm.info(['console']).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+154-0src/vm/sbin/vmadmd.js
+154-01 files

SmartOS/live 02fee4a — src/vm/sbin vmadmd.js

Use socat to proxy zone console devices

fs.createReadStream doesn't work properly with character devices like
/dev/zcons/*/zoneconsole. Use socat instead to handle the device I/O
properly.

For non-KVM brands, spawn socat process per connection to proxy between
TCP socket and zone console device with proper raw/echo settings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+22-10src/vm/sbin/vmadmd.js
+22-101 files

SmartOS/live 60437de — src/vm/node_modules proptable.js

Add console to runtime_info for all VM brands

Add 'console' to runtime_info feature list for all brands to enable
vmadm info queries for console connection details.

Changes:
- KVM: Add 'console' to existing runtime_info array
- Bhyve: Add 'console' to runtime_info array
- Joyent: Add runtime_info: ['console'] (new)
- Joyent-minimal: Add runtime_info: ['console'] (new)
- LX: Add runtime_info: ['console'] (new)

This allows vm.info(['console']) to work for all brands, which is
required by CNAPI console endpoint and vmadmd console proxy.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+6-3src/vm/node_modules/proptable.js
+6-31 files

SmartOS/live 80508ea — src/vm/sbin vmadmd.js

Add zoneadmd console handshake for non-KVM brands

The zoneadmd console_sock requires a protocol handshake before data flows.
Send 'IDENT C 0\n' and wait for 'OK' response before proxying data.

This matches the zlogin -C handshake protocol.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply at anthropic.com>
DeltaFile
+28-3src/vm/sbin/vmadmd.js
+28-31 files

SmartOS/live fa55013 — src/vm/man vmadm.8.md

OS-7351 VM.create should allow disk with image to be grown (doc fixup)

Reviewed by: Carlos Neira <cneira at edgecast.io>
Reviewed by: Toomas Soome <tsoome at edgecast.io>
Approved by: Toomas Soome <tsoome at edgecast.io>
DeltaFile
+9-6src/vm/man/vmadm.8.md
+9-61 files

SmartOS/live 49362d2 — src/vm/man vmadm.8.md

OS-7351 VM.create should allow disk with image to be grown (doc fixup)

vmadm(8) has said since OS-1916 (791d5838, 2013) that disks.*.size is
"not allowed" when a disk includes image_uuid. OS-7351 (466f00ae,
"VM.create should allow disk with image to be grown") changed that in
2018 without updating the man page: vmadm accepts the size, and creates
the disk that size, as long as it is at least the size of the image.

OS-7351's tests show it, in src/vm/tests/test-bhyve-disk-resize.js
(at 54701331): 'boot disk is grown when size > image_size' (line 340)
and 'create fails when size < image_size' (line 361). The code, in
src/vm/node_modules/VM.js (at 54701331):

- Validation rejects a size only when it is smaller than the image's
  (lines 1132-1136: `image.target.size < i.size` adds 'size' to
  bad_values; added by OS-7351).
- createVolume() uses the payload's size when there is one and the
  image's size only otherwise (lines 2418-2422; OS-7352 gave it this
  shape).

    [12 lines not shown]
DeltaFile
+9-6src/vm/man/vmadm.8.md
+9-61 files

SmartOS/live 5470133 — src/lib/sdc config.sh

OS-8766 load_sdc_sysinfo performance improvements

The loop forked a subshell, cut and sed for each line of sysinfo output, now optimized
DeltaFile
+3-4src/lib/sdc/config.sh
+3-41 files

SmartOS/live 7e0ffdc — . Jenkinsfile

This branch should build components from related branches on Jenkins too.

NOTE: THIS CHANGE AND ANY OTHERS IN Jenkinsfile SHOULD NOT GET PUSHED
      INTO `master` WHEN IT IS READY FOR BEING ACTUALLY COMMITTED!
DeltaFile
+1-1Jenkinsfile
+1-11 files

SmartOS/live 2b21ab7 — tools build_live

Merge branch 'master' into OS-8766
DeltaFile
+1-1tools/build_live
+1-11 files

SmartOS/live 000d1e8 — src/lib/sdc config.sh

OS-8766 load_sdc_sysinfo forks cut and sed per line, adding ~850ms to every zone boot

The loop forked a subshell, cut and sed for each line of sysinfo
output, about 71 processes per call. The function runs from the zone
brand statechange hook, so every zone boot paid for it.

Measured on a compute node with an Intel Xeon Gold 6240:

  load_sdc_sysinfo             842 ms -> 33 ms
  statechange hook            1012 ms -> 161 ms
  vmadm start to guest ready  2631 ms -> 1721 ms

Output verified identical under both bash and ksh93: 69 variables,
byte for byte.

load_sdc_bootparams and sdc_bootparams_keys below have the same
pattern and are left alone here; they were not on the path measured.

Co-Authored-By: Claude Opus 5 (1M context) <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsuxyuVvHe6ro76LWLs8GP
DeltaFile
+3-4src/lib/sdc/config.sh
+3-41 files

SmartOS/live 148c368 — tools build_live

Fix gcc14-debug release builds with a bit more space in /. (#1183)

Reviewed by: Toomas Soome <tsoome at edgecast.io>
Reviewed by: Nahum Shalman <nshalman at edgecast.io>
Approved by: Nahum Shalman <nshalman at edgecast.io>
DeltaFile
+1-1tools/build_live
+1-11 files

SmartOS/live 9cf303c — src/lib/sdc config.sh

OS-8766 load_sdc_sysinfo forks cut and sed per line, adding ~850ms to every zone boot

The loop forked a subshell, cut and sed for each line of sysinfo
output, about 71 processes per call. The function runs from the zone
brand statechange hook, so every zone boot paid for it.

Measured on a compute node with an Intel Xeon Gold 6240:

  load_sdc_sysinfo             842 ms -> 33 ms
  statechange hook            1012 ms -> 161 ms
  vmadm start to guest ready  2631 ms -> 1721 ms

Output verified identical under both bash and ksh93: 69 variables,
byte for byte.

load_sdc_bootparams and sdc_bootparams_keys below have the same
pattern and are left alone here; they were not on the path measured.

Co-Authored-By: Claude Opus 5 (1M context) <noreply at anthropic.com>
Claude-Session: https://claude.ai/code/session_012Kn8vg7nnv6i6kYcSaRHty
DeltaFile
+2-3src/lib/sdc/config.sh
+2-31 files

SmartOS/live 064e661 — tools build_live

Fix gcc14-debug release builds with a bit more space in /.
DeltaFile
+1-1tools/build_live
+1-11 files

SmartOS/live 72681e7 — src/smartdc/bin pkgsrc-setup.sh

OS-8759 SmartOS installation needs to pull newer bootstrap tar

Reviewed by: Jonathan Perkin <jperkin at edgecast.io>
Reviewed by: Nahum Shalman <nshalman at edgecast.io>
Approved by: Nahum Shalman <nshalman at edgecast.io>
DeltaFile
+3-2src/smartdc/bin/pkgsrc-setup.sh
+3-21 files

SmartOS/live fd18283 — src/smartdc/bin pkgsrc-setup.sh

OS-8759 SmartOS installation needs to pull newer bootstrap tar
DeltaFile
+3-2src/smartdc/bin/pkgsrc-setup.sh
+3-21 files

SmartOS/live be47cec — tools build_live

Fix gcc14-debug release builds with a bit more space in /usr/.
DeltaFile
+1-1tools/build_live
+1-11 files

SmartOS/live a3782d5 — . Jenkinsfile

OS-8754 let Jenkinsfile skip stages in case of single-stage failure

Reviewed by: Toomas Soome <tsoome at edgecast.io>
Approved by: Toomas Soome <tsoome at edgecast.io>
DeltaFile
+28-1Jenkinsfile
+28-11 files

SmartOS/live e4b5dc2 — . Jenkinsfile

remove typo-ed whitespace
DeltaFile
+1-1Jenkinsfile
+1-11 files

SmartOS/live 4d5b2a2 — . Jenkinsfile

failFast as parameter?
DeltaFile
+1-2Jenkinsfile
+1-21 files