diff --git a/cmd/acmesolver/app/BUILD.bazel b/cmd/acmesolver/app/BUILD.bazel index 26e3d80ee..5e26cba8f 100644 --- a/cmd/acmesolver/app/BUILD.bazel +++ b/cmd/acmesolver/app/BUILD.bazel @@ -7,6 +7,8 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/issuer/acme/http/solver:go_default_library", + "//pkg/logs:go_default_library", + "//pkg/util:go_default_library", "@com_github_spf13_cobra//:go_default_library", ], ) diff --git a/cmd/acmesolver/app/app.go b/cmd/acmesolver/app/app.go index 2d5dc651c..31d2ddd05 100644 --- a/cmd/acmesolver/app/app.go +++ b/cmd/acmesolver/app/app.go @@ -19,30 +19,32 @@ package app import ( "context" - "github.com/jetstack/cert-manager/pkg/issuer/acme/http/solver" "github.com/spf13/cobra" + + "github.com/jetstack/cert-manager/pkg/issuer/acme/http/solver" + logf "github.com/jetstack/cert-manager/pkg/logs" + "github.com/jetstack/cert-manager/pkg/util" ) -func NewACMESolverCommand(ctx context.Context) *cobra.Command { - var ( - listenPort int - domain string - token string - key string - ) +func NewACMESolverCommand(stopCh <-chan struct{}) *cobra.Command { + s := new(solver.HTTP01Solver) cmd := &cobra.Command{ Use: "acmesolver", - Short: "HTTP server used to solver ACME challenges.", + Short: "HTTP server used to solve ACME challenges.", RunE: func(cmd *cobra.Command, args []string) error { - s := &solver.HTTP01Solver{ - ListenPort: listenPort, - Domain: domain, - Token: token, - Key: key, - } + rootCtx := util.ContextWithStopCh(context.Background(), stopCh) + rootCtx = logf.NewContext(rootCtx, nil, "acmesolver") + log := logf.FromContext(rootCtx) - if err := s.Listen(ctx); err != nil { + go func() { + <-stopCh + if err := s.Shutdown(rootCtx); err != nil { + log.Error(err, "error shutting down acmesolver server") + } + }() + + if err := s.Listen(log); err != nil { return err } @@ -50,10 +52,10 @@ func NewACMESolverCommand(ctx context.Context) *cobra.Command { }, } - cmd.Flags().IntVar(&listenPort, "listen-port", 8089, "the port number to listen on for connections") - cmd.Flags().StringVar(&domain, "domain", "", "the domain name to verify") - cmd.Flags().StringVar(&token, "token", "", "the challenge token to verify against") - cmd.Flags().StringVar(&key, "key", "", "the challenge key to respond with") + cmd.Flags().IntVar(&s.ListenPort, "listen-port", 8089, "the port number to listen on for connections") + cmd.Flags().StringVar(&s.Domain, "domain", "", "the domain name to verify") + cmd.Flags().StringVar(&s.Token, "token", "", "the challenge token to verify against") + cmd.Flags().StringVar(&s.Key, "key", "", "the challenge key to respond with") return cmd } diff --git a/cmd/acmesolver/main.go b/cmd/acmesolver/main.go index e117446cc..479474e7d 100644 --- a/cmd/acmesolver/main.go +++ b/cmd/acmesolver/main.go @@ -17,7 +17,6 @@ limitations under the License. package main import ( - "context" "fmt" "os" @@ -31,16 +30,7 @@ import ( func main() { stopCh := utilcmd.SetupSignalHandler() - ctx, cancel := context.WithCancel(context.TODO()) - cmd := app.NewACMESolverCommand(ctx) - - go func() { - select { - case <-ctx.Done(): - case <-stopCh: - cancel() - } - }() + cmd := app.NewACMESolverCommand(stopCh) if err := cmd.Execute(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) diff --git a/pkg/issuer/acme/http/solver/BUILD.bazel b/pkg/issuer/acme/http/solver/BUILD.bazel index 1c486b17e..c40bcf53b 100644 --- a/pkg/issuer/acme/http/solver/BUILD.bazel +++ b/pkg/issuer/acme/http/solver/BUILD.bazel @@ -8,7 +8,7 @@ go_library( ], importpath = "github.com/jetstack/cert-manager/pkg/issuer/acme/http/solver", visibility = ["//visibility:public"], - deps = ["//pkg/logs:go_default_library"], + deps = ["@com_github_go_logr_logr//:go_default_library"], ) filegroup( diff --git a/pkg/issuer/acme/http/solver/solver.go b/pkg/issuer/acme/http/solver/solver.go index 21c1fdf48..78355f60d 100644 --- a/pkg/issuer/acme/http/solver/solver.go +++ b/pkg/issuer/acme/http/solver/solver.go @@ -17,13 +17,12 @@ limitations under the License. package solver import ( - "context" "fmt" "net/http" "path" "strings" - logf "github.com/jetstack/cert-manager/pkg/logs" + "github.com/go-logr/logr" ) type HTTP01Solver struct { @@ -32,10 +31,11 @@ type HTTP01Solver struct { Domain string Token string Key string + + http.Server } -func (h *HTTP01Solver) Listen(ctx context.Context) error { - log := logf.FromContext(ctx) +func (h *HTTP01Solver) Listen(log logr.Logger) error { log.Info("starting listener", "expected_domain", h.Domain, "expected_token", h.Token, @@ -89,5 +89,11 @@ func (h *HTTP01Solver) Listen(ctx context.Context) error { w.WriteHeader(http.StatusOK) fmt.Fprint(w, h.Key) }) - return http.ListenAndServe(fmt.Sprintf(":%d", h.ListenPort), handler) + + h.Server = http.Server{ + Addr: fmt.Sprintf(":%d", h.ListenPort), + Handler: handler, + } + + return h.Server.ListenAndServe() }