client/tailscale,cmd/{cli,get-authkey,k8s-operator}: set distinct User-Agents

This helps better distinguish what is generating activity to the
Tailscale public API.

Updates tailscale/corp#23838

Signed-off-by: Percy Wegmann <percy@tailscale.com>
This commit is contained in:
Percy Wegmann 2024-10-11 08:06:53 -05:00 committed by Percy Wegmann
parent 33029d4486
commit f9949cde8b
5 changed files with 14 additions and 7 deletions

View File

@ -51,6 +51,9 @@ type Client struct {
// HTTPClient optionally specifies an alternate HTTP client to use. // HTTPClient optionally specifies an alternate HTTP client to use.
// If nil, http.DefaultClient is used. // If nil, http.DefaultClient is used.
HTTPClient *http.Client HTTPClient *http.Client
// UserAgent optionally specifies an alternate User-Agent header
UserAgent string
} }
func (c *Client) httpClient() *http.Client { func (c *Client) httpClient() *http.Client {
@ -97,8 +100,9 @@ func (c *Client) setAuth(r *http.Request) {
// and can be changed manually by the user. // and can be changed manually by the user.
func NewClient(tailnet string, auth AuthMethod) *Client { func NewClient(tailnet string, auth AuthMethod) *Client {
return &Client{ return &Client{
tailnet: tailnet, tailnet: tailnet,
auth: auth, auth: auth,
UserAgent: "tailscale-client-oss",
} }
} }
@ -110,17 +114,16 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
return nil, errors.New("use of Client without setting I_Acknowledge_This_API_Is_Unstable") return nil, errors.New("use of Client without setting I_Acknowledge_This_API_Is_Unstable")
} }
c.setAuth(req) c.setAuth(req)
if c.UserAgent != "" {
req.Header.Set("User-Agent", c.UserAgent)
}
return c.httpClient().Do(req) return c.httpClient().Do(req)
} }
// sendRequest add the authentication key to the request and sends it. It // sendRequest add the authentication key to the request and sends it. It
// receives the response and reads up to 10MB of it. // receives the response and reads up to 10MB of it.
func (c *Client) sendRequest(req *http.Request) ([]byte, *http.Response, error) { func (c *Client) sendRequest(req *http.Request) ([]byte, *http.Response, error) {
if !I_Acknowledge_This_API_Is_Unstable { resp, err := c.Do(req)
return nil, nil, errors.New("use of Client without setting I_Acknowledge_This_API_Is_Unstable")
}
c.setAuth(req)
resp, err := c.httpClient().Do(req)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
} }

View File

@ -51,6 +51,7 @@ func main() {
ctx := context.Background() ctx := context.Background()
tsClient := tailscale.NewClient("-", nil) tsClient := tailscale.NewClient("-", nil)
tsClient.UserAgent = "tailscale-get-authkey"
tsClient.HTTPClient = credentials.Client(ctx) tsClient.HTTPClient = credentials.Client(ctx)
tsClient.BaseURL = baseURL tsClient.BaseURL = baseURL

View File

@ -143,6 +143,7 @@ func initTSNet(zlog *zap.SugaredLogger) (*tsnet.Server, *tailscale.Client) {
TokenURL: "https://login.tailscale.com/api/v2/oauth/token", TokenURL: "https://login.tailscale.com/api/v2/oauth/token",
} }
tsClient := tailscale.NewClient("-", nil) tsClient := tailscale.NewClient("-", nil)
tsClient.UserAgent = "tailscale-k8s-operator"
tsClient.HTTPClient = credentials.Client(context.Background()) tsClient.HTTPClient = credentials.Client(context.Background())
s := &tsnet.Server{ s := &tsnet.Server{

View File

@ -1152,6 +1152,7 @@ func resolveAuthKey(ctx context.Context, v, tags string) (string, error) {
} }
tsClient := tailscale.NewClient("-", nil) tsClient := tailscale.NewClient("-", nil)
tsClient.UserAgent = "tailscale-cli"
tsClient.HTTPClient = credentials.Client(ctx) tsClient.HTTPClient = credentials.Client(ctx)
tsClient.BaseURL = baseURL tsClient.BaseURL = baseURL

View File

@ -903,6 +903,7 @@ func (s *Server) APIClient() (*tailscale.Client, error) {
} }
c := tailscale.NewClient("-", nil) c := tailscale.NewClient("-", nil)
c.UserAgent = "tailscale-tsnet"
c.HTTPClient = &http.Client{Transport: s.lb.KeyProvingNoiseRoundTripper()} c.HTTPClient = &http.Client{Transport: s.lb.KeyProvingNoiseRoundTripper()}
return c, nil return c, nil
} }