mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-22 10:26:26 +02:00
reviewed
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
module github.com/qdm12/gluetun-servers
|
||||
|
||||
go 1.25.0
|
||||
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,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
@@ -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
@@ -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
|
||||
@@ -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
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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{}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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) {}
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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 {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user