From 02c7a6c3e80150e0fd566ea1ddd0dae2979e1532 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Thu, 30 Nov 2023 23:16:34 +0100 Subject: [PATCH 01/12] Fix builds --- .github/workflows/build.yml | 6 ++---- Dockerfile | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ec53ade..6396ab7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,10 +57,8 @@ jobs: platform=$(echo $platform | sed 's/.exe//g') extension=".exe" fi - cd artifacts - cp -f "zurg-$platform$extension" zurg - zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" zurg - cd .. + cp -f "artifacts/zurg-$platform$extension" "artifacts/zurg$extension" + (cd artifacts && zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" "zurg$extension") done - name: Upload artifacts to workflow diff --git a/Dockerfile b/Dockerfile index 3035c2e..162e63f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ FROM golang:1-alpine AS builder WORKDIR /app COPY . . RUN apk add --no-cache bash git go gcc musl-dev curl fuse -RUN go build -ldflags="-s -w -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=${BuiltAt}' -X 'github.com/debridmediamanager/zurg/internal.GoVersion=${GoVersion}' -X 'github.com/debridmediamanager/zurg/internal.GitCommit=${GitCommit}' -X 'github.com/debridmediamanager/zurg/internal.Version=${Version}'" -o zurg cmd/zurg +RUN go build -ldflags="-s -w -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=${BuiltAt}' -X 'github.com/debridmediamanager/zurg/internal.GoVersion=${GoVersion}' -X 'github.com/debridmediamanager/zurg/internal.GitCommit=${GitCommit}' -X 'github.com/debridmediamanager/zurg/internal.Version=${Version}'" -o zurg ./cmd/zurg # Obfuscation stage FROM alpine:3 AS obfuscator From 099a8f92a897009af05adfae077a91b9d147e421 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Thu, 30 Nov 2023 23:23:28 +0100 Subject: [PATCH 02/12] Solve http issue --- internal/torrent/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index cac60b7..f831c22 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -869,7 +869,7 @@ func (t *TorrentManager) updateDirectoryResponsesCache() { continue } davRet += dav.Directory(tor.AccessKey, tor.LatestAdded) - htmlRet += fmt.Sprintf("
  • %s
  • ", directory, tor.AccessKey, tor.AccessKey) + htmlRet += fmt.Sprintf("
  • %s
  • ", directory, tor.AccessKey, tor.AccessKey) } } @@ -897,7 +897,7 @@ func (t *TorrentManager) buildTorrentResponses(tor *Torrent) (string, string) { davRet += dav.File(filename, file.Bytes, file.Ended) filePath := filepath.Join("$dir", tor.AccessKey, url.PathEscape(filename)) - htmlRet += fmt.Sprintf("
  • %s
  • ", filePath, filename) + htmlRet += fmt.Sprintf("
  • %s
  • ", filePath, filename) } davRet += "" From 7987c058609d6e51becc1d06cde91e8e1edcec05 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Thu, 30 Nov 2023 23:31:27 +0100 Subject: [PATCH 03/12] Bring back old archive soln --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6396ab7..33862a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,8 +57,7 @@ jobs: platform=$(echo $platform | sed 's/.exe//g') extension=".exe" fi - cp -f "artifacts/zurg-$platform$extension" "artifacts/zurg$extension" - (cd artifacts && zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" "zurg$extension") + (cd artifacts && zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" "zurg-$platform$extension") done - name: Upload artifacts to workflow From 25ef76bca14688dd964d232dd8e980a5bba36d8f Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 00:14:47 +0100 Subject: [PATCH 04/12] Fix passing ldflags --- .github/workflows/build.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 33862a2..d0056ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,11 +39,11 @@ jobs: x: false race: false ldflags: > - -s -w - -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$(date +%Y-%m-%dT%H:%M:%S)' - -X 'github.com/debridmediamanager/zurg/internal.GoVersion=$(go version | cut -d ' ' -f 3)' - -X 'github.com/debridmediamanager/zurg/internal.GitCommit=$(git rev-parse HEAD)' - -X 'github.com/debridmediamanager/zurg/internal.Version=${{ steps.version.outputs.version }}' + -s -w \ + -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$(date +%Y-%m-%dT%H:%M:%S)' \ + -X "github.com/debridmediamanager/zurg/internal.GoVersion=$(go version | cut -d ' ' -f 3)" \ + -X "github.com/debridmediamanager/zurg/internal.GitCommit=$(git rev-parse HEAD)" \ + -X "github.com/debridmediamanager/zurg/internal.Version=${{ steps.version.outputs.version }}" buildmode: default trimpath: true @@ -57,7 +57,8 @@ jobs: platform=$(echo $platform | sed 's/.exe//g') extension=".exe" fi - (cd artifacts && zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" "zurg-$platform$extension") + cp -fR artifacts/zurg-$platform$extension artifacts/zurg$extension + (cd artifacts && zip -r "../compressed_artifacts/zurg-${{ steps.version.outputs.version }}-$platform.zip" "zurg$extension") done - name: Upload artifacts to workflow From 2fff33af77473a057303ca7bc15d5efa564cae3c Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 00:50:39 +0100 Subject: [PATCH 05/12] After local build --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0056ff..2e13a59 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: with: xgo_version: latest go_version: 1.21 - pkg: ./cmd/zurg + pkg: cmd/zurg dest: artifacts prefix: zurg targets: windows/amd64,linux/amd64,linux/arm64,darwin/arm64 @@ -39,11 +39,11 @@ jobs: x: false race: false ldflags: > - -s -w \ - -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$(date +%Y-%m-%dT%H:%M:%S)' \ - -X "github.com/debridmediamanager/zurg/internal.GoVersion=$(go version | cut -d ' ' -f 3)" \ - -X "github.com/debridmediamanager/zurg/internal.GitCommit=$(git rev-parse HEAD)" \ - -X "github.com/debridmediamanager/zurg/internal.Version=${{ steps.version.outputs.version }}" + -s -w + -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$(date +%Y-%m-%dT%H:%M:%S)' + -X 'github.com/debridmediamanager/zurg/internal.GoVersion=$(go version | cut -d " " -f 3)' + -X 'github.com/debridmediamanager/zurg/internal.GitCommit=$(git rev-parse HEAD)' + -X 'github.com/debridmediamanager/zurg/internal.Version=${{ steps.version.outputs.version }}' buildmode: default trimpath: true From db2387faf5b8bc4c3f096eb5a78ed604d7bb3f31 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 01:46:54 +0100 Subject: [PATCH 06/12] Use outputs --- .github/workflows/build.yml | 13 ++++++++++--- .github/workflows/build_docker.yml | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e13a59..9fa903c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,13 @@ jobs: - name: Check out code uses: actions/checkout@v4 + - name: Generate build variables + id: prep + run: | + echo "built_at=$(date +%Y-%m-%dT%H:%M:%S)" >> $GITHUB_OUTPUT + echo "go_version=$(go version | cut -d ' ' -f 3)" >> $GITHUB_OUTPUT + echo "git_commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + - name: Cross-compile with xgo uses: crazy-max/ghaction-xgo@v3 with: @@ -40,9 +47,9 @@ jobs: race: false ldflags: > -s -w - -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$(date +%Y-%m-%dT%H:%M:%S)' - -X 'github.com/debridmediamanager/zurg/internal.GoVersion=$(go version | cut -d " " -f 3)' - -X 'github.com/debridmediamanager/zurg/internal.GitCommit=$(git rev-parse HEAD)' + -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=${{ steps.prep.outputs.built_at }}' + -X 'github.com/debridmediamanager/zurg/internal.GoVersion=${{ steps.prep.outputs.go_version }}' + -X 'github.com/debridmediamanager/zurg/internal.GitCommit=${{ steps.prep.outputs.git_commit }}' -X 'github.com/debridmediamanager/zurg/internal.Version=${{ steps.version.outputs.version }}' buildmode: default trimpath: true diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index 301f01d..6d856ba 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -45,6 +45,13 @@ jobs: with: images: ghcr.io/${{ github.repository }} + - name: Generate build variables + id: prep + run: | + echo "built_at=$(date +%Y-%m-%dT%H:%M:%S)" >> $GITHUB_OUTPUT + echo "go_version=$(go version | cut -d ' ' -f 3)" >> $GITHUB_OUTPUT + echo "git_commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + - name: Build and push Docker image uses: docker/build-push-action@v5 with: @@ -56,9 +63,9 @@ jobs: cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache build-args: | - BuiltAt=$(date +%Y-%m-%dT%H:%M:%S) - GoVersion=$(go version) - GitCommit=$(git rev-parse HEAD) + BuiltAt=${{ steps.prep.outputs.built_at }}' + GoVersion=${{ steps.prep.outputs.go_version }}' + GitCommit=${{ steps.prep.outputs.git_commit }}' Version=${{ steps.version.outputs.version }} - name: Extract metadata (tags, labels) for Docker From 9d8ff6c1f87e8e4126bf4227ec6cbe30a90c0fd9 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 03:35:40 +0100 Subject: [PATCH 07/12] Add version to docker image --- Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 162e63f..3fb557c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,14 @@ -# Accept GOOS and GOARCH as build arguments +FROM golang:1-alpine AS builder ARG GOOS=linux ARG GOARCH=amd64 ARG BuiltAt ARG GoVersion ARG GitCommit ARG Version - -# Build stage -FROM golang:1-alpine AS builder WORKDIR /app COPY . . RUN apk add --no-cache bash git go gcc musl-dev curl fuse -RUN go build -ldflags="-s -w -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=${BuiltAt}' -X 'github.com/debridmediamanager/zurg/internal.GoVersion=${GoVersion}' -X 'github.com/debridmediamanager/zurg/internal.GitCommit=${GitCommit}' -X 'github.com/debridmediamanager/zurg/internal.Version=${Version}'" -o zurg ./cmd/zurg +RUN go build -ldflags "-s -w -X github.com/debridmediamanager/zurg/internal.BuiltAt=$BuiltAt -X github.com/debridmediamanager/zurg/internal.GoVersion=$GoVersion -X github.com/debridmediamanager/zurg/internal.GitCommit=$GitCommit -X github.com/debridmediamanager/zurg/internal.Version=$Version" -o zurg ./cmd/zurg # Obfuscation stage FROM alpine:3 AS obfuscator From 33ffa9154c7f83f705499cda7b56549999de0199 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 12:57:50 +0100 Subject: [PATCH 08/12] Use ipv6 dialer, the rest are defaults --- pkg/http/client.go | 62 ++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/pkg/http/client.go b/pkg/http/client.go index 36a8ec9..4fd9d37 100644 --- a/pkg/http/client.go +++ b/pkg/http/client.go @@ -29,7 +29,7 @@ type HTTPClient struct { } func NewHTTPClient(token string, maxRetries int, timeoutSecs int, cfg config.ConfigInterface, log *zap.SugaredLogger) *HTTPClient { - return &HTTPClient{ + client := HTTPClient{ bearerToken: token, client: &http.Client{ Timeout: time.Duration(timeoutSecs) * time.Second, @@ -63,6 +63,32 @@ func NewHTTPClient(token string, maxRetries int, timeoutSecs int, cfg config.Con ipv6: cmap.New[net.IP](), log: log, } + + if cfg.ShouldForceIPv6() { + dialer := &net.Dialer{} + + dialContext := func(ctx context.Context, network, address string) (net.Conn, error) { + ips, err := net.DefaultResolver.LookupIPAddr(ctx, address) + if err != nil { + return nil, err + } + + for _, ip := range ips { + if ip.IP.To4() == nil { // IPv6 address found + ipv6Address := "[" + ip.IP.String() + "]" + return dialer.DialContext(ctx, network, ipv6Address) + } + } + return nil, net.UnknownNetworkError("no IPv6 address found") + } + + transport := &http.Transport{ + DialContext: dialContext, + } + client.client.Transport = transport + } + + return &client } func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) { @@ -77,40 +103,6 @@ func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) { req.Header.Set("Authorization", "Bearer "+r.bearerToken) } - if r.cfg.ShouldForceIPv6() { - dialer := &net.Dialer{} - transport := r.client.Transport.(*http.Transport).Clone() - transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { - host, port, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - if ipv6, ok := r.ipv6.Get(host); !ok { - // Lookup IP address if not found in map - ips, err := net.LookupIP(host) - if err != nil { - return nil, err - } - for _, ip := range ips { - if ip.To4() == nil { // IPv6 - ipv6 = ip - r.ipv6.Set(host, ipv6) - break - } - } - if ipv6 == nil { // No IPv6 address found, fallback to default - addr = net.JoinHostPort(host, port) - } else { - addr = net.JoinHostPort(ipv6.String(), port) - } - } else if ipv6 != nil && host == req.URL.Hostname() { - addr = net.JoinHostPort(ipv6.String(), port) - } - return dialer.DialContext(ctx, network, addr) - } - r.client.Transport = transport - } - var resp *http.Response var err error attempt := 0 From 45ca65110efcff2b0ce675741632530105c78337 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 13:29:59 +0100 Subject: [PATCH 09/12] Fix ipv6 client --- pkg/http/client.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pkg/http/client.go b/pkg/http/client.go index 4fd9d37..6c14575 100644 --- a/pkg/http/client.go +++ b/pkg/http/client.go @@ -24,7 +24,7 @@ type HTTPClient struct { getRetryIncr func(resp *http.Response, err error) int bearerToken string cfg config.ConfigInterface - ipv6 cmap.ConcurrentMap[string, net.IP] + ipv6 cmap.ConcurrentMap[string, string] log *zap.SugaredLogger } @@ -60,26 +60,32 @@ func NewHTTPClient(token string, maxRetries int, timeoutSecs int, cfg config.Con return RATE_LIMIT_FACTOR // retry and increment attempt }, cfg: cfg, - ipv6: cmap.New[net.IP](), + ipv6: cmap.New[string](), log: log, } if cfg.ShouldForceIPv6() { dialer := &net.Dialer{} - dialContext := func(ctx context.Context, network, address string) (net.Conn, error) { - ips, err := net.DefaultResolver.LookupIPAddr(ctx, address) + host, port, _ := net.SplitHostPort(address) + if ipv6Address, ok := client.ipv6.Get(address); ok { + return dialer.DialContext(ctx, network, ipv6Address) + } + + ips, err := net.DefaultResolver.LookupIPAddr(ctx, host) if err != nil { return nil, err } for _, ip := range ips { if ip.IP.To4() == nil { // IPv6 address found - ipv6Address := "[" + ip.IP.String() + "]" + ip6Host := ip.IP.String() + ipv6Address := net.JoinHostPort(ip6Host, port) + client.ipv6.Set(address, ipv6Address) return dialer.DialContext(ctx, network, ipv6Address) } } - return nil, net.UnknownNetworkError("no IPv6 address found") + return dialer.DialContext(ctx, network, address) } transport := &http.Transport{ From b2144421cb790eb2a2900dfdfe2d2804625e0af9 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 13:42:44 +0100 Subject: [PATCH 10/12] Reduce resources consumed by the hook --- internal/torrent/hooks.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/internal/torrent/hooks.go b/internal/torrent/hooks.go index e44afb0..11c846d 100644 --- a/internal/torrent/hooks.go +++ b/internal/torrent/hooks.go @@ -1,7 +1,6 @@ package torrent import ( - "bytes" "fmt" "os/exec" @@ -14,22 +13,27 @@ type ScriptExecutor struct { Args []string } -func (se *ScriptExecutor) Execute() (string, error) { +func (se *ScriptExecutor) Execute() error { if se.Script == "" { - return "", nil + return nil } + + // Prepare the command cmd := exec.Command("/bin/sh", "-c", se.Script) - cmd.Args = append(cmd.Args, "zurg") cmd.Args = append(cmd.Args, se.Args...) - var out bytes.Buffer - var stderr bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &stderr - err := cmd.Run() + + // Start the command and immediately return, not caring about its state + err := cmd.Start() if err != nil { - return "", fmt.Errorf("error executing script: %v; stderr: %s", err, stderr.String()) + return fmt.Errorf("error starting script: %v", err) } - return out.String(), nil + + // Detach the process + go func() { + cmd.Wait() + }() + + return nil } func OnLibraryUpdateHook(paths []string, config config.ConfigInterface, log *zap.SugaredLogger) { @@ -37,12 +41,10 @@ func OnLibraryUpdateHook(paths []string, config config.ConfigInterface, log *zap Script: config.GetOnLibraryUpdate(), Args: paths, } - output, err := executor.Execute() + err := executor.Execute() if err != nil { log.Errorf("Failed to execute hook on_library_update: %v", err) return } - if output != "" { - log.Infof("Output of hook on_library_update:\n%s", output) - } + // No need to log the output since we're not capturing it } From 25e4dbb8b025ce7925645654254a3609e0bd6a6d Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 14:10:51 +0100 Subject: [PATCH 11/12] Add quote wrapper --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3fb557c..d1f7604 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ ARG Version WORKDIR /app COPY . . RUN apk add --no-cache bash git go gcc musl-dev curl fuse -RUN go build -ldflags "-s -w -X github.com/debridmediamanager/zurg/internal.BuiltAt=$BuiltAt -X github.com/debridmediamanager/zurg/internal.GoVersion=$GoVersion -X github.com/debridmediamanager/zurg/internal.GitCommit=$GitCommit -X github.com/debridmediamanager/zurg/internal.Version=$Version" -o zurg ./cmd/zurg +RUN go build -ldflags "-s -w -X 'github.com/debridmediamanager/zurg/internal.BuiltAt=$BuiltAt' -X 'github.com/debridmediamanager/zurg/internal.GoVersion=$GoVersion' -X 'github.com/debridmediamanager/zurg/internal.GitCommit=$GitCommit' -X 'github.com/debridmediamanager/zurg/internal.Version=$Version'" -o zurg ./cmd/zurg # Obfuscation stage FROM alpine:3 AS obfuscator From 0da26fea85a06dcb360262d6f8acca9136390db6 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 1 Dec 2023 14:19:43 +0100 Subject: [PATCH 12/12] Remove extra quotes --- .github/workflows/build_docker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index 6d856ba..5302b24 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -63,9 +63,9 @@ jobs: cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache build-args: | - BuiltAt=${{ steps.prep.outputs.built_at }}' - GoVersion=${{ steps.prep.outputs.go_version }}' - GitCommit=${{ steps.prep.outputs.git_commit }}' + BuiltAt=${{ steps.prep.outputs.built_at }} + GoVersion=${{ steps.prep.outputs.go_version }} + GitCommit=${{ steps.prep.outputs.git_commit }} Version=${{ steps.version.outputs.version }} - name: Extract metadata (tags, labels) for Docker