From 85e60b26336e9aa36c234df6f2c19fe49042185f Mon Sep 17 00:00:00 2001 From: Grégoire Duchêne Date: Sat, 25 Jun 2022 10:43:53 +0100 Subject: Split the AWS version into its own module This allows the rather large AWS Lambda SDK to only be fetched if the command itself is being fetched. --- cmd/go-import-redirect-aws/go.mod | 13 ++++++++ cmd/go-import-redirect-aws/go.sum | 12 +++++++ cmd/go-import-redirect-aws/main.go | 58 ++++++++++++++++++++++++++++++++++ cmd/go-import-redirect/main.go | 65 ++++++++++++++++++++++++++++++++++++++ docker/Dockerfile | 4 +-- go.mod | 5 +-- go.sum | 6 ---- main.go | 65 -------------------------------------- main_aws.go | 60 ----------------------------------- 9 files changed, 151 insertions(+), 137 deletions(-) create mode 100644 cmd/go-import-redirect-aws/go.mod create mode 100644 cmd/go-import-redirect-aws/go.sum create mode 100644 cmd/go-import-redirect-aws/main.go create mode 100644 cmd/go-import-redirect/main.go delete mode 100644 main.go delete mode 100644 main_aws.go diff --git a/cmd/go-import-redirect-aws/go.mod b/cmd/go-import-redirect-aws/go.mod new file mode 100644 index 0000000..882bbf8 --- /dev/null +++ b/cmd/go-import-redirect-aws/go.mod @@ -0,0 +1,13 @@ +module go.awhk.org/go-import-redirect/cmd/go-import-redirect-aws + +go 1.18 + +require ( + github.com/aws/aws-lambda-go v1.32.0 + go.awhk.org/go-import-redirect v0.4.0 +) + +require ( + github.com/google/go-cmp v0.5.8 // indirect + go.awhk.org/core v0.0.0-20220618115257-41a47c757dca // indirect +) diff --git a/cmd/go-import-redirect-aws/go.sum b/cmd/go-import-redirect-aws/go.sum new file mode 100644 index 0000000..be8832f --- /dev/null +++ b/cmd/go-import-redirect-aws/go.sum @@ -0,0 +1,12 @@ +github.com/aws/aws-lambda-go v1.32.0 h1:i8MflawW1hoyYp85GMH7LhvAs4cqzL7LOS6fSv8l2KM= +github.com/aws/aws-lambda-go v1.32.0/go.mod h1:IF5Q7wj4VyZyUFnZ54IQqeWtctHQ9tz+KhcbDenr220= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +go.awhk.org/core v0.0.0-20220618115257-41a47c757dca h1:BFEKF8Ee3JyltAiViWR/MNedIvdqO6N3ywTj9NoGMCo= +go.awhk.org/core v0.0.0-20220618115257-41a47c757dca/go.mod h1:5C9oWobMcQLGj+rcfvAvSiGrp/vslOD0eUiwYymTaQI= +go.awhk.org/go-import-redirect v0.4.0 h1:tpkut6Y8h18v2vOwiVaLZqJf+wMZ2ka++UQR7Bcv6Hw= +go.awhk.org/go-import-redirect v0.4.0/go.mod h1:ikQIE2DO13h15oS9ZqoLzDROL9x/RI86ZuQ44sH+1JA= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= diff --git a/cmd/go-import-redirect-aws/main.go b/cmd/go-import-redirect-aws/main.go new file mode 100644 index 0000000..fb758a3 --- /dev/null +++ b/cmd/go-import-redirect-aws/main.go @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne +// SPDX-License-Identifier: ISC + +package main + +import ( + "context" + "net/http" + "os" + "path" + "regexp" + "strings" + + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" + + "go.awhk.org/go-import-redirect/pkg/redirector" +) + +var transf = redirector.Transformer{ + Pattern: &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(os.Getenv("FROM"), `\\`, `\`))}, + Replacement: os.Getenv("TO"), + VCS: os.Getenv("VCS"), +} + +func redirect(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + pkg := path.Join(req.Headers["Host"], req.Path) + + if !transf.Pattern.MatchString(pkg) { + return events.APIGatewayProxyResponse{StatusCode: http.StatusNotFound}, nil + } + + if v, ok := req.QueryStringParameters["go-get"]; !ok || v != "1" { + return events.APIGatewayProxyResponse{ + Headers: map[string]string{"Location": "https://pkg.go.dev/" + pkg}, + StatusCode: http.StatusFound, + }, nil + } + + data := redirector.TemplateData{ + Package: pkg, + Repository: transf.Pattern.ReplaceAllString(pkg, transf.Replacement), + VCS: transf.VCS, + } + var buf strings.Builder + if err := redirector.DefaultTemplate.Execute(&buf, data); err != nil { + return events.APIGatewayProxyResponse{}, err + } + return events.APIGatewayProxyResponse{ + Body: buf.String(), + Headers: map[string]string{"Content-Type": "text/html; charset=utf-8"}, + StatusCode: http.StatusOK, + }, nil +} + +func main() { + lambda.Start(redirect) +} diff --git a/cmd/go-import-redirect/main.go b/cmd/go-import-redirect/main.go new file mode 100644 index 0000000..dd7e262 --- /dev/null +++ b/cmd/go-import-redirect/main.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne +// SPDX-License-Identifier: ISC + +//go:build !aws + +package main + +import ( + "context" + "encoding/json" + "flag" + "log" + "net/http" + "os" + "os/signal" + "regexp" + "strings" + "syscall" + "time" + + "go.awhk.org/core" + "go.awhk.org/go-import-redirect/pkg/redirector" +) + +var ( + addr = flag.String("addr", "localhost:8080", "address to listen on") + cfg = flag.String("c", "", "path to a configuration file") + from = flag.String("from", "", "package prefix to remove") + to = flag.String("to", "", "repository prefix to add") + vcs = flag.String("vcs", "git", "version control system to signal") +) + +func main() { + flag.Parse() + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGTERM) + + h := &redirector.Redirector{Template: redirector.DefaultTemplate} + if *cfg != "" { + if err := json.NewDecoder(core.Must(os.Open(*cfg))).Decode(&h.Transformers); err != nil { + log.Fatalln(err) + } + } else { + h.Transformers = append(h.Transformers, redirector.Transformer{ + Pattern: &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(*from, `\\`, `\`))}, + Replacement: *to, + VCS: *vcs, + }) + } + + srv := http.Server{Handler: h} + go func() { + if err := srv.Serve(core.Must(core.Listen(*addr))); err != nil && err != http.ErrServerClosed { + log.Fatalln("server.Serve:", err) + } + }() + + <-done + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil && err != http.ErrServerClosed { + log.Fatalln("server.Shutdown:", err) + } +} diff --git a/docker/Dockerfile b/docker/Dockerfile index cd1fe2a..07ae387 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,8 @@ -FROM golang:1.17 +FROM golang:1.18 WORKDIR /root COPY . ./ ENV CGO_ENABLED=0 -RUN go build -tags nosystemd +RUN go build ./cmd/go-import-redirect FROM scratch COPY --from=0 /root/go-import-redirect /go-import-redirect diff --git a/go.mod b/go.mod index 7dfe583..5891c70 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,6 @@ module go.awhk.org/go-import-redirect go 1.18 -require ( - github.com/aws/aws-lambda-go v1.32.0 - go.awhk.org/core v0.0.0-20220618115257-41a47c757dca -) +require go.awhk.org/core v0.0.0-20220618115257-41a47c757dca require github.com/google/go-cmp v0.5.8 // indirect diff --git a/go.sum b/go.sum index b166009..21798b9 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,4 @@ -github.com/aws/aws-lambda-go v1.32.0 h1:i8MflawW1hoyYp85GMH7LhvAs4cqzL7LOS6fSv8l2KM= -github.com/aws/aws-lambda-go v1.32.0/go.mod h1:IF5Q7wj4VyZyUFnZ54IQqeWtctHQ9tz+KhcbDenr220= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= go.awhk.org/core v0.0.0-20220618115257-41a47c757dca h1:BFEKF8Ee3JyltAiViWR/MNedIvdqO6N3ywTj9NoGMCo= go.awhk.org/core v0.0.0-20220618115257-41a47c757dca/go.mod h1:5C9oWobMcQLGj+rcfvAvSiGrp/vslOD0eUiwYymTaQI= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= diff --git a/main.go b/main.go deleted file mode 100644 index dd7e262..0000000 --- a/main.go +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne -// SPDX-License-Identifier: ISC - -//go:build !aws - -package main - -import ( - "context" - "encoding/json" - "flag" - "log" - "net/http" - "os" - "os/signal" - "regexp" - "strings" - "syscall" - "time" - - "go.awhk.org/core" - "go.awhk.org/go-import-redirect/pkg/redirector" -) - -var ( - addr = flag.String("addr", "localhost:8080", "address to listen on") - cfg = flag.String("c", "", "path to a configuration file") - from = flag.String("from", "", "package prefix to remove") - to = flag.String("to", "", "repository prefix to add") - vcs = flag.String("vcs", "git", "version control system to signal") -) - -func main() { - flag.Parse() - - done := make(chan os.Signal, 1) - signal.Notify(done, os.Interrupt, syscall.SIGTERM) - - h := &redirector.Redirector{Template: redirector.DefaultTemplate} - if *cfg != "" { - if err := json.NewDecoder(core.Must(os.Open(*cfg))).Decode(&h.Transformers); err != nil { - log.Fatalln(err) - } - } else { - h.Transformers = append(h.Transformers, redirector.Transformer{ - Pattern: &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(*from, `\\`, `\`))}, - Replacement: *to, - VCS: *vcs, - }) - } - - srv := http.Server{Handler: h} - go func() { - if err := srv.Serve(core.Must(core.Listen(*addr))); err != nil && err != http.ErrServerClosed { - log.Fatalln("server.Serve:", err) - } - }() - - <-done - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - if err := srv.Shutdown(ctx); err != nil && err != http.ErrServerClosed { - log.Fatalln("server.Shutdown:", err) - } -} diff --git a/main_aws.go b/main_aws.go deleted file mode 100644 index 76cd5b9..0000000 --- a/main_aws.go +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne -// SPDX-License-Identifier: ISC - -//go:build aws && linux - -package main - -import ( - "context" - "net/http" - "os" - "path" - "regexp" - "strings" - - "github.com/aws/aws-lambda-go/events" - "github.com/aws/aws-lambda-go/lambda" - - "go.awhk.org/go-import-redirect/pkg/redirector" -) - -var transf = redirector.Transformer{ - Pattern: &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(os.Getenv("FROM"), `\\`, `\`))}, - Replacement: os.Getenv("TO"), - VCS: os.Getenv("VCS"), -} - -func redirect(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { - pkg := path.Join(req.Headers["Host"], req.Path) - - if !transf.Pattern.MatchString(pkg) { - return events.APIGatewayProxyResponse{StatusCode: http.StatusNotFound}, nil - } - - if v, ok := req.QueryStringParameters["go-get"]; !ok || v != "1" { - return events.APIGatewayProxyResponse{ - Headers: map[string]string{"Location": "https://pkg.go.dev/" + pkg}, - StatusCode: http.StatusFound, - }, nil - } - - data := redirector.TemplateData{ - Package: pkg, - Repository: transf.Pattern.ReplaceAllString(pkg, transf.Replacement), - VCS: transf.VCS, - } - var buf strings.Builder - if err := redirector.DefaultTemplate.Execute(&buf, data); err != nil { - return events.APIGatewayProxyResponse{}, err - } - return events.APIGatewayProxyResponse{ - Body: buf.String(), - Headers: map[string]string{"Content-Type": "text/html; charset=utf-8"}, - StatusCode: http.StatusOK, - }, nil -} - -func main() { - lambda.Start(redirect) -} -- cgit v1.2.3-70-g09d2