Filter Privado servers by hostnames only

This commit is contained in:
Quentin McGaw
2020-11-09 23:17:22 +00:00
parent f1e4b9937b
commit 40ed070f21
12 changed files with 222 additions and 289 deletions

View File

@@ -208,8 +208,7 @@ docker run --rm --network=container:gluetun alpine:3.12 wget -qO- https://ipinfo
| --- | --- | --- | --- | | --- | --- | --- | --- |
| 🏁 `USER` | | | Your username | | 🏁 `USER` | | | Your username |
| 🏁 `PASSWORD` | | | Your password | | 🏁 `PASSWORD` | | | Your password |
| `CITY` | | One of the Privado city codes, i.e. `ams` | VPN server city | | `HOSTNAME` | | [One of the Privado hostname](internal/constants/privado.go#L26), i.e. `ams-001.vpn.privado.io` | VPN server hostname |
| `SERVER_NUMBER` | | Server integer number | Optional server number. For example `2` for `sof-002` |
### DNS over TLS ### DNS over TLS

View File

@@ -11,11 +11,11 @@ const (
PrivadoCertificate = "MIIFKDCCAxCgAwIBAgIJAMtrmqZxIV/OMA0GCSqGSIb3DQEBDQUAMBIxEDAOBgNVBAMMB1ByaXZhZG8wHhcNMjAwMTA4MjEyODQ1WhcNMzUwMTA5MjEyODQ1WjASMRAwDgYDVQQDDAdQcml2YWRvMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPwOgiwNJzZTnKIXwAB0TSu/Lu2qt2U2I8obtQjwhi/7OrfmbmYykSdro70al2XPhnwAGGdCxW6LDnp0UN/IOhD11mgBPo14f5CLkBQjSJ6VN5miPbvK746LsNZl9H8rQGvDuPo4CG9BfPZMiDRGlsMxij/jztzgT1gmuxQ7WHfFRcNzBas1dHa9hV/d3TU6/t47x4SE/ljdcCtJiu7Zn6ODKQoys3mB7Luz2ngqUJWvkqsg+E4+3eJ0M8Hlbn5TPaRJBID7DAdYo6Vs6xGCYr981ThFcmoIQ10js10yANrrfGAzd03b3TnLAgko0uQMHjliMZL6L8sWOPHxyxJI0us88SFh4UgcFyRHKHPKux7w24SxAlZUYoUcTHp9VjG5XvDKYxzgV2RdM4ulBGbQRQ3y3/CyddsyQYMvA55Ets0LfPaBvDIcct70iXijGsdvlX1du3ArGpG7Vaje/RU4nbbGT6HYRdt5YyZfof288ukMOSj20nVcmS+c/4tqsxSerRb1aq5LOi1IemSkTMeC5gCbexk+L1vl7NT/58sxjGmu5bXwnvev/lIItfi2AlITrfUSEv19iDMKkeshwn/+sFJBMWYyluP+yJ56yR+MWoXvLlSWphLDTqq19yx3BZn0P1tgbXoR0g8PTdJFcz8z3RIb7myVLYulV1oGG/3rka0CAwEAAaOBgDB+MB0GA1UdDgQWBBTFtJkZCVDuDAD6k5bJzefjJdO3DTBCBgNVHSMEOzA5gBTFtJkZCVDuDAD6k5bJzefjJdO3DaEWpBQwEjEQMA4GA1UEAwwHUHJpdmFkb4IJAMtrmqZxIV/OMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBDQUAA4ICAQB7MUSXMeBb9wlSv4sUaT1JHEwE26nlBw+TKmezfuPU5pBlY0LYr6qQZY95DHqsRJ7ByUzGUrGo17dNGXlcuNc6TAaQQEDRPo6y+LVh2TWMk15TUMI+MkqryJtCret7xGvDigKYMJgBy58HN3RAVr1B7cL9youwzLgc2Y/NcFKvnQJKeiIYAJ7g0CcnJiQvgZTS7xdwkEBXfsngmUCIG320DLPEL+Ze0HiUrxwWljMRya6i40AeH3Zu2i532xX1wV5+cjA4RJWIKg6ri/Q54iFGtZrA9/nc6y9uoQHkmz8cGyVUmJxFzMrrIICVqUtVRxLhkTMe4UzwRWTBeGgtW4tS0yq1QonAKfOyjgRw/CeY55D2UGvnAFZdTadtYXS4Alu2P9zdwoEk3fzHiVmDjqfJVr5wz9383aABUFrPI3nz6ed/Z6LZflKh1k+DUDEp8NxU4klUULWsSOKoa5zGX51G8cdHxwQLImXvtGuN5eSR8jCTgxFZhdps/xes4KkyfIz9FMYG748M+uOTgKITf4zdJ9BAyiQaOufVQZ8WjhWzWk9YHec9VqPkzpWNGkVjiRI5ewuXwZzZ164tMv2hikBXSuUCnFz37/ZNwGlDi0oBdDszCk2GxccdFHHaCSmpjU5MrdJ+5IhtTKGeTx+US2hTIVHQFIO99DmacxSYvLNcSQ==" PrivadoCertificate = "MIIFKDCCAxCgAwIBAgIJAMtrmqZxIV/OMA0GCSqGSIb3DQEBDQUAMBIxEDAOBgNVBAMMB1ByaXZhZG8wHhcNMjAwMTA4MjEyODQ1WhcNMzUwMTA5MjEyODQ1WjASMRAwDgYDVQQDDAdQcml2YWRvMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPwOgiwNJzZTnKIXwAB0TSu/Lu2qt2U2I8obtQjwhi/7OrfmbmYykSdro70al2XPhnwAGGdCxW6LDnp0UN/IOhD11mgBPo14f5CLkBQjSJ6VN5miPbvK746LsNZl9H8rQGvDuPo4CG9BfPZMiDRGlsMxij/jztzgT1gmuxQ7WHfFRcNzBas1dHa9hV/d3TU6/t47x4SE/ljdcCtJiu7Zn6ODKQoys3mB7Luz2ngqUJWvkqsg+E4+3eJ0M8Hlbn5TPaRJBID7DAdYo6Vs6xGCYr981ThFcmoIQ10js10yANrrfGAzd03b3TnLAgko0uQMHjliMZL6L8sWOPHxyxJI0us88SFh4UgcFyRHKHPKux7w24SxAlZUYoUcTHp9VjG5XvDKYxzgV2RdM4ulBGbQRQ3y3/CyddsyQYMvA55Ets0LfPaBvDIcct70iXijGsdvlX1du3ArGpG7Vaje/RU4nbbGT6HYRdt5YyZfof288ukMOSj20nVcmS+c/4tqsxSerRb1aq5LOi1IemSkTMeC5gCbexk+L1vl7NT/58sxjGmu5bXwnvev/lIItfi2AlITrfUSEv19iDMKkeshwn/+sFJBMWYyluP+yJ56yR+MWoXvLlSWphLDTqq19yx3BZn0P1tgbXoR0g8PTdJFcz8z3RIb7myVLYulV1oGG/3rka0CAwEAAaOBgDB+MB0GA1UdDgQWBBTFtJkZCVDuDAD6k5bJzefjJdO3DTBCBgNVHSMEOzA5gBTFtJkZCVDuDAD6k5bJzefjJdO3DaEWpBQwEjEQMA4GA1UEAwwHUHJpdmFkb4IJAMtrmqZxIV/OMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBDQUAA4ICAQB7MUSXMeBb9wlSv4sUaT1JHEwE26nlBw+TKmezfuPU5pBlY0LYr6qQZY95DHqsRJ7ByUzGUrGo17dNGXlcuNc6TAaQQEDRPo6y+LVh2TWMk15TUMI+MkqryJtCret7xGvDigKYMJgBy58HN3RAVr1B7cL9youwzLgc2Y/NcFKvnQJKeiIYAJ7g0CcnJiQvgZTS7xdwkEBXfsngmUCIG320DLPEL+Ze0HiUrxwWljMRya6i40AeH3Zu2i532xX1wV5+cjA4RJWIKg6ri/Q54iFGtZrA9/nc6y9uoQHkmz8cGyVUmJxFzMrrIICVqUtVRxLhkTMe4UzwRWTBeGgtW4tS0yq1QonAKfOyjgRw/CeY55D2UGvnAFZdTadtYXS4Alu2P9zdwoEk3fzHiVmDjqfJVr5wz9383aABUFrPI3nz6ed/Z6LZflKh1k+DUDEp8NxU4klUULWsSOKoa5zGX51G8cdHxwQLImXvtGuN5eSR8jCTgxFZhdps/xes4KkyfIz9FMYG748M+uOTgKITf4zdJ9BAyiQaOufVQZ8WjhWzWk9YHec9VqPkzpWNGkVjiRI5ewuXwZzZ164tMv2hikBXSuUCnFz37/ZNwGlDi0oBdDszCk2GxccdFHHaCSmpjU5MrdJ+5IhtTKGeTx+US2hTIVHQFIO99DmacxSYvLNcSQ=="
) )
func PrivadoCityChoices() (choices []string) { func PrivadoHostnameChoices() (choices []string) {
servers := PrivadoServers() servers := PrivadoServers()
choices = make([]string, len(servers)) choices = make([]string, len(servers))
for i := range servers { for i := range servers {
choices[i] = servers[i].City choices[i] = servers[i].Hostname
} }
return choices return choices
} }
@@ -23,184 +23,184 @@ func PrivadoCityChoices() (choices []string) {
//nolint:gomnd //nolint:gomnd
func PrivadoServers() []models.PrivadoServer { func PrivadoServers() []models.PrivadoServer {
return []models.PrivadoServer{ return []models.PrivadoServer{
{City: "akl", Number: 1, IP: net.IP{23, 254, 104, 114}}, {Hostname: "akl-001.vpn.privado.io", IP: net.IP{23, 254, 104, 114}},
{City: "akl", Number: 2, IP: net.IP{23, 254, 104, 120}}, {Hostname: "akl-002.vpn.privado.io", IP: net.IP{23, 254, 104, 120}},
{City: "akl", Number: 3, IP: net.IP{23, 254, 104, 51}}, {Hostname: "akl-003.vpn.privado.io", IP: net.IP{23, 254, 104, 51}},
{City: "ams", Number: 1, IP: net.IP{91, 148, 224, 10}}, {Hostname: "ams-001.vpn.privado.io", IP: net.IP{91, 148, 224, 10}},
{City: "ams", Number: 10, IP: net.IP{91, 148, 228, 20}}, {Hostname: "ams-002.vpn.privado.io", IP: net.IP{91, 148, 224, 20}},
{City: "ams", Number: 11, IP: net.IP{91, 148, 228, 30}}, {Hostname: "ams-003.vpn.privado.io", IP: net.IP{91, 148, 224, 30}},
{City: "ams", Number: 12, IP: net.IP{91, 148, 228, 40}}, {Hostname: "ams-004.vpn.privado.io", IP: net.IP{91, 148, 224, 40}},
{City: "ams", Number: 13, IP: net.IP{91, 148, 228, 50}}, {Hostname: "ams-005.vpn.privado.io", IP: net.IP{91, 148, 224, 50}},
{City: "ams", Number: 14, IP: net.IP{91, 148, 228, 60}}, {Hostname: "ams-006.vpn.privado.io", IP: net.IP{91, 148, 224, 60}},
{City: "ams", Number: 15, IP: net.IP{91, 148, 228, 70}}, {Hostname: "ams-007.vpn.privado.io", IP: net.IP{91, 148, 224, 70}},
{City: "ams", Number: 16, IP: net.IP{91, 148, 228, 80}}, {Hostname: "ams-008.vpn.privado.io", IP: net.IP{91, 148, 224, 80}},
{City: "ams", Number: 2, IP: net.IP{91, 148, 224, 20}}, {Hostname: "ams-009.vpn.privado.io", IP: net.IP{91, 148, 228, 10}},
{City: "ams", Number: 3, IP: net.IP{91, 148, 224, 30}}, {Hostname: "ams-010.vpn.privado.io", IP: net.IP{91, 148, 228, 20}},
{City: "ams", Number: 4, IP: net.IP{91, 148, 224, 40}}, {Hostname: "ams-011.vpn.privado.io", IP: net.IP{91, 148, 228, 30}},
{City: "ams", Number: 5, IP: net.IP{91, 148, 224, 50}}, {Hostname: "ams-012.vpn.privado.io", IP: net.IP{91, 148, 228, 40}},
{City: "ams", Number: 6, IP: net.IP{91, 148, 224, 60}}, {Hostname: "ams-013.vpn.privado.io", IP: net.IP{91, 148, 228, 50}},
{City: "ams", Number: 7, IP: net.IP{91, 148, 224, 70}}, {Hostname: "ams-014.vpn.privado.io", IP: net.IP{91, 148, 228, 60}},
{City: "ams", Number: 8, IP: net.IP{91, 148, 224, 80}}, {Hostname: "ams-015.vpn.privado.io", IP: net.IP{91, 148, 228, 70}},
{City: "ams", Number: 9, IP: net.IP{91, 148, 228, 10}}, {Hostname: "ams-016.vpn.privado.io", IP: net.IP{91, 148, 228, 80}},
{City: "arn", Number: 1, IP: net.IP{86, 106, 103, 67}}, {Hostname: "arn-001.vpn.privado.io", IP: net.IP{86, 106, 103, 67}},
{City: "arn", Number: 2, IP: net.IP{86, 106, 103, 74}}, {Hostname: "arn-002.vpn.privado.io", IP: net.IP{86, 106, 103, 74}},
{City: "arn", Number: 3, IP: net.IP{86, 106, 103, 81}}, {Hostname: "arn-003.vpn.privado.io", IP: net.IP{86, 106, 103, 81}},
{City: "ath", Number: 1, IP: net.IP{188, 123, 126, 61}}, {Hostname: "ath-001.vpn.privado.io", IP: net.IP{188, 123, 126, 61}},
{City: "ath", Number: 2, IP: net.IP{188, 123, 126, 64}}, {Hostname: "ath-002.vpn.privado.io", IP: net.IP{188, 123, 126, 64}},
{City: "ath", Number: 3, IP: net.IP{188, 123, 126, 68}}, {Hostname: "ath-003.vpn.privado.io", IP: net.IP{188, 123, 126, 68}},
{City: "ath", Number: 4, IP: net.IP{188, 123, 126, 72}}, {Hostname: "ath-004.vpn.privado.io", IP: net.IP{188, 123, 126, 72}},
{City: "beg", Number: 1, IP: net.IP{89, 38, 224, 19}}, {Hostname: "beg-001.vpn.privado.io", IP: net.IP{89, 38, 224, 19}},
{City: "beg", Number: 2, IP: net.IP{89, 38, 224, 25}}, {Hostname: "beg-002.vpn.privado.io", IP: net.IP{89, 38, 224, 25}},
{City: "bkk", Number: 1, IP: net.IP{119, 59, 111, 3}}, {Hostname: "bkk-001.vpn.privado.io", IP: net.IP{119, 59, 111, 3}},
{City: "bkk", Number: 2, IP: net.IP{119, 59, 111, 11}}, {Hostname: "bkk-002.vpn.privado.io", IP: net.IP{119, 59, 111, 11}},
{City: "bom", Number: 1, IP: net.IP{103, 26, 204, 61}}, {Hostname: "bom-001.vpn.privado.io", IP: net.IP{103, 26, 204, 61}},
{City: "bom", Number: 2, IP: net.IP{103, 26, 204, 70}}, {Hostname: "bom-002.vpn.privado.io", IP: net.IP{103, 26, 204, 70}},
{City: "bru", Number: 1, IP: net.IP{217, 138, 211, 163}}, {Hostname: "bru-001.vpn.privado.io", IP: net.IP{217, 138, 211, 163}},
{City: "bru", Number: 2, IP: net.IP{217, 138, 211, 170}}, {Hostname: "bru-002.vpn.privado.io", IP: net.IP{217, 138, 211, 170}},
{City: "bru", Number: 3, IP: net.IP{217, 138, 211, 177}}, {Hostname: "bru-003.vpn.privado.io", IP: net.IP{217, 138, 211, 177}},
{City: "bru", Number: 4, IP: net.IP{217, 138, 211, 184}}, {Hostname: "bru-004.vpn.privado.io", IP: net.IP{217, 138, 211, 184}},
{City: "bts", Number: 1, IP: net.IP{37, 120, 221, 227}}, {Hostname: "bts-001.vpn.privado.io", IP: net.IP{37, 120, 221, 227}},
{City: "bts", Number: 2, IP: net.IP{37, 120, 221, 233}}, {Hostname: "bts-002.vpn.privado.io", IP: net.IP{37, 120, 221, 233}},
{City: "bud", Number: 1, IP: net.IP{185, 128, 26, 194}}, {Hostname: "bud-001.vpn.privado.io", IP: net.IP{185, 128, 26, 194}},
{City: "bud", Number: 2, IP: net.IP{185, 128, 26, 200}}, {Hostname: "bud-002.vpn.privado.io", IP: net.IP{185, 128, 26, 200}},
{City: "cdg", Number: 1, IP: net.IP{89, 40, 183, 99}}, {Hostname: "cdg-001.vpn.privado.io", IP: net.IP{89, 40, 183, 99}},
{City: "cdg", Number: 2, IP: net.IP{89, 40, 183, 106}}, {Hostname: "cdg-002.vpn.privado.io", IP: net.IP{89, 40, 183, 106}},
{City: "cdg", Number: 3, IP: net.IP{89, 40, 183, 113}}, {Hostname: "cdg-003.vpn.privado.io", IP: net.IP{89, 40, 183, 113}},
{City: "cdg", Number: 4, IP: net.IP{89, 40, 183, 120}}, {Hostname: "cdg-004.vpn.privado.io", IP: net.IP{89, 40, 183, 120}},
{City: "cph", Number: 1, IP: net.IP{2, 58, 46, 35}}, {Hostname: "cph-001.vpn.privado.io", IP: net.IP{2, 58, 46, 35}},
{City: "cph", Number: 2, IP: net.IP{2, 58, 46, 42}}, {Hostname: "cph-002.vpn.privado.io", IP: net.IP{2, 58, 46, 42}},
{City: "cph", Number: 3, IP: net.IP{2, 58, 46, 49}}, {Hostname: "cph-003.vpn.privado.io", IP: net.IP{2, 58, 46, 49}},
{City: "cph", Number: 4, IP: net.IP{2, 58, 46, 56}}, {Hostname: "cph-004.vpn.privado.io", IP: net.IP{2, 58, 46, 56}},
{City: "dca", Number: 1, IP: net.IP{85, 12, 61, 10}}, {Hostname: "dca-001.vpn.privado.io", IP: net.IP{85, 12, 61, 10}},
{City: "dca", Number: 13, IP: net.IP{185, 247, 68, 3}}, {Hostname: "dca-002.vpn.privado.io", IP: net.IP{85, 12, 61, 20}},
{City: "dca", Number: 14, IP: net.IP{185, 247, 68, 10}}, {Hostname: "dca-003.vpn.privado.io", IP: net.IP{85, 12, 61, 30}},
{City: "dca", Number: 15, IP: net.IP{185, 247, 68, 17}}, {Hostname: "dca-004.vpn.privado.io", IP: net.IP{85, 12, 61, 40}},
{City: "dca", Number: 16, IP: net.IP{185, 247, 68, 24}}, {Hostname: "dca-005.vpn.privado.io", IP: net.IP{85, 12, 61, 50}},
{City: "dca", Number: 2, IP: net.IP{85, 12, 61, 20}}, {Hostname: "dca-006.vpn.privado.io", IP: net.IP{85, 12, 61, 60}},
{City: "dca", Number: 3, IP: net.IP{85, 12, 61, 30}}, {Hostname: "dca-007.vpn.privado.io", IP: net.IP{85, 12, 61, 70}},
{City: "dca", Number: 4, IP: net.IP{85, 12, 61, 40}}, {Hostname: "dca-008.vpn.privado.io", IP: net.IP{85, 12, 61, 80}},
{City: "dca", Number: 5, IP: net.IP{85, 12, 61, 50}}, {Hostname: "dca-013.vpn.privado.io", IP: net.IP{185, 247, 68, 3}},
{City: "dca", Number: 6, IP: net.IP{85, 12, 61, 60}}, {Hostname: "dca-014.vpn.privado.io", IP: net.IP{185, 247, 68, 10}},
{City: "dca", Number: 7, IP: net.IP{85, 12, 61, 70}}, {Hostname: "dca-015.vpn.privado.io", IP: net.IP{185, 247, 68, 17}},
{City: "dca", Number: 8, IP: net.IP{85, 12, 61, 80}}, {Hostname: "dca-016.vpn.privado.io", IP: net.IP{185, 247, 68, 24}},
{City: "dfw", Number: 1, IP: net.IP{23, 105, 32, 243}}, {Hostname: "dfw-001.vpn.privado.io", IP: net.IP{23, 105, 32, 243}},
{City: "dfw", Number: 2, IP: net.IP{23, 105, 32, 244}}, {Hostname: "dfw-002.vpn.privado.io", IP: net.IP{23, 105, 32, 244}},
{City: "dub", Number: 1, IP: net.IP{84, 247, 48, 227}}, {Hostname: "dub-001.vpn.privado.io", IP: net.IP{84, 247, 48, 227}},
{City: "dub", Number: 2, IP: net.IP{84, 247, 48, 234}}, {Hostname: "dub-002.vpn.privado.io", IP: net.IP{84, 247, 48, 234}},
{City: "dub", Number: 3, IP: net.IP{84, 247, 48, 241}}, {Hostname: "dub-003.vpn.privado.io", IP: net.IP{84, 247, 48, 241}},
{City: "dub", Number: 4, IP: net.IP{84, 247, 48, 248}}, {Hostname: "dub-004.vpn.privado.io", IP: net.IP{84, 247, 48, 248}},
{City: "eze", Number: 1, IP: net.IP{168, 205, 93, 211}}, {Hostname: "eze-001.vpn.privado.io", IP: net.IP{168, 205, 93, 211}},
{City: "eze", Number: 2, IP: net.IP{168, 205, 93, 217}}, {Hostname: "eze-002.vpn.privado.io", IP: net.IP{168, 205, 93, 217}},
{City: "fra", Number: 1, IP: net.IP{91, 148, 232, 10}}, {Hostname: "fra-001.vpn.privado.io", IP: net.IP{91, 148, 232, 10}},
{City: "fra", Number: 2, IP: net.IP{91, 148, 232, 20}}, {Hostname: "fra-002.vpn.privado.io", IP: net.IP{91, 148, 232, 20}},
{City: "fra", Number: 3, IP: net.IP{91, 148, 232, 30}}, {Hostname: "fra-003.vpn.privado.io", IP: net.IP{91, 148, 232, 30}},
{City: "fra", Number: 4, IP: net.IP{91, 148, 232, 40}}, {Hostname: "fra-004.vpn.privado.io", IP: net.IP{91, 148, 232, 40}},
{City: "fra", Number: 5, IP: net.IP{91, 148, 233, 7}}, {Hostname: "fra-005.vpn.privado.io", IP: net.IP{91, 148, 233, 7}},
{City: "fra", Number: 6, IP: net.IP{91, 148, 233, 8}}, {Hostname: "fra-006.vpn.privado.io", IP: net.IP{91, 148, 233, 8}},
{City: "fra", Number: 7, IP: net.IP{91, 148, 233, 9}}, {Hostname: "fra-007.vpn.privado.io", IP: net.IP{91, 148, 233, 9}},
{City: "fra", Number: 8, IP: net.IP{91, 148, 233, 10}}, {Hostname: "fra-008.vpn.privado.io", IP: net.IP{91, 148, 233, 10}},
{City: "gru", Number: 1, IP: net.IP{177, 54, 145, 193}}, {Hostname: "gru-001.vpn.privado.io", IP: net.IP{177, 54, 145, 193}},
{City: "gru", Number: 2, IP: net.IP{177, 54, 145, 197}}, {Hostname: "gru-002.vpn.privado.io", IP: net.IP{177, 54, 145, 197}},
{City: "hel", Number: 1, IP: net.IP{194, 34, 134, 219}}, {Hostname: "hel-001.vpn.privado.io", IP: net.IP{194, 34, 134, 219}},
{City: "hel", Number: 2, IP: net.IP{194, 34, 134, 227}}, {Hostname: "hel-002.vpn.privado.io", IP: net.IP{194, 34, 134, 227}},
{City: "hkg", Number: 1, IP: net.IP{209, 58, 185, 88}}, {Hostname: "hkg-001.vpn.privado.io", IP: net.IP{209, 58, 185, 88}},
{City: "hkg", Number: 2, IP: net.IP{209, 58, 185, 97}}, {Hostname: "hkg-002.vpn.privado.io", IP: net.IP{209, 58, 185, 97}},
{City: "hkg", Number: 3, IP: net.IP{209, 58, 185, 108}}, {Hostname: "hkg-003.vpn.privado.io", IP: net.IP{209, 58, 185, 108}},
{City: "hkg", Number: 4, IP: net.IP{209, 58, 185, 120}}, {Hostname: "hkg-004.vpn.privado.io", IP: net.IP{209, 58, 185, 120}},
{City: "icn", Number: 1, IP: net.IP{169, 56, 73, 146}}, {Hostname: "icn-001.vpn.privado.io", IP: net.IP{169, 56, 73, 146}},
{City: "icn", Number: 2, IP: net.IP{169, 56, 73, 153}}, {Hostname: "icn-002.vpn.privado.io", IP: net.IP{169, 56, 73, 153}},
{City: "iev", Number: 1, IP: net.IP{176, 103, 52, 40}}, {Hostname: "iev-001.vpn.privado.io", IP: net.IP{176, 103, 52, 40}},
{City: "iev", Number: 2, IP: net.IP{176, 103, 53, 40}}, {Hostname: "iev-002.vpn.privado.io", IP: net.IP{176, 103, 53, 40}},
{City: "ist", Number: 1, IP: net.IP{185, 84, 183, 3}}, {Hostname: "ist-001.vpn.privado.io", IP: net.IP{185, 84, 183, 3}},
{City: "ist", Number: 2, IP: net.IP{185, 84, 183, 4}}, {Hostname: "ist-002.vpn.privado.io", IP: net.IP{185, 84, 183, 4}},
{City: "jfk", Number: 1, IP: net.IP{217, 138, 208, 99}}, {Hostname: "jfk-001.vpn.privado.io", IP: net.IP{217, 138, 208, 99}},
{City: "jfk", Number: 2, IP: net.IP{217, 138, 208, 106}}, {Hostname: "jfk-002.vpn.privado.io", IP: net.IP{217, 138, 208, 106}},
{City: "jfk", Number: 3, IP: net.IP{217, 138, 208, 113}}, {Hostname: "jfk-003.vpn.privado.io", IP: net.IP{217, 138, 208, 113}},
{City: "jfk", Number: 4, IP: net.IP{217, 138, 208, 120}}, {Hostname: "jfk-004.vpn.privado.io", IP: net.IP{217, 138, 208, 120}},
{City: "jnb", Number: 1, IP: net.IP{172, 107, 93, 131}}, {Hostname: "jnb-001.vpn.privado.io", IP: net.IP{172, 107, 93, 131}},
{City: "jnb", Number: 2, IP: net.IP{172, 107, 93, 137}}, {Hostname: "jnb-002.vpn.privado.io", IP: net.IP{172, 107, 93, 137}},
{City: "lax", Number: 10, IP: net.IP{45, 152, 182, 234}}, {Hostname: "lax-009.vpn.privado.io", IP: net.IP{45, 152, 182, 227}},
{City: "lax", Number: 11, IP: net.IP{45, 152, 182, 241}}, {Hostname: "lax-010.vpn.privado.io", IP: net.IP{45, 152, 182, 234}},
{City: "lax", Number: 12, IP: net.IP{45, 152, 182, 248}}, {Hostname: "lax-011.vpn.privado.io", IP: net.IP{45, 152, 182, 241}},
{City: "lax", Number: 9, IP: net.IP{45, 152, 182, 227}}, {Hostname: "lax-012.vpn.privado.io", IP: net.IP{45, 152, 182, 248}},
{City: "lis", Number: 1, IP: net.IP{89, 26, 243, 153}}, {Hostname: "lis-001.vpn.privado.io", IP: net.IP{89, 26, 243, 153}},
{City: "lis", Number: 2, IP: net.IP{89, 26, 243, 154}}, {Hostname: "lis-002.vpn.privado.io", IP: net.IP{89, 26, 243, 154}},
{City: "lon", Number: 1, IP: net.IP{217, 138, 195, 163}}, {Hostname: "lon-001.vpn.privado.io", IP: net.IP{217, 138, 195, 163}},
{City: "lon", Number: 2, IP: net.IP{217, 138, 195, 170}}, {Hostname: "lon-002.vpn.privado.io", IP: net.IP{217, 138, 195, 170}},
{City: "lon", Number: 3, IP: net.IP{217, 138, 195, 177}}, {Hostname: "lon-003.vpn.privado.io", IP: net.IP{217, 138, 195, 177}},
{City: "lon", Number: 4, IP: net.IP{217, 138, 195, 184}}, {Hostname: "lon-004.vpn.privado.io", IP: net.IP{217, 138, 195, 184}},
{City: "mad", Number: 1, IP: net.IP{217, 138, 218, 131}}, {Hostname: "mad-001.vpn.privado.io", IP: net.IP{217, 138, 218, 131}},
{City: "man", Number: 1, IP: net.IP{217, 138, 196, 131}}, {Hostname: "man-001.vpn.privado.io", IP: net.IP{217, 138, 196, 131}},
{City: "man", Number: 2, IP: net.IP{217, 138, 196, 138}}, {Hostname: "man-002.vpn.privado.io", IP: net.IP{217, 138, 196, 138}},
{City: "man", Number: 3, IP: net.IP{217, 138, 196, 145}}, {Hostname: "man-003.vpn.privado.io", IP: net.IP{217, 138, 196, 145}},
{City: "man", Number: 4, IP: net.IP{217, 138, 196, 152}}, {Hostname: "man-004.vpn.privado.io", IP: net.IP{217, 138, 196, 152}},
{City: "mex", Number: 1, IP: net.IP{169, 57, 96, 52}}, {Hostname: "mex-001.vpn.privado.io", IP: net.IP{169, 57, 96, 52}},
{City: "mex", Number: 2, IP: net.IP{169, 57, 96, 57}}, {Hostname: "mex-002.vpn.privado.io", IP: net.IP{169, 57, 96, 57}},
{City: "mia", Number: 1, IP: net.IP{86, 106, 87, 131}}, {Hostname: "mia-001.vpn.privado.io", IP: net.IP{86, 106, 87, 131}},
{City: "mia", Number: 2, IP: net.IP{86, 106, 87, 138}}, {Hostname: "mia-002.vpn.privado.io", IP: net.IP{86, 106, 87, 138}},
{City: "mia", Number: 3, IP: net.IP{86, 106, 87, 145}}, {Hostname: "mia-003.vpn.privado.io", IP: net.IP{86, 106, 87, 145}},
{City: "mia", Number: 4, IP: net.IP{86, 106, 87, 152}}, {Hostname: "mia-004.vpn.privado.io", IP: net.IP{86, 106, 87, 152}},
{City: "mxp", Number: 1, IP: net.IP{89, 40, 182, 195}}, {Hostname: "mxp-001.vpn.privado.io", IP: net.IP{89, 40, 182, 195}},
{City: "mxp", Number: 2, IP: net.IP{89, 40, 182, 201}}, {Hostname: "mxp-002.vpn.privado.io", IP: net.IP{89, 40, 182, 201}},
{City: "nrt", Number: 1, IP: net.IP{217, 138, 252, 3}}, {Hostname: "nrt-001.vpn.privado.io", IP: net.IP{217, 138, 252, 3}},
{City: "nrt", Number: 2, IP: net.IP{217, 138, 252, 10}}, {Hostname: "nrt-002.vpn.privado.io", IP: net.IP{217, 138, 252, 10}},
{City: "nrt", Number: 3, IP: net.IP{217, 138, 252, 17}}, {Hostname: "nrt-003.vpn.privado.io", IP: net.IP{217, 138, 252, 17}},
{City: "nrt", Number: 4, IP: net.IP{217, 138, 252, 24}}, {Hostname: "nrt-004.vpn.privado.io", IP: net.IP{217, 138, 252, 24}},
{City: "ord", Number: 1, IP: net.IP{23, 108, 95, 129}}, {Hostname: "ord-001.vpn.privado.io", IP: net.IP{23, 108, 95, 129}},
{City: "ord", Number: 2, IP: net.IP{23, 108, 95, 167}}, {Hostname: "ord-002.vpn.privado.io", IP: net.IP{23, 108, 95, 167}},
{City: "osl", Number: 1, IP: net.IP{84, 247, 50, 115}}, {Hostname: "osl-001.vpn.privado.io", IP: net.IP{84, 247, 50, 115}},
{City: "osl", Number: 2, IP: net.IP{84, 247, 50, 119}}, {Hostname: "osl-002.vpn.privado.io", IP: net.IP{84, 247, 50, 119}},
{City: "osl", Number: 3, IP: net.IP{84, 247, 50, 123}}, {Hostname: "osl-003.vpn.privado.io", IP: net.IP{84, 247, 50, 123}},
{City: "otp", Number: 1, IP: net.IP{89, 46, 102, 179}}, {Hostname: "otp-001.vpn.privado.io", IP: net.IP{89, 46, 102, 179}},
{City: "otp", Number: 2, IP: net.IP{89, 46, 102, 185}}, {Hostname: "otp-002.vpn.privado.io", IP: net.IP{89, 46, 102, 185}},
{City: "phx", Number: 1, IP: net.IP{91, 148, 236, 10}}, {Hostname: "phx-001.vpn.privado.io", IP: net.IP{91, 148, 236, 10}},
{City: "phx", Number: 2, IP: net.IP{91, 148, 236, 20}}, {Hostname: "phx-002.vpn.privado.io", IP: net.IP{91, 148, 236, 20}},
{City: "phx", Number: 3, IP: net.IP{91, 148, 236, 30}}, {Hostname: "phx-003.vpn.privado.io", IP: net.IP{91, 148, 236, 30}},
{City: "phx", Number: 4, IP: net.IP{91, 148, 236, 40}}, {Hostname: "phx-004.vpn.privado.io", IP: net.IP{91, 148, 236, 40}},
{City: "phx", Number: 5, IP: net.IP{91, 148, 236, 50}}, {Hostname: "phx-005.vpn.privado.io", IP: net.IP{91, 148, 236, 50}},
{City: "phx", Number: 6, IP: net.IP{91, 148, 236, 60}}, {Hostname: "phx-006.vpn.privado.io", IP: net.IP{91, 148, 236, 60}},
{City: "phx", Number: 7, IP: net.IP{91, 148, 236, 70}}, {Hostname: "phx-007.vpn.privado.io", IP: net.IP{91, 148, 236, 70}},
{City: "phx", Number: 8, IP: net.IP{91, 148, 236, 80}}, {Hostname: "phx-008.vpn.privado.io", IP: net.IP{91, 148, 236, 80}},
{City: "prg", Number: 1, IP: net.IP{185, 216, 35, 99}}, {Hostname: "prg-001.vpn.privado.io", IP: net.IP{185, 216, 35, 99}},
{City: "prg", Number: 2, IP: net.IP{185, 216, 35, 105}}, {Hostname: "prg-002.vpn.privado.io", IP: net.IP{185, 216, 35, 105}},
{City: "rix", Number: 1, IP: net.IP{109, 248, 149, 35}}, {Hostname: "rix-001.vpn.privado.io", IP: net.IP{109, 248, 149, 35}},
{City: "rix", Number: 2, IP: net.IP{109, 248, 149, 40}}, {Hostname: "rix-002.vpn.privado.io", IP: net.IP{109, 248, 149, 40}},
{City: "rkv", Number: 1, IP: net.IP{82, 221, 131, 78}}, {Hostname: "rkv-001.vpn.privado.io", IP: net.IP{82, 221, 131, 78}},
{City: "rkv", Number: 2, IP: net.IP{82, 221, 131, 127}}, {Hostname: "rkv-002.vpn.privado.io", IP: net.IP{82, 221, 131, 127}},
{City: "sea", Number: 1, IP: net.IP{23, 81, 208, 96}}, {Hostname: "sea-001.vpn.privado.io", IP: net.IP{23, 81, 208, 96}},
{City: "sea", Number: 2, IP: net.IP{23, 81, 208, 104}}, {Hostname: "sea-002.vpn.privado.io", IP: net.IP{23, 81, 208, 104}},
{City: "sin", Number: 1, IP: net.IP{92, 119, 178, 131}}, {Hostname: "sin-001.vpn.privado.io", IP: net.IP{92, 119, 178, 131}},
{City: "sin", Number: 2, IP: net.IP{92, 119, 178, 138}}, {Hostname: "sin-002.vpn.privado.io", IP: net.IP{92, 119, 178, 138}},
{City: "sin", Number: 3, IP: net.IP{92, 119, 178, 145}}, {Hostname: "sin-003.vpn.privado.io", IP: net.IP{92, 119, 178, 145}},
{City: "sin", Number: 4, IP: net.IP{92, 119, 178, 152}}, {Hostname: "sin-004.vpn.privado.io", IP: net.IP{92, 119, 178, 152}},
{City: "sof", Number: 1, IP: net.IP{217, 138, 221, 163}}, {Hostname: "sof-001.vpn.privado.io", IP: net.IP{217, 138, 221, 163}},
{City: "sof", Number: 2, IP: net.IP{217, 138, 221, 169}}, {Hostname: "sof-002.vpn.privado.io", IP: net.IP{217, 138, 221, 169}},
{City: "stl", Number: 1, IP: net.IP{148, 72, 170, 145}}, {Hostname: "stl-001.vpn.privado.io", IP: net.IP{148, 72, 170, 145}},
{City: "stl", Number: 2, IP: net.IP{148, 72, 172, 82}}, {Hostname: "stl-002.vpn.privado.io", IP: net.IP{148, 72, 172, 82}},
{City: "syd", Number: 1, IP: net.IP{93, 115, 35, 35}}, {Hostname: "syd-001.vpn.privado.io", IP: net.IP{93, 115, 35, 35}},
{City: "syd", Number: 2, IP: net.IP{93, 115, 35, 42}}, {Hostname: "syd-002.vpn.privado.io", IP: net.IP{93, 115, 35, 42}},
{City: "syd", Number: 3, IP: net.IP{93, 115, 35, 49}}, {Hostname: "syd-003.vpn.privado.io", IP: net.IP{93, 115, 35, 49}},
{City: "syd", Number: 4, IP: net.IP{93, 115, 35, 56}}, {Hostname: "syd-004.vpn.privado.io", IP: net.IP{93, 115, 35, 56}},
{City: "vie", Number: 1, IP: net.IP{5, 253, 207, 227}}, {Hostname: "vie-001.vpn.privado.io", IP: net.IP{5, 253, 207, 227}},
{City: "vie", Number: 2, IP: net.IP{5, 253, 207, 234}}, {Hostname: "vie-002.vpn.privado.io", IP: net.IP{5, 253, 207, 234}},
{City: "vie", Number: 3, IP: net.IP{5, 253, 207, 241}}, {Hostname: "vie-003.vpn.privado.io", IP: net.IP{5, 253, 207, 241}},
{City: "vie", Number: 4, IP: net.IP{5, 253, 207, 248}}, {Hostname: "vie-004.vpn.privado.io", IP: net.IP{5, 253, 207, 248}},
{City: "vno", Number: 1, IP: net.IP{185, 64, 104, 176}}, {Hostname: "vno-001.vpn.privado.io", IP: net.IP{185, 64, 104, 176}},
{City: "vno", Number: 2, IP: net.IP{185, 64, 104, 180}}, {Hostname: "vno-002.vpn.privado.io", IP: net.IP{185, 64, 104, 180}},
{City: "waw", Number: 1, IP: net.IP{217, 138, 209, 163}}, {Hostname: "waw-001.vpn.privado.io", IP: net.IP{217, 138, 209, 163}},
{City: "waw", Number: 2, IP: net.IP{217, 138, 209, 164}}, {Hostname: "waw-002.vpn.privado.io", IP: net.IP{217, 138, 209, 164}},
{City: "waw", Number: 3, IP: net.IP{217, 138, 209, 165}}, {Hostname: "waw-003.vpn.privado.io", IP: net.IP{217, 138, 209, 165}},
{City: "waw", Number: 4, IP: net.IP{217, 138, 209, 166}}, {Hostname: "waw-004.vpn.privado.io", IP: net.IP{217, 138, 209, 166}},
{City: "yul", Number: 1, IP: net.IP{217, 138, 213, 67}}, {Hostname: "yul-001.vpn.privado.io", IP: net.IP{217, 138, 213, 67}},
{City: "yul", Number: 2, IP: net.IP{217, 138, 213, 74}}, {Hostname: "yul-002.vpn.privado.io", IP: net.IP{217, 138, 213, 74}},
{City: "yul", Number: 3, IP: net.IP{217, 138, 213, 81}}, {Hostname: "yul-003.vpn.privado.io", IP: net.IP{217, 138, 213, 81}},
{City: "yul", Number: 4, IP: net.IP{217, 138, 213, 88}}, {Hostname: "yul-004.vpn.privado.io", IP: net.IP{217, 138, 213, 88}},
{City: "yvr", Number: 1, IP: net.IP{71, 19, 248, 57}}, {Hostname: "yvr-001.vpn.privado.io", IP: net.IP{71, 19, 248, 57}},
{City: "yvr", Number: 2, IP: net.IP{71, 19, 248, 113}}, {Hostname: "yvr-002.vpn.privado.io", IP: net.IP{71, 19, 248, 113}},
{City: "yyz", Number: 3, IP: net.IP{199, 189, 27, 19}}, {Hostname: "yyz-003.vpn.privado.io", IP: net.IP{199, 189, 27, 19}},
{City: "zrh", Number: 1, IP: net.IP{185, 156, 175, 195}}, {Hostname: "zrh-001.vpn.privado.io", IP: net.IP{185, 156, 175, 195}},
{City: "zrh", Number: 2, IP: net.IP{185, 156, 175, 202}}, {Hostname: "zrh-002.vpn.privado.io", IP: net.IP{185, 156, 175, 202}},
{City: "zrh", Number: 3, IP: net.IP{185, 156, 175, 209}}, {Hostname: "zrh-003.vpn.privado.io", IP: net.IP{185, 156, 175, 209}},
{City: "zrh", Number: 4, IP: net.IP{185, 156, 175, 216}}, {Hostname: "zrh-004.vpn.privado.io", IP: net.IP{185, 156, 175, 216}},
} }
} }

View File

@@ -32,8 +32,8 @@ func GetAllServers() (allServers models.AllServers) {
Servers: PurevpnServers(), Servers: PurevpnServers(),
}, },
Privado: models.PrivadoServers{ Privado: models.PrivadoServers{
Version: 1, Version: 2,
Timestamp: 1604546335, Timestamp: 1604963273,
Servers: PrivadoServers(), Servers: PrivadoServers(),
}, },
Surfshark: models.SurfsharkServers{ Surfshark: models.SurfsharkServers{

View File

@@ -57,7 +57,7 @@ func Test_versions(t *testing.T) {
"Privado": { "Privado": {
model: models.PrivadoServer{}, model: models.PrivadoServer{},
version: allServers.Privado.Version, version: allServers.Privado.Version,
digest: "d7f96824", digest: "1d5aeb23",
}, },
"Purevpn": { "Purevpn": {
model: models.PurevpnServer{}, model: models.PurevpnServer{},
@@ -143,7 +143,7 @@ func Test_timestamps(t *testing.T) {
"Privado": { "Privado": {
servers: allServers.Privado.Servers, servers: allServers.Privado.Servers,
timestamp: allServers.Privado.Timestamp, timestamp: allServers.Privado.Timestamp,
digest: "3ccd3e0f", digest: "df2a046d",
}, },
"Surfshark": { "Surfshark": {
servers: allServers.Surfshark.Servers, servers: allServers.Surfshark.Servers,

View File

@@ -27,7 +27,7 @@ type ServerSelection struct {
Countries []string `json:"countries"` // Mullvad, PureVPN Countries []string `json:"countries"` // Mullvad, PureVPN
Cities []string `json:"cities"` // Mullvad, PureVPN, Windscribe Cities []string `json:"cities"` // Mullvad, PureVPN, Windscribe
Hostnames []string `json:"hostnames"` // Windscribe Hostnames []string `json:"hostnames"` // Windscribe, Privado
// Mullvad // Mullvad
ISPs []string `json:"isps"` ISPs []string `json:"isps"`

View File

@@ -108,14 +108,13 @@ func (s *PurevpnServer) String() string {
} }
type PrivadoServer struct { type PrivadoServer struct {
IP net.IP `json:"ip"` IP net.IP `json:"ip"`
City string `json:"city"` Hostname string `json:"hostname"`
Number uint16 `json:"number"`
} }
func (s *PrivadoServer) String() string { func (s *PrivadoServer) String() string {
return fmt.Sprintf("{City: %q, Number: %d, IP: %s}", return fmt.Sprintf("{Hostname: %q, IP: %s}",
s.City, s.Number, goStringifyIP(s.IP)) s.Hostname, goStringifyIP(s.IP))
} }
func goStringifyIP(ip net.IP) string { func goStringifyIP(ip net.IP) string {

View File

@@ -92,8 +92,7 @@ type Reader interface {
GetNordvpnNumbers() (numbers []uint16, err error) GetNordvpnNumbers() (numbers []uint16, err error)
// Privado getters // Privado getters
GetPrivadoCities() (regions []string, err error) GetPrivadoHostnames() (hostnames []string, err error)
GetPrivadoNumbers() (numbers []uint16, err error)
// PureVPN getters // PureVPN getters
GetPurevpnRegions() (regions []string, err error) GetPurevpnRegions() (regions []string, err error)

View File

@@ -1,37 +1,11 @@
package params package params
import ( import (
"fmt"
"strconv"
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
) )
// GetPrivadoCities obtains the cities for the Privado server from the // GetPrivadoHostnames obtains the hostnames for the Privado server from the
// environment variable CITY. // environment variable HOSTNAME.
func (r *reader) GetPrivadoCities() (regions []string, err error) { func (r *reader) GetPrivadoHostnames() (hosts []string, err error) {
return r.envParams.GetCSVInPossibilities("CITY", constants.PrivadoCityChoices()) return r.envParams.GetCSVInPossibilities("HOSTNAME", constants.PrivadoHostnameChoices())
}
// GetPrivadoNumbers obtains the server numbers (optional) for the Privado servers from the
// environment variable SERVER_NUMBER.
func (r *reader) GetPrivadoNumbers() (numbers []uint16, err error) {
possibilities := make([]string, 65537)
for i := range possibilities {
possibilities[i] = fmt.Sprintf("%d", i)
}
possibilities[65536] = ""
values, err := r.envParams.GetCSVInPossibilities("SERVER_NUMBER", possibilities)
if err != nil {
return nil, err
}
numbers = make([]uint16, len(values))
for i := range values {
n, err := strconv.Atoi(values[i])
if err != nil {
return nil, err
}
numbers[i] = uint16(n)
}
return numbers, nil
} }

View File

@@ -26,17 +26,10 @@ func newPrivado(servers []models.PrivadoServer, timeNow timeNowFunc) *privado {
} }
} }
func (s *privado) filterServers(cities []string, numbers []uint16) (servers []models.PrivadoServer) { func (s *privado) filterServers(hostnames []string) (servers []models.PrivadoServer) {
numbersStr := make([]string, len(numbers))
for i := range numbers {
numbersStr[i] = fmt.Sprintf("%d", numbers[i])
}
for _, server := range s.servers { for _, server := range s.servers {
numberStr := fmt.Sprintf("%d", server.Number)
switch { switch {
case case filterByPossibilities(server.Hostname, hostnames):
filterByPossibilities(server.City, cities),
filterByPossibilities(numberStr, numbersStr):
default: default:
servers = append(servers, server) servers = append(servers, server)
} }
@@ -44,20 +37,6 @@ func (s *privado) filterServers(cities []string, numbers []uint16) (servers []mo
return servers return servers
} }
func makePrivadoHostname(city string, number uint16) string {
numberString := ""
const ten, hundred = 10, 100
switch {
case number < ten:
numberString = fmt.Sprintf("00%d", number)
case number < hundred:
numberString = fmt.Sprintf("0%d", number)
default:
numberString = fmt.Sprintf("%d", number)
}
return fmt.Sprintf("%s-%s.vpn.privado.io", city, numberString)
}
func (s *privado) GetOpenVPNConnection(selection models.ServerSelection) ( func (s *privado) GetOpenVPNConnection(selection models.ServerSelection) (
connection models.OpenVPNConnection, err error) { connection models.OpenVPNConnection, err error) {
var port uint16 = 1194 var port uint16 = 1194
@@ -71,7 +50,7 @@ func (s *privado) GetOpenVPNConnection(selection models.ServerSelection) (
return models.OpenVPNConnection{IP: selection.TargetIP, Port: port, Protocol: selection.Protocol}, nil return models.OpenVPNConnection{IP: selection.TargetIP, Port: port, Protocol: selection.Protocol}, nil
} }
servers := s.filterServers(selection.Cities, selection.Numbers) servers := s.filterServers(selection.Hostnames)
if len(servers) == 0 { if len(servers) == 0 {
return connection, fmt.Errorf("no server found for cities %s and server numbers %v", return connection, fmt.Errorf("no server found for cities %s and server numbers %v",
commaJoin(selection.Cities), selection.Numbers) commaJoin(selection.Cities), selection.Numbers)
@@ -83,7 +62,7 @@ func (s *privado) GetOpenVPNConnection(selection models.ServerSelection) (
IP: servers[i].IP, IP: servers[i].IP,
Port: port, Port: port,
Protocol: selection.Protocol, Protocol: selection.Protocol,
Hostname: makePrivadoHostname(servers[i].City, servers[i].Number), Hostname: servers[i].Hostname,
} }
connections = append(connections, connection) connections = append(connections, connection)
} }

View File

@@ -244,11 +244,7 @@ func GetPrivadoSettings(paramsReader params.Reader) (settings models.ProviderSet
if err != nil { if err != nil {
return settings, err return settings, err
} }
settings.ServerSelection.Cities, err = paramsReader.GetPrivadoCities() settings.ServerSelection.Hostnames, err = paramsReader.GetPrivadoHostnames()
if err != nil {
return settings, err
}
settings.ServerSelection.Numbers, err = paramsReader.GetPrivadoNumbers()
if err != nil { if err != nil {
return settings, err return settings, err
} }

View File

@@ -47,12 +47,19 @@ func (s *storage) mergeServers(hardcoded, persistent models.AllServers) (merged
merged.Pia = persistent.Pia merged.Pia = persistent.Pia
} }
} }
merged.Privado = hardcoded.Privado merged.Privado = hardcoded.Privado
if persistent.Privado.Timestamp > hardcoded.Privado.Timestamp { versionDiff := int(persistent.Privado.Version) - int(hardcoded.Privado.Version)
switch {
case versionDiff > 0:
s.logger.Info("Using Privado servers from file (%d version(s) more recent)", versionDiff)
merged.Privado = persistent.Privado
case persistent.Privado.Timestamp > hardcoded.Privado.Timestamp:
s.logger.Info("Using Privado servers from file (%s more recent)", s.logger.Info("Using Privado servers from file (%s more recent)",
getUnixTimeDifference(persistent.Privado.Timestamp, hardcoded.Privado.Timestamp)) getUnixTimeDifference(persistent.Privado.Timestamp, hardcoded.Privado.Timestamp))
merged.Privado = persistent.Privado merged.Privado = persistent.Privado
} }
merged.Purevpn = hardcoded.Purevpn merged.Purevpn = hardcoded.Purevpn
if persistent.Purevpn.Timestamp > hardcoded.Purevpn.Timestamp { if persistent.Purevpn.Timestamp > hardcoded.Purevpn.Timestamp {
s.logger.Info("Using Purevpn servers from file (%s more recent)", s.logger.Info("Using Purevpn servers from file (%s more recent)",

View File

@@ -5,8 +5,6 @@ import (
"fmt" "fmt"
"net" "net"
"sort" "sort"
"strconv"
"strings"
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/golibs/network" "github.com/qdm12/golibs/network"
@@ -45,59 +43,41 @@ func findPrivadoServersFromZip(ctx context.Context, client network.Client, looku
if len(remoteLines) == 0 { if len(remoteLines) == 0 {
return nil, warnings, fmt.Errorf("cannot find any remote lines in %s", fileName) return nil, warnings, fmt.Errorf("cannot find any remote lines in %s", fileName)
} }
hosts := extractHostnamesFromRemoteLines(remoteLines) hostnames := extractHostnamesFromRemoteLines(remoteLines)
if len(hosts) == 0 { if len(hostnames) == 0 {
return nil, warnings, fmt.Errorf("cannot find any hosts in %s", fileName) return nil, warnings, fmt.Errorf("cannot find any hosts in %s", fileName)
} else if len(hosts) > 1 { } else if len(hostnames) > 1 {
warning := fmt.Sprintf("more than one host in %q, only taking first one %q into account", fileName, hosts[0]) warning := fmt.Sprintf("more than one host in %q, only taking first one %q into account", fileName, hostnames[0])
warnings = append(warnings, warning) warnings = append(warnings, warning)
} }
host := hosts[0] hostname := hostnames[0]
if net.ParseIP(host) != nil { if net.ParseIP(hostname) != nil {
warning := fmt.Sprintf("ignoring IP address host %q in %s", host, fileName) warning := fmt.Sprintf("ignoring IP address host %q in %s", hostname, fileName)
warnings = append(warnings, warning) warnings = append(warnings, warning)
continue continue
} }
const repetition = 1 const repetition = 1
IPs, err := resolveRepeat(ctx, lookupIP, host, repetition) IPs, err := resolveRepeat(ctx, lookupIP, hostname, repetition)
switch { switch {
case err != nil: case err != nil:
return nil, warnings, err return nil, warnings, err
case len(IPs) == 0: case len(IPs) == 0:
warning := fmt.Sprintf("no IP address found for host %q", host) warning := fmt.Sprintf("no IP address found for host %q", hostname)
warnings = append(warnings, warning) warnings = append(warnings, warning)
continue continue
case len(IPs) > 1: case len(IPs) > 1:
warning := fmt.Sprintf("more than one IP address found for host %q", host) warning := fmt.Sprintf("more than one IP address found for host %q", hostname)
warnings = append(warnings, warning) warnings = append(warnings, warning)
} }
subdomain := strings.TrimSuffix(host, ".vpn.privado.io")
parts := strings.Split(subdomain, "-")
const expectedParts = 2
if len(parts) != expectedParts {
warning := fmt.Sprintf("malformed subdomain %q: cannot find city and server number", subdomain)
warnings = append(warnings, warning)
continue
}
city, serverNumberString := parts[0], parts[1]
serverNumberInt, err := strconv.ParseInt(serverNumberString, 10, 16)
if err != nil {
warning := fmt.Sprintf("malformed server number %q: %s", serverNumberString, err)
warnings = append(warnings, warning)
continue
}
server := models.PrivadoServer{ server := models.PrivadoServer{
City: city, Hostname: hostname,
Number: uint16(serverNumberInt), IP: IPs[0],
IP: IPs[0],
} }
servers = append(servers, server) servers = append(servers, server)
} }
sort.Slice(servers, func(i, j int) bool { sort.Slice(servers, func(i, j int) bool {
keyA := servers[i].City + fmt.Sprintf("%d", servers[i].Number) return servers[i].Hostname < servers[j].Hostname
keyB := servers[j].City + fmt.Sprintf("%d", servers[j].Number)
return keyA < keyB
}) })
return servers, warnings, nil return servers, warnings, nil
} }