This commit is contained in:
Quentin McGaw
2026-05-12 04:43:27 +00:00
parent 5b01324d5f
commit 71c4fcda52
52 changed files with 304371 additions and 303986 deletions
+3
View File
@@ -71,6 +71,9 @@ linters:
- linters:
- err113
text: "do not define dynamic errors, use wrapped static errors instead"
- linters: # TODO remove this is temporary
- gomoddirectives
text: "local replacement are not allowed: github.com/qdm12/gluetun-servers"
paths:
- third_party$
+4 -1
View File
@@ -19,6 +19,8 @@ COPY --from=golangci-lint /bin /go/bin/golangci-lint
COPY --from=mockgen /bin /go/bin/mockgen
WORKDIR /tmp/gobuild
COPY go.mod go.sum ./
# Temporary, remove this:
COPY gluetun-servers/ ./gluetun-servers/
RUN go mod download
COPY cmd/ ./cmd/
COPY internal/ ./internal/
@@ -249,6 +251,7 @@ ENV VPN_SERVICE_PROVIDER=pia \
UPDATER_PERIOD=0 \
UPDATER_MIN_RATIO=0.8 \
UPDATER_VPN_SERVICE_PROVIDERS= \
UPDATER_PREFER_DIRECT_DOWNLOAD=no \
UPDATER_PROTONVPN_EMAIL= \
UPDATER_PROTONVPN_PASSWORD= \
# Public IP
@@ -257,7 +260,7 @@ ENV VPN_SERVICE_PROVIDER=pia \
PUBLICIP_API=ipinfo,ifconfigco,ip2location,cloudflare \
PUBLICIP_API_TOKEN= \
# Storage
STORAGE_FILEPATH=/gluetun/servers.json \
STORAGE_SERVERS_DIRECTORY_PATH=/gluetun/servers/ \
# Pprof
PPROF_ENABLED=no \
PPROF_BLOCK_PROFILE_RATE=0 \
+11 -12
View File
@@ -169,21 +169,19 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
defer fmt.Println(gluetunLogo)
announcementExp, err := time.Parse(time.RFC3339, "2026-04-30T00:00:00Z")
announcementExp, err := time.Parse(time.RFC3339, "2026-06-30T00:00:00Z")
if err != nil {
return err
}
splashSettings := gosplash.Settings{
User: "qdm12",
Repository: "gluetun",
Emails: []string{"quentin.mcgaw@gmail.com"},
Version: buildInfo.Version,
Commit: buildInfo.Commit,
Created: buildInfo.Created,
Announcement: "the repository will be migrated to https://github.com/passteque/gluetun on 2026-05-21, " +
"which is a Github organization under my sole control, so don't get alarmed if you get redirected " +
"in the coming days (reason: personal paperwork ugh)",
AnnounceExp: announcementExp,
User: "qdm12",
Repository: "gluetun",
Emails: []string{"quentin.mcgaw@gmail.com"},
Version: buildInfo.Version,
Commit: buildInfo.Commit,
Created: buildInfo.Created,
Announcement: "Your servers data files are now migrated to /gluetun/servers/",
AnnounceExp: announcementExp,
// Sponsor information
PaypalUser: "qmcgaw",
GithubSponsor: "qdm12",
@@ -245,7 +243,8 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
// TODO run this in a loop or in openvpn to reload from file without restarting
storageLogger := logger.New(log.SetComponent("storage"))
storage, err := storage.New(storageLogger, *allSettings.Storage.Filepath)
storage, err := storage.New(storageLogger, *allSettings.Storage.ServersPath,
*allSettings.Storage.LegacyServersFilepath)
if err != nil {
return err
}
+3
View File
@@ -0,0 +1,3 @@
module github.com/qdm12/gluetun-servers
go 1.25.0
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+663
View File
@@ -0,0 +1,663 @@
{
"version": 1,
"timestamp": 1726044812,
"servers": [
{
"vpn": "openvpn",
"region": "Algeria",
"hostname": "dz1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.104.253"
]
},
{
"vpn": "openvpn",
"region": "Argentina",
"hostname": "ar1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.35"
]
},
{
"vpn": "openvpn",
"region": "Australia Melbourne",
"hostname": "au2.vpn.giganews.com",
"udp": true,
"ips": [
"64.253.88.29"
]
},
{
"vpn": "openvpn",
"region": "Australia Perth",
"hostname": "au3.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.27"
]
},
{
"vpn": "openvpn",
"region": "Australia Sydney",
"hostname": "au1.vpn.giganews.com",
"udp": true,
"ips": [
"64.253.88.21"
]
},
{
"vpn": "openvpn",
"region": "Austria",
"hostname": "at1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.148.253"
]
},
{
"vpn": "openvpn",
"region": "Bahrain",
"hostname": "bh1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.63.253"
]
},
{
"vpn": "openvpn",
"region": "Belgium",
"hostname": "be1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.145.253"
]
},
{
"vpn": "openvpn",
"region": "Brazil",
"hostname": "br1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.33"
]
},
{
"vpn": "openvpn",
"region": "Bulgaria",
"hostname": "bg1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.167.253"
]
},
{
"vpn": "openvpn",
"region": "Canada",
"hostname": "ca1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.34"
]
},
{
"vpn": "openvpn",
"region": "Columbia",
"hostname": "co1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.37"
]
},
{
"vpn": "openvpn",
"region": "Costa Rica",
"hostname": "cr1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.39"
]
},
{
"vpn": "openvpn",
"region": "Czech Republic",
"hostname": "cz1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.164.253"
]
},
{
"vpn": "openvpn",
"region": "Denmark",
"hostname": "dk1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.154.253"
]
},
{
"vpn": "openvpn",
"region": "Dubai",
"hostname": "ae1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.101.253"
]
},
{
"vpn": "openvpn",
"region": "Egypt",
"hostname": "eg1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.10.253"
]
},
{
"vpn": "openvpn",
"region": "El Salvador",
"hostname": "sv1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.36"
]
},
{
"vpn": "openvpn",
"region": "Finland",
"hostname": "fi1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.166.253"
]
},
{
"vpn": "openvpn",
"region": "France",
"hostname": "fr1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.141.253"
]
},
{
"vpn": "openvpn",
"region": "Germany",
"hostname": "de1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.128.253"
]
},
{
"vpn": "openvpn",
"region": "Greece",
"hostname": "gr1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.11.253"
]
},
{
"vpn": "openvpn",
"region": "Hong Kong",
"hostname": "hk1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.37"
]
},
{
"vpn": "openvpn",
"region": "Iceland",
"hostname": "is1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.17.253"
]
},
{
"vpn": "openvpn",
"region": "India",
"hostname": "in1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.60.253"
]
},
{
"vpn": "openvpn",
"region": "Indonesia",
"hostname": "id1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.28"
]
},
{
"vpn": "openvpn",
"region": "Ireland",
"hostname": "ie1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.19.253"
]
},
{
"vpn": "openvpn",
"region": "Israel",
"hostname": "il1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.59.253"
]
},
{
"vpn": "openvpn",
"region": "Italy",
"hostname": "it1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.161.253"
]
},
{
"vpn": "openvpn",
"region": "Japan",
"hostname": "jp1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.20.20"
]
},
{
"vpn": "openvpn",
"region": "Latvia",
"hostname": "lv1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.174.253"
]
},
{
"vpn": "openvpn",
"region": "Liechtenstein",
"hostname": "li1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.177.253"
]
},
{
"vpn": "openvpn",
"region": "Lithuania",
"hostname": "lt1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.173.253"
]
},
{
"vpn": "openvpn",
"region": "Luxembourg",
"hostname": "lu1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.165.253"
]
},
{
"vpn": "openvpn",
"region": "Macao",
"hostname": "mo1.vpn.giganews.com",
"udp": true,
"ips": [
"69.167.31.253"
]
},
{
"vpn": "openvpn",
"region": "Malaysia",
"hostname": "my1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.29"
]
},
{
"vpn": "openvpn",
"region": "Maldives",
"hostname": "mv1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.35"
]
},
{
"vpn": "openvpn",
"region": "Marshall Islands",
"hostname": "mh1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.34"
]
},
{
"vpn": "openvpn",
"region": "Mexico",
"hostname": "mx1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.24"
]
},
{
"vpn": "openvpn",
"region": "Netherlands",
"hostname": "eu1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.135.253"
]
},
{
"vpn": "openvpn",
"region": "New Zealand",
"hostname": "nz1.vpn.giganews.com",
"udp": true,
"ips": [
"64.253.88.29"
]
},
{
"vpn": "openvpn",
"region": "Norway",
"hostname": "no1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.163.253"
]
},
{
"vpn": "openvpn",
"region": "Pakistan",
"hostname": "pk1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.58.253"
]
},
{
"vpn": "openvpn",
"region": "Panama",
"hostname": "pa1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.41"
]
},
{
"vpn": "openvpn",
"region": "Philippines",
"hostname": "ph1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.30"
]
},
{
"vpn": "openvpn",
"region": "Poland",
"hostname": "pl1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.170.253"
]
},
{
"vpn": "openvpn",
"region": "Portugal",
"hostname": "pt1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.168.253"
]
},
{
"vpn": "openvpn",
"region": "Qatar",
"hostname": "qa1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.62.253"
]
},
{
"vpn": "openvpn",
"region": "Romania",
"hostname": "ro1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.171.253"
]
},
{
"vpn": "openvpn",
"region": "Russia",
"hostname": "ru1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.151.253"
]
},
{
"vpn": "openvpn",
"region": "Saudi Arabia",
"hostname": "sa1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.61.253"
]
},
{
"vpn": "openvpn",
"region": "Singapore",
"hostname": "sg1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.31"
]
},
{
"vpn": "openvpn",
"region": "Slovakia",
"hostname": "sk1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.176.253"
]
},
{
"vpn": "openvpn",
"region": "Slovenia",
"hostname": "si1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.175.253"
]
},
{
"vpn": "openvpn",
"region": "South Korea",
"hostname": "kr1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.20.21"
]
},
{
"vpn": "openvpn",
"region": "Spain",
"hostname": "es1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.157.253"
]
},
{
"vpn": "openvpn",
"region": "Sweden",
"hostname": "se1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.159.253"
]
},
{
"vpn": "openvpn",
"region": "Switzerland",
"hostname": "ch1.vpn.giganews.com",
"udp": true,
"ips": [
"31.6.41.253"
]
},
{
"vpn": "openvpn",
"region": "Taiwan",
"hostname": "tw1.vpn.giganews.com",
"udp": true,
"ips": [
"69.167.32.253"
]
},
{
"vpn": "openvpn",
"region": "Thailand",
"hostname": "th1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.32"
]
},
{
"vpn": "openvpn",
"region": "Turkey",
"hostname": "tr1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.169.253"
]
},
{
"vpn": "openvpn",
"region": "USA Austin",
"hostname": "us3.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.28"
]
},
{
"vpn": "openvpn",
"region": "USA Chicago",
"hostname": "us6.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.22"
]
},
{
"vpn": "openvpn",
"region": "USA Los Angeles",
"hostname": "us1.vpn.giganews.com",
"udp": true,
"ips": [
"69.167.28.253"
]
},
{
"vpn": "openvpn",
"region": "USA Miami",
"hostname": "us4.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.16.31"
]
},
{
"vpn": "openvpn",
"region": "USA New York",
"hostname": "us5.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.32"
]
},
{
"vpn": "openvpn",
"region": "USA San Francisco",
"hostname": "us7.vpn.giganews.com",
"udp": true,
"ips": [
"69.167.29.253"
]
},
{
"vpn": "openvpn",
"region": "USA Seattle",
"hostname": "us8.vpn.giganews.com",
"udp": true,
"ips": [
"69.167.30.253"
]
},
{
"vpn": "openvpn",
"region": "USA Washington DC",
"hostname": "us2.vpn.giganews.com",
"udp": true,
"ips": [
"209.160.115.253"
]
},
{
"vpn": "openvpn",
"region": "Ukraine",
"hostname": "ua1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.172.253"
]
},
{
"vpn": "openvpn",
"region": "United Kingdom",
"hostname": "uk1.vpn.giganews.com",
"udp": true,
"ips": [
"178.208.168.253"
]
},
{
"vpn": "openvpn",
"region": "Uruguay",
"hostname": "uy1.vpn.giganews.com",
"udp": true,
"ips": [
"128.90.34.26"
]
},
{
"vpn": "openvpn",
"region": "Vietnam",
"hostname": "vn1.vpn.giganews.com",
"udp": true,
"ips": [
"216.168.18.33"
]
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,442 @@
{
"version": 1,
"timestamp": 1682032240,
"servers": [
{
"vpn": "openvpn",
"city": "Amsterdam",
"tcp": true,
"udp": true,
"ips": [
"37.48.94.1",
"37.48.94.1",
"37.48.94.1",
"95.211.95.233",
"85.17.28.145",
"95.168.167.236",
"85.17.64.131",
"95.211.95.244"
]
},
{
"vpn": "openvpn",
"city": "Basel",
"tcp": true,
"udp": true,
"ips": [
"82.199.134.162",
"82.199.134.162",
"82.199.134.162",
"80.255.7.66"
]
},
{
"vpn": "openvpn",
"city": "Belgrade",
"tcp": true,
"udp": true,
"ips": [
"152.89.160.98",
"152.89.160.98",
"152.89.160.98"
]
},
{
"vpn": "openvpn",
"city": "Berlin",
"tcp": true,
"udp": true,
"ips": [
"80.255.7.98",
"80.255.7.98",
"80.255.7.98"
]
},
{
"vpn": "openvpn",
"city": "Bucharest",
"tcp": true,
"udp": true,
"ips": [
"185.57.82.25",
"185.57.82.25",
"185.57.82.25"
]
},
{
"vpn": "openvpn",
"city": "Calais",
"tcp": true,
"udp": true,
"ips": [
"149.202.77.77",
"149.202.77.77",
"149.202.77.77"
]
},
{
"vpn": "openvpn",
"city": "Chicago",
"tcp": true,
"udp": true,
"ips": [
"104.237.193.26",
"104.237.193.26",
"104.237.193.26"
]
},
{
"vpn": "openvpn",
"city": "Copenhagen",
"tcp": true,
"udp": true,
"ips": [
"185.152.32.66",
"185.152.32.66",
"185.152.32.66"
]
},
{
"vpn": "openvpn",
"city": "Dallas",
"tcp": true,
"udp": true,
"ips": [
"138.128.136.164",
"138.128.136.164",
"138.128.136.164"
]
},
{
"vpn": "openvpn",
"city": "Erfurt",
"tcp": true,
"udp": true,
"ips": [
"217.114.218.18",
"217.114.218.18",
"217.114.218.18"
]
},
{
"vpn": "openvpn",
"city": "Frankfurt",
"tcp": true,
"udp": true,
"ips": [
"37.58.58.239",
"37.58.58.239",
"37.58.58.239",
"178.162.194.30"
]
},
{
"vpn": "openvpn",
"city": "Hamburg",
"tcp": true,
"udp": true,
"ips": [
"80.255.7.114",
"80.255.7.114",
"80.255.7.114"
]
},
{
"vpn": "openvpn",
"city": "Hongkong",
"tcp": true,
"udp": true,
"ips": [
"209.58.188.129",
"209.58.188.129",
"209.58.188.129"
]
},
{
"vpn": "openvpn",
"city": "Jerusalem",
"tcp": true,
"udp": true,
"ips": [
"82.81.85.231",
"82.81.85.231",
"82.81.85.231"
]
},
{
"vpn": "openvpn",
"city": "London",
"tcp": true,
"udp": true,
"ips": [
"82.199.130.34",
"82.199.130.34",
"82.199.130.34",
"5.187.21.98"
]
},
{
"vpn": "openvpn",
"city": "LosAngeles",
"tcp": true,
"udp": true,
"ips": [
"162.245.206.242",
"162.245.206.242",
"162.245.206.242"
]
},
{
"vpn": "openvpn",
"city": "Madrid",
"tcp": true,
"udp": true,
"ips": [
"185.183.106.146",
"185.183.106.146",
"185.183.106.146"
]
},
{
"vpn": "openvpn",
"city": "Malmoe",
"tcp": true,
"udp": true,
"ips": [
"194.68.170.51",
"194.68.170.51",
"194.68.170.51"
]
},
{
"vpn": "openvpn",
"city": "Manchester",
"tcp": true,
"udp": true,
"ips": [
"217.138.196.98",
"217.138.196.98",
"217.138.196.98"
]
},
{
"vpn": "openvpn",
"city": "Miami",
"tcp": true,
"udp": true,
"ips": [
"38.132.118.66",
"38.132.118.66",
"38.132.118.66"
]
},
{
"vpn": "openvpn",
"city": "Milan",
"tcp": true,
"udp": true,
"ips": [
"192.145.127.210",
"192.145.127.210",
"192.145.127.210"
]
},
{
"vpn": "openvpn",
"city": "Montreal",
"tcp": true,
"udp": true,
"ips": [
"167.114.209.103",
"167.114.209.103",
"167.114.209.103"
]
},
{
"vpn": "openvpn",
"city": "Moscow",
"tcp": true,
"udp": true,
"ips": [
"192.162.100.240",
"192.162.100.240",
"192.162.100.240"
]
},
{
"vpn": "openvpn",
"city": "NewYork",
"tcp": true,
"udp": true,
"ips": [
"96.9.246.194",
"96.9.246.194",
"96.9.246.194"
]
},
{
"vpn": "openvpn",
"city": "Nuremberg",
"tcp": true,
"udp": true,
"ips": [
"80.255.10.194",
"80.255.10.194",
"80.255.10.194",
"81.95.5.34"
]
},
{
"vpn": "openvpn",
"city": "Oslo",
"tcp": true,
"udp": true,
"ips": [
"91.205.187.186",
"91.205.187.186",
"91.205.187.186"
]
},
{
"vpn": "openvpn",
"city": "Paris",
"tcp": true,
"udp": true,
"ips": [
"5.135.143.84",
"5.135.143.84",
"5.135.143.84"
]
},
{
"vpn": "openvpn",
"city": "Prague",
"tcp": true,
"udp": true,
"ips": [
"195.138.249.2",
"195.138.249.2",
"195.138.249.2"
]
},
{
"vpn": "openvpn",
"city": "Reykjavik",
"tcp": true,
"udp": true,
"ips": [
"82.221.111.10",
"82.221.111.10",
"82.221.111.10"
]
},
{
"vpn": "openvpn",
"city": "Riga",
"tcp": true,
"udp": true,
"ips": [
"46.183.221.194",
"46.183.221.194",
"46.183.221.194"
]
},
{
"vpn": "openvpn",
"city": "Rotterdam",
"tcp": true,
"udp": true,
"ips": [
"31.204.150.106",
"31.204.150.106",
"31.204.150.106",
"31.204.150.138",
"31.204.152.189",
"31.204.152.102",
"31.204.153.106"
]
},
{
"vpn": "openvpn",
"city": "Singapore",
"tcp": true,
"udp": true,
"ips": [
"103.254.153.202",
"103.254.153.202",
"103.254.153.202",
"209.58.162.197"
]
},
{
"vpn": "openvpn",
"city": "Stockholm",
"tcp": true,
"udp": true,
"ips": [
"185.217.1.2",
"185.217.1.2",
"185.217.1.2",
"185.41.240.18"
]
},
{
"vpn": "openvpn",
"city": "Sydney",
"tcp": true,
"udp": true,
"ips": [
"66.203.112.47",
"66.203.112.47",
"66.203.112.47",
"66.203.112.50"
]
},
{
"vpn": "openvpn",
"city": "Tokyo",
"tcp": true,
"udp": true,
"ips": [
"31.204.145.166",
"31.204.145.166",
"31.204.145.166"
]
},
{
"vpn": "openvpn",
"city": "Vienna",
"tcp": true,
"udp": true,
"ips": [
"146.70.28.34",
"146.70.28.34",
"146.70.28.34"
]
},
{
"vpn": "openvpn",
"city": "Warsaw",
"tcp": true,
"udp": true,
"ips": [
"146.70.85.162",
"146.70.85.162",
"146.70.85.162"
]
},
{
"vpn": "openvpn",
"city": "Zurich",
"tcp": true,
"udp": true,
"ips": [
"37.120.213.210",
"37.120.213.210",
"37.120.213.210",
"152.89.162.226",
"37.120.213.194"
]
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+870
View File
@@ -0,0 +1,870 @@
{
"version": 4,
"timestamp": 1654006579,
"servers": [
{
"vpn": "openvpn",
"country": "Argentina",
"city": "BuenosAires",
"hostname": "ar-bue.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"181.119.160.59"
]
},
{
"vpn": "openvpn",
"country": "Australia",
"city": "Melbourne",
"hostname": "au-mel.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"103.231.88.203"
]
},
{
"vpn": "openvpn",
"country": "Australia",
"city": "Sydney1",
"hostname": "au-syd.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"143.244.63.96"
]
},
{
"vpn": "openvpn",
"country": "Austria",
"city": "Wien",
"hostname": "at-wie.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.9.19.91"
]
},
{
"vpn": "openvpn",
"country": "Belgium",
"city": "Brussels",
"hostname": "be-bru.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.104.186.211"
]
},
{
"vpn": "openvpn",
"country": "Brazil",
"city": "SaoPaulo",
"hostname": "br-sao.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.162.230.59"
]
},
{
"vpn": "openvpn",
"country": "Bulgaria",
"city": "Sofia",
"hostname": "bg-sof.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.94.192.163"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Montreal",
"hostname": "ca-mon.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"37.120.237.163",
"87.101.92.131"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Vancouver",
"hostname": "ca-van.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"74.3.160.19"
]
},
{
"vpn": "openvpn",
"country": "Chile",
"city": "Santiago",
"hostname": "cl-san.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"216.241.14.227"
]
},
{
"vpn": "openvpn",
"country": "Colombia",
"city": "Bogota",
"hostname": "ca-tor.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.148.7.3",
"45.148.7.6",
"45.148.7.8"
]
},
{
"vpn": "openvpn",
"country": "Colombia",
"city": "Bogota",
"hostname": "co-bog.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"201.217.220.27"
]
},
{
"vpn": "openvpn",
"country": "Costa Rica",
"city": "SanJose",
"hostname": "cr-san.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"190.10.8.218"
]
},
{
"vpn": "openvpn",
"country": "Croatia",
"city": "Zagreb",
"hostname": "hr-zag.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"85.10.56.127"
]
},
{
"vpn": "openvpn",
"country": "Cyprus",
"city": "Nicosia",
"hostname": "cy-nic.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.173.226.47"
]
},
{
"vpn": "openvpn",
"country": "Czech Republic",
"city": "Prague",
"hostname": "cz-pra.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.156.174.179"
]
},
{
"vpn": "openvpn",
"country": "Denmark",
"city": "Copenhagen",
"hostname": "dk-cop.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"62.115.255.188",
"62.115.255.189"
]
},
{
"vpn": "openvpn",
"country": "France",
"city": "Paris1",
"hostname": "fr-par.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"80.239.199.102",
"80.239.199.103",
"80.239.199.104",
"80.239.199.105"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"city": "Frankfurt1",
"hostname": "de-fra.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"193.180.119.130",
"193.180.119.131"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"city": "Nuremberg",
"hostname": "de-nur.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.89.36.3"
]
},
{
"vpn": "openvpn",
"country": "Greece",
"city": "Athens",
"hostname": "gr-ath.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"154.57.3.33"
]
},
{
"vpn": "openvpn",
"country": "Hong Kong",
"city": "HongKong",
"hostname": "hk-hon.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"84.17.37.58"
]
},
{
"vpn": "openvpn",
"country": "Hungary",
"city": "Budapest",
"hostname": "hu-bud.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.104.187.67"
]
},
{
"vpn": "openvpn",
"country": "Iceland",
"city": "Reykjavik",
"hostname": "is-rey.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"82.221.113.210"
]
},
{
"vpn": "openvpn",
"country": "Indonesia",
"city": "Jakarta",
"hostname": "id-jak.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"23.248.170.136"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"city": "Dublin",
"hostname": "ie-dub.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"217.138.222.67"
]
},
{
"vpn": "openvpn",
"country": "Isle of Man",
"city": "Ballasalla",
"hostname": "im-bal.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"81.27.96.89"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"city": "Milan",
"hostname": "it-mil.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.130.85.3",
"45.130.85.6",
"217.212.240.90",
"217.212.240.91",
"217.212.240.92",
"217.212.240.93"
]
},
{
"vpn": "openvpn",
"country": "Japan",
"city": "Tokyo1",
"hostname": "jp-tok.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"89.187.160.154",
"89.187.161.142"
]
},
{
"vpn": "openvpn",
"country": "Korea",
"city": "Seoul",
"hostname": "kr-seo.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"92.223.73.37"
]
},
{
"vpn": "openvpn",
"country": "Latvia",
"city": "Riga",
"hostname": "lv-rig.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"217.199.103.164"
]
},
{
"vpn": "openvpn",
"country": "Lithuania",
"city": "Siauliai",
"hostname": "lt-sia.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.64.104.48"
]
},
{
"vpn": "openvpn",
"country": "Luxembourg",
"city": "Steinsel",
"hostname": "lu-ste.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"94.242.250.71"
]
},
{
"vpn": "openvpn",
"country": "Malaysia",
"city": "KualaLumpur",
"hostname": "my-kua.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"128.1.160.184"
]
},
{
"vpn": "openvpn",
"country": "Mexico",
"city": "MexicoCity",
"hostname": "mx-mex.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"190.60.16.28"
]
},
{
"vpn": "openvpn",
"country": "Moldova",
"city": "Chisinau",
"hostname": "md-chi.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"178.17.172.99"
]
},
{
"vpn": "openvpn",
"country": "Netherlands",
"city": "Amsterdam1",
"hostname": "nl-ams.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"193.180.119.194",
"193.180.119.195",
"193.180.119.196",
"193.180.119.197"
]
},
{
"vpn": "openvpn",
"country": "New Zealand",
"city": "Auckland",
"hostname": "nz-auc.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.252.191.34"
]
},
{
"vpn": "openvpn",
"country": "Norway",
"city": "Oslo",
"hostname": "no-osl.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"91.205.186.26"
]
},
{
"vpn": "openvpn",
"country": "Panama",
"city": "PanamaCity",
"hostname": "pa-pan.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"200.110.155.235"
]
},
{
"vpn": "openvpn",
"country": "Peru",
"city": "Lima",
"hostname": "pe-lim.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"170.0.81.107"
]
},
{
"vpn": "openvpn",
"country": "Philippines",
"city": "Manila",
"hostname": "ph-man.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"128.1.209.12"
]
},
{
"vpn": "openvpn",
"country": "Poland",
"city": "Torun",
"hostname": "pl-tor.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"91.236.55.255",
"185.72.199.130"
]
},
{
"vpn": "openvpn",
"country": "Portugal",
"city": "Lisbon",
"hostname": "pt-lis.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"130.185.85.107"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"city": "Bukarest",
"hostname": "ro-buk.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"89.40.181.203"
]
},
{
"vpn": "openvpn",
"country": "Russian Federation",
"city": "Krasnoyarsk",
"hostname": "ru-kra.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"92.223.87.11"
]
},
{
"vpn": "openvpn",
"country": "Russian Federation",
"city": "Moscow",
"hostname": "ru-mos.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"92.223.103.138"
]
},
{
"vpn": "openvpn",
"country": "Russian Federation",
"city": "StPetersburg",
"hostname": "ru-pet.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"95.213.148.99"
]
},
{
"vpn": "openvpn",
"country": "Serbia",
"city": "Belgrade",
"hostname": "rs-bel.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"141.98.103.166"
]
},
{
"vpn": "openvpn",
"country": "Slovakia",
"city": "Bratislava",
"hostname": "sg-sin.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"143.244.33.81"
]
},
{
"vpn": "openvpn",
"country": "Slovakia",
"city": "Bratislava",
"hostname": "sk-bra.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"46.29.2.168"
]
},
{
"vpn": "openvpn",
"country": "South Africa",
"city": "Johannesburg",
"hostname": "za-joh.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"129.232.185.115",
"129.232.209.235"
]
},
{
"vpn": "openvpn",
"country": "Spain",
"city": "Madrid",
"hostname": "es-mad.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"217.212.244.92",
"217.212.244.93"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"city": "Gothenburg",
"hostname": "se-got.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"193.187.91.19",
"193.187.91.21"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"city": "Kista",
"hostname": "se-kis.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"193.187.88.216",
"193.187.88.217",
"193.187.88.218",
"193.187.88.219",
"193.187.88.220",
"193.187.88.221",
"193.187.88.222"
]
},
{
"country": "Sweden",
"city": "Stockholm",
"tcp": true,
"udp": true,
"ips": [
"193.180.119.2"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"city": "Stockholm",
"hostname": "se-sto.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.130.87.3",
"45.130.87.5",
"45.130.87.7",
"45.130.87.9",
"45.130.87.12",
"45.130.87.14",
"45.130.87.16",
"45.130.87.18"
]
},
{
"vpn": "openvpn",
"country": "Switzerland",
"city": "Zurich1",
"hostname": "ch-zur.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"217.212.245.92",
"217.212.245.93"
]
},
{
"vpn": "openvpn",
"country": "Taiwan",
"city": "Taipei",
"hostname": "tw-tai.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"2.58.241.51"
]
},
{
"vpn": "openvpn",
"country": "Thailand",
"city": "Bangkok",
"hostname": "th-ban.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"103.27.203.234"
]
},
{
"vpn": "openvpn",
"country": "Turkey",
"city": "Istanbul",
"hostname": "tr-ist.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"92.38.180.28"
]
},
{
"vpn": "openvpn",
"country": "Ukraine",
"city": "Kiev",
"hostname": "ua-kie.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"192.121.68.131"
]
},
{
"vpn": "openvpn",
"country": "Ukraine",
"city": "Nikolaev",
"hostname": "ua-nik.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"194.54.83.21"
]
},
{
"vpn": "openvpn",
"country": "United Arab Emirates",
"city": "Dubai",
"hostname": "ae-dub.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.9.249.59"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"city": "London2",
"hostname": "uk-lon2.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.41.242.67"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"city": "London7",
"hostname": "uk-lon7.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.125.204.179"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"city": "Manchester",
"hostname": "uk-man.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"185.206.227.181"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Atlanta",
"hostname": "us-atl.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"89.187.170.130",
"138.199.2.53"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Buffalo",
"hostname": "us-buf.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"172.245.13.115",
"192.210.199.35"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Dallas",
"hostname": "us-dal.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"89.187.164.97"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "LasVegas",
"hostname": "us-las.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"82.102.30.19"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Miami",
"hostname": "us-mia.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"195.181.163.139"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "NewYork1",
"hostname": "us-nyc.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"45.130.86.3",
"45.130.86.5",
"45.130.86.8",
"45.130.86.10",
"45.130.86.12"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Phoenix",
"hostname": "us-pho.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"82.102.30.131"
]
},
{
"vpn": "openvpn",
"country": "Vietnam",
"city": "HoChiMinhCity",
"hostname": "vn-hoc.pvdata.host",
"tcp": true,
"udp": true,
"ips": [
"210.2.64.5"
]
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
package servers
import (
"embed"
)
// Files contains all embedded provider JSON files shipped with this module.
//
//go:embed *.json
var Files embed.FS
+318
View File
@@ -0,0 +1,318 @@
{
"version": 1,
"timestamp": 1766608133,
"servers": [
{
"vpn": "openvpn",
"country": "Australia",
"region": "Oceania",
"city": "Sydney",
"hostname": "gw1.syd1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"163.47.126.10"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "North America",
"city": "Montreal",
"hostname": "gw1.yul1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"205.204.85.246"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "North America",
"city": "Toronto",
"hostname": "gw1.yyz1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"172.105.14.142"
]
},
{
"vpn": "openvpn",
"country": "France",
"region": "Europe",
"city": "Paris",
"hostname": "gw1.cdg1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"176.67.168.241"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"region": "Europe",
"city": "Frankfurt",
"hostname": "gw1.fra1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"139.162.159.184"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"region": "Europe",
"city": "Milan",
"hostname": "gw1.mxp1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"37.247.49.148"
]
},
{
"vpn": "openvpn",
"country": "Japan",
"region": "Asia",
"city": "Tokyo",
"hostname": "gw1.nrt1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"172.105.235.210"
]
},
{
"vpn": "openvpn",
"country": "Netherlands",
"region": "Europe",
"city": "Amsterdam",
"hostname": "gw2.ams3.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"151.236.14.57"
]
},
{
"vpn": "openvpn",
"country": "New Zealand",
"region": "Oceania",
"city": "Auckland",
"hostname": "gw1.akl1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"45.125.244.99"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"region": "Europe",
"city": "Bucharest",
"hostname": "gw1.buh2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"89.46.100.116"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"region": "Asia",
"city": "Singapore",
"hostname": "gw2.sin2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"139.162.55.80"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"region": "Europe",
"city": "Stockholm",
"hostname": "gw1.arn1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"178.73.210.224"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"region": "Europe",
"city": "London",
"hostname": "gw4.lhr1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"146.185.17.165"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"region": "Europe",
"city": "Manchester",
"hostname": "gw1.man2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"91.109.246.6"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Atlanta",
"hostname": "gw1.atl1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"216.119.148.130"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Boston",
"hostname": "gw1.bos1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"192.34.83.144"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Buffalo",
"hostname": "gw1.buf1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"23.94.191.122"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Chicago",
"hostname": "gw2.ord1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"174.127.124.132"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Columbus",
"hostname": "gw1.cmh1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"207.182.134.3"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Houston",
"hostname": "gw2.hou1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"162.218.229.130"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Kansas City",
"hostname": "gw1.mci2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"192.187.101.186"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Los Angeles",
"hostname": "gw1.lax2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"104.247.220.10"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "New York",
"hostname": "gw1.lga2.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"206.221.178.210"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Phoenix",
"hostname": "gw1.phx1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"198.15.118.139"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "Salt Lake City",
"hostname": "gw2.slc1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"209.95.48.179"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "North America",
"city": "St Louis",
"hostname": "gw1.stl1.slickvpn.com",
"tcp": true,
"udp": true,
"ips": [
"209.135.132.136"
]
}
]
}
File diff suppressed because it is too large Load Diff
+912
View File
@@ -0,0 +1,912 @@
{
"version": 3,
"timestamp": 1766454878,
"servers": [
{
"vpn": "openvpn",
"country": "Australia",
"city": "Sydney",
"hostname": "au.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"93.115.35.106",
"93.115.35.146",
"93.115.35.154",
"193.56.253.18",
"193.56.253.34",
"193.56.253.50",
"193.56.253.66",
"193.56.253.82",
"193.56.253.98",
"193.56.253.130",
"217.138.205.98",
"217.138.205.114",
"217.138.205.202",
"217.138.205.210",
"217.138.205.218"
]
},
{
"vpn": "openvpn",
"country": "Austria",
"hostname": "aus.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.155.2",
"37.120.155.10",
"37.120.155.18",
"37.120.155.26",
"37.120.155.34"
]
},
{
"vpn": "openvpn",
"country": "Belgium",
"hostname": "bg.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"89.249.73.130",
"89.249.73.250",
"185.232.21.34",
"185.232.21.42",
"185.232.21.210",
"185.232.21.242",
"185.232.21.250"
]
},
{
"vpn": "openvpn",
"country": "Brazil",
"hostname": "br.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.133.180.130",
"45.133.180.138",
"45.133.180.146",
"45.133.180.154",
"45.133.180.162"
]
},
{
"vpn": "openvpn",
"country": "Bulgaria",
"hostname": "bul.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"82.102.23.178",
"82.102.23.186",
"82.102.23.202"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Toronto",
"hostname": "ca.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.137.2",
"146.70.137.18",
"146.70.137.34",
"146.70.137.42",
"146.70.137.50",
"146.70.137.58",
"146.70.137.66",
"146.70.137.74",
"146.70.137.82",
"146.70.137.90",
"146.70.137.98",
"146.70.137.106",
"146.70.137.114",
"146.70.137.122",
"146.70.137.130",
"146.70.137.138",
"146.70.137.146",
"146.70.137.154",
"146.70.137.194",
"146.70.137.210",
"146.70.137.218",
"146.70.137.226"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Vancouver",
"hostname": "cavan.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"38.96.254.73",
"38.96.254.100",
"134.195.197.77",
"209.127.34.202"
]
},
{
"vpn": "openvpn",
"country": "Chile",
"hostname": "ch.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.235.52.19",
"37.235.52.64",
"193.235.146.104"
]
},
{
"vpn": "openvpn",
"country": "Czech",
"hostname": "cz.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"185.189.115.98",
"185.189.115.103",
"185.189.115.108",
"185.189.115.118"
]
},
{
"vpn": "openvpn",
"country": "Denmark",
"hostname": "dn.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"2.58.46.138",
"2.58.46.146",
"2.58.46.154",
"2.58.46.178",
"45.12.221.2",
"45.12.221.18",
"45.12.221.26",
"45.12.221.34",
"45.12.221.42",
"185.245.84.74"
]
},
{
"vpn": "openvpn",
"country": "Finland",
"hostname": "fn.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"91.132.197.186",
"91.132.197.188",
"91.132.197.192"
]
},
{
"vpn": "openvpn",
"country": "France",
"hostname": "fr.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.158.138",
"93.177.75.2",
"93.177.75.10",
"93.177.75.34",
"93.177.75.50",
"93.177.75.58",
"93.177.75.66",
"93.177.75.74",
"93.177.75.90",
"93.177.75.106",
"93.177.75.130",
"93.177.75.138",
"93.177.75.146",
"93.177.75.154",
"93.177.75.162",
"93.177.75.202"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"hostname": "ger.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"93.177.73.66",
"93.177.73.74",
"93.177.73.82",
"93.177.73.90",
"93.177.73.98",
"93.177.73.106",
"93.177.73.114",
"93.177.73.122",
"93.177.73.130",
"93.177.73.138",
"93.177.73.146",
"93.177.73.154",
"93.177.73.194",
"93.177.73.202",
"93.177.73.210",
"93.177.73.218",
"93.177.73.226",
"93.177.73.234"
]
},
{
"vpn": "openvpn",
"country": "Greece",
"hostname": "gre.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.92.33.2",
"45.92.33.10"
]
},
{
"vpn": "openvpn",
"country": "Hong",
"city": "Kong",
"hostname": "hk.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"89.45.6.218",
"89.45.6.226",
"89.45.6.234"
]
},
{
"vpn": "openvpn",
"country": "Hungary",
"hostname": "hg.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.144.98",
"37.120.144.106"
]
},
{
"vpn": "openvpn",
"country": "Iceland",
"hostname": "ice.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.133.192.226",
"45.133.192.230",
"45.133.192.234"
]
},
{
"vpn": "openvpn",
"country": "India",
"city": "Bangalore",
"hostname": "in.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.142.10",
"146.70.142.34",
"146.70.142.42"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"hostname": "ire.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"77.81.139.66",
"77.81.139.74",
"77.81.139.82"
]
},
{
"vpn": "openvpn",
"country": "Israel",
"hostname": "isr-loc1.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"185.191.204.154",
"185.191.204.155"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"hostname": "it.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.9.251.14",
"45.9.251.178",
"45.9.251.182",
"185.128.27.106",
"192.145.127.190"
]
},
{
"vpn": "openvpn",
"country": "Japan",
"hostname": "jp.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.76.58",
"146.70.76.66",
"146.70.76.74",
"146.70.76.90",
"146.70.76.98",
"146.70.76.106",
"146.70.76.114"
]
},
{
"vpn": "openvpn",
"country": "Luxembourg",
"hostname": "lux.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"5.253.204.58",
"5.253.204.66",
"5.253.204.74",
"5.253.204.82"
]
},
{
"vpn": "openvpn",
"country": "Mexico",
"hostname": "mx.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.133.180.2",
"45.133.180.10",
"45.133.180.18",
"45.133.180.26",
"45.133.180.34"
]
},
{
"vpn": "openvpn",
"country": "Moldova",
"hostname": "md.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"178.175.131.106",
"178.175.131.114",
"178.175.138.18"
]
},
{
"vpn": "openvpn",
"country": "Netherlands",
"hostname": "nl.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.238.130",
"77.243.189.194",
"77.243.189.234",
"86.106.20.98",
"89.238.177.26",
"95.174.67.90",
"95.174.67.130",
"95.174.67.138",
"95.174.67.234",
"95.174.67.242",
"139.28.217.82",
"139.28.217.178",
"139.28.217.186",
"139.28.217.210",
"139.28.217.218",
"139.28.217.242",
"185.156.172.146"
]
},
{
"vpn": "openvpn",
"country": "New",
"city": "Zealand",
"hostname": "nz.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"103.108.94.58",
"103.231.90.2",
"103.231.90.18",
"103.231.90.26",
"103.231.90.42",
"103.231.90.202"
]
},
{
"vpn": "openvpn",
"country": "Norway",
"hostname": "no.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"185.125.168.247",
"185.125.168.248",
"185.125.169.25",
"185.125.169.26",
"185.125.169.29",
"185.125.169.30",
"185.125.169.31",
"185.125.169.32",
"185.181.61.37",
"185.181.61.39"
]
},
{
"vpn": "openvpn",
"country": "Poland",
"hostname": "pl.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.156.170",
"37.120.156.178",
"37.120.156.186",
"37.120.156.194",
"37.120.156.202"
]
},
{
"vpn": "openvpn",
"country": "Portugal",
"hostname": "pg.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"94.46.179.70",
"94.46.179.80"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"hostname": "ro.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"31.14.252.90",
"31.14.252.146",
"31.14.252.178",
"89.40.71.106",
"89.46.103.106",
"93.120.27.162",
"185.45.15.106",
"194.59.248.202"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"hostname": "sg.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"82.102.25.2",
"91.245.253.134",
"91.245.253.138",
"92.119.178.22",
"92.119.178.26",
"185.200.116.250",
"185.200.117.142",
"185.200.117.186"
]
},
{
"vpn": "openvpn",
"country": "Slovakia",
"hostname": "slk.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"193.37.255.122",
"193.37.255.130",
"193.37.255.146"
]
},
{
"vpn": "openvpn",
"country": "South",
"city": "Korea",
"hostname": "sk.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"108.181.51.205",
"108.181.51.226"
]
},
{
"vpn": "openvpn",
"country": "Spain",
"hostname": "sp.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"89.238.178.206",
"89.238.178.234",
"192.145.124.226",
"192.145.124.230",
"192.145.124.234",
"192.145.124.242"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"hostname": "swe.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.153.2",
"37.120.153.7",
"37.120.153.12",
"37.120.153.22",
"37.120.153.27",
"37.120.153.32",
"37.120.153.37",
"37.120.153.42",
"37.120.153.47",
"37.120.153.57",
"37.120.153.67",
"37.120.153.72",
"37.120.153.77",
"37.120.153.82",
"37.120.153.92",
"37.120.153.97",
"37.120.153.102"
]
},
{
"vpn": "openvpn",
"country": "Switzerland",
"hostname": "swiss.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"185.236.201.210",
"185.236.201.215",
"195.206.105.2",
"195.206.105.7",
"195.206.105.12",
"195.206.105.17",
"195.206.105.22",
"195.206.105.27",
"195.206.105.32",
"195.206.105.37",
"195.206.105.42",
"195.206.105.47",
"195.206.105.52",
"195.206.105.57",
"217.138.203.242"
]
},
{
"vpn": "openvpn",
"country": "Taiwan",
"hostname": "tw.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.133.181.66"
]
},
{
"vpn": "openvpn",
"country": "Thailand",
"hostname": "th.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"202.129.16.42",
"202.129.16.106",
"202.129.16.140"
]
},
{
"vpn": "openvpn",
"country": "UAE",
"hostname": "uae.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"45.9.249.158",
"45.9.249.238",
"45.9.250.10"
]
},
{
"vpn": "openvpn",
"country": "UK",
"city": "London",
"hostname": "uk.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.198.162",
"146.70.83.130",
"146.70.83.146",
"146.70.83.154",
"146.70.83.162",
"146.70.83.170",
"146.70.83.178",
"146.70.83.186",
"146.70.83.194",
"146.70.83.202",
"146.70.83.210",
"146.70.83.218",
"146.70.83.226",
"146.70.83.234",
"146.70.83.242",
"146.70.83.250",
"185.253.98.42"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Atlanta",
"hostname": "us-atl.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.57.2",
"146.70.57.10",
"146.70.57.18",
"146.70.57.34",
"146.70.57.42",
"146.70.57.50",
"146.70.57.58",
"146.70.57.66",
"146.70.57.74"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Chicago",
"hostname": "us-chi-loc2.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"64.44.63.98",
"64.44.140.250",
"167.88.3.210",
"167.88.15.50"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Dallas",
"hostname": "us-dal.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.50.2",
"146.70.50.10",
"146.70.50.18",
"146.70.50.26",
"146.70.50.34",
"146.70.50.42",
"146.70.50.50",
"146.70.50.58",
"146.70.50.66",
"146.70.50.74",
"146.70.50.82",
"146.70.50.90",
"146.70.50.98",
"146.70.50.106",
"146.70.50.114",
"146.70.50.122",
"146.70.50.130",
"146.70.50.138",
"146.70.50.146",
"146.70.50.154",
"146.70.50.162",
"146.70.50.170",
"146.70.50.178",
"146.70.50.186",
"146.70.50.194"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Las Vegas",
"hostname": "us-lv.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.147.234",
"37.120.147.242",
"37.120.147.250",
"45.89.173.98",
"45.89.173.106",
"45.89.173.114",
"45.89.173.122",
"45.89.173.162",
"185.242.5.66",
"185.242.5.74",
"185.242.5.82",
"185.242.5.90",
"185.242.5.162",
"185.242.5.170",
"185.242.5.178",
"185.242.5.186"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Los Angeles",
"hostname": "us-la.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"37.120.147.130",
"37.120.214.114",
"37.120.214.122",
"91.219.212.242",
"139.28.216.74",
"139.28.216.218",
"146.70.49.2",
"146.70.49.10",
"146.70.49.18",
"146.70.49.26",
"146.70.49.34",
"146.70.49.42",
"146.70.49.58",
"146.70.49.66",
"146.70.49.74",
"146.70.49.98",
"146.70.49.106",
"185.253.161.186",
"217.138.217.2"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Miami",
"hostname": "us-fl.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.51.2",
"146.70.51.10",
"146.70.51.18",
"146.70.51.26",
"146.70.51.34",
"146.70.51.42",
"146.70.51.50",
"146.70.51.58",
"146.70.51.66",
"146.70.51.74",
"146.70.51.82",
"146.70.51.90",
"146.70.51.98",
"146.70.51.106",
"146.70.51.114",
"146.70.51.122",
"146.70.51.130",
"146.70.51.154",
"146.70.51.162",
"146.70.51.170",
"146.70.51.178"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "New Jersey",
"hostname": "us-nj.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.34.2",
"146.70.34.10",
"146.70.34.18",
"146.70.34.26",
"146.70.34.34",
"146.70.34.58",
"146.70.34.66",
"146.70.34.90",
"146.70.34.98",
"146.70.34.106",
"146.70.34.122",
"146.70.34.130",
"146.70.34.138",
"146.70.34.146",
"146.70.34.162",
"146.70.34.170",
"146.70.34.178",
"146.70.34.186",
"146.70.34.194"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "New York",
"hostname": "us-ny.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.115.218",
"146.70.215.18",
"146.70.215.26",
"146.70.215.34",
"146.70.215.42",
"146.70.215.50",
"146.70.215.58",
"193.148.18.242"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "San Francisco",
"hostname": "us-sf.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"143.198.101.109",
"167.99.103.222",
"167.99.171.156",
"206.189.64.126",
"206.189.169.41",
"206.189.208.52",
"206.189.208.113",
"206.189.214.46",
"206.189.214.52",
"206.189.218.112",
"206.189.218.114",
"206.189.218.238"
]
},
{
"vpn": "openvpn",
"country": "USA",
"city": "Seattle",
"hostname": "us-sa.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"64.44.90.170",
"64.44.90.178",
"64.44.90.186",
"107.175.82.7",
"107.175.82.35",
"107.175.82.106"
]
},
{
"vpn": "openvpn",
"country": "serbia",
"hostname": "serbia.torguard.com",
"tcp": true,
"udp": true,
"ips": [
"146.70.54.90"
]
}
]
}
@@ -0,0 +1,944 @@
{
"version": 1,
"timestamp": 1708534611,
"servers": [
{
"vpn": "openvpn",
"country": "Australia",
"city": "Sydney",
"hostname": "au-syd.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.79.239.47",
"139.99.130.220",
"139.99.131.38",
"170.64.132.24",
"170.64.132.105",
"170.64.132.155",
"170.64.132.164",
"170.64.132.166",
"170.64.132.168"
]
},
{
"vpn": "openvpn",
"country": "Austria",
"hostname": "at.vpnunlimitedapp.com",
"udp": true,
"ips": [
"50.7.115.19",
"95.164.36.217",
"95.164.36.221",
"95.164.36.222",
"95.164.36.223",
"176.120.65.51",
"176.120.65.52"
]
},
{
"vpn": "openvpn",
"country": "Belgium",
"hostname": "be.vpnunlimitedapp.com",
"udp": true,
"ips": [
"37.120.143.178"
]
},
{
"vpn": "openvpn",
"country": "Bosnia and Herzegovina",
"hostname": "ba.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.164.35.37"
]
},
{
"vpn": "openvpn",
"country": "Brazil",
"hostname": "br.vpnunlimitedapp.com",
"udp": true,
"ips": [
"216.238.105.38",
"216.238.111.125",
"216.238.116.106",
"216.238.117.122",
"216.238.117.129"
]
},
{
"vpn": "openvpn",
"country": "Bulgaria",
"hostname": "bg.vpnunlimitedapp.com",
"udp": true,
"ips": [
"77.91.100.3",
"77.91.100.61",
"77.91.100.173"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"hostname": "ca.vpnunlimitedapp.com",
"udp": true,
"ips": [
"192.99.6.164",
"192.99.6.166",
"192.99.7.170",
"192.99.14.158",
"192.99.37.199"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Toronto",
"hostname": "ca-tr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"104.254.90.34",
"104.254.90.58",
"162.253.131.106",
"184.75.213.42",
"184.75.213.50",
"184.75.213.194",
"204.187.100.82"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"city": "Vancouver",
"hostname": "ca-vn.vpnunlimitedapp.com",
"udp": true,
"ips": [
"162.221.202.17"
]
},
{
"vpn": "openvpn",
"country": "Costa Rica",
"hostname": "cr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"145.14.131.24",
"145.14.131.50",
"145.14.131.59",
"145.14.131.81",
"145.14.131.173",
"145.14.131.176",
"145.14.131.187",
"145.14.131.194"
]
},
{
"vpn": "openvpn",
"country": "Croatia",
"hostname": "hr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"85.10.51.3",
"85.10.56.3",
"85.10.56.4",
"85.10.56.100"
]
},
{
"vpn": "openvpn",
"country": "Cyprus",
"hostname": "cy.vpnunlimitedapp.com",
"udp": true,
"ips": [
"194.30.136.102",
"194.30.136.123"
]
},
{
"vpn": "openvpn",
"country": "Czech Republic",
"hostname": "cz.vpnunlimitedapp.com",
"udp": true,
"ips": [
"94.131.97.31",
"94.131.97.159",
"94.131.97.199",
"185.216.35.46"
]
},
{
"vpn": "openvpn",
"country": "Denmark",
"hostname": "dk.vpnunlimitedapp.com",
"udp": true,
"ips": [
"37.120.194.174",
"89.45.7.90",
"185.206.224.50"
]
},
{
"vpn": "openvpn",
"country": "Estonia",
"hostname": "ee.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.181.23.37",
"94.131.15.52",
"95.164.8.18"
]
},
{
"vpn": "openvpn",
"country": "Finland",
"hostname": "fi.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.159.249.138",
"45.159.249.162",
"45.159.249.205"
]
},
{
"vpn": "openvpn",
"country": "France",
"hostname": "fr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"51.159.99.123",
"62.210.38.83",
"62.210.132.5",
"62.210.132.12",
"62.210.188.244",
"62.210.204.161",
"62.210.206.27",
"62.210.207.15",
"195.154.166.20",
"195.154.169.66",
"195.154.199.175",
"195.154.204.36",
"195.154.221.54",
"195.154.222.168"
]
},
{
"vpn": "openvpn",
"country": "France",
"city": "Roubaix",
"hostname": "fr-rbx.vpnunlimitedapp.com",
"udp": true,
"ips": [
"51.255.71.16",
"147.135.137.107",
"151.80.27.199"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"city": "Düsseldorf",
"hostname": "de-dus.vpnunlimitedapp.com",
"udp": true,
"ips": [
"85.14.243.42",
"146.0.32.121",
"146.0.42.77"
]
},
{
"vpn": "openvpn",
"country": "Greece",
"hostname": "gr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"94.131.8.45",
"94.131.8.47"
]
},
{
"vpn": "openvpn",
"country": "Hungary",
"hostname": "hu.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.182.38.132",
"5.182.38.193",
"77.91.72.105"
]
},
{
"vpn": "openvpn",
"country": "Iceland",
"hostname": "is.vpnunlimitedapp.com",
"udp": true,
"ips": [
"91.194.161.20",
"91.194.161.21",
"91.194.161.22"
]
},
{
"vpn": "openvpn",
"country": "India",
"hostname": "in.vpnunlimitedapp.com",
"udp": true,
"ips": [
"162.218.95.14",
"198.145.227.50",
"198.145.227.51",
"198.145.227.52",
"198.145.227.53",
"198.145.227.54",
"198.145.227.55",
"198.145.227.56",
"198.145.227.57",
"198.145.227.58",
"198.145.227.59",
"198.145.227.60",
"198.145.227.61",
"198.145.227.62",
"198.145.227.63",
"198.145.227.64",
"198.145.227.65",
"198.145.227.66",
"198.145.227.67",
"198.145.227.68",
"198.145.227.69",
"198.145.227.70"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"city": "Dublin",
"hostname": "ie-dub.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.108.129.58",
"188.241.178.118",
"194.4.51.233",
"194.4.51.234",
"194.4.51.235"
]
},
{
"vpn": "openvpn",
"country": "Isle of Man",
"hostname": "im.vpnunlimitedapp.com",
"udp": true,
"ips": [
"37.235.55.14",
"37.235.55.45",
"37.235.55.57",
"37.235.55.62",
"37.235.55.68",
"37.235.55.240",
"192.71.211.15"
]
},
{
"vpn": "openvpn",
"country": "Israel",
"hostname": "il.vpnunlimitedapp.com",
"udp": true,
"ips": [
"91.225.218.142",
"91.225.218.143",
"91.225.218.144",
"193.182.144.23"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"city": "Milan",
"hostname": "it-mil.vpnunlimitedapp.com",
"udp": true,
"ips": [
"91.193.5.50"
]
},
{
"vpn": "openvpn",
"country": "Japan",
"hostname": "jp.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.76.49.6",
"45.76.220.224",
"66.42.38.10",
"85.208.110.122",
"107.191.60.241",
"108.160.139.177",
"139.162.125.238",
"139.180.197.252",
"139.180.206.179"
]
},
{
"vpn": "openvpn",
"country": "Korea",
"hostname": "kr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"141.164.34.194",
"141.164.39.45",
"158.247.213.101"
]
},
{
"vpn": "openvpn",
"country": "Kuala Lumpur",
"hostname": "mys.vpnunlimitedapp.com",
"udp": true,
"ips": [
"111.90.141.34"
]
},
{
"vpn": "openvpn",
"country": "Lithuania",
"hostname": "lt.vpnunlimitedapp.com",
"udp": true,
"ips": [
"94.131.14.222",
"94.131.14.223",
"94.131.14.224",
"94.131.14.225",
"94.131.14.226"
]
},
{
"vpn": "openvpn",
"country": "Mexico",
"hostname": "mx.vpnunlimitedapp.com",
"udp": true,
"ips": [
"216.238.66.6",
"216.238.66.40",
"216.238.69.229",
"216.238.72.203",
"216.238.73.64",
"216.238.73.252",
"216.238.75.254",
"216.238.76.115",
"216.238.77.95",
"216.238.78.81",
"216.238.79.163",
"216.238.79.200",
"216.238.80.169",
"216.238.81.55",
"216.238.82.61",
"216.238.83.73"
]
},
{
"vpn": "openvpn",
"country": "Moldova",
"hostname": "md.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.67.229.191",
"45.67.229.240"
]
},
{
"vpn": "openvpn",
"country": "Netherlands",
"hostname": "nl.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.32.236.232",
"50.7.176.51",
"50.7.176.116",
"82.196.12.12",
"95.85.21.9",
"95.85.21.11",
"95.85.21.12",
"95.85.21.13",
"95.179.150.23",
"199.247.27.95"
]
},
{
"vpn": "openvpn",
"country": "New Zealand",
"hostname": "nz.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.99.133.64",
"185.99.133.177"
]
},
{
"vpn": "openvpn",
"country": "Norway",
"hostname": "no.vpnunlimitedapp.com",
"udp": true,
"ips": [
"91.225.217.27",
"91.225.217.28",
"91.225.217.29",
"91.225.217.30",
"91.225.217.31"
]
},
{
"vpn": "openvpn",
"country": "Oman",
"hostname": "om.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.226.124.110"
]
},
{
"vpn": "openvpn",
"country": "Poland",
"hostname": "pl.vpnunlimitedapp.com",
"udp": true,
"ips": [
"37.120.156.234"
]
},
{
"vpn": "openvpn",
"country": "Portugal",
"hostname": "pt.vpnunlimitedapp.com",
"udp": true,
"ips": [
"94.131.10.98",
"94.131.10.99",
"94.131.10.100",
"94.131.10.101"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"hostname": "ro.vpnunlimitedapp.com",
"udp": true,
"ips": [
"77.81.98.70",
"185.144.83.11",
"185.144.83.13"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"hostname": "sg-free.vpnunlimitedapp.com",
"udp": true,
"free": true,
"ips": [
"178.128.48.177",
"178.128.117.139",
"188.166.177.236",
"206.189.80.158"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"hostname": "sg.vpnunlimitedapp.com",
"udp": true,
"ips": [
"139.99.62.61",
"143.198.207.137",
"143.198.207.145",
"143.198.207.218",
"143.198.208.19",
"143.198.208.211",
"143.198.212.21",
"143.198.216.60",
"143.198.216.119",
"143.198.216.142",
"143.198.216.213",
"159.65.0.220",
"159.223.48.163",
"159.223.63.231",
"159.223.85.125",
"159.223.91.73",
"174.138.22.2",
"174.138.24.49",
"178.128.85.6",
"178.128.107.38",
"209.97.161.18"
]
},
{
"vpn": "openvpn",
"country": "Slovakia",
"hostname": "sk.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.252.23.93",
"5.252.23.194",
"45.89.54.32",
"45.89.54.232",
"45.89.54.234"
]
},
{
"vpn": "openvpn",
"country": "Slovenia",
"hostname": "si.vpnunlimitedapp.com",
"udp": true,
"ips": [
"91.132.94.91",
"91.132.94.240",
"192.71.244.28",
"192.71.244.38"
]
},
{
"vpn": "openvpn",
"country": "South Africa",
"hostname": "za.vpnunlimitedapp.com",
"udp": true,
"ips": [
"129.232.129.157",
"129.232.130.179",
"129.232.130.186",
"129.232.130.187",
"129.232.133.41",
"129.232.134.122",
"129.232.219.195",
"129.232.219.196"
]
},
{
"vpn": "openvpn",
"country": "Spain",
"hostname": "es.vpnunlimitedapp.com",
"udp": true,
"ips": [
"65.20.97.197",
"176.120.74.254",
"185.231.204.2",
"185.231.204.4",
"185.231.204.9",
"185.231.204.14",
"185.231.204.16",
"208.85.19.114",
"208.85.21.129"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"hostname": "se.vpnunlimitedapp.com",
"udp": true,
"ips": [
"70.34.201.81",
"70.34.202.181",
"70.34.214.117",
"94.131.98.211",
"94.131.98.217",
"94.131.98.218",
"94.131.115.4",
"94.131.115.66"
]
},
{
"vpn": "openvpn",
"country": "Switzerland",
"hostname": "ch.vpnunlimitedapp.com",
"udp": true,
"ips": [
"94.131.12.81",
"94.131.12.83",
"94.131.12.90",
"94.131.12.96",
"94.131.12.104",
"94.131.12.116"
]
},
{
"vpn": "openvpn",
"country": "Thailand",
"hostname": "th.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.64.186.97"
]
},
{
"vpn": "openvpn",
"country": "Turkey",
"hostname": "tr.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.17.115.62",
"185.73.202.218",
"185.123.101.149"
]
},
{
"vpn": "openvpn",
"country": "United Arab Emirates",
"hostname": "ae.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.9.249.201",
"45.9.249.202",
"45.9.249.209",
"45.9.249.211",
"45.9.249.216",
"45.9.250.143",
"45.9.250.145",
"147.78.0.91",
"147.78.0.93"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"hostname": "uk.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.152.213.186",
"77.245.65.2",
"88.150.180.82",
"88.150.224.74",
"176.227.198.122"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"city": "London",
"hostname": "uk-cv.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.101.143.66",
"5.101.169.146",
"178.159.10.78"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"city": "London",
"hostname": "uk-lon.vpnunlimitedapp.com",
"udp": true,
"ips": [
"5.101.136.154",
"78.110.160.6"
]
},
{
"vpn": "openvpn",
"country": "United States",
"hostname": "us-stream.vpnunlimitedapp.com",
"udp": true,
"stream": true,
"ips": [
"64.227.111.143",
"128.199.9.51",
"138.197.203.142",
"143.110.156.9",
"143.110.225.79",
"159.89.128.183",
"161.35.236.242",
"164.90.144.44",
"165.227.49.171",
"167.99.96.113",
"178.128.79.75",
"192.241.194.208",
"198.199.96.52",
"198.199.97.247",
"198.199.103.88",
"198.199.103.243",
"198.199.105.87",
"198.199.114.155",
"206.189.165.44",
"206.189.211.205"
]
},
{
"vpn": "openvpn",
"country": "United States",
"hostname": "us.vpnunlimitedapp.com",
"udp": true,
"ips": [
"108.181.57.249",
"108.181.132.151",
"108.181.132.193",
"108.181.132.195",
"172.106.167.229",
"199.115.117.81"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Chicago",
"hostname": "us-chi.vpnunlimitedapp.com",
"udp": true,
"ips": [
"66.23.205.226",
"108.181.62.129",
"108.181.62.187",
"108.181.62.189",
"108.181.62.201"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Dallas",
"hostname": "us-dal.vpnunlimitedapp.com",
"udp": true,
"ips": [
"172.241.113.19",
"172.241.115.99"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Denver",
"hostname": "us-den.vpnunlimitedapp.com",
"udp": true,
"ips": [
"23.237.26.20",
"23.237.26.25",
"23.237.26.26",
"23.237.26.67",
"23.237.26.68",
"23.237.26.74"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Houston",
"hostname": "us-hou.vpnunlimitedapp.com",
"udp": true,
"ips": [
"66.187.75.122",
"162.218.228.194",
"162.218.228.196",
"162.218.229.106"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Las Vegas",
"hostname": "us-lv.vpnunlimitedapp.com",
"udp": true,
"ips": [
"185.242.5.18",
"185.242.5.22"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Los Angeles",
"hostname": "us-la.vpnunlimitedapp.com",
"udp": true,
"ips": [
"23.83.37.209",
"23.83.37.213",
"45.136.131.40",
"64.31.33.154",
"69.162.99.70"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Miami",
"hostname": "us-mia.vpnunlimitedapp.com",
"udp": true,
"ips": [
"45.32.174.147",
"45.77.74.249",
"45.77.95.122",
"45.77.161.227",
"45.77.165.103",
"45.77.196.77",
"140.82.29.71",
"144.202.44.138",
"144.202.44.229",
"149.28.111.111",
"207.246.75.109"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "New York",
"hostname": "us-ny-free.vpnunlimitedapp.com",
"udp": true,
"free": true,
"ips": [
"64.227.9.14",
"137.184.131.0",
"137.184.199.252",
"137.184.218.195",
"143.198.124.34"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "New York",
"hostname": "us-ny.vpnunlimitedapp.com",
"udp": true,
"ips": [
"23.105.134.162",
"64.42.178.202",
"64.42.178.226"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Salt Lake City",
"hostname": "us-slc.vpnunlimitedapp.com",
"udp": true,
"ips": [
"209.95.53.223",
"209.95.53.225"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "San Francisco",
"hostname": "us-sf.vpnunlimitedapp.com",
"udp": true,
"ips": [
"209.58.135.75",
"209.58.135.106",
"209.58.137.71"
]
},
{
"vpn": "openvpn",
"country": "United States",
"city": "Seattle",
"hostname": "us-sea.vpnunlimitedapp.com",
"udp": true,
"ips": [
"23.81.209.137",
"64.120.123.48",
"108.62.60.89",
"216.244.82.50"
]
},
{
"vpn": "openvpn",
"country": "Vietnam",
"hostname": "vn.vpnunlimitedapp.com",
"udp": true,
"ips": [
"146.196.67.7"
]
}
]
}
+752
View File
@@ -0,0 +1,752 @@
{
"version": 1,
"timestamp": 1766455077,
"servers": [
{
"vpn": "openvpn",
"country": "Australia",
"region": "New South Wales",
"city": "Sydney",
"hostname": "au1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"103.75.119.47"
]
},
{
"vpn": "openvpn",
"country": "Belgium",
"hostname": "be1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"87.98.252.127"
]
},
{
"vpn": "openvpn",
"country": "Brazil",
"region": "São Paulo",
"city": "São Paulo",
"hostname": "br1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"109.104.155.30"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "Quebec",
"city": "Montreal",
"hostname": "ca0.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"198.100.159.195"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "Quebec",
"city": "Montreal",
"hostname": "ca1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"149.56.46.132"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "Quebec",
"city": "Montreal",
"hostname": "ca2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"158.69.7.165"
]
},
{
"vpn": "openvpn",
"country": "Canada",
"region": "Quebec",
"city": "Montreal",
"hostname": "ca3.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"158.69.7.185"
]
},
{
"vpn": "openvpn",
"country": "Czech Republic",
"hostname": "cz1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"51.77.92.182"
]
},
{
"vpn": "openvpn",
"country": "France",
"hostname": "fr0.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"5.196.34.246"
]
},
{
"vpn": "openvpn",
"country": "France",
"region": "Flanders",
"city": "Antwerp",
"hostname": "fr2.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"5.135.35.186"
]
},
{
"vpn": "openvpn",
"country": "France",
"region": "Flanders",
"city": "Antwerp",
"hostname": "fr4.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"5.135.35.180"
]
},
{
"vpn": "openvpn",
"country": "France",
"region": "Hauts-de-France",
"city": "Roubaix",
"hostname": "fr1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"151.80.148.41"
]
},
{
"vpn": "openvpn",
"country": "France",
"region": "Hauts-de-France",
"city": "Roubaix",
"hostname": "fr3.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"151.80.148.150"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"hostname": "de1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"54.38.159.43"
]
},
{
"vpn": "openvpn",
"country": "Germany",
"hostname": "de2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"54.38.156.6"
]
},
{
"vpn": "openvpn",
"country": "Hong Kong",
"city": "Hong Kong",
"hostname": "hk1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"203.23.128.147"
]
},
{
"vpn": "openvpn",
"country": "India",
"hostname": "in1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"103.118.17.175"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"region": "Leinster",
"city": "Dublin",
"hostname": "ie1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"185.224.197.164"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"region": "Leinster",
"city": "Dublin",
"hostname": "ie2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"185.224.199.37"
]
},
{
"vpn": "openvpn",
"country": "Ireland",
"region": "Leinster",
"city": "Dublin",
"hostname": "ie3.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"185.224.196.102"
]
},
{
"vpn": "openvpn",
"country": "Israel",
"region": "Tel Aviv",
"city": "Tel Aviv",
"hostname": "il1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"83.229.71.19"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"hostname": "it1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"51.75.158.45"
]
},
{
"vpn": "openvpn",
"country": "Italy",
"region": "Lombardy",
"city": "Milan",
"hostname": "it2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"185.47.172.197"
]
},
{
"vpn": "openvpn",
"country": "Japan",
"region": "Tokyo",
"city": "Tokyo",
"hostname": "jp1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"103.106.228.223"
]
},
{
"vpn": "openvpn",
"country": "Lithuania",
"hostname": "lt1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"51.38.118.127"
]
},
{
"vpn": "openvpn",
"country": "Mexico",
"region": "Mexico City",
"city": "Mexico City",
"hostname": "mx1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"147.78.1.20"
]
},
{
"vpn": "openvpn",
"country": "Netherlands",
"region": "Île-de-France",
"city": "Paris",
"hostname": "nl1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"51.158.252.2"
]
},
{
"vpn": "openvpn",
"country": "Poland",
"region": "Lower Silesia",
"city": "Wroclaw",
"hostname": "pl1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"87.98.234.252"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"region": "Central Macedonia",
"city": "Thessaloniki",
"hostname": "ro1.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"154.43.62.84"
]
},
{
"vpn": "openvpn",
"country": "Romania",
"region": "Central Macedonia",
"city": "Thessaloniki",
"hostname": "ro2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"154.43.62.85"
]
},
{
"vpn": "openvpn",
"country": "Russia",
"hostname": "ru1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"192.144.37.45"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"city": "Singapore",
"hostname": "sg0.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"216.107.138.208"
]
},
{
"vpn": "openvpn",
"country": "Singapore",
"city": "Singapore",
"hostname": "sg1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"216.107.138.209"
]
},
{
"vpn": "openvpn",
"country": "Spain",
"hostname": "es1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"51.77.89.153"
]
},
{
"vpn": "openvpn",
"country": "Spain",
"region": "Madrid",
"city": "Madrid",
"hostname": "es2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"103.241.67.200"
]
},
{
"vpn": "openvpn",
"country": "Sweden",
"region": "Jönköping",
"city": "Jönköping",
"hostname": "se1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"79.136.1.90"
]
},
{
"vpn": "openvpn",
"country": "Switzerland",
"region": "Zurich",
"city": "Zurich",
"hostname": "ch1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"37.143.131.123"
]
},
{
"vpn": "openvpn",
"country": "Ukraine",
"region": "Kyiv City",
"city": "Kyiv",
"hostname": "ua1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"139.28.38.117"
]
},
{
"vpn": "openvpn",
"country": "Ukraine",
"region": "Kyiv City",
"city": "Kyiv",
"hostname": "ua2.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"139.28.39.103"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"hostname": "uk3.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"51.75.161.116"
]
},
{
"vpn": "openvpn",
"country": "United Kingdom",
"region": "England",
"city": "Erith",
"hostname": "uk2.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"154.41.135.18"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "California",
"city": "Los Angeles",
"hostname": "us11.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"162.251.167.66"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "California",
"city": "Los Angeles",
"hostname": "us12.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"162.251.167.67"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "California",
"city": "Los Angeles",
"hostname": "us13.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"162.251.167.68"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "California",
"city": "Los Angeles",
"hostname": "us14.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"162.251.167.69"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "California",
"city": "Los Angeles",
"hostname": "us15.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"162.251.167.70"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Missouri",
"city": "Kansas City",
"hostname": "us21.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"109.104.152.183"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "New York",
"city": "New York",
"hostname": "us1.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"172.96.166.26"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "New York",
"city": "New York",
"hostname": "us2.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"172.96.166.27"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "New York",
"city": "New York",
"hostname": "us3.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"172.96.166.28"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "New York",
"city": "New York",
"hostname": "us4.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"172.96.166.29"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "New York",
"city": "New York",
"hostname": "us5.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"172.96.166.30"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Oregon",
"city": "Hillsboro",
"hostname": "us10.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"15.204.48.101"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Oregon",
"city": "Hillsboro",
"hostname": "us6.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"51.81.186.71"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Oregon",
"city": "Hillsboro",
"hostname": "us7.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"15.204.48.98"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Oregon",
"city": "Hillsboro",
"hostname": "us8.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"15.204.48.99"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Oregon",
"city": "Hillsboro",
"hostname": "us9.isponeder.com",
"tcp": true,
"udp": true,
"ips": [
"15.204.48.100"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Virginia",
"city": "Reston",
"hostname": "us16.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"15.204.172.7"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Virginia",
"city": "Reston",
"hostname": "us17.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"15.204.178.212"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Virginia",
"city": "Reston",
"hostname": "us18.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"15.204.178.213"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Virginia",
"city": "Reston",
"hostname": "us19.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"15.204.178.214"
]
},
{
"vpn": "openvpn",
"country": "United States",
"region": "Virginia",
"city": "Reston",
"hostname": "us20.isponeder.com",
"tcp": true,
"udp": true,
"premium": true,
"ips": [
"15.204.178.215"
]
}
]
}
+663
View File
@@ -0,0 +1,663 @@
{
"version": 3,
"timestamp": 1709814473,
"servers": [
{
"vpn": "openvpn",
"region": "Algeria",
"hostname": "dz1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.104.254"
]
},
{
"vpn": "openvpn",
"region": "Argentina",
"hostname": "ar1.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.19"
]
},
{
"vpn": "openvpn",
"region": "Australia Melbourne",
"hostname": "au2.vyprvpn.com",
"udp": true,
"ips": [
"64.253.88.19"
]
},
{
"vpn": "openvpn",
"region": "Australia Perth",
"hostname": "au3.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.19"
]
},
{
"vpn": "openvpn",
"region": "Australia Sydney",
"hostname": "au1.vyprvpn.com",
"udp": true,
"ips": [
"64.253.88.18"
]
},
{
"vpn": "openvpn",
"region": "Austria",
"hostname": "at1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.148.254"
]
},
{
"vpn": "openvpn",
"region": "Bahrain",
"hostname": "bh1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.63.254"
]
},
{
"vpn": "openvpn",
"region": "Belgium",
"hostname": "be1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.145.254"
]
},
{
"vpn": "openvpn",
"region": "Brazil",
"hostname": "br1.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.20"
]
},
{
"vpn": "openvpn",
"region": "Bulgaria",
"hostname": "bg1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.167.254"
]
},
{
"vpn": "openvpn",
"region": "Canada",
"hostname": "ca1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.33"
]
},
{
"vpn": "openvpn",
"region": "Columbia",
"hostname": "co1.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.21"
]
},
{
"vpn": "openvpn",
"region": "Costa Rica",
"hostname": "cr1.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.22"
]
},
{
"vpn": "openvpn",
"region": "Czech Republic",
"hostname": "cz1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.164.254"
]
},
{
"vpn": "openvpn",
"region": "Denmark",
"hostname": "dk1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.154.254"
]
},
{
"vpn": "openvpn",
"region": "Dubai",
"hostname": "ae1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.101.254"
]
},
{
"vpn": "openvpn",
"region": "Egypt",
"hostname": "eg1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.10.254"
]
},
{
"vpn": "openvpn",
"region": "El Salvador",
"hostname": "sv1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.20"
]
},
{
"vpn": "openvpn",
"region": "Finland",
"hostname": "fi1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.166.254"
]
},
{
"vpn": "openvpn",
"region": "France",
"hostname": "fr1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.141.254"
]
},
{
"vpn": "openvpn",
"region": "Germany",
"hostname": "de1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.128.254"
]
},
{
"vpn": "openvpn",
"region": "Greece",
"hostname": "gr1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.11.254"
]
},
{
"vpn": "openvpn",
"region": "Hong Kong",
"hostname": "hk1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.36"
]
},
{
"vpn": "openvpn",
"region": "Iceland",
"hostname": "is1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.17.254"
]
},
{
"vpn": "openvpn",
"region": "India",
"hostname": "in1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.60.254"
]
},
{
"vpn": "openvpn",
"region": "Indonesia",
"hostname": "id1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.20"
]
},
{
"vpn": "openvpn",
"region": "Ireland",
"hostname": "ie1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.19.254"
]
},
{
"vpn": "openvpn",
"region": "Israel",
"hostname": "il1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.59.254"
]
},
{
"vpn": "openvpn",
"region": "Italy",
"hostname": "it1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.161.254"
]
},
{
"vpn": "openvpn",
"region": "Japan",
"hostname": "jp1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.113.18"
]
},
{
"vpn": "openvpn",
"region": "Latvia",
"hostname": "lv1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.174.254"
]
},
{
"vpn": "openvpn",
"region": "Liechtenstein",
"hostname": "li1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.177.254"
]
},
{
"vpn": "openvpn",
"region": "Lithuania",
"hostname": "lt1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.173.254"
]
},
{
"vpn": "openvpn",
"region": "Luxembourg",
"hostname": "lu1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.165.254"
]
},
{
"vpn": "openvpn",
"region": "Macao",
"hostname": "mo1.vyprvpn.com",
"udp": true,
"ips": [
"69.167.31.254"
]
},
{
"vpn": "openvpn",
"region": "Malaysia",
"hostname": "my1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.21"
]
},
{
"vpn": "openvpn",
"region": "Maldives",
"hostname": "mv1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.26"
]
},
{
"vpn": "openvpn",
"region": "Marshall Islands",
"hostname": "mh1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.25"
]
},
{
"vpn": "openvpn",
"region": "Mexico",
"hostname": "mx1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.23"
]
},
{
"vpn": "openvpn",
"region": "Netherlands",
"hostname": "eu1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.135.254"
]
},
{
"vpn": "openvpn",
"region": "New Zealand",
"hostname": "nz1.vyprvpn.com",
"udp": true,
"ips": [
"64.253.88.20"
]
},
{
"vpn": "openvpn",
"region": "Norway",
"hostname": "no1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.163.254"
]
},
{
"vpn": "openvpn",
"region": "Pakistan",
"hostname": "pk1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.58.254"
]
},
{
"vpn": "openvpn",
"region": "Panama",
"hostname": "pa1.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.23"
]
},
{
"vpn": "openvpn",
"region": "Philippines",
"hostname": "ph1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.22"
]
},
{
"vpn": "openvpn",
"region": "Poland",
"hostname": "pl1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.170.254"
]
},
{
"vpn": "openvpn",
"region": "Portugal",
"hostname": "pt1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.168.254"
]
},
{
"vpn": "openvpn",
"region": "Qatar",
"hostname": "qa1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.62.254"
]
},
{
"vpn": "openvpn",
"region": "Romania",
"hostname": "ro1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.171.254"
]
},
{
"vpn": "openvpn",
"region": "Russia",
"hostname": "ru1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.151.254"
]
},
{
"vpn": "openvpn",
"region": "Saudi Arabia",
"hostname": "sa1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.61.254"
]
},
{
"vpn": "openvpn",
"region": "Singapore",
"hostname": "sg1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.18"
]
},
{
"vpn": "openvpn",
"region": "Slovakia",
"hostname": "sk1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.176.254"
]
},
{
"vpn": "openvpn",
"region": "Slovenia",
"hostname": "si1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.175.254"
]
},
{
"vpn": "openvpn",
"region": "South Korea",
"hostname": "kr1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.113.19"
]
},
{
"vpn": "openvpn",
"region": "Spain",
"hostname": "es1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.157.254"
]
},
{
"vpn": "openvpn",
"region": "Sweden",
"hostname": "se1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.159.254"
]
},
{
"vpn": "openvpn",
"region": "Switzerland",
"hostname": "ch1.vyprvpn.com",
"udp": true,
"ips": [
"31.6.41.254"
]
},
{
"vpn": "openvpn",
"region": "Taiwan",
"hostname": "tw1.vyprvpn.com",
"udp": true,
"ips": [
"69.167.32.254"
]
},
{
"vpn": "openvpn",
"region": "Thailand",
"hostname": "th1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.23"
]
},
{
"vpn": "openvpn",
"region": "Turkey",
"hostname": "tr1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.169.254"
]
},
{
"vpn": "openvpn",
"region": "USA Austin",
"hostname": "us3.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.27"
]
},
{
"vpn": "openvpn",
"region": "USA Chicago",
"hostname": "us6.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.21"
]
},
{
"vpn": "openvpn",
"region": "USA Los Angeles",
"hostname": "us1.vyprvpn.com",
"udp": true,
"ips": [
"69.167.28.254"
]
},
{
"vpn": "openvpn",
"region": "USA Miami",
"hostname": "us4.vyprvpn.com",
"udp": true,
"ips": [
"216.168.16.18"
]
},
{
"vpn": "openvpn",
"region": "USA New York",
"hostname": "us5.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.31"
]
},
{
"vpn": "openvpn",
"region": "USA San Francisco",
"hostname": "us7.vyprvpn.com",
"udp": true,
"ips": [
"69.167.29.254"
]
},
{
"vpn": "openvpn",
"region": "USA Seattle",
"hostname": "us8.vyprvpn.com",
"udp": true,
"ips": [
"69.167.30.254"
]
},
{
"vpn": "openvpn",
"region": "USA Washington DC",
"hostname": "us2.vyprvpn.com",
"udp": true,
"ips": [
"209.160.115.254"
]
},
{
"vpn": "openvpn",
"region": "Ukraine",
"hostname": "ua1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.172.254"
]
},
{
"vpn": "openvpn",
"region": "United Kingdom",
"hostname": "uk1.vyprvpn.com",
"udp": true,
"ips": [
"178.208.168.254"
]
},
{
"vpn": "openvpn",
"region": "Uruguay",
"hostname": "uy1.vyprvpn.com",
"udp": true,
"ips": [
"128.90.34.25"
]
},
{
"vpn": "openvpn",
"region": "Vietnam",
"hostname": "vn1.vyprvpn.com",
"udp": true,
"ips": [
"209.99.1.24"
]
}
]
}
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -3,7 +3,6 @@ module github.com/qdm12/gluetun
go 1.25.0
require (
github.com/ProtonMail/go-srp v0.0.7
github.com/amnezia-vpn/amneziawg-go v0.2.16
github.com/breml/rootcerts v0.3.4
github.com/fatih/color v1.18.0
@@ -37,6 +36,7 @@ require (
require (
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect
github.com/ProtonMail/go-crypto v1.3.0-proton // indirect
github.com/ProtonMail/go-srp v0.0.7
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
@@ -54,6 +54,7 @@ require (
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.60.1 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/qdm12/gluetun-servers v0.1.0
github.com/qdm12/goservices v0.1.1-0.20251104135713-6bee97bd4978 // indirect
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect
golang.org/x/crypto v0.48.0 // indirect
@@ -66,3 +67,5 @@ require (
kernel.org/pub/linux/libs/security/libcap/cap v1.2.70 // indirect
kernel.org/pub/linux/libs/security/libcap/psx v1.2.70 // indirect
)
replace github.com/qdm12/gluetun-servers => ./gluetun-servers
+2 -6
View File
@@ -1,11 +1,7 @@
package cli
type CLI struct {
repoServersPath string
}
type CLI struct{}
func New() *CLI {
return &CLI{
repoServersPath: "./internal/storage/servers.json",
}
return &CLI{}
}
+2 -5
View File
@@ -9,9 +9,7 @@ import (
"path/filepath"
"strings"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/storage"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
@@ -74,10 +72,9 @@ func (c *CLI) FormatServers(args []string) error {
}
}
logger := newNoopLogger()
storage, err := storage.New(logger, constants.ServersData)
storage, err := setupStorage(newNoopLogger())
if err != nil {
return fmt.Errorf("creating servers storage: %w", err)
return fmt.Errorf("setting up storage: %w", err)
}
formatted, err := storage.Format(providerToFormat, format)
+39
View File
@@ -0,0 +1,39 @@
package cli
import (
"fmt"
"github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/configuration/sources/files"
"github.com/qdm12/gluetun/internal/configuration/sources/secrets"
"github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gosettings/reader"
"github.com/qdm12/gosettings/reader/sources/env"
)
type storageSetupLogger interface {
storage.Logger
files.Warner
}
func setupStorage(logger storageSetupLogger) (s *storage.Storage, err error) {
settingsReader := reader.New(reader.Settings{
Sources: []reader.Source{
secrets.New(logger),
files.New(logger),
env.New(env.Settings{}),
},
})
var settings settings.Storage
err = settings.Read(settingsReader)
if err != nil {
return nil, fmt.Errorf("reading storage settings: %w", err)
}
settings.SetDefaults()
storage, err := storage.New(logger, *settings.ServersPath,
*settings.LegacyServersFilepath)
if err != nil {
return nil, fmt.Errorf("creating storage: %w", err)
}
return storage, nil
}
+4 -2
View File
@@ -6,5 +6,7 @@ func newNoopLogger() *noopLogger {
return new(noopLogger)
}
func (l *noopLogger) Info(string) {}
func (l *noopLogger) Warn(string) {}
func (l *noopLogger) Info(string) {}
func (l *noopLogger) Infof(string, ...any) {}
func (l *noopLogger) Warn(string) {}
func (l *noopLogger) Warnf(string, ...any) {}
+2 -4
View File
@@ -9,12 +9,10 @@ import (
"time"
"github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/netlink"
"github.com/qdm12/gluetun/internal/openvpn/extract"
"github.com/qdm12/gluetun/internal/provider"
"github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/gosettings/reader"
)
@@ -49,9 +47,9 @@ type IPv6Checker interface {
func (c *CLI) OpenvpnConfig(logger OpenvpnConfigLogger, reader *reader.Reader,
ipv6Checker IPv6Checker,
) error {
storage, err := storage.New(logger, constants.ServersData)
storage, err := setupStorage(newNoopLogger())
if err != nil {
return err
return fmt.Errorf("setting up storage: %w", err)
}
var allSettings settings.Settings
+15 -24
View File
@@ -13,12 +13,10 @@ import (
"github.com/qdm12/dns/v2/pkg/doh"
dnsprovider "github.com/qdm12/dns/v2/pkg/provider"
"github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/openvpn/extract"
"github.com/qdm12/gluetun/internal/provider"
"github.com/qdm12/gluetun/internal/publicip/api"
"github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/gluetun/internal/updater/unzip"
@@ -26,18 +24,19 @@ import (
type UpdaterLogger interface {
Info(s string)
Infof(format string, args ...any)
Warn(s string)
Warnf(format string, args ...any)
Error(s string)
}
func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) error {
options := settings.Updater{}
var endUserMode, maintainerMode, updateAll bool
// TODO v4: remove flags below already present in standard settings
var endUserMode, maintainerMode string
var updateAll bool
var dnsServer, csvProviders, ipToken, protonUsername, protonEmail, protonPassword string
flagSet := flag.NewFlagSet("update", flag.ExitOnError)
flagSet.BoolVar(&endUserMode, "enduser", false, "Write results to /gluetun/servers.json (for end users)")
flagSet.BoolVar(&maintainerMode, "maintainer", false,
"Write results to ./internal/storage/servers.json to modify the program (for maintainers)")
flagSet.StringVar(&dnsServer, "dns", "", "no longer used, your DNS will use DoH with Cloudflare and Google")
const defaultMinRatio = 0.8
flagSet.Float64Var(&options.MinRatio, "minratio", defaultMinRatio,
@@ -49,16 +48,19 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e
"(Retro-compatibility) Username to use to authenticate with Proton. Use -proton-email instead.") // v4 remove this
flagSet.StringVar(&protonEmail, "proton-email", "", "Email to use to authenticate with Proton")
flagSet.StringVar(&protonPassword, "proton-password", "", "Password to use to authenticate with Proton")
flagSet.StringVar(&endUserMode, "enduser", "", "deprecated")
flagSet.StringVar(&maintainerMode, "maintainer", "", "deprecated")
if err := flagSet.Parse(args); err != nil {
return err
}
if dnsServer != "" {
switch {
case dnsServer != "":
logger.Warn("The -dns flag is no longer used, your DNS will use DoH with Cloudflare and Google")
}
if !endUserMode && !maintainerMode {
return errors.New("at least one of -enduser or -maintainer must be specified")
case endUserMode != "":
logger.Warn("The -enduser flag is now unused")
case maintainerMode != "":
logger.Warn("The -maintainer flag is now unused")
}
if updateAll {
@@ -87,11 +89,7 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e
return fmt.Errorf("options validation failed: %w", err)
}
serversDataPath := constants.ServersData
if maintainerMode {
serversDataPath = ""
}
storage, err := storage.New(logger, serversDataPath)
storage, err := setupStorage(logger)
if err != nil {
return fmt.Errorf("creating servers storage: %w", err)
}
@@ -127,18 +125,11 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e
providers := provider.NewProviders(storage, time.Now, logger, httpClient,
unzipper, parallelResolver, ipFetcher, openvpnFileExtractor, options)
updater := updater.New(httpClient, storage, providers, logger)
updater := updater.New(httpClient, storage, providers, logger, *options.PreferDirectDownload)
err = updater.UpdateServers(ctx, options.Providers, options.MinRatio)
if err != nil {
return fmt.Errorf("updating server information: %w", err)
}
if maintainerMode {
err := storage.FlushToFile(c.repoServersPath)
if err != nil {
return fmt.Errorf("writing servers data to embedded JSON file: %w", err)
}
}
return nil
}
+2 -2
View File
@@ -132,7 +132,7 @@ func (s *Settings) SetDefaults() {
s.IPv6.setDefaults()
s.PublicIP.setDefaults()
s.Shadowsocks.setDefaults()
s.Storage.setDefaults()
s.Storage.SetDefaults()
s.System.setDefaults()
s.Version.setDefaults()
s.VPN.setDefaults()
@@ -213,7 +213,7 @@ func (s *Settings) Read(r *reader.Reader, warner Warner) (err error) {
return s.PublicIP.read(r, warner)
},
"shadowsocks": s.Shadowsocks.read,
"storage": s.Storage.read,
"storage": s.Storage.Read,
"system": s.System.read,
"updater": s.Updater.read,
"version": s.Version.read,
@@ -90,7 +90,7 @@ func Test_Settings_String(t *testing.T) {
| Logging: yes
| Authentication file path: /gluetun/auth/config.toml
Storage settings:
| Filepath: /gluetun/servers.json
| Servers directory path: /gluetun/servers/
OS Alpine settings:
| Process UID: 1000
| Process GID: 1000
+42 -14
View File
@@ -4,6 +4,7 @@ import (
"fmt"
"path/filepath"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gosettings"
"github.com/qdm12/gosettings/reader"
"github.com/qdm12/gotree"
@@ -11,15 +12,25 @@ import (
// Storage contains settings to configure the storage.
type Storage struct {
// Filepath is the path to the servers.json file. An empty string disables on-disk storage.
Filepath *string
// ServersPath is the path to the servers files directory.
// An empty string disables on-disk storage.
ServersPath *string
// LegacyServersFilepath is the legacy "fat" JSON filepath to migrate from.
// TODO v4: remove
LegacyServersFilepath *string
}
func (s Storage) validate() (err error) {
if *s.Filepath != "" { // optional
_, err := filepath.Abs(*s.Filepath)
if *s.ServersPath != "" { // optional
_, err := filepath.Abs(*s.ServersPath)
if err != nil {
return fmt.Errorf("filepath is not valid: %w", err)
return fmt.Errorf("servers path is not valid: %w", err)
}
}
if *s.LegacyServersFilepath != "" {
_, err := filepath.Abs(*s.LegacyServersFilepath)
if err != nil {
return fmt.Errorf("legacy servers filepath is not valid: %w", err)
}
}
return nil
@@ -27,17 +38,20 @@ func (s Storage) validate() (err error) {
func (s *Storage) copy() (copied Storage) {
return Storage{
Filepath: gosettings.CopyPointer(s.Filepath),
ServersPath: gosettings.CopyPointer(s.ServersPath),
LegacyServersFilepath: gosettings.CopyPointer(s.LegacyServersFilepath),
}
}
func (s *Storage) overrideWith(other Storage) {
s.Filepath = gosettings.OverrideWithPointer(s.Filepath, other.Filepath)
s.ServersPath = gosettings.OverrideWithPointer(s.ServersPath, other.ServersPath)
s.LegacyServersFilepath = gosettings.OverrideWithPointer(s.LegacyServersFilepath, other.LegacyServersFilepath)
}
func (s *Storage) setDefaults() {
const defaultFilepath = "/gluetun/servers.json"
s.Filepath = gosettings.DefaultPointer(s.Filepath, defaultFilepath)
func (s *Storage) SetDefaults() {
const defaultServersPath = "/gluetun/servers/"
s.ServersPath = gosettings.DefaultPointer(s.ServersPath, defaultServersPath)
s.LegacyServersFilepath = gosettings.DefaultPointer(s.LegacyServersFilepath, constants.ServersDataLegacy)
}
func (s Storage) String() string {
@@ -45,15 +59,29 @@ func (s Storage) String() string {
}
func (s Storage) toLinesNode() (node *gotree.Node) {
if *s.Filepath == "" {
if *s.ServersPath == "" {
return gotree.New("Storage settings: disabled")
}
node = gotree.New("Storage settings:")
node.Appendf("Filepath: %s", *s.Filepath)
node.Appendf("Servers directory path: %s", *s.ServersPath)
if *s.LegacyServersFilepath != constants.ServersDataLegacy {
node.Appendf("Legacy servers filepath: %s", *s.LegacyServersFilepath)
}
return node
}
func (s *Storage) read(r *reader.Reader) (err error) {
s.Filepath = r.Get("STORAGE_FILEPATH", reader.AcceptEmpty(true))
func (s *Storage) Read(r *reader.Reader) (err error) {
// Retro-compatibility:
// TODO v4: remove support for STORAGE_FILEPATH
filePath := r.Get("STORAGE_FILEPATH", reader.AcceptEmpty(true), reader.IsRetro("STORAGE_SERVERS_DIRECTORY_PATH"))
if filePath != nil {
s.LegacyServersFilepath = filePath
if *filePath == "" {
s.ServersPath = ptrTo("") // skip disk operations
}
}
if s.ServersPath == nil {
s.ServersPath = r.Get("STORAGE_SERVERS_DIRECTORY_PATH", reader.AcceptEmpty(true))
}
return nil
}
+17 -5
View File
@@ -29,6 +29,9 @@ type Updater struct {
// Providers is the list of VPN service providers
// to update server information for.
Providers []string
// PreferDirectDownload is whether to prefer direct download of
// server data from Github (recommended).
PreferDirectDownload *bool
// ProtonEmail is the email to authenticate with the Proton API.
ProtonEmail *string
// ProtonPassword is the password to authenticate with the Proton API.
@@ -72,11 +75,12 @@ func (u Updater) Validate() (err error) {
func (u *Updater) copy() (copied Updater) {
return Updater{
Period: gosettings.CopyPointer(u.Period),
MinRatio: u.MinRatio,
Providers: gosettings.CopySlice(u.Providers),
ProtonEmail: gosettings.CopyPointer(u.ProtonEmail),
ProtonPassword: gosettings.CopyPointer(u.ProtonPassword),
Period: gosettings.CopyPointer(u.Period),
MinRatio: u.MinRatio,
Providers: gosettings.CopySlice(u.Providers),
PreferDirectDownload: gosettings.CopyPointer(u.PreferDirectDownload),
ProtonEmail: gosettings.CopyPointer(u.ProtonEmail),
ProtonPassword: gosettings.CopyPointer(u.ProtonPassword),
}
}
@@ -87,6 +91,7 @@ func (u *Updater) overrideWith(other Updater) {
u.Period = gosettings.OverrideWithPointer(u.Period, other.Period)
u.MinRatio = gosettings.OverrideWithComparable(u.MinRatio, other.MinRatio)
u.Providers = gosettings.OverrideWithSlice(u.Providers, other.Providers)
u.PreferDirectDownload = gosettings.OverrideWithPointer(u.PreferDirectDownload, other.PreferDirectDownload)
u.ProtonEmail = gosettings.OverrideWithPointer(u.ProtonEmail, other.ProtonEmail)
u.ProtonPassword = gosettings.OverrideWithPointer(u.ProtonPassword, other.ProtonPassword)
}
@@ -104,6 +109,7 @@ func (u *Updater) SetDefaults(vpnProvider string) {
}
// Set these to empty strings to avoid nil pointer panics
u.PreferDirectDownload = gosettings.DefaultPointer(u.PreferDirectDownload, false)
u.ProtonEmail = gosettings.DefaultPointer(u.ProtonEmail, "")
u.ProtonPassword = gosettings.DefaultPointer(u.ProtonPassword, "")
}
@@ -121,6 +127,7 @@ func (u Updater) toLinesNode() (node *gotree.Node) {
node.Appendf("Update period: %s", *u.Period)
node.Appendf("Minimum ratio: %.1f", u.MinRatio)
node.Appendf("Providers to update: %s", strings.Join(u.Providers, ", "))
node.Appendf("Prefer direct download: %s", gosettings.BoolToYesNo(u.PreferDirectDownload))
if slices.Contains(u.Providers, providers.Protonvpn) {
node.Appendf("Proton API email: %s", *u.ProtonEmail)
node.Appendf("Proton API password: %s", gosettings.ObfuscateKey(*u.ProtonPassword))
@@ -142,6 +149,11 @@ func (u *Updater) read(r *reader.Reader) (err error) {
u.Providers = r.CSV("UPDATER_VPN_SERVICE_PROVIDERS")
u.PreferDirectDownload, err = r.BoolPtr("UPDATER_PREFER_DIRECT_DOWNLOAD")
if err != nil {
return err
}
u.ProtonEmail = r.Get("UPDATER_PROTONVPN_EMAIL")
if u.ProtonEmail == nil {
protonUsername := r.String("UPDATER_PROTONVPN_USERNAME", reader.IsRetro("UPDATER_PROTONVPN_EMAIL"))
+2 -2
View File
@@ -1,6 +1,6 @@
package constants
const (
// ServersData is the server information filepath.
ServersData = "/gluetun/servers.json"
// ServersDataLegacy is the old server information filepath.
ServersDataLegacy = "/gluetun/servers.json"
)
+2
View File
@@ -154,6 +154,8 @@ func (a *AllServers) Count() (count int) {
type Servers struct {
Version uint16 `json:"version"`
Timestamp int64 `json:"timestamp"`
Preferred bool `json:"preferred,omitempty"`
Filepath string `json:"filepath,omitempty"`
Servers []Server `json:"servers,omitempty"`
}
+60 -27
View File
@@ -2,6 +2,7 @@ package storage
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sort"
@@ -9,44 +10,76 @@ import (
"github.com/qdm12/gluetun/internal/models"
)
// FlushToFile flushes the merged servers data to the file
// specified by path, as indented JSON.
func (s *Storage) FlushToFile(path string) error {
s.mergedMutex.RLock()
defer s.mergedMutex.RUnlock()
// flushToFile flushes the merged servers data to files
// using the manifest file path given. It is not thread-safe.
func (s *Storage) flushToFile(manifestPath string) error {
const (
filePermission = 0o644
dirPermission = 0o755
)
return s.flushToFile(path)
}
// flushToFile flushes the merged servers data to the file
// specified by path, as indented JSON. It is not thread-safe.
func (s *Storage) flushToFile(path string) error {
if path == "" {
return nil // no file to write to
}
const permission = 0o644
dirPath := filepath.Dir(path)
if err := os.MkdirAll(dirPath, permission); err != nil {
return err
serversDirectoryPath := filepath.Dir(manifestPath)
if err := os.MkdirAll(serversDirectoryPath, dirPermission); err != nil {
return fmt.Errorf("creating directory: %w", err)
}
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, permission)
for provider, providerServers := range s.mergedServers.ProviderToServers {
providerFilepath := providerServers.Filepath
if providerFilepath == "" {
providerFilepath = filepath.Join(serversDirectoryPath, provider+".json")
}
providerDirectoryPath := filepath.Dir(providerFilepath)
if err := os.MkdirAll(providerDirectoryPath, dirPermission); err != nil {
return fmt.Errorf("creating directory: %w", err)
}
}
metadata := map[string]any{"version": s.mergedServers.Version}
for provider, providerServers := range s.mergedServers.ProviderToServers {
sort.Sort(models.SortableServers(providerServers.Servers))
providerFilepath := providerServers.Filepath
if providerFilepath == "" {
providerFilepath = filepath.Join(serversDirectoryPath, provider+".json")
}
providerFile, err := os.OpenFile(providerFilepath,
os.O_CREATE|os.O_WRONLY|os.O_TRUNC, filePermission)
if err != nil {
return fmt.Errorf("opening servers data file for %s: %w", provider, err)
}
encoder := json.NewEncoder(providerFile)
encoder.SetIndent("", " ")
err = encoder.Encode(providerServers)
if err != nil {
_ = providerFile.Close()
return fmt.Errorf("encoding servers data for %s: %w", provider, err)
}
err = providerFile.Close()
if err != nil {
return fmt.Errorf("closing servers data file for %s: %w", provider, err)
}
metadata[provider] = map[string]string{"filepath": providerFilepath}
}
serversFile, err := os.OpenFile(manifestPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, filePermission)
if err != nil {
return err
}
encoder := json.NewEncoder(file)
encoder := json.NewEncoder(serversFile)
encoder.SetIndent("", " ")
for _, obj := range s.mergedServers.ProviderToServers {
sort.Sort(models.SortableServers(obj.Servers))
}
err = encoder.Encode(&s.mergedServers)
err = encoder.Encode(metadata)
if err != nil {
_ = file.Close()
_ = serversFile.Close()
return err
}
return file.Close()
return serversFile.Close()
}
+34 -3
View File
@@ -3,19 +3,50 @@ package storage
import (
"embed"
"encoding/json"
"fmt"
"path"
serversmodule "github.com/qdm12/gluetun-servers/pkg/servers"
"github.com/qdm12/gluetun/internal/models"
)
//go:embed servers.json
var allServersEmbedFS embed.FS
func parseHardcodedServers() (allServers models.AllServers, err error) {
func parseHardcodedServers() (allServers models.AllServers) {
f, err := allServersEmbedFS.Open("servers.json")
if err != nil {
return allServers, err
panic(err)
}
defer f.Close() // no-op
decoder := json.NewDecoder(f)
err = decoder.Decode(&allServers)
return allServers, err
if err != nil {
panic("decoding servers.json: " + err.Error())
}
for provider, metadata := range allServers.ProviderToServers {
filename := path.Base(metadata.Filepath)
providerFile, err := serversmodule.Files.Open(filename)
if err != nil {
panic(fmt.Sprintf("reading embedded provider file %s for %s: %s", filename, provider, err))
}
defer providerFile.Close() // no-op
var providerServers models.Servers
decoder := json.NewDecoder(providerFile)
err = decoder.Decode(&providerServers)
if err != nil {
panic(fmt.Sprintf("JSON decoding embedded provider file %s for %s: %s",
filename, provider, err))
} else if providerServers.Filepath != "" {
panic(fmt.Sprintf("embedded provider file %s for %s should not have filepath set",
filename, provider))
}
providerServers.Filepath = metadata.Filepath // inherit filepath from servers.json
allServers.ProviderToServers[provider] = providerServers
}
return allServers
}
+40 -3
View File
@@ -1,9 +1,13 @@
package storage
import (
"encoding/json"
"path"
"testing"
"github.com/qdm12/gluetun-servers/pkg/servers"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -11,9 +15,10 @@ import (
func Test_parseHardcodedServers(t *testing.T) {
t.Parallel()
servers, err := parseHardcodedServers()
require.NoError(t, err)
var servers models.AllServers
assert.NotPanics(t, func() {
servers = parseHardcodedServers()
})
// all providers minus custom
allProviders := providers.All()
@@ -24,3 +29,35 @@ func Test_parseHardcodedServers(t *testing.T) {
assert.NotEmptyf(t, servers, "for provider %s", provider)
}
}
func Test_parseHardcodedServers_filepathsAndEmbeddedProviderFiles(t *testing.T) {
t.Parallel()
hardcodedServers := parseHardcodedServers()
allProviders := providers.All()
for _, provider := range allProviders {
providerServers, ok := hardcodedServers.ProviderToServers[provider]
require.Truef(t, ok, "for provider %s", provider)
require.NotEmptyf(t, providerServers.Filepath,
"embedded servers filepath should be set for provider %s", provider)
filename := path.Base(providerServers.Filepath)
file, err := servers.Files.Open(filename)
require.NoErrorf(t, err, "opening embedded provider file for %s", provider)
var fileServers struct {
Version uint16 `json:"version"`
Timestamp int64 `json:"timestamp"`
Servers []json.RawMessage `json:"servers"`
}
err = json.NewDecoder(file).Decode(&fileServers)
require.NoErrorf(t, err, "decoding embedded provider file for %s", provider)
require.NoError(t, file.Close())
assert.NotZerof(t, fileServers.Version, "for provider %s", provider)
assert.NotZerof(t, fileServers.Timestamp, "for provider %s", provider)
assert.NotEmptyf(t, fileServers.Servers, "for provider %s", provider)
}
}
+14
View File
@@ -30,6 +30,20 @@ func (s *Storage) mergeServers(hardcoded, persisted models.AllServers) models.Al
func (s *Storage) mergeProviderServers(provider string,
hardcoded, persisted models.Servers,
) (merged models.Servers) {
if persisted.Preferred && persisted.Version != hardcoded.Version {
s.logger.Warn(fmt.Sprintf(
"persisted preferred %s servers are discarded because they have version %d and hardcoded servers have version %d",
provider, persisted.Version, hardcoded.Version))
}
// If persisted data is marked as preferred, use it regardless of timestamp
// (as long as versions match)
if persisted.Preferred && persisted.Version == hardcoded.Version && len(persisted.Servers) > 0 {
s.logger.Info(fmt.Sprintf(
"Using %s servers from file (marked as preferred)", provider))
return persisted
}
nowTimestamp := time.Now().Unix()
if persisted.Timestamp > nowTimestamp {
s.logger.Warn(fmt.Sprintf(
+17
View File
@@ -45,6 +45,23 @@ func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0)
}
// Infof mocks base method.
func (m *MockLogger) Infof(arg0 string, arg1 ...interface{}) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0}
for _, a := range arg1 {
varargs = append(varargs, a)
}
m.ctrl.Call(m, "Infof", varargs...)
}
// Infof indicates an expected call of Infof.
func (mr *MockLoggerMockRecorder) Infof(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Infof", reflect.TypeOf((*MockLogger)(nil).Infof), varargs...)
}
// Warn mocks base method.
func (m *MockLogger) Warn(arg0 string) {
m.ctrl.T.Helper()
+23 -303854
View File
File diff suppressed because it is too large Load Diff
-3
View File
@@ -3,7 +3,6 @@ package updater
import (
"context"
"github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/provider"
)
@@ -16,8 +15,6 @@ type Storage interface {
SetServers(provider string, servers []models.Server) (err error)
GetServersCount(provider string) (count int)
ServersAreEqual(provider string, servers []models.Server) (equal bool)
// Extra methods to match the provider.New storage interface
FilterServers(provider string, selection settings.ServerSelection) (filtered []models.Server, err error)
}
type Unzipper interface {
+1 -1
View File
@@ -50,7 +50,7 @@ func NewLoop(settings settings.Updater, providers updater.Providers,
status: constants.Stopped,
settings: settings,
},
updater: updater.New(client, storage, providers, logger),
updater: updater.New(client, storage, providers, logger, *settings.PreferDirectDownload),
logger: logger,
start: make(chan struct{}),
running: make(chan models.LoopStatus),
+36 -7
View File
@@ -5,6 +5,8 @@ import (
"encoding/json"
"errors"
"fmt"
"net/url"
"path"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/provider/common"
@@ -16,18 +18,35 @@ type Provider interface {
}
func (u *Updater) updateProvider(ctx context.Context, provider Provider,
minRatio float64,
manifest manifest, minRatio float64,
) (err error) {
providerName := provider.Name()
existingServersCount := u.storage.GetServersCount(providerName)
minServers := int(minRatio * float64(existingServersCount))
servers, err := provider.FetchServers(ctx, minServers)
if err != nil {
if errors.Is(err, common.ErrNotEnoughServers) {
u.logger.Warn("note: if running the update manually, you can use the flag " +
"-minratio to allow the update to succeed with less servers found")
var servers []models.Server
if manifest.providerToFilepath == nil {
servers, err = provider.FetchServers(ctx, minServers)
if err != nil {
if errors.Is(err, common.ErrNotEnoughServers) {
u.logger.Warn("note: if running the update manually, you can use the flag " +
"-minratio to allow the update to succeed with less servers found")
}
return fmt.Errorf("getting %s servers: %w", providerName, err)
}
} else {
providerFilepath := manifest.providerToFilepath[providerName]
providerFileURL := buildProviderFileURL(providerName, providerFilepath)
var data models.Servers
err = u.fetchJSON(ctx, providerFileURL, &data)
if err != nil {
return fmt.Errorf("downloading provider file %s: %w", providerFileURL, err)
}
if len(servers) < minServers {
return fmt.Errorf("provider %s has not enough servers from downloaded file: got %d and expected at least %d",
providerName, len(servers), minServers)
}
return fmt.Errorf("getting %s servers: %w", providerName, err)
}
for _, server := range servers {
@@ -55,3 +74,13 @@ func (u *Updater) updateProvider(ctx context.Context, provider Provider,
}
return nil
}
func buildProviderFileURL(providerName, filePath string) (providerFileURL string) {
filename := path.Base(filePath)
if filename == "." || filename == "/" || filename == "" {
filename = providerName + ".json"
}
const serversFilesBaseURL = "https://raw.githubusercontent.com/qdm12/gluetun-servers/main/pkg/servers/"
return serversFilesBaseURL + url.PathEscape(filename)
}
+81 -9
View File
@@ -2,10 +2,15 @@ package updater
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"strings"
"time"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/provider/common"
"github.com/qdm12/gluetun/internal/updater/unzip"
"golang.org/x/text/cases"
@@ -13,7 +18,8 @@ import (
)
type Updater struct {
providers Providers
providers Providers
preferDirectDownload bool
// state
storage Storage
@@ -26,22 +32,31 @@ type Updater struct {
}
func New(httpClient *http.Client, storage Storage,
providers Providers, logger Logger,
providers Providers, logger Logger, preferDirectDownload bool,
) *Updater {
unzipper := unzip.New(httpClient)
return &Updater{
providers: providers,
storage: storage,
logger: logger,
timeNow: time.Now,
client: httpClient,
unzipper: unzipper,
providers: providers,
storage: storage,
logger: logger,
timeNow: time.Now,
client: httpClient,
unzipper: unzipper,
preferDirectDownload: preferDirectDownload,
}
}
func (u *Updater) UpdateServers(ctx context.Context, providers []string,
minRatio float64,
) (err error) {
var manifest manifest
if u.preferDirectDownload {
manifest, err = u.fetchManifest(ctx)
if err != nil {
return fmt.Errorf("fetching remote manifest: %w", err)
}
}
caser := cases.Title(language.English)
for _, providerName := range providers {
u.logger.Info("updating " + caser.String(providerName) + " servers...")
@@ -49,7 +64,7 @@ func (u *Updater) UpdateServers(ctx context.Context, providers []string,
fetcher := u.providers.Get(providerName)
// TODO support servers offering only TCP or only UDP
// for NordVPN and PureVPN
err := u.updateProvider(ctx, fetcher, minRatio)
err := u.updateProvider(ctx, fetcher, manifest, minRatio)
switch {
case err == nil:
continue
@@ -70,3 +85,60 @@ func (u *Updater) UpdateServers(ctx context.Context, providers []string,
return nil
}
type manifest struct {
providerToFilepath map[string]string
}
func (u *Updater) fetchManifest(ctx context.Context) (m manifest, err error) {
const serversManifestURL = "https://raw.githubusercontent.com/qdm12/gluetun-servers/main/pkg/servers/manifest.json"
var raw map[string]json.RawMessage
err = u.fetchJSON(ctx, serversManifestURL, &raw)
if err != nil {
return m, err
}
providerNames := providers.All()
m.providerToFilepath = make(map[string]string, len(providerNames))
for _, name := range providerNames {
var metadata struct {
Filepath string `json:"filepath"`
}
err = json.Unmarshal(raw[name], &metadata)
if err != nil {
return m, fmt.Errorf("decoding manifest metadata for %s: %w", name, err)
} else if metadata.Filepath == "" {
return m, fmt.Errorf("manifest missing filepath for provider %s", name)
}
m.providerToFilepath[name] = metadata.Filepath
}
return m, nil
}
func (u *Updater) fetchJSON(ctx context.Context, rawURL string, dst any) (err error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil)
if err != nil {
return fmt.Errorf("creating request: %w", err)
}
response, err := u.client.Do(req)
if err != nil {
return fmt.Errorf("doing request: %w", err)
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
const limit = 10 * 1024 * 1024 // 10 MiB
body, _ := io.ReadAll(io.LimitReader(response.Body, limit))
return fmt.Errorf("HTTP status code %d for %s: %s",
response.StatusCode, rawURL, strings.TrimSpace(string(body)))
}
err = json.NewDecoder(response.Body).Decode(dst)
if err != nil {
return fmt.Errorf("decoding response body: %w", err)
}
return nil
}