update
This commit is contained in:
parent
2117b6321c
commit
1cd2e543c7
49
.github/workflows/ci.yml
vendored
49
.github/workflows/ci.yml
vendored
@ -1,49 +0,0 @@
|
|||||||
name: Main
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
main:
|
|
||||||
name: Main Process
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
GO_VERSION: stable
|
|
||||||
GOLANGCI_LINT_VERSION: v1.54.2
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
# https://github.com/marketplace/actions/checkout
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
# https://github.com/marketplace/actions/setup-go-environment
|
|
||||||
- name: Set up Go ${{ env.GO_VERSION }}
|
|
||||||
uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ${{ env.GO_VERSION }}
|
|
||||||
|
|
||||||
- name: Check and get dependencies
|
|
||||||
run: |
|
|
||||||
go mod tidy
|
|
||||||
git diff --exit-code go.mod
|
|
||||||
git diff --exit-code go.sum
|
|
||||||
|
|
||||||
# https://golangci-lint.run/usage/install#other-ci
|
|
||||||
- name: Install golangci-lint ${{ env.GOLANGCI_LINT_VERSION }}
|
|
||||||
run: |
|
|
||||||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin ${GOLANGCI_LINT_VERSION}
|
|
||||||
golangci-lint --version
|
|
||||||
|
|
||||||
- name: Make
|
|
||||||
run: make
|
|
||||||
|
|
||||||
- name: Make Image
|
|
||||||
run: make image
|
|
||||||
36
.github/workflows/go-cross.yml
vendored
36
.github/workflows/go-cross.yml
vendored
@ -1,36 +0,0 @@
|
|||||||
name: Go Matrix
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
cross:
|
|
||||||
name: Go
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
env:
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
go-version: [ stable, oldstable ]
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# https://github.com/marketplace/actions/checkout
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
# https://github.com/marketplace/actions/setup-go-environment
|
|
||||||
- name: Set up Go ${{ matrix.go-version }}
|
|
||||||
uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ${{ matrix.go-version }}
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: go test -v -cover ./...
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: go build -v -ldflags "-s -w" -trimpath
|
|
||||||
55
.github/workflows/release.yml
vendored
55
.github/workflows/release.yml
vendored
@ -1,55 +0,0 @@
|
|||||||
name: "Release a tag"
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Release Process
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
GO_VERSION: stable
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
# https://github.com/marketplace/actions/checkout
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
# https://github.com/marketplace/actions/setup-go-environment
|
|
||||||
- name: Set up Go ${{ env.GO_VERSION }}
|
|
||||||
uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ${{ env.GO_VERSION }}
|
|
||||||
|
|
||||||
- name: dockerhub-login
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: ghcr-login
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: traefiker
|
|
||||||
password: ${{ secrets.GHCR_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
# https://goreleaser.com/ci/actions/
|
|
||||||
- name: Run GoReleaser
|
|
||||||
uses: goreleaser/goreleaser-action@v2
|
|
||||||
with:
|
|
||||||
version: latest
|
|
||||||
args: release --rm-dist
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_REPO }}
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
run:
|
|
||||||
timeout: 2m
|
|
||||||
skip-files: []
|
|
||||||
|
|
||||||
linters-settings:
|
|
||||||
govet:
|
|
||||||
enable-all: true
|
|
||||||
disable:
|
|
||||||
- fieldalignment
|
|
||||||
gocyclo:
|
|
||||||
min-complexity: 16
|
|
||||||
goconst:
|
|
||||||
min-len: 3
|
|
||||||
min-occurrences: 3
|
|
||||||
misspell:
|
|
||||||
locale: US
|
|
||||||
funlen:
|
|
||||||
lines: -1
|
|
||||||
statements: 40
|
|
||||||
gofumpt:
|
|
||||||
extra-rules: true
|
|
||||||
depguard:
|
|
||||||
rules:
|
|
||||||
main:
|
|
||||||
deny:
|
|
||||||
- pkg: "github.com/instana/testify"
|
|
||||||
desc: not allowed
|
|
||||||
- pkg: "github.com/pkg/errors"
|
|
||||||
desc: Should be replaced by standard lib errors package
|
|
||||||
godox:
|
|
||||||
keywords:
|
|
||||||
- FIXME
|
|
||||||
gocritic:
|
|
||||||
enabled-tags:
|
|
||||||
- diagnostic
|
|
||||||
- style
|
|
||||||
- performance
|
|
||||||
disabled-checks:
|
|
||||||
- sloppyReassign
|
|
||||||
- rangeValCopy
|
|
||||||
- octalLiteral
|
|
||||||
- paramTypeCombine # already handle by gofumpt.extra-rules
|
|
||||||
settings:
|
|
||||||
hugeParam:
|
|
||||||
sizeThreshold: 100
|
|
||||||
forbidigo:
|
|
||||||
forbid:
|
|
||||||
- '^print(ln)?$'
|
|
||||||
- '^panic$'
|
|
||||||
- '^spew\.Print(f|ln)?$'
|
|
||||||
- '^spew\.Dump$'
|
|
||||||
|
|
||||||
linters:
|
|
||||||
enable-all: true
|
|
||||||
disable:
|
|
||||||
- deadcode # deprecated
|
|
||||||
- exhaustivestruct # deprecated
|
|
||||||
- golint # deprecated
|
|
||||||
- ifshort # deprecated
|
|
||||||
- interfacer # deprecated
|
|
||||||
- maligned # deprecated
|
|
||||||
- nosnakecase # deprecated
|
|
||||||
- scopelint # deprecated
|
|
||||||
- scopelint # deprecated
|
|
||||||
- structcheck # deprecated
|
|
||||||
- varcheck # deprecated
|
|
||||||
- execinquery # not relevant (SQL)
|
|
||||||
- rowserrcheck # not relevant (SQL)
|
|
||||||
- sqlclosecheck # not relevant (SQL)
|
|
||||||
- cyclop # duplicate of gocyclo
|
|
||||||
- dupl
|
|
||||||
- exhaustive
|
|
||||||
- exhaustruct
|
|
||||||
- forbidigo
|
|
||||||
- gochecknoglobals
|
|
||||||
- gochecknoinits
|
|
||||||
- goerr113
|
|
||||||
- gomnd
|
|
||||||
- gosec
|
|
||||||
- lll
|
|
||||||
- nilnil
|
|
||||||
- nlreturn
|
|
||||||
- paralleltest
|
|
||||||
- prealloc
|
|
||||||
- testpackage
|
|
||||||
- tparallel
|
|
||||||
- varnamelen
|
|
||||||
- wrapcheck
|
|
||||||
- wsl
|
|
||||||
|
|
||||||
issues:
|
|
||||||
exclude-use-default: false
|
|
||||||
max-per-linter: 0
|
|
||||||
max-same-issues: 0
|
|
||||||
exclude:
|
|
||||||
- 'package-comments: should have a package comment'
|
|
||||||
142
.goreleaser.yml
142
.goreleaser.yml
@ -1,142 +0,0 @@
|
|||||||
project_name: whoami
|
|
||||||
|
|
||||||
builds:
|
|
||||||
- binary: whoami
|
|
||||||
goos:
|
|
||||||
- windows
|
|
||||||
- darwin
|
|
||||||
- linux
|
|
||||||
goarch:
|
|
||||||
- amd64
|
|
||||||
- arm
|
|
||||||
- arm64
|
|
||||||
goarm:
|
|
||||||
- '7'
|
|
||||||
|
|
||||||
changelog:
|
|
||||||
sort: asc
|
|
||||||
filters:
|
|
||||||
exclude:
|
|
||||||
- '^docs:'
|
|
||||||
- '^doc:'
|
|
||||||
- '^chore:'
|
|
||||||
- '^chore(deps):'
|
|
||||||
- '^test:'
|
|
||||||
- '^tests:'
|
|
||||||
|
|
||||||
archives:
|
|
||||||
- id: whoami
|
|
||||||
name_template: '{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm}}v{{ .Arm }}{{ end }}'
|
|
||||||
format: tar.gz
|
|
||||||
format_overrides:
|
|
||||||
- goos: windows
|
|
||||||
format: zip
|
|
||||||
files:
|
|
||||||
- LICENSE
|
|
||||||
|
|
||||||
docker_manifests:
|
|
||||||
- name_template: 'traefik/whoami:{{ .Tag }}'
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- name_template: 'traefik/whoami:latest'
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- name_template: 'traefik/whoami:v{{ .Major }}.{{ .Minor }}'
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-amd64'
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-arm64'
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-armv7'
|
|
||||||
|
|
||||||
- name_template: 'ghcr.io/traefik/whoami:{{ .Tag }}'
|
|
||||||
image_templates:
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- name_template: 'ghcr.io/traefik/whoami:latest'
|
|
||||||
image_templates:
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- name_template: 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}'
|
|
||||||
image_templates:
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-armv7'
|
|
||||||
|
|
||||||
dockers:
|
|
||||||
- use: buildx
|
|
||||||
goos: linux
|
|
||||||
goarch: amd64
|
|
||||||
dockerfile: buildx.Dockerfile
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:latest-amd64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:latest-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-amd64'
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-amd64'
|
|
||||||
build_flag_templates:
|
|
||||||
- '--pull'
|
|
||||||
# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
|
|
||||||
- '--label=org.opencontainers.image.title={{.ProjectName}}'
|
|
||||||
- '--label=org.opencontainers.image.description=Tiny Go webserver that prints OS information and HTTP request to output'
|
|
||||||
- '--label=org.opencontainers.image.source={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.url={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.documentation={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.created={{.Date}}'
|
|
||||||
- '--label=org.opencontainers.image.revision={{.FullCommit}}'
|
|
||||||
- '--label=org.opencontainers.image.version={{.Version}}'
|
|
||||||
- '--platform=linux/amd64'
|
|
||||||
|
|
||||||
- use: buildx
|
|
||||||
goos: linux
|
|
||||||
goarch: arm64
|
|
||||||
dockerfile: buildx.Dockerfile
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:latest-arm64'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:latest-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-arm64'
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-arm64'
|
|
||||||
build_flag_templates:
|
|
||||||
- '--pull'
|
|
||||||
# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
|
|
||||||
- '--label=org.opencontainers.image.title={{.ProjectName}}'
|
|
||||||
- '--label=org.opencontainers.image.description=Tiny Go webserver that prints OS information and HTTP request to output'
|
|
||||||
- '--label=org.opencontainers.image.source={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.url={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.documentation={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.created={{.Date}}'
|
|
||||||
- '--label=org.opencontainers.image.revision={{.FullCommit}}'
|
|
||||||
- '--label=org.opencontainers.image.version={{.Version}}'
|
|
||||||
- '--platform=linux/arm64'
|
|
||||||
|
|
||||||
- use: buildx
|
|
||||||
goos: linux
|
|
||||||
goarch: arm
|
|
||||||
goarm: '7'
|
|
||||||
dockerfile: buildx.Dockerfile
|
|
||||||
image_templates:
|
|
||||||
- 'traefik/whoami:latest-armv7'
|
|
||||||
- 'traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- 'traefik/whoami:v{{ .Major }}.{{ .Minor }}-armv7'
|
|
||||||
- 'ghcr.io/traefik/whoami:latest-armv7'
|
|
||||||
- 'ghcr.io/traefik/whoami:{{ .Tag }}-armv7'
|
|
||||||
- 'ghcr.io/traefik/whoami:v{{ .Major }}.{{ .Minor }}-armv7'
|
|
||||||
build_flag_templates:
|
|
||||||
- '--pull'
|
|
||||||
# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
|
|
||||||
- '--label=org.opencontainers.image.title={{.ProjectName}}'
|
|
||||||
- '--label=org.opencontainers.image.description=Tiny Go webserver that prints OS information and HTTP request to output'
|
|
||||||
- '--label=org.opencontainers.image.source={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.url={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.documentation={{.GitURL}}'
|
|
||||||
- '--label=org.opencontainers.image.created={{.Date}}'
|
|
||||||
- '--label=org.opencontainers.image.revision={{.FullCommit}}'
|
|
||||||
- '--label=org.opencontainers.image.version={{.Version}}'
|
|
||||||
- '--platform=linux/arm/v7'
|
|
||||||
202
LICENSE
202
LICENSE
@ -1,202 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [2015-2019] [Containous]
|
|
||||||
Copyright [2020-2022] [Traefik Labs]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
17
Makefile
17
Makefile
@ -1,17 +0,0 @@
|
|||||||
.PHONY: default check test build image
|
|
||||||
|
|
||||||
IMAGE_NAME := traefik/whoami
|
|
||||||
|
|
||||||
default: check test build
|
|
||||||
|
|
||||||
build:
|
|
||||||
CGO_ENABLED=0 go build -a --trimpath --installsuffix cgo --ldflags="-s" -o whoami
|
|
||||||
|
|
||||||
test:
|
|
||||||
go test -v -cover ./...
|
|
||||||
|
|
||||||
check:
|
|
||||||
golangci-lint run
|
|
||||||
|
|
||||||
image:
|
|
||||||
docker build -t $(IMAGE_NAME) .
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
# syntax=docker/dockerfile:1.2
|
|
||||||
FROM golang:1-alpine as builder
|
|
||||||
|
|
||||||
RUN apk --no-cache --no-progress add git ca-certificates tzdata make \
|
|
||||||
&& update-ca-certificates \
|
|
||||||
&& rm -rf /var/cache/apk/*
|
|
||||||
|
|
||||||
# syntax=docker/dockerfile:1.2
|
|
||||||
# Create a minimal container to run a Golang static binary
|
|
||||||
FROM scratch
|
|
||||||
|
|
||||||
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
|
|
||||||
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
|
||||||
COPY whoami /
|
|
||||||
|
|
||||||
ENTRYPOINT ["/whoami"]
|
|
||||||
EXPOSE 80
|
|
||||||
66
content.go
66
content.go
@ -1,66 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
const contentCharset = "-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
|
|
||||||
type contentReader struct {
|
|
||||||
size int64
|
|
||||||
cur int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read implements the io.Read interface.
|
|
||||||
func (r *contentReader) Read(p []byte) (int, error) {
|
|
||||||
length := r.size - 1
|
|
||||||
|
|
||||||
if r.cur >= length {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
if len(p) == 0 {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var n int
|
|
||||||
if r.cur == 0 {
|
|
||||||
p[n] = '|'
|
|
||||||
r.cur++
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
|
|
||||||
for n < len(p) && r.cur <= length {
|
|
||||||
p[n] = contentCharset[int(r.cur)%len(contentCharset)]
|
|
||||||
r.cur++
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.cur >= length {
|
|
||||||
p[n-1] = '|'
|
|
||||||
}
|
|
||||||
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Seek implements the io.Seek interface.
|
|
||||||
func (r *contentReader) Seek(offset int64, whence int) (int64, error) {
|
|
||||||
switch whence {
|
|
||||||
default:
|
|
||||||
return 0, errors.New("seek: invalid whence")
|
|
||||||
case io.SeekStart:
|
|
||||||
offset += 0
|
|
||||||
case io.SeekCurrent:
|
|
||||||
offset += r.cur
|
|
||||||
case io.SeekEnd:
|
|
||||||
offset += r.size - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if offset < 0 {
|
|
||||||
return 0, errors.New("seek: invalid offset")
|
|
||||||
}
|
|
||||||
|
|
||||||
r.cur = offset
|
|
||||||
|
|
||||||
return offset, nil
|
|
||||||
}
|
|
||||||
@ -1,82 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_contentReader_Read(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
size int64
|
|
||||||
content string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "simple",
|
|
||||||
size: 40,
|
|
||||||
content: "|ABCDEFGHIJKLMNOPQRSTUVWXYZ-ABCDEFGHIJK|",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
test := test
|
|
||||||
t.Run(test.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
d := &contentReader{size: test.size}
|
|
||||||
|
|
||||||
b, err := io.ReadAll(d)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("contentReader.Read() error = %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if string(b) != test.content {
|
|
||||||
t.Errorf("return content does not match expected value: got %s want %s", b, test.content)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_contentReader_ReadSeek(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
offset int64
|
|
||||||
seekWhence int
|
|
||||||
size int64
|
|
||||||
content string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "simple",
|
|
||||||
offset: 10,
|
|
||||||
seekWhence: io.SeekCurrent,
|
|
||||||
size: 40,
|
|
||||||
content: "JKLMNOPQRSTUVWXYZ-ABCDEFGHIJK|",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
test := test
|
|
||||||
t.Run(test.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
d := &contentReader{size: test.size}
|
|
||||||
|
|
||||||
_, err := d.Seek(test.offset, test.seekWhence)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("contentReader.Seek() error = %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := io.ReadAll(d)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("contentReader.Read() error = %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if string(b) != test.content {
|
|
||||||
t.Errorf("return content does not match expected value: got %s want %s", b, test.content)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -336,3 +337,64 @@ func getIPs() []string {
|
|||||||
|
|
||||||
return ips
|
return ips
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const contentCharset = "-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
type contentReader struct {
|
||||||
|
size int64
|
||||||
|
cur int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read implements the io.Read interface.
|
||||||
|
func (r *contentReader) Read(p []byte) (int, error) {
|
||||||
|
length := r.size - 1
|
||||||
|
|
||||||
|
if r.cur >= length {
|
||||||
|
return 0, io.EOF
|
||||||
|
}
|
||||||
|
if len(p) == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var n int
|
||||||
|
if r.cur == 0 {
|
||||||
|
p[n] = '|'
|
||||||
|
r.cur++
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
for n < len(p) && r.cur <= length {
|
||||||
|
p[n] = contentCharset[int(r.cur)%len(contentCharset)]
|
||||||
|
r.cur++
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.cur >= length {
|
||||||
|
p[n-1] = '|'
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Seek implements the io.Seek interface.
|
||||||
|
func (r *contentReader) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
switch whence {
|
||||||
|
default:
|
||||||
|
return 0, errors.New("seek: invalid whence")
|
||||||
|
case io.SeekStart:
|
||||||
|
offset += 0
|
||||||
|
case io.SeekCurrent:
|
||||||
|
offset += r.cur
|
||||||
|
case io.SeekEnd:
|
||||||
|
offset += r.size - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if offset < 0 {
|
||||||
|
return 0, errors.New("seek: invalid offset")
|
||||||
|
}
|
||||||
|
|
||||||
|
r.cur = offset
|
||||||
|
|
||||||
|
return offset, nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user