From ebbc630b319a6d10caaedb47c79efe152d6b29e2 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 24 May 2026 22:00:34 +0000 Subject: [PATCH] chore(storage): remove servers.json in favor of just code at runtime --- .github/workflows/ci.yml | 14 ++++--- internal/storage/hardcoded.go | 28 +++++--------- internal/storage/helpers.go | 3 +- internal/storage/read_test.go | 3 +- internal/storage/servers.json | 72 ----------------------------------- 5 files changed, 20 insertions(+), 100 deletions(-) delete mode 100644 internal/storage/servers.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7a622e6..6b786de7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,6 @@ jobs: locale: "US" level: error exclude: | - ./internal/storage/servers.json ./.golangci.yml *.md @@ -98,7 +97,7 @@ jobs: github.event_name == 'release' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]') ) - needs: [ verify ] + needs: [verify] runs-on: ubuntu-latest environment: secrets steps: @@ -120,7 +119,8 @@ jobs: - name: Run Gluetun container with ProtonVPN Wireguard and port forwarding configuration - run: echo -e "${{ secrets.PROTONVPN_WIREGUARD_PRIVATE_KEY }}" | ./ci/runner + run: + echo -e "${{ secrets.PROTONVPN_WIREGUARD_PRIVATE_KEY }}" | ./ci/runner protonvpn-wireguard-port-forwarding - name: Run Gluetun container with ProtonVPN OpenVPN and port forwarding @@ -129,7 +129,8 @@ jobs: secrets.PROTONVPN_OPENVPN_PASSWORD }}" | ./ci/runner protonvpn-openvpn-port-forwarding - - name: Run Gluetun container with Private Internet Access OpenVPN and port + - name: + Run Gluetun container with Private Internet Access OpenVPN and port forwarding configuration run: echo -e "${{ secrets.PRIVATEINTERNETACCESS_OPENVPN_USER }}\n${{ secrets.PRIVATEINTERNETACCESS_OPENVPN_PASSWORD }}" | ./ci/runner @@ -141,7 +142,8 @@ jobs: secrets.AIRVPN_WIREGUARD_ADDRESSES }}" | ./ci/runner airvpn-wireguard - name: Run Gluetun container with AirVPN OpenVPN configuration - run: echo -e "${{ secrets.AIRVPN_OPENVPN_KEY }}\n${{ secrets.AIRVPN_OPENVPN_CERT + run: + echo -e "${{ secrets.AIRVPN_OPENVPN_KEY }}\n${{ secrets.AIRVPN_OPENVPN_CERT }}" | ./ci/runner airvpn-openvpn codeql: @@ -169,7 +171,7 @@ jobs: github.event_name == 'release' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]') ) - needs: [ verify, verify-private, codeql ] + needs: [verify, verify-private, codeql] permissions: actions: read contents: read diff --git a/internal/storage/hardcoded.go b/internal/storage/hardcoded.go index cd7079a0..af75c549 100644 --- a/internal/storage/hardcoded.go +++ b/internal/storage/hardcoded.go @@ -1,32 +1,23 @@ package storage import ( - "embed" "encoding/json" "fmt" - "path" + "path/filepath" serversmodule "github.com/qdm12/gluetun-servers/pkg/servers" + "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/models" ) -//go:embed servers.json -var allServersEmbedFS embed.FS - func parseHardcodedServers() (allServers models.AllServers) { - f, err := allServersEmbedFS.Open("servers.json") - if err != nil { - panic(err) - } - defer f.Close() // no-op - decoder := json.NewDecoder(f) - err = decoder.Decode(&allServers) - if err != nil { - panic("decoding servers.json: " + err.Error()) - } + allProviders := providers.All() - for provider, metadata := range allServers.ProviderToServers { - filename := path.Base(metadata.Filepath) + const version = 1 + allServers.ProviderToServers = make(map[string]models.Servers, len(allProviders)) + allServers.Version = version + for _, provider := range allProviders { + filename := provider + ".json" providerFile, err := serversmodule.Files.Open(filename) if err != nil { panic(fmt.Sprintf("reading embedded provider file %s for %s: %s", filename, provider, err)) @@ -44,7 +35,8 @@ func parseHardcodedServers() (allServers models.AllServers) { filename, provider)) } - providerServers.Filepath = metadata.Filepath // inherit filepath from servers.json + const serversPath = "/gluetun/servers/" + providerServers.Filepath = filepath.Join(serversPath, filename) allServers.ProviderToServers[provider] = providerServers } diff --git a/internal/storage/helpers.go b/internal/storage/helpers.go index cd6bf9dc..0d998aa7 100644 --- a/internal/storage/helpers.go +++ b/internal/storage/helpers.go @@ -3,6 +3,5 @@ package storage import "fmt" func panicOnProviderMissingHardcoded(provider string) { - panic(fmt.Sprintf("provider %s not found in hardcoded servers map; "+ - "did you add the provider key in the embedded servers.json?", provider)) + panic(fmt.Sprintf("provider %s not found in hardcoded servers map", provider)) } diff --git a/internal/storage/read_test.go b/internal/storage/read_test.go index 85a124cf..d7fd915e 100644 --- a/internal/storage/read_test.go +++ b/internal/storage/read_test.go @@ -152,8 +152,7 @@ func Test_extractServersFromBytes(t *testing.T) { allProviders[0]: 1, // Missing provider allProviders[1] } - expectedPanicValue := fmt.Sprintf("provider %s not found in hardcoded servers map; "+ - "did you add the provider key in the embedded servers.json?", allProviders[1]) + expectedPanicValue := fmt.Sprintf("provider %s not found in hardcoded servers map", allProviders[1]) assert.PanicsWithValue(t, expectedPanicValue, func() { _, _ = s.extractServersFromBytes(b, hardcodedVersions) }) diff --git a/internal/storage/servers.json b/internal/storage/servers.json deleted file mode 100644 index 3ab612f1..00000000 --- a/internal/storage/servers.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "version": 1, - "airvpn": { - "filepath": "/gluetun/servers/airvpn.json" - }, - "cyberghost": { - "filepath": "/gluetun/servers/cyberghost.json" - }, - "expressvpn": { - "filepath": "/gluetun/servers/expressvpn.json" - }, - "fastestvpn": { - "filepath": "/gluetun/servers/fastestvpn.json" - }, - "giganews": { - "filepath": "/gluetun/servers/giganews.json" - }, - "hidemyass": { - "filepath": "/gluetun/servers/hidemyass.json" - }, - "ipvanish": { - "filepath": "/gluetun/servers/ipvanish.json" - }, - "ivpn": { - "filepath": "/gluetun/servers/ivpn.json" - }, - "mullvad": { - "filepath": "/gluetun/servers/mullvad.json" - }, - "nordvpn": { - "filepath": "/gluetun/servers/nordvpn.json" - }, - "perfect privacy": { - "filepath": "/gluetun/servers/perfect privacy.json" - }, - "privado": { - "filepath": "/gluetun/servers/privado.json" - }, - "private internet access": { - "filepath": "/gluetun/servers/private internet access.json" - }, - "privatevpn": { - "filepath": "/gluetun/servers/privatevpn.json" - }, - "protonvpn": { - "filepath": "/gluetun/servers/protonvpn.json" - }, - "purevpn": { - "filepath": "/gluetun/servers/purevpn.json" - }, - "slickvpn": { - "filepath": "/gluetun/servers/slickvpn.json" - }, - "surfshark": { - "filepath": "/gluetun/servers/surfshark.json" - }, - "torguard": { - "filepath": "/gluetun/servers/torguard.json" - }, - "vpn unlimited": { - "filepath": "/gluetun/servers/vpn unlimited.json" - }, - "vpnsecure": { - "filepath": "/gluetun/servers/vpnsecure.json" - }, - "vyprvpn": { - "filepath": "/gluetun/servers/vyprvpn.json" - }, - "windscribe": { - "filepath": "/gluetun/servers/windscribe.json" - } -}