feat: generate User-Agent for DNS API clients (#2293)
This commit is contained in:
parent
a6654a99c1
commit
e67b8ea21b
18 changed files with 288 additions and 172 deletions
8
Makefile
8
Makefile
|
@ -39,16 +39,16 @@ checks:
|
||||||
.PHONY: patch minor major detach
|
.PHONY: patch minor major detach
|
||||||
|
|
||||||
patch:
|
patch:
|
||||||
go run internal/release.go release -m patch
|
go run ./internal/useragent/ release -m patch
|
||||||
|
|
||||||
minor:
|
minor:
|
||||||
go run internal/release.go release -m minor
|
go run ./internal/useragent/ release -m minor
|
||||||
|
|
||||||
major:
|
major:
|
||||||
go run internal/release.go release -m major
|
go run ./internal/useragent/ release -m major
|
||||||
|
|
||||||
detach:
|
detach:
|
||||||
go run internal/release.go detach
|
go run ./internal/useragent/ detach
|
||||||
|
|
||||||
# Docs
|
# Docs
|
||||||
.PHONY: docs-build docs-serve docs-themes
|
.PHONY: docs-build docs-serve docs-themes
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package sender
|
// Code generated by 'internal/useragent'; DO NOT EDIT.
|
||||||
|
|
||||||
// CODE GENERATED AUTOMATICALLY
|
package sender
|
||||||
// THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// ourUserAgent is the User-Agent of this underlying library package.
|
// ourUserAgent is the User-Agent of this underlying library package.
|
||||||
|
|
36
internal/useragent/data_dns.go
Normal file
36
internal/useragent/data_dns.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
const dnsBaseUserAgent = "goacme-lego/"
|
||||||
|
|
||||||
|
const dnsSourceFile = "./providers/dns/internal/useragent/useragent.go"
|
||||||
|
|
||||||
|
const dnsTemplate = `// Code generated by 'internal/useragent'; DO NOT EDIT.
|
||||||
|
|
||||||
|
package useragent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ourUserAgent is the User-Agent of this underlying library package.
|
||||||
|
ourUserAgent = "goacme-lego/{{ .version }}"
|
||||||
|
|
||||||
|
// ourUserAgentComment is part of the UA comment linked to the version status of this underlying library package.
|
||||||
|
// values: detach|release
|
||||||
|
// NOTE: Update this with each tagged release.
|
||||||
|
ourUserAgentComment = "{{ .comment }}"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get builds and returns the User-Agent string.
|
||||||
|
func Get() string {
|
||||||
|
return fmt.Sprintf("%s (%s; %s; %s)", ourUserAgent, ourUserAgentComment, runtime.GOOS, runtime.GOARCH)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHeader sets the User-Agent header.
|
||||||
|
func SetHeader(h http.Header) {
|
||||||
|
h.Set("User-Agent", Get())
|
||||||
|
}
|
||||||
|
`
|
21
internal/useragent/data_sender.go
Normal file
21
internal/useragent/data_sender.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
const senderBaseUserAgent = "xenolf-acme/"
|
||||||
|
|
||||||
|
const senderSourceFile = "./acme/api/internal/sender/useragent.go"
|
||||||
|
|
||||||
|
const senderTemplate = `// Code generated by 'internal/useragent'; DO NOT EDIT.
|
||||||
|
|
||||||
|
package sender
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ourUserAgent is the User-Agent of this underlying library package.
|
||||||
|
ourUserAgent = "xenolf-acme/{{ .version }}"
|
||||||
|
|
||||||
|
// ourUserAgentComment is part of the UA comment linked to the version status of this underlying library package.
|
||||||
|
// values: detach|release
|
||||||
|
// NOTE: Update this with each tagged release.
|
||||||
|
ourUserAgentComment = "{{ .comment }}"
|
||||||
|
)
|
||||||
|
|
||||||
|
`
|
|
@ -7,107 +7,123 @@ import (
|
||||||
"go/format"
|
"go/format"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const sourceFile = "./acme/api/internal/sender/useragent.go"
|
type Generator struct {
|
||||||
|
baseUserAgent string
|
||||||
const uaTemplate = `package sender
|
template string
|
||||||
|
sourcePath string
|
||||||
// CODE GENERATED AUTOMATICALLY
|
|
||||||
// THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ourUserAgent is the User-Agent of this underlying library package.
|
|
||||||
ourUserAgent = "xenolf-acme/{{ .version }}"
|
|
||||||
|
|
||||||
// ourUserAgentComment is part of the UA comment linked to the version status of this underlying library package.
|
|
||||||
// values: detach|release
|
|
||||||
// NOTE: Update this with each tagged release.
|
|
||||||
ourUserAgentComment = "{{ .comment }}"
|
|
||||||
)
|
|
||||||
|
|
||||||
`
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "lego-releaser"
|
|
||||||
app.Usage = "Lego releaser"
|
|
||||||
app.HelpName = "releaser"
|
|
||||||
app.Commands = []*cli.Command{
|
|
||||||
{
|
|
||||||
Name: "release",
|
|
||||||
Usage: "Update file for a release",
|
|
||||||
Action: release,
|
|
||||||
Before: func(ctx *cli.Context) error {
|
|
||||||
mode := ctx.String("mode")
|
|
||||||
switch mode {
|
|
||||||
case "patch", "minor", "major":
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("invalid mode: %s", mode)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "mode",
|
|
||||||
Aliases: []string{"m"},
|
|
||||||
Value: "patch",
|
|
||||||
Usage: "The release mode: patch|minor|major",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "detach",
|
|
||||||
Usage: "Update file post release",
|
|
||||||
Action: detach,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func release(ctx *cli.Context) error {
|
func NewGenerator(baseUserAgent string, tmpl string, sourcePath string) *Generator {
|
||||||
mode := ctx.String("mode")
|
return &Generator{baseUserAgent: baseUserAgent, template: tmpl, sourcePath: sourcePath}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Generator) Release(mode string) error {
|
||||||
// Read file
|
// Read file
|
||||||
data, err := readUserAgentFile(sourceFile)
|
data, err := readUserAgentFile(g.sourcePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bump version
|
// Bump version
|
||||||
newVersion, err := bumpVersion(data["ourUserAgent"], mode)
|
newVersion, err := g.bumpVersion(data["ourUserAgent"], mode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write file
|
// Write file
|
||||||
comment := "release" // detach|release
|
comment := "release" // detach|release
|
||||||
return writeUserAgentFile(sourceFile, newVersion, comment)
|
|
||||||
|
return g.writeUserAgentFile(g.sourcePath, newVersion, comment)
|
||||||
}
|
}
|
||||||
|
|
||||||
func detach(_ *cli.Context) error {
|
func (g *Generator) Detach() error {
|
||||||
// Read file
|
// Read file
|
||||||
data, err := readUserAgentFile(sourceFile)
|
data, err := readUserAgentFile(g.sourcePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write file
|
// Write file
|
||||||
version := strings.TrimPrefix(data["ourUserAgent"], "xenolf-acme/")
|
version := strings.TrimPrefix(data["ourUserAgent"], g.baseUserAgent)
|
||||||
comment := "detach"
|
comment := "detach"
|
||||||
return writeUserAgentFile(sourceFile, version, comment)
|
|
||||||
|
return g.writeUserAgentFile(g.sourcePath, version, comment)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Generator) writeUserAgentFile(filename, version, comment string) error {
|
||||||
|
tmpl, err := template.New("ua").Parse(g.template)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
err = tmpl.Execute(b, map[string]string{
|
||||||
|
"version": version,
|
||||||
|
"comment": comment,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
source, err := format.Source(b.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.WriteFile(filename, source, 0o644)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Generator) bumpVersion(userAgent, mode string) (string, error) {
|
||||||
|
prevVersion := strings.TrimPrefix(userAgent, g.baseUserAgent)
|
||||||
|
|
||||||
|
allString := regexp.MustCompile(`(\d+)\.(\d+)\.(\d+)`).FindStringSubmatch(prevVersion)
|
||||||
|
|
||||||
|
if len(allString) != 4 {
|
||||||
|
return "", fmt.Errorf("invalid version format: %s", prevVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch mode {
|
||||||
|
case "patch":
|
||||||
|
patch, err := strconv.Atoi(allString[3])
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s.%s.%d", allString[1], allString[2], patch+1), nil
|
||||||
|
case "minor":
|
||||||
|
minor, err := strconv.Atoi(allString[2])
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s.%d.0", allString[1], minor+1), nil
|
||||||
|
case "major":
|
||||||
|
major, err := strconv.Atoi(allString[1])
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%d.0.0", major+1), nil
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("invalid mode: %s", mode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readUserAgentFile(filename string) (map[string]string, error) {
|
||||||
|
fset := token.NewFileSet()
|
||||||
|
file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
v := visitor{data: make(map[string]string)}
|
||||||
|
ast.Walk(v, file)
|
||||||
|
|
||||||
|
return v.data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type visitor struct {
|
type visitor struct {
|
||||||
|
@ -152,72 +168,3 @@ func (v visitor) Visit(n ast.Node) ast.Visitor {
|
||||||
}
|
}
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
func readUserAgentFile(filename string) (map[string]string, error) {
|
|
||||||
fset := token.NewFileSet()
|
|
||||||
file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
v := visitor{data: make(map[string]string)}
|
|
||||||
ast.Walk(v, file)
|
|
||||||
|
|
||||||
return v.data, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeUserAgentFile(filename, version, comment string) error {
|
|
||||||
tmpl, err := template.New("ua").Parse(uaTemplate)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
b := &bytes.Buffer{}
|
|
||||||
err = tmpl.Execute(b, map[string]string{
|
|
||||||
"version": version,
|
|
||||||
"comment": comment,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
source, err := format.Source(b.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return os.WriteFile(filename, source, 0o644)
|
|
||||||
}
|
|
||||||
|
|
||||||
func bumpVersion(userAgent, mode string) (string, error) {
|
|
||||||
prevVersion := strings.TrimPrefix(userAgent, "xenolf-acme/")
|
|
||||||
|
|
||||||
allString := regexp.MustCompile(`(\d+)\.(\d+)\.(\d+)`).FindStringSubmatch(prevVersion)
|
|
||||||
|
|
||||||
if len(allString) != 4 {
|
|
||||||
return "", fmt.Errorf("invalid version format: %s", prevVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
switch mode {
|
|
||||||
case "patch":
|
|
||||||
patch, err := strconv.Atoi(allString[3])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s.%s.%d", allString[1], allString[2], patch+1), nil
|
|
||||||
case "minor":
|
|
||||||
minor, err := strconv.Atoi(allString[2])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s.%d.0", allString[1], minor+1), nil
|
|
||||||
case "major":
|
|
||||||
major, err := strconv.Atoi(allString[1])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%d.0.0", major+1), nil
|
|
||||||
default:
|
|
||||||
return "", fmt.Errorf("invalid mode: %s", mode)
|
|
||||||
}
|
|
||||||
}
|
|
84
internal/useragent/main.go
Normal file
84
internal/useragent/main.go
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Name = "lego-releaser"
|
||||||
|
app.Usage = "Lego releaser"
|
||||||
|
app.HelpName = "releaser"
|
||||||
|
app.Commands = []*cli.Command{
|
||||||
|
{
|
||||||
|
Name: "release",
|
||||||
|
Usage: "Update file for a release",
|
||||||
|
Action: release,
|
||||||
|
Before: func(ctx *cli.Context) error {
|
||||||
|
mode := ctx.String("mode")
|
||||||
|
switch mode {
|
||||||
|
case "patch", "minor", "major":
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid mode: %s", mode)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "mode",
|
||||||
|
Aliases: []string{"m"},
|
||||||
|
Value: "patch",
|
||||||
|
Usage: "The release mode: patch|minor|major",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "detach",
|
||||||
|
Usage: "Update file post release",
|
||||||
|
Action: detach,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
err := app.Run(os.Args)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func release(ctx *cli.Context) error {
|
||||||
|
mode := ctx.String("mode")
|
||||||
|
|
||||||
|
generators := []*Generator{
|
||||||
|
NewGenerator(senderBaseUserAgent, senderTemplate, senderSourceFile),
|
||||||
|
NewGenerator(dnsBaseUserAgent, dnsTemplate, dnsSourceFile),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, generator := range generators {
|
||||||
|
err := generator.Release(mode)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func detach(_ *cli.Context) error {
|
||||||
|
generators := []*Generator{
|
||||||
|
NewGenerator(senderBaseUserAgent, senderTemplate, senderSourceFile),
|
||||||
|
NewGenerator(dnsBaseUserAgent, dnsTemplate, dnsSourceFile),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, generator := range generators {
|
||||||
|
err := generator.Detach()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/dnsimple/dnsimple-go/dnsimple"
|
"github.com/dnsimple/dnsimple-go/dnsimple"
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -77,7 +78,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.AccessToken})
|
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.AccessToken})
|
||||||
client := dnsimple.NewClient(oauth2.NewClient(context.Background(), ts))
|
client := dnsimple.NewClient(oauth2.NewClient(context.Background(), ts))
|
||||||
client.SetUserAgent("go-acme/lego")
|
client.SetUserAgent(useragent.Get())
|
||||||
|
|
||||||
if config.BaseURL != "" {
|
if config.BaseURL != "" {
|
||||||
client.BaseURL = config.BaseURL
|
client.BaseURL = config.BaseURL
|
||||||
|
|
|
@ -11,14 +11,11 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/internal/errutils"
|
"github.com/go-acme/lego/v4/providers/dns/internal/errutils"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultBaseURL = "https://usersapiv2.epik.com/v2"
|
const defaultBaseURL = "https://usersapiv2.epik.com/v2"
|
||||||
|
|
||||||
// The API server don't support User-Agent starting with `go-`, then this User-Agent is different from the other implementation.
|
|
||||||
// https://github.com/go-acme/lego/issues/2268#issuecomment-2394007004
|
|
||||||
const defaultUserAgent = "goacme/lego"
|
|
||||||
|
|
||||||
// Client the Epik API client.
|
// Client the Epik API client.
|
||||||
type Client struct {
|
type Client struct {
|
||||||
signature string
|
signature string
|
||||||
|
@ -101,7 +98,7 @@ func (c Client) RemoveHostRecord(ctx context.Context, domain string, recordID st
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) do(req *http.Request, result any) error {
|
func (c Client) do(req *http.Request, result any) error {
|
||||||
req.Header.Set("User-Agent", defaultUserAgent)
|
useragent.SetHeader(req.Header)
|
||||||
|
|
||||||
resp, err := c.HTTPClient.Do(req)
|
resp, err := c.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/exoscale/egoscale/v3/credentials"
|
"github.com/exoscale/egoscale/v3/credentials"
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Environment variables names.
|
// Environment variables names.
|
||||||
|
@ -85,7 +86,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
credentials.NewStaticCredentials(config.APIKey, config.APISecret),
|
credentials.NewStaticCredentials(config.APIKey, config.APISecret),
|
||||||
egoscale.ClientOptWithEndpoint(egoscale.Endpoint(config.Endpoint)),
|
egoscale.ClientOptWithEndpoint(egoscale.Endpoint(config.Endpoint)),
|
||||||
egoscale.ClientOptWithHTTPClient(&http.Client{Timeout: config.HTTPTimeout}),
|
egoscale.ClientOptWithHTTPClient(&http.Client{Timeout: config.HTTPTimeout}),
|
||||||
egoscale.ClientOptWithUserAgent("go-acme/lego"),
|
egoscale.ClientOptWithUserAgent(useragent.Get()),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("exoscale: initializing client: %w", err)
|
return nil, fmt.Errorf("exoscale: initializing client: %w", err)
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
infoblox "github.com/infobloxopen/infoblox-go-client"
|
infoblox "github.com/infobloxopen/infoblox-go-client"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -31,10 +32,7 @@ const (
|
||||||
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
|
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const defaultPoolConnections = 10
|
||||||
defaultPoolConnections = 10
|
|
||||||
defaultUserAgent = "go-acme/lego"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Config is used to configure the creation of the DNSProvider.
|
// Config is used to configure the creation of the DNSProvider.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
@ -151,7 +149,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
defer func() { _ = connector.Logout() }()
|
defer func() { _ = connector.Logout() }()
|
||||||
|
|
||||||
objectManager := infoblox.NewObjectManager(connector, defaultUserAgent, "")
|
objectManager := infoblox.NewObjectManager(connector, useragent.Get(), "")
|
||||||
|
|
||||||
record, err := objectManager.CreateTXTRecord(dns01.UnFqdn(info.EffectiveFQDN), info.Value, uint(d.config.TTL), d.config.DNSView)
|
record, err := objectManager.CreateTXTRecord(dns01.UnFqdn(info.EffectiveFQDN), info.Value, uint(d.config.TTL), d.config.DNSView)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -176,7 +174,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
defer func() { _ = connector.Logout() }()
|
defer func() { _ = connector.Logout() }()
|
||||||
|
|
||||||
objectManager := infoblox.NewObjectManager(connector, defaultUserAgent, "")
|
objectManager := infoblox.NewObjectManager(connector, useragent.Get(), "")
|
||||||
|
|
||||||
// gets the record's unique ref from when we created it
|
// gets the record's unique ref from when we created it
|
||||||
d.recordRefsMu.Lock()
|
d.recordRefsMu.Lock()
|
||||||
|
|
29
providers/dns/internal/useragent/useragent.go
Normal file
29
providers/dns/internal/useragent/useragent.go
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Code generated by 'internal/useragent'; DO NOT EDIT.
|
||||||
|
|
||||||
|
package useragent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ourUserAgent is the User-Agent of this underlying library package.
|
||||||
|
ourUserAgent = "goacme-lego/4.19.2"
|
||||||
|
|
||||||
|
// ourUserAgentComment is part of the UA comment linked to the version status of this underlying library package.
|
||||||
|
// values: detach|release
|
||||||
|
// NOTE: Update this with each tagged release.
|
||||||
|
ourUserAgentComment = "detach"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get builds and returns the User-Agent string.
|
||||||
|
func Get() string {
|
||||||
|
return fmt.Sprintf("%s (%s; %s; %s)", ourUserAgent, ourUserAgentComment, runtime.GOOS, runtime.GOARCH)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHeader sets the User-Agent header.
|
||||||
|
func SetHeader(h http.Header) {
|
||||||
|
h.Set("User-Agent", Get())
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
"github.com/linode/linodego"
|
"github.com/linode/linodego"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
@ -99,7 +100,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
client := linodego.NewClient(oauth2Client)
|
client := linodego.NewClient(oauth2Client)
|
||||||
client.SetUserAgent("go-acme/lego https://github.com/linode/linodego")
|
client.SetUserAgent(useragent.Get())
|
||||||
|
|
||||||
return &DNSProvider{config: config, client: &client}, nil
|
return &DNSProvider{config: config, client: &client}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
"github.com/ovh/go-ovh/ovh"
|
"github.com/ovh/go-ovh/ovh"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -271,7 +272,7 @@ func newClient(config *Config) (*ovh.Client, error) {
|
||||||
return nil, fmt.Errorf("new client: %w", err)
|
return nil, fmt.Errorf("new client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.UserAgent = "go-acme/lego"
|
client.UserAgent = useragent.Get()
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
client "github.com/sacloud/api-client-go"
|
client "github.com/sacloud/api-client-go"
|
||||||
"github.com/sacloud/iaas-api-go"
|
"github.com/sacloud/iaas-api-go"
|
||||||
"github.com/sacloud/iaas-api-go/helper/api"
|
"github.com/sacloud/iaas-api-go/helper/api"
|
||||||
|
@ -95,7 +96,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
AccessToken: config.Token,
|
AccessToken: config.Token,
|
||||||
AccessTokenSecret: config.Secret,
|
AccessTokenSecret: config.Secret,
|
||||||
HttpClient: config.HTTPClient,
|
HttpClient: config.HTTPClient,
|
||||||
UserAgent: fmt.Sprintf("go-acme/lego %s", iaas.DefaultUserAgent),
|
UserAgent: fmt.Sprintf("%s %s", iaas.DefaultUserAgent, useragent.Get()),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
scwdomain "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1"
|
scwdomain "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1"
|
||||||
"github.com/scaleway/scaleway-sdk-go/scw"
|
"github.com/scaleway/scaleway-sdk-go/scw"
|
||||||
)
|
)
|
||||||
|
@ -100,7 +101,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
configuration := []scw.ClientOption{
|
configuration := []scw.ClientOption{
|
||||||
scw.WithAuth(config.AccessKey, config.Token),
|
scw.WithAuth(config.AccessKey, config.Token),
|
||||||
scw.WithUserAgent("Scaleway Lego's provider"),
|
scw.WithUserAgent(useragent.Get()),
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.ProjectID != "" {
|
if config.ProjectID != "" {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
selectelapi "github.com/selectel/domains-go/pkg/v2"
|
selectelapi "github.com/selectel/domains-go/pkg/v2"
|
||||||
"github.com/selectel/go-selvpcclient/v3/selvpcclient"
|
"github.com/selectel/go-selvpcclient/v3/selvpcclient"
|
||||||
)
|
)
|
||||||
|
@ -25,8 +26,6 @@ const (
|
||||||
defaultHTTPTimeout = 30 * time.Second
|
defaultHTTPTimeout = 30 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultUserAgent = "go-acme/lego"
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
envNamespace = "SELECTELV2_"
|
envNamespace = "SELECTELV2_"
|
||||||
|
|
||||||
|
@ -114,7 +113,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := http.Header{}
|
headers := http.Header{}
|
||||||
headers.Set("User-Agent", defaultUserAgent)
|
useragent.SetHeader(headers)
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
baseClient: selectelapi.NewClient(config.BaseURL, config.HTTPClient, headers),
|
baseClient: selectelapi.NewClient(config.BaseURL, config.HTTPClient, headers),
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
"github.com/ultradns/ultradns-go-sdk/pkg/client"
|
"github.com/ultradns/ultradns-go-sdk/pkg/client"
|
||||||
"github.com/ultradns/ultradns-go-sdk/pkg/record"
|
"github.com/ultradns/ultradns-go-sdk/pkg/record"
|
||||||
"github.com/ultradns/ultradns-go-sdk/pkg/rrset"
|
"github.com/ultradns/ultradns-go-sdk/pkg/rrset"
|
||||||
|
@ -24,12 +25,10 @@ const (
|
||||||
EnvTTL = envNamespace + "TTL"
|
EnvTTL = envNamespace + "TTL"
|
||||||
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
|
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
|
||||||
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
|
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
|
||||||
|
|
||||||
// Default variables names.
|
|
||||||
defaultEndpoint = "https://api.ultradns.com/"
|
|
||||||
defaultUserAgent = "go-acme/lego"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const defaultEndpoint = "https://api.ultradns.com/"
|
||||||
|
|
||||||
// DNSProvider implements the challenge.Provider interface.
|
// DNSProvider implements the challenge.Provider interface.
|
||||||
type DNSProvider struct {
|
type DNSProvider struct {
|
||||||
config *Config
|
config *Config
|
||||||
|
@ -83,7 +82,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
Username: config.Username,
|
Username: config.Username,
|
||||||
Password: config.Password,
|
Password: config.Password,
|
||||||
HostURL: config.Endpoint,
|
HostURL: config.Endpoint,
|
||||||
UserAgent: defaultUserAgent,
|
UserAgent: useragent.Get(),
|
||||||
}
|
}
|
||||||
|
|
||||||
uClient, err := client.NewClient(ultraConfig)
|
uClient, err := client.NewClient(ultraConfig)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/platform/config/env"
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/internal/useragent"
|
||||||
"github.com/vinyldns/go-vinyldns/vinyldns"
|
"github.com/vinyldns/go-vinyldns/vinyldns"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
AccessKey: config.AccessKey,
|
AccessKey: config.AccessKey,
|
||||||
SecretKey: config.SecretKey,
|
SecretKey: config.SecretKey,
|
||||||
Host: config.Host,
|
Host: config.Host,
|
||||||
UserAgent: "go-acme/lego",
|
UserAgent: useragent.Get(),
|
||||||
})
|
})
|
||||||
|
|
||||||
client.HTTPClient.Timeout = 30 * time.Second
|
client.HTTPClient.Timeout = 30 * time.Second
|
||||||
|
|
Loading…
Add table
Reference in a new issue