diff --git a/Makefile b/Makefile index 547f06e..8e56de7 100644 --- a/Makefile +++ b/Makefile @@ -16,41 +16,30 @@ build: build_linux_amd64: cd src \ - && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/collerd-${APPVERSION}-linux-amd64 cmd/collerd/main.go \ - && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/coller-${APPVERSION}-linux-amd64 cmd/coller/main.go \ - && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/copier-${APPVERSION}-linux-amd64 cmd/copier/main.go - -archive_linux_amd64: - mkdir -p releases/coller-${APPVERSION}-linux-amd64 \ - && cp bin/collerd-${APPVERSION}-linux-amd64 releases/coller-${APPVERSION}-linux-amd64/collerd \ - && cp bin/coller-${APPVERSION}-linux-amd64 releases/coller-${APPVERSION}-linux-amd64/coller \ - && cp bin/copier-${APPVERSION}-linux-amd64 releases/coller-${APPVERSION}-linux-amd64/copier \ - && cd releases/ \ - && tar cvpzf coller-${APPVERSION}-linux-amd64.tar.gz coller-${APPVERSION}-linux-amd64 + && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/collerd-linux-amd64 cmd/collerd/main.go \ + && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/coller-linux-amd64 cmd/coller/main.go \ + && GOOS=linux GOARCH=amd64 go build -ldflags "${LDFLAGS}" -o ../bin/copier-linux-amd64 cmd/copier/main.go build_darwin_arm64: cd src \ - && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/collerd-${APPVERSION}-darwin-arm64 cmd/collerd/main.go \ - && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/coller-${APPVERSION}-darwin-arm64 cmd/coller/main.go \ - && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/copier-${APPVERSION}-darwin-arm64 cmd/copier/main.go + && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/collerd-darwin-arm64 cmd/collerd/main.go \ + && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/coller-darwin-arm64 cmd/coller/main.go \ + && GOOS=darwin GOARCH=arm64 go build -ldflags "${LDFLAGS}" -o ../bin/copier-darwin-arm64 cmd/copier/main.go -archive_darwin_arm64: - mkdir -p releases/coller-${APPVERSION}-darwin-arm64 \ - && cp bin/collerd-${APPVERSION}-darwin-arm64 releases/coller-${APPVERSION}-darwin-arm64/collerd \ - && cp bin/coller-${APPVERSION}-darwin-arm64 releases/coller-${APPVERSION}-darwin-arm64/coller \ - && cp bin/copier-${APPVERSION}-darwin-arm64 releases/coller-${APPVERSION}-darwin-arm64/copier \ - && cd releases/ \ - && tar cvpzf coller-${APPVERSION}-darwin-arm64.tar.gz coller-${APPVERSION}-darwin-arm64 +create_release: + mkdir -p releases/${APPVERSION} \ + && cp -p bin/collerd-linux-amd64 releases/${APPVERSION}/collerd-linux-amd64 \ + && cp -p bin/coller-linux-amd64 releases/${APPVERSION}/coller-linux-amd64 \ + && cp -p bin/copier-linux-amd64 releases/${APPVERSION}/copier-linux-amd64 \ + && cp -p bin/collerd-darwin-arm64 releases/${APPVERSION}/collerd-darwin-arm64 \ + && cp -p bin/coller-darwin-arm64 releases/${APPVERSION}/coller-darwin-arm64 \ + && cp -p bin/copier-darwin-arm64 releases/${APPVERSION}/copier-darwin-arm64 checksum: - cd releases \ - && sha256sum *.tar.gz > checksums.txt + cd releases/${APPVERSION} \ + && sha256sum collerd-* coller-* copier-* > checksums.txt -clean_for_releases: - rm -rf releases/coller-${APPVERSION}-linux-amd64 \ - && rm -rf releases/coller-${APPVERSION}-darwin-arm64 - -releases: build_linux_amd64 build_darwin_arm64 archive_linux_amd64 archive_darwin_arm64 checksum clean_for_releases +releases: build_linux_amd64 build_darwin_arm64 create_release checksum releases_with_docker: docker run -it -v $(shell pwd):/mnt -w /mnt -e "UID=$(shell id -u)" -e "GID=$(shell id -g)" ${DOCKER_IMAGE} ./docker/build.sh diff --git a/docker/build.sh b/docker/build.sh index 783ba44..47c817d 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -17,4 +17,4 @@ apt-get install -y libx11-dev make releases -chown ${UID}:${GID} -R releases +chown ${UID}:${GID} -R bin releases diff --git a/src/internal/utils.go b/src/internal/utils.go index c98c2e3..9db5ece 100644 --- a/src/internal/utils.go +++ b/src/internal/utils.go @@ -117,3 +117,12 @@ func ToLowerStringSlice(src []string) (dst []string) { } return } + +func InSlice(s []string, elem string) bool { + for _, v := range s { + if v == elem { + return true + } + } + return false +} diff --git a/src/internal/utils_test.go b/src/internal/utils_test.go index cc251f0..eef7c03 100644 --- a/src/internal/utils_test.go +++ b/src/internal/utils_test.go @@ -85,3 +85,25 @@ func TestToLowerStringsSlice(t *testing.T) { t.Logf("got '%s', want '%s'", got, expected) } } + +func TestInSlice(t *testing.T) { + tests := []struct { + elem string + s []string + expected bool + }{ + {"linux", []string{"linux", "darwin"}, true}, + {"windows", []string{"linux", "darwin"}, false}, + } + + for _, tc := range tests { + t.Run(fmt.Sprintf("TestInSlice#%s", tc.elem), func(t *testing.T) { + got := InSlice(tc.s, tc.elem) + if got != tc.expected { + t.Errorf("got '%t', want '%t'", got, tc.expected) + } else { + t.Logf("got '%t', want '%t'", got, tc.expected) + } + }) + } +} diff --git a/src/server/server.go b/src/server/server.go index f8a2d3f..4cef956 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -19,7 +19,12 @@ import ( "git.riou.xyz/jriou/coller/internal" ) -var passwordLength = internal.MIN_PASSWORD_LENGTH +var ( + passwordLength = internal.MIN_PASSWORD_LENGTH + supportedOSes = []string{"linux", "darwin"} + supportedArches = []string{"amd64", "arm64"} + supportedClients = []string{"coller", "copier"} +) type Server struct { logger *slog.Logger @@ -405,6 +410,42 @@ func (h *GetProtectedWebNoteHandler) ServeHTTP(w http.ResponseWriter, r *http.Re h.Templates.ExecuteTemplate(w, "note", h.PageData) } +type ClientsHandler struct { + Templates *template.Template + PageData PageData + logger *slog.Logger +} + +func (h *ClientsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h.logger.Debug("rendering clients web page") + h.Templates.ExecuteTemplate(w, "clients", h.PageData) +} + +type ClientHandler struct { + logger *slog.Logger + version string +} + +func (h *ClientHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h.logger.Debug("rendering client redirection") + vars := mux.Vars(r) + os := vars["os"] + arch := vars["arch"] + clientName := vars["clientName"] + + if !internal.InSlice(supportedOSes, os) || !internal.InSlice(supportedArches, arch) || !internal.InSlice(supportedClients, clientName) { + w.WriteHeader(http.StatusNotFound) + return + } + + version := h.version + if version == "" { + version = "latest" + } + + http.Redirect(w, r, fmt.Sprintf("https://git.riou.xyz/jriou/%s/releases/download/%s/%s-%s-%s", clientName, version, clientName, os, arch), http.StatusMovedPermanently) +} + //go:embed templates/* var templatesFS embed.FS @@ -456,6 +497,14 @@ func (s *Server) Start() error { } r.Path("/create").Handler(createNoteWithFormHandler).Methods("POST") + clientsHandler := &ClientsHandler{ + Templates: templates, + PageData: p, + logger: s.logger, + } + r.Path("/clients.html").Handler(clientsHandler).Methods("GET") + r.Path("/clients/{os:[a-z]+}-{arch:[a-z0-9]+}/{clientName:[a-z]+}").Handler(&ClientHandler{logger: s.logger, version: p.Version}).Methods("GET") + protectedWebNoteHandler := &GetProtectedWebNoteHandler{ Templates: templates, PageData: p, diff --git a/src/server/templates/clients.html b/src/server/templates/clients.html new file mode 100644 index 0000000..6e57267 --- /dev/null +++ b/src/server/templates/clients.html @@ -0,0 +1,62 @@ +{{define "clients"}} + + + +{{block "head" .}}{{end}} + +
+ {{block "header" .}}{{end}} +Command-line clients
+Name | +Docs | +OS | +Arch | +Download | +
---|---|---|---|---|
coller | +📄 + | +Linux | +x86-64 | +💾 | +
macOS | +ARM64 | +💾 | +||
copier | +📄 + | +Linux | +x86-64 | +💾 | +
macOS | +ARM64 | +💾 | +