Files
tsrun/internal/runtime/proxy/run.go
T
dmgnr 2cfb64b496
Deploy tsrun / deploy (push) Successful in 6m23s
i feel like committing
2026-07-23 02:22:19 +00:00

81 lines
1.9 KiB
Go

package proxy
import (
"context"
"fmt"
"os"
"os/signal"
"path/filepath"
"syscall"
_ "tailscale.com/feature/condregister/oauthkey"
"tailscale.com/tsnet"
base "tsrun/internal/runtime"
"tsrun/internal/vault"
)
func Run(ctx context.Context, payload vault.Payload) error {
return RunWithReporter(ctx, payload, nil)
}
func RunWithReporter(ctx context.Context, payload vault.Payload, report base.Reporter) error {
report.Send(base.Event{Kind: base.EventStage, Mode: "proxy", Message: "starting proxy mode"})
baseDir, err := os.MkdirTemp("", "tsrun-proxy-*")
if err != nil {
return err
}
defer os.RemoveAll(baseDir)
hostname := defaultHostname("tsrun-proxy")
srv := &tsnet.Server{
Hostname: hostname,
Dir: filepath.Join(baseDir, "state"),
Ephemeral: true,
ClientSecret: payload.OAuthClientSecret,
AdvertiseTags: payload.Tags,
}
defer srv.Close()
if _, err := srv.Up(ctx); err != nil {
return err
}
report.Send(base.Event{Kind: base.EventStage, Mode: "proxy", Message: "tailscale connected"})
proxyListener, err := startProxyListener(ctx, srv)
if err != nil {
return err
}
defer proxyListener.closeFn()
if report == nil {
fmt.Printf("proxy mode active\n")
fmt.Printf("%s\n", directRequestHint())
fmt.Printf("Proxy: %s\n", formatProxyURL(proxyListener.addr))
fmt.Printf("Username: tsnet\n")
fmt.Printf("Password: %s\n", proxyListener.proxyCred)
}
report.Send(base.Event{
Kind: base.EventRunning,
Mode: "proxy",
Message: "proxy ready",
Hostname: hostname,
ProxyAddr: proxyListener.addr,
ProxyUser: "tsnet",
ProxyPass: proxyListener.proxyCred,
})
waitCtx, stop := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
defer stop()
<-waitCtx.Done()
return waitCtx.Err()
}
func defaultHostname(prefix string) string {
host, err := os.Hostname()
if err != nil || host == "" {
return prefix
}
return fmt.Sprintf("%s-%s", prefix, host)
}