62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
package tsnet
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"tailscale.com/client/tailscale"
|
|
"tailscale.com/tsnet"
|
|
)
|
|
|
|
// Wrapper type so we can add methods to the server.
|
|
type TSAgent struct {
|
|
*tsnet.Server
|
|
Lc *tailscale.LocalClient
|
|
ID string
|
|
Debug bool
|
|
}
|
|
|
|
// Creates a new tsnet agent and returns an instance of the server.
|
|
func NewAgent(hostname, controlURL, authKey string, debug bool) *TSAgent {
|
|
s := &tsnet.Server{
|
|
Hostname: hostname,
|
|
ControlURL: controlURL,
|
|
AuthKey: authKey,
|
|
Logf: func(string, ...interface{}) {}, // Disabled by default
|
|
}
|
|
|
|
if debug {
|
|
s.Logf = log.New(
|
|
os.Stderr,
|
|
fmt.Sprintf("[DBG:%s] ", hostname),
|
|
log.LstdFlags,
|
|
).Printf
|
|
}
|
|
|
|
return &TSAgent{s, nil, "", debug}
|
|
}
|
|
|
|
// Starts the tsnet agent and sets the node ID.
|
|
func (s *TSAgent) StartAndFetchID() {
|
|
// Waits until the agent is up and running.
|
|
status, err := s.Up(context.Background())
|
|
if err != nil {
|
|
log.Fatalf("Failed to start agent: %v", err)
|
|
}
|
|
|
|
s.Lc, err = s.LocalClient()
|
|
if err != nil {
|
|
log.Fatalf("Failed to create local client: %v", err)
|
|
}
|
|
|
|
log.Printf("Agent running with ID: %s", status.Self.PublicKey)
|
|
s.ID = string(status.Self.ID)
|
|
}
|
|
|
|
// Shuts down the tsnet agent.
|
|
func (s *TSAgent) Shutdown() {
|
|
s.Close()
|
|
}
|