<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tailscale/ssh, branch awly/deadcode-sysresources</title>
<subtitle>The easiest, most secure way to use WireGuard and 2FA</subtitle>
<id>http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-sysresources</id>
<link rel='self' href='http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-sysresources'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/'/>
<updated>2026-04-13T21:18:27Z</updated>
<entry>
<title>ssh/tailssh: speed up SSH integration tests</title>
<updated>2026-04-13T21:18:27Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-05T01:06:55Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=e2fa9ff140b9b1a65b2839cd0235bd506f0c6fc3'/>
<id>urn:sha1:e2fa9ff140b9b1a65b2839cd0235bd506f0c6fc3</id>
<content type='text'>
Parallelize the SSH integration tests across OS targets and reduce
per-container overhead:

- CI: use GitHub Actions matrix strategy to run all 4 OS containers
  (ubuntu:focal, ubuntu:jammy, ubuntu:noble, alpine:latest) in parallel
  instead of sequentially (~4x wall-clock improvement)

- Makefile: run docker builds in parallel for local dev too

- Dockerfile: consolidate ~20 separate RUN commands into 5 (one per
  test phase), eliminating Docker layer overhead. Combine test binary
  invocations where no state mutation is needed between them. Fix a bug
  where TestDoDropPrivileges was silently not being run (was passed as a
  second positional arg to -test.run instead of using regex alternation).

- TestMain: replace tail -F + 2s sleep with synchronous log read,
  eliminating 2s overhead per test binary invocation. Set debugTest once
  in TestMain instead of redundantly in each test function.

- session.read(): close channel on EOF so non-shell tests return
  immediately instead of waiting for the 1s silence timeout.

Updates #19244

Change-Id: I2cc8588964fbce0dd7b654fb94e7ff33440b8584
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ssh/tailssh: gofmt</title>
<updated>2026-04-13T18:09:13Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-13T17:56:01Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=aa9a76cf302172bedb951a17907e945cb51d5371'/>
<id>urn:sha1:aa9a76cf302172bedb951a17907e945cb51d5371</id>
<content type='text'>
I'm not sure how this file got into the repo without gofmt.

Maybe gofmt rules changed in some Go release?

Updates #cleanup

Change-Id: Ia8bd46e29f116f7fbfca11be80c8ef48699cd9f2
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>.github, tool/listpkgs: automatically find tests which use tstest.RequireRoot</title>
<updated>2026-04-10T23:22:05Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-10T21:30:27Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=cf59a6fb237b153521a00977208e1fc0c895b867'/>
<id>urn:sha1:cf59a6fb237b153521a00977208e1fc0c895b867</id>
<content type='text'>
Updates tailscale/corp#40007

Change-Id: I677d3d9e276cb6633a14ac07e4b58ea08e52fac4
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>tstest: add RequireRoot helper</title>
<updated>2026-04-10T17:48:50Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-10T14:35:50Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=5e81840b57d0a72b50f4d1d9dec1141971335ce9'/>
<id>urn:sha1:5e81840b57d0a72b50f4d1d9dec1141971335ce9</id>
<content type='text'>
Start using a common helper for tests to declare that they require root.

This is step 1. A later step will then make this helper track which tests were
skipped so a subsequent pass will run these test as root.

Updates tailscale/corp#40007

Change-Id: I4979e1def0fa3691d38c83f48c89aaa443e7f62e
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ssh/tailssh: fix default PATH for Debian</title>
<updated>2026-04-09T15:57:40Z</updated>
<author>
<name>Andrew Dunham</name>
<email>andrew@tailscale.com</email>
</author>
<published>2026-04-07T18:02:56Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=27e6fed0c17902d1250cea4c44d7884a2a1ed41e'/>
<id>urn:sha1:27e6fed0c17902d1250cea4c44d7884a2a1ed41e</id>
<content type='text'>
Validated against a modern Debian install, fixes a typo.

Updates #cleanup

Signed-off-by: Andrew Dunham &lt;andrew@du.nham.ca&gt;
Change-Id: I7b26012f54dbd2f0f9fea98722e8edc2fe97645a
</content>
</entry>
<entry>
<title>ssh/tailssh: fix race in session termination message delivery</title>
<updated>2026-04-07T12:31:16Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-05T13:47:51Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=2b1cfa7c4d55a438062cef08ae5f85e0ffad5305'/>
<id>urn:sha1:2b1cfa7c4d55a438062cef08ae5f85e0ffad5305</id>
<content type='text'>
When a recording upload fails mid-session, the recording goroutine
cancels the session context. This triggers two concurrent paths:
exec.CommandContext kills the process (causing cmd.Wait to return),
and killProcessOnContextDone tries to write the termination message
via exitOnce.Do. If cmd.Wait returns first, the main goroutine's
exitOnce.Do(func(){}) steals the once, and the termination message
is never written to the client.

Fix by waiting for killProcessOnContextDone to finish writing the
termination message (via &lt;-ss.exitHandled) before claiming exitOnce,
when the context is already done.

Also fix the fallback path when launchProcess itself fails due to
context cancellation: use SSHTerminationMessage() with the correct
"\r\n\r\n" framing instead of fmt.Fprintf with the internal error
string.

Deflakes TestSSHRecordingCancelsSessionsOnUploadFailure, which was
failing consistently at a low rate due to the exitOnce race. After
this fix, flakestress passes with 8,668 runs, 0 failures.

Fixes #7707 (again. hopefully for good.)

Change-Id: I5ab911c71574db8d3f9d979fb839f273be51ecf9
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ssh: replace tempfork with tailscale/gliderssh</title>
<updated>2026-04-07T10:59:38Z</updated>
<author>
<name>Kristoffer Dalby</name>
<email>kristoffer@tailscale.com</email>
</author>
<published>2026-03-16T11:04:59Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=dd3b613787f055665b1b60a51567d0f460dd3f2e'/>
<id>urn:sha1:dd3b613787f055665b1b60a51567d0f460dd3f2e</id>
<content type='text'>
Brings in a newer version of Gliderlabs SSH with added socket forwarding support.

Fixes #12409
Fixes #5295

Signed-off-by: Kristoffer Dalby &lt;kristoffer@tailscale.com&gt;
</content>
</entry>
<entry>
<title>tempfork/gliderlabs/ssh: remove tempfork</title>
<updated>2026-04-07T10:59:38Z</updated>
<author>
<name>Kristoffer Dalby</name>
<email>kristoffer@tailscale.com</email>
</author>
<published>2026-03-09T10:24:49Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=82fa218c4a177e6075c9edebe72f48d51120bd1f'/>
<id>urn:sha1:82fa218c4a177e6075c9edebe72f48d51120bd1f</id>
<content type='text'>
Updates #12409
Updates #5295

Signed-off-by: Kristoffer Dalby &lt;kristoffer@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ssh/tailssh: fix integration test hang due to missing host keys</title>
<updated>2026-04-06T16:29:31Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-05T03:15:20Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=4111d4be4b51041191547ad0b8631e3f5e83ac1f'/>
<id>urn:sha1:4111d4be4b51041191547ad0b8631e3f5e83ac1f</id>
<content type='text'>
Commit f905871fb moved host key generation from the ipnLocalBackend
interface (GetSSH_HostKeys) to the standalone getHostKeys function,
which requires either system host keys in /etc/ssh/ or a valid
TailscaleVarRoot to generate keys into. The testBackend returned ""
for TailscaleVarRoot, and the Docker test containers only install
openssh-client (no server host keys), so getHostKeys always failed.

When getHostKeys fails, HandleSSHConn returns the error but never
closes the TCP connection, so SSH clients hang forever waiting for
the server hello.

Fix by creating a temp directory in TestMain and returning it from
testBackend.TailscaleVarRoot().

Regression from f905871fb #18949 ("ipn/ipnlocal, feature/ssh: move SSH code
out of LocalBackend to feature").

I was apparently too impatient to wait for the test to complete
and didn't connect the dots: https://github.com/tailscale/tailscale/actions/runs/22930275950

We should make that test faster (#19244) for the patience issue, but
also fail more nicely if this happens in the future.

Updates #19244

Change-Id: If82393b8f35413b04174e6f7d09a1ee3a2125a6b
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>cmd/vet: add subtestnames analyzer; fix all existing violations</title>
<updated>2026-04-05T22:52:51Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-04T21:32:14Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=5ef3713c9fb0896fee566918d9f5f932c66086d9'/>
<id>urn:sha1:5ef3713c9fb0896fee566918d9f5f932c66086d9</id>
<content type='text'>
Add a new vet analyzer that checks t.Run subtest names don't contain
characters requiring quoting when re-running via "go test -run". This
enforces the style guide rule: don't use spaces or punctuation in
subtest names.

The analyzer flags:
- Direct t.Run calls with string literal names containing spaces,
  regex metacharacters, quotes, or other problematic characters
- Table-driven t.Run(tt.name, ...) calls where tt ranges over a
  slice/map literal with bad name field values

Also fix all 978 existing violations across 81 test files, replacing
spaces with hyphens and shortening long sentence-like names to concise
hyphenated forms.

Updates #19242

Change-Id: Ib0ad96a111bd8e764582d1d4902fe2599454ab65
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
</feed>
