81 lines
1.9 KiB
Go
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)
|
|
}
|