Add missing files.
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
3546c6f674
commit
37fe025cec
@ -0,0 +1,23 @@
|
|||||||
|
# ---> Go
|
||||||
|
# If you prefer the allow list template instead of the deny list, see community template:
|
||||||
|
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||||
|
#
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, built with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Dependency directories (remove the comment below to include it)
|
||||||
|
# vendor/
|
||||||
|
|
||||||
|
# Go workspace file
|
||||||
|
go.work
|
||||||
|
|
@ -0,0 +1,102 @@
|
|||||||
|
# options for analysis running
|
||||||
|
run:
|
||||||
|
# timeout for analysis, e.g. 30s, 5m, default is 1m
|
||||||
|
timeout: 1m
|
||||||
|
|
||||||
|
# exit code when at least one issue was found, default is 1
|
||||||
|
issues-exit-code: 0
|
||||||
|
|
||||||
|
# include test files or not, default is true
|
||||||
|
tests: false
|
||||||
|
|
||||||
|
# which dirs to skip: issues from them won't be reported;
|
||||||
|
# can use regexp here: generated.*, regexp is applied on full path;
|
||||||
|
# default value is empty list, but default dirs are skipped independently
|
||||||
|
# from this option's value (see skip-dirs-use-default).
|
||||||
|
# "/" will be replaced by current OS file path separator to properly work
|
||||||
|
# on Windows.
|
||||||
|
skip-dirs:
|
||||||
|
- wasm
|
||||||
|
- static
|
||||||
|
- node_modules
|
||||||
|
- documents
|
||||||
|
- docker
|
||||||
|
- bind-*
|
||||||
|
|
||||||
|
# default is true. Enables skipping of directories:
|
||||||
|
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
|
||||||
|
skip-dirs-use-default: true
|
||||||
|
|
||||||
|
# by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules":
|
||||||
|
# If invoked with -mod=readonly, the go command is disallowed from the implicit
|
||||||
|
# automatic updating of go.mod described above. Instead, it fails when any changes
|
||||||
|
# to go.mod are needed. This setting is most useful to check that go.mod does
|
||||||
|
# not need updates, such as in a continuous integration and testing system.
|
||||||
|
# If invoked with -mod=vendor, the go command assumes that the vendor
|
||||||
|
# directory holds the correct copies of dependencies and ignores
|
||||||
|
# the dependency descriptions in go.mod.
|
||||||
|
modules-download-mode: mod
|
||||||
|
|
||||||
|
# Allow multiple parallel golangci-lint instances running.
|
||||||
|
# If false (default) - golangci-lint acquires file lock on start.
|
||||||
|
allow-parallel-runners: true
|
||||||
|
|
||||||
|
|
||||||
|
# output configuration options
|
||||||
|
output:
|
||||||
|
# colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions
|
||||||
|
# default is "colored-line-number"
|
||||||
|
format: colored-line-number
|
||||||
|
|
||||||
|
# print lines of code with issue, default is true
|
||||||
|
print-issued-lines: true
|
||||||
|
|
||||||
|
# print linter name in the end of issue text, default is true
|
||||||
|
print-linter-name: true
|
||||||
|
|
||||||
|
# make issues output unique by line, default is true
|
||||||
|
uniq-by-line: true
|
||||||
|
|
||||||
|
# add a prefix to the output file references; default is no prefix
|
||||||
|
path-prefix: ""
|
||||||
|
|
||||||
|
# sorts results by: filepath, line and column
|
||||||
|
sort-results: false
|
||||||
|
|
||||||
|
|
||||||
|
# all available settings of specific linters
|
||||||
|
linters-settings:
|
||||||
|
gofmt:
|
||||||
|
# simplify code: gofmt with `-s` option, true by default
|
||||||
|
simplify: true
|
||||||
|
staticcheck:
|
||||||
|
# Select the Go version to target. The default is '1.13'.
|
||||||
|
go: "1.16"
|
||||||
|
# https://staticcheck.io/docs/options#checks
|
||||||
|
checks: ["all"]
|
||||||
|
stylecheck:
|
||||||
|
# Select the Go version to target. The default is '1.13'.
|
||||||
|
go: "1.18"
|
||||||
|
# https://staticcheck.io/docs/options#checks
|
||||||
|
checks: ["all"]
|
||||||
|
errcheck:
|
||||||
|
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
|
||||||
|
# default is false: such cases aren't reported by default.
|
||||||
|
check-blank: true
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
# go install github.com/kisielk/errcheck@latest
|
||||||
|
# go install github.com/gordonklaus/ineffassign@latest
|
||||||
|
# go install honnef.co/go/tools/cmd/staticcheck@latest
|
||||||
|
# go install gitlab.com/opennota/check/cmd/varcheck@latest
|
||||||
|
# go install github.com/go-critic/go-critic/cmd/gocritic@latest
|
||||||
|
- errcheck
|
||||||
|
- staticcheck
|
||||||
|
- stylecheck
|
||||||
|
- ineffassign
|
||||||
|
- varcheck
|
||||||
|
- gofmt
|
||||||
|
- gocritic
|
||||||
|
- wsl
|
||||||
|
fast: false
|
@ -0,0 +1,18 @@
|
|||||||
|
FROM golang:1.18-bullseye
|
||||||
|
LABEL author="Thomas Bellembois"
|
||||||
|
|
||||||
|
# Copying sources.
|
||||||
|
WORKDIR /go/src/github.com/tbellembois/codefirst-menuwrapper/
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Installing.
|
||||||
|
RUN go install -v ./...
|
||||||
|
RUN chmod +x /go/bin/codefirst-menuwrapper
|
||||||
|
|
||||||
|
# Copying entrypoint.
|
||||||
|
COPY entrypoint.sh /
|
||||||
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
USER www-data
|
||||||
|
EXPOSE 8081
|
||||||
|
CMD ["/entrypoint.sh"]
|
@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
debug=""
|
||||||
|
|
||||||
|
if [ ! -z "$DEBUG" ]
|
||||||
|
then
|
||||||
|
debug="-debug"
|
||||||
|
fi
|
||||||
|
|
||||||
|
/go/bin/codefirst-menuwrapper -proxyurl=$PROXYURL -codefirsturl=$CODEFIRSTURL $debug
|
@ -0,0 +1,10 @@
|
|||||||
|
module codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-menuwrapper
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-menu/v2 v2.0.0-20220901141305-9da5f43fc873
|
||||||
|
github.com/sirupsen/logrus v1.9.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect
|
@ -0,0 +1,14 @@
|
|||||||
|
codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-menu/v2 v2.0.0-20220901141305-9da5f43fc873 h1:GYYkgzYWIYV5qLSVguwerESYAfFSESlsJAV3drN1mno=
|
||||||
|
codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-menu/v2 v2.0.0-20220901141305-9da5f43fc873/go.mod h1:hQ1fdhe5i32sO3pl+kic2sPFTA1uw3X3U82aDV77LoU=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||||
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
|
||||||
|
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -0,0 +1,204 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httputil"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-menu/v2/menu"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
updatedMenu, updatedStringbody string
|
||||||
|
proxyURL, codefirstURL string
|
||||||
|
debug, dump bool
|
||||||
|
)
|
||||||
|
|
||||||
|
func gUnzipData(data []byte) (resData []byte, err error) {
|
||||||
|
b := bytes.NewBuffer(data)
|
||||||
|
|
||||||
|
var r io.Reader
|
||||||
|
r, err = gzip.NewReader(b)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var resB bytes.Buffer
|
||||||
|
_, err = resB.ReadFrom(r)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resData = resB.Bytes()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateResponse(r *http.Response) error {
|
||||||
|
|
||||||
|
contentType := r.Header[http.CanonicalHeaderKey("content-type")]
|
||||||
|
contentEncoding := r.Header[http.CanonicalHeaderKey("content-encoding")]
|
||||||
|
location := r.Header[http.CanonicalHeaderKey("location")]
|
||||||
|
statusCode := r.StatusCode
|
||||||
|
|
||||||
|
log.WithFields(
|
||||||
|
log.Fields{
|
||||||
|
"r.Header": r.Header,
|
||||||
|
"statusCode": statusCode,
|
||||||
|
"contentType": contentType,
|
||||||
|
"contentEncoding": contentEncoding,
|
||||||
|
"location": location,
|
||||||
|
},
|
||||||
|
).Debug()
|
||||||
|
|
||||||
|
if statusCode == http.StatusFound && strings.HasPrefix(proxyURL, "http://pastebin") && len(contentType) == 0 {
|
||||||
|
if len(location) > 0 {
|
||||||
|
r.Header.Del("location")
|
||||||
|
r.Header.Set("location", fmt.Sprintf("/pastebin%s", location[0]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode != http.StatusOK {
|
||||||
|
log.Debug("skipping not status ok reponse")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(contentType) > 0 && strings.HasPrefix(contentType[0], "text/html") {
|
||||||
|
var (
|
||||||
|
body []byte
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
if body, err = io.ReadAll(r.Body); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(contentEncoding) > 0 && strings.HasPrefix(contentEncoding[0], "gzip") {
|
||||||
|
if body, err = gUnzipData(body); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stringBody := string(body)
|
||||||
|
|
||||||
|
if strings.HasPrefix(proxyURL, "http://pastebin") {
|
||||||
|
updatedStringbody = strings.Replace(stringBody, "action=\"/\"", "action=\"/pastebin/\"", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://cinny") {
|
||||||
|
updatedStringbody = strings.Replace(stringBody, `<body id="appBody">`, `<body id="appBody">`+updatedMenu, 1)
|
||||||
|
} else {
|
||||||
|
updatedStringbody = strings.Replace(stringBody, "<body>", "<body>"+updatedMenu, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := bytes.NewBufferString(updatedStringbody)
|
||||||
|
r.Body = ioutil.NopCloser(buf)
|
||||||
|
|
||||||
|
r.Header.Del("content-encoding")
|
||||||
|
r.Header.Del("content-type")
|
||||||
|
r.Header.Set("content-type", "text/html; charset=utf-8")
|
||||||
|
r.Header.Set("content-length", fmt.Sprint(buf.Len()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
flag.StringVar(&proxyURL, "proxyurl", "", "proxy URL")
|
||||||
|
flag.StringVar(&codefirstURL, "codefirsturl", "", "codefirst URL")
|
||||||
|
flag.BoolVar(&debug, "debug", false, "enable debug")
|
||||||
|
flag.BoolVar(&dump, "dump", false, "dump menu")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
updatedMenu = menu.CodeFirstMenu
|
||||||
|
|
||||||
|
if dump {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--gitea", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "gitea-->", "", 1)
|
||||||
|
fmt.Println(updatedMenu)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if proxyURL == "" {
|
||||||
|
panic(errors.New("empty proxy URL"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if debug {
|
||||||
|
log.SetLevel(log.DebugLevel)
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedMenu = strings.ReplaceAll(updatedMenu, "CODEFIRST_HOSTNAME", codefirstURL)
|
||||||
|
|
||||||
|
if strings.HasPrefix(proxyURL, "http://gitea") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--gitea", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "gitea-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://drone") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--drone", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "drone-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://dockerrunner") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--dockerrunner", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "dockerrunner-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://registryui") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--dockerregistry", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "dockerregistry-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://sonarqube") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--sonar", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "sonar-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://nginx") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--documentation", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "documentation-->", "", 1)
|
||||||
|
} else if strings.HasPrefix(proxyURL, "http://cinny") {
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "<!--cinny", "", 1)
|
||||||
|
updatedMenu = strings.Replace(updatedMenu, "cinny-->", "", 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
remote, err := url.Parse(proxyURL)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.WithFields(
|
||||||
|
log.Fields{
|
||||||
|
"proxyURL": proxyURL,
|
||||||
|
"updatedMenu": updatedMenu,
|
||||||
|
},
|
||||||
|
).Debug()
|
||||||
|
|
||||||
|
handler := func(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
log.WithFields(
|
||||||
|
log.Fields{
|
||||||
|
"r.Host": r.Host,
|
||||||
|
"r.RequestURI": r.RequestURI,
|
||||||
|
},
|
||||||
|
).Debug()
|
||||||
|
|
||||||
|
r.Host = remote.Host
|
||||||
|
p.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy := httputil.NewSingleHostReverseProxy(remote)
|
||||||
|
proxy.ModifyResponse = UpdateResponse
|
||||||
|
|
||||||
|
http.HandleFunc("/", handler(proxy))
|
||||||
|
err = http.ListenAndServe(":8081", nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue