Fix surfshark updater and update server data

This commit is contained in:
Quentin McGaw
2020-09-13 00:41:31 +00:00
parent 1fc1776dbf
commit f9b6e854b1
6 changed files with 250 additions and 128 deletions

View File

@@ -37,7 +37,7 @@ func GetAllServers() (allServers models.AllServers) {
},
Surfshark: models.SurfsharkServers{
Version: 1,
Timestamp: 1599323261,
Timestamp: 1599957644,
Servers: SurfsharkServers(),
},
Vyprvpn: models.VyprvpnServers{

View File

@@ -53,7 +53,7 @@ func Test_timestamps(t *testing.T) {
assert.Equal(t, "hAjEIo6FIrUsJuRmKOKPzA", digestServersTimestamp(t, allServers.Pia.Servers, allServers.Pia.Timestamp))
assert.Equal(t, "uiMp4IqH7NmvCIQ7gvR05Q", digestServersTimestamp(t, allServers.PiaOld.Servers, allServers.PiaOld.Timestamp))
assert.Equal(t, "kwJdVWTiBOspfrRwZIA+Sg", digestServersTimestamp(t, allServers.Purevpn.Servers, allServers.Purevpn.Timestamp))
assert.Equal(t, "2rceMJexUNMv0VIqme34iA", digestServersTimestamp(t, allServers.Surfshark.Servers, allServers.Surfshark.Timestamp))
assert.Equal(t, "q28ju2KJqLhrggJTTjXSiw", digestServersTimestamp(t, allServers.Surfshark.Servers, allServers.Surfshark.Timestamp))
assert.Equal(t, "KdIQWi2tYUM4aMXvWfVBEg", digestServersTimestamp(t, allServers.Vyprvpn.Servers, allServers.Vyprvpn.Timestamp))
assert.Equal(t, "faQUVtOnLMVezN0giHSz3Q", digestServersTimestamp(t, allServers.Windscribe.Servers, allServers.Windscribe.Timestamp))
}

View File

@@ -22,47 +22,62 @@ func SurfsharkRegionChoices() (choices []string) {
func SurfsharkServers() []models.SurfsharkServer {
return []models.SurfsharkServer{
{Region: "Albania", IPs: []net.IP{{31, 171, 152, 195}, {31, 171, 154, 149}}},
{Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 13}, {91, 206, 168, 15}}},
{Region: "Australia Melbourne", IPs: []net.IP{{144, 48, 38, 19}}},
{Region: "Australia Perth", IPs: []net.IP{{124, 150, 139, 43}, {124, 150, 139, 123}}},
{Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 43}, {45, 125, 247, 195}}},
{Region: "Austria", IPs: []net.IP{{5, 253, 207, 51}, {37, 120, 212, 77}}},
{Region: "Albania", IPs: []net.IP{{31, 171, 152, 197}, {31, 171, 154, 147}}},
{Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 13}, {91, 206, 168, 24}}},
{Region: "Australia Adelaide", IPs: []net.IP{{45, 248, 79, 67}, {45, 248, 79, 69}}},
{Region: "Australia Brisbane", IPs: []net.IP{{144, 48, 39, 107}, {144, 48, 39, 131}}},
{Region: "Australia Melbourne", IPs: []net.IP{{103, 192, 80, 141}, {144, 48, 38, 141}}},
{Region: "Australia Perth", IPs: []net.IP{{45, 248, 78, 45}, {124, 150, 139, 27}}},
{Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 195}, {180, 149, 228, 117}}},
{Region: "Australia US", IPs: []net.IP{{45, 76, 117, 108}}},
{Region: "Austria", IPs: []net.IP{{5, 253, 207, 83}, {37, 120, 212, 131}}},
{Region: "Azerbaijan", IPs: []net.IP{{94, 20, 21, 85}, {94, 20, 21, 87}}},
{Region: "Belgium", IPs: []net.IP{{5, 253, 205, 99}, {185, 232, 21, 51}}},
{Region: "Brazil", IPs: []net.IP{{191, 96, 73, 212}, {191, 96, 73, 216}}},
{Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 197}, {217, 138, 202, 21}}},
{Region: "Canada Montreal", IPs: []net.IP{{198, 8, 85, 74}, {198, 8, 85, 89}}},
{Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 197}, {68, 71, 244, 222}}},
{Region: "Belgium", IPs: []net.IP{{5, 253, 205, 181}, {5, 253, 205, 213}}},
{Region: "Bosnia and Herzegovina", IPs: []net.IP{{185, 99, 3, 7}, {185, 212, 111, 41}}},
{Region: "Brazil", IPs: []net.IP{{191, 96, 73, 214}, {191, 96, 73, 216}}},
{Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 37}}},
{Region: "Canada Montreal", IPs: []net.IP{{172, 98, 82, 85}, {198, 8, 85, 19}}},
{Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 200}, {104, 200, 138, 163}}},
{Region: "Canada Toronto mp001", IPs: []net.IP{{138, 197, 151, 26}}},
{Region: "Canada US", IPs: []net.IP{{159, 203, 57, 80}}},
{Region: "Canada Vancouver", IPs: []net.IP{{66, 115, 147, 79}, {66, 115, 147, 87}}},
{Region: "Chile", IPs: []net.IP{{31, 169, 121, 16}}},
{Region: "Colombia", IPs: []net.IP{{45, 129, 32, 5}, {45, 129, 32, 10}}},
{Region: "Colombia", IPs: []net.IP{{45, 129, 32, 8}}},
{Region: "Costa Rica", IPs: []net.IP{{176, 227, 241, 19}, {176, 227, 241, 21}}},
{Region: "Croatia", IPs: []net.IP{{89, 164, 99, 109}, {89, 164, 99, 111}}},
{Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 36}, {195, 47, 194, 61}}},
{Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 34}}},
{Region: "Czech Republic", IPs: []net.IP{{185, 152, 64, 151}, {185, 152, 64, 178}}},
{Region: "Estonia", IPs: []net.IP{{165, 231, 163, 3}, {185, 174, 159, 51}}},
{Region: "Finland", IPs: []net.IP{{196, 244, 191, 163}, {196, 244, 191, 197}}},
{Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 142}, {185, 108, 106, 164}}},
{Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 65}, {185, 166, 84, 85}}},
{Region: "France Paris", IPs: []net.IP{{45, 83, 90, 183}, {84, 247, 51, 251}}},
{Region: "Germany Berlin", IPs: []net.IP{{152, 89, 163, 245}, {217, 138, 216, 219}}},
{Region: "Germany Frankfurt am Main", IPs: []net.IP{{37, 120, 196, 51}, {37, 120, 197, 11}}},
{Region: "Denmark", IPs: []net.IP{{37, 120, 194, 115}, {95, 174, 65, 71}}},
{Region: "Estonia", IPs: []net.IP{{165, 231, 163, 23}, {185, 174, 159, 69}}},
{Region: "Finland", IPs: []net.IP{{196, 244, 191, 179}, {196, 244, 191, 181}}},
{Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 67}, {185, 108, 106, 150}}},
{Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 53}, {185, 166, 84, 75}}},
{Region: "France Paris", IPs: []net.IP{{45, 83, 90, 181}, {45, 89, 174, 103}}},
{Region: "France Sweden", IPs: []net.IP{{199, 247, 8, 20}}},
{Region: "Germany Berlin", IPs: []net.IP{{152, 89, 163, 19}, {217, 138, 216, 243}}},
{Region: "Germany Frankfurt am Main", IPs: []net.IP{{185, 158, 135, 36}, {185, 220, 70, 83}}},
{Region: "Germany Frankfurt am Main st001", IPs: []net.IP{{45, 87, 212, 179}}},
{Region: "Germany Frankfurt am Main st002", IPs: []net.IP{{45, 87, 212, 181}}},
{Region: "Germany Frankfurt am Main st003", IPs: []net.IP{{45, 87, 212, 183}}},
{Region: "Germany Munich", IPs: []net.IP{{178, 238, 231, 49}, {178, 238, 231, 51}}},
{Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 149, 162}, {62, 171, 151, 180}}},
{Region: "Greece", IPs: []net.IP{{194, 150, 167, 34}, {194, 150, 167, 44}}},
{Region: "Hong Kong", IPs: []net.IP{{84, 17, 37, 154}, {84, 17, 57, 66}}},
{Region: "Iceland", IPs: []net.IP{{82, 221, 128, 156}, {82, 221, 143, 241}}},
{Region: "India Chennai", IPs: []net.IP{{103, 94, 27, 101}, {103, 94, 27, 229}}},
{Region: "India Indore", IPs: []net.IP{{103, 73, 189, 219}, {103, 73, 189, 221}}},
{Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 219}, {103, 120, 66, 221}}},
{Region: "Ireland", IPs: []net.IP{{23, 92, 127, 93}, {217, 138, 222, 45}}},
{Region: "Israel", IPs: []net.IP{{87, 239, 255, 107}, {87, 239, 255, 109}}},
{Region: "Italy Milan", IPs: []net.IP{{84, 17, 58, 148}, {212, 102, 54, 160}}},
{Region: "Italy Rome", IPs: []net.IP{{82, 102, 26, 91}, {185, 217, 71, 53}}},
{Region: "Japan Tokyo", IPs: []net.IP{{89, 187, 161, 4}, {103, 208, 221, 229}}},
{Region: "Germany Frankfurt mp001", IPs: []net.IP{{46, 101, 189, 14}}},
{Region: "Germany Munich", IPs: []net.IP{{178, 238, 231, 51}, {178, 238, 231, 55}}},
{Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 149, 162}, {62, 171, 151, 182}}},
{Region: "Germany Singapour", IPs: []net.IP{{159, 89, 14, 157}}},
{Region: "Germany UK", IPs: []net.IP{{46, 101, 250, 73}}},
{Region: "Greece", IPs: []net.IP{{194, 150, 167, 34}, {194, 150, 167, 40}}},
{Region: "Hong Kong", IPs: []net.IP{{84, 17, 57, 73}, {212, 102, 42, 201}}},
{Region: "Hungary", IPs: []net.IP{{37, 120, 144, 151}, {37, 120, 144, 213}}},
{Region: "Iceland", IPs: []net.IP{{82, 221, 128, 166}, {82, 221, 143, 243}}},
{Region: "India Chennai", IPs: []net.IP{{103, 108, 117, 118}, {103, 108, 117, 151}}},
{Region: "India Indore", IPs: []net.IP{{103, 39, 132, 189}, {137, 59, 52, 109}}},
{Region: "India Mumbai", IPs: []net.IP{{103, 221, 233, 88}, {165, 231, 253, 147}}},
{Region: "India UK", IPs: []net.IP{{134, 209, 148, 122}}},
{Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 214}, {103, 120, 66, 216}}},
{Region: "Ireland", IPs: []net.IP{{185, 108, 128, 159}, {185, 108, 128, 181}}},
{Region: "Israel", IPs: []net.IP{{87, 239, 255, 109}}},
{Region: "Italy Milan", IPs: []net.IP{{84, 17, 58, 148}, {185, 128, 27, 37}}},
{Region: "Italy Rome", IPs: []net.IP{{82, 102, 26, 61}, {82, 102, 26, 115}}},
{Region: "Japan Tokyo", IPs: []net.IP{{45, 87, 213, 5}, {103, 208, 221, 227}}},
{Region: "Japan Tokyo st001", IPs: []net.IP{{45, 87, 213, 19}}},
{Region: "Japan Tokyo st002", IPs: []net.IP{{45, 87, 213, 21}}},
{Region: "Japan Tokyo st003", IPs: []net.IP{{45, 87, 213, 23}}},
@@ -70,84 +85,100 @@ func SurfsharkServers() []models.SurfsharkServer {
{Region: "Japan Tokyo st005", IPs: []net.IP{{217, 138, 212, 21}}},
{Region: "Japan Tokyo st006", IPs: []net.IP{{82, 102, 28, 123}}},
{Region: "Japan Tokyo st007", IPs: []net.IP{{82, 102, 28, 125}}},
{Region: "Kazakhstan", IPs: []net.IP{{95, 57, 207, 202}, {95, 57, 207, 204}}},
{Region: "Korea", IPs: []net.IP{{61, 14, 210, 244}, {103, 249, 28, 231}}},
{Region: "Latvia", IPs: []net.IP{{188, 92, 78, 135}, {188, 92, 78, 145}}},
{Region: "Kazakhstan", IPs: []net.IP{{95, 57, 207, 200}}},
{Region: "Korea", IPs: []net.IP{{61, 14, 210, 239}, {61, 97, 243, 112}}},
{Region: "Latvia", IPs: []net.IP{{188, 92, 78, 140}, {188, 92, 78, 142}}},
{Region: "Libya", IPs: []net.IP{{41, 208, 72, 157}, {41, 208, 72, 204}}},
{Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 94}, {185, 153, 151, 106}}},
{Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 60}, {185, 153, 151, 83}}},
{Region: "Malaysia", IPs: []net.IP{{42, 0, 30, 152}, {42, 0, 30, 209}}},
{Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 5}, {194, 41, 112, 11}}},
{Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 9}, {194, 41, 112, 19}}},
{Region: "Moldova", IPs: []net.IP{{178, 175, 128, 235}, {178, 175, 128, 237}}},
{Region: "Netherlands Amsterdam", IPs: []net.IP{{81, 19, 209, 120}, {185, 59, 222, 92}}},
{Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 4}}},
{Region: "Netherlands Amsterdam", IPs: []net.IP{{89, 46, 223, 74}, {89, 46, 223, 217}}},
{Region: "Netherlands Amsterdam mp001", IPs: []net.IP{{188, 166, 43, 117}}},
{Region: "Netherlands Amsterdam st001", IPs: []net.IP{{81, 19, 209, 51}}},
{Region: "Netherlands US", IPs: []net.IP{{188, 166, 98, 91}}},
{Region: "New Zealand", IPs: []net.IP{{180, 149, 231, 67}}},
{Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 6}, {102, 165, 23, 42}}},
{Region: "North Macedonia", IPs: []net.IP{{185, 225, 28, 93}, {185, 225, 28, 101}}},
{Region: "Norway", IPs: []net.IP{{45, 12, 223, 213}, {95, 174, 66, 41}}},
{Region: "Paraguay", IPs: []net.IP{{186, 16, 32, 168}, {186, 16, 32, 173}}},
{Region: "Philippines", IPs: []net.IP{{45, 134, 224, 5}, {45, 134, 224, 18}}},
{Region: "Poland Gdansk", IPs: []net.IP{{5, 187, 49, 189}, {5, 187, 53, 55}}},
{Region: "Poland Warsaw", IPs: []net.IP{{84, 17, 55, 134}, {185, 246, 208, 72}}},
{Region: "Portugal Loule", IPs: []net.IP{{176, 61, 146, 106}, {176, 61, 146, 118}}},
{Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 21}, {194, 39, 127, 38}}},
{Region: "Romania", IPs: []net.IP{{45, 89, 175, 53}, {86, 106, 137, 147}}},
{Region: "Russia Moscow", IPs: []net.IP{{213, 183, 56, 145}, {213, 183, 56, 233}}},
{Region: "Russia St. Petersburg", IPs: []net.IP{{213, 183, 54, 110}, {213, 183, 54, 143}}},
{Region: "Serbia", IPs: []net.IP{{152, 89, 160, 115}, {152, 89, 160, 117}}},
{Region: "Singapore", IPs: []net.IP{{89, 187, 163, 132}, {89, 187, 163, 195}}},
{Region: "Norway", IPs: []net.IP{{45, 12, 223, 213}, {84, 247, 50, 69}}},
{Region: "Paraguay", IPs: []net.IP{{181, 40, 18, 56}, {186, 16, 32, 163}}},
{Region: "Philippines", IPs: []net.IP{{45, 134, 224, 10}, {45, 134, 224, 20}}},
{Region: "Poland Gdansk", IPs: []net.IP{{5, 187, 53, 51}}},
{Region: "Poland Warsaw", IPs: []net.IP{{185, 246, 208, 77}, {185, 246, 208, 105}}},
{Region: "Portugal Lisbon", IPs: []net.IP{{5, 154, 174, 26}, {5, 154, 174, 173}}},
{Region: "Portugal Loule", IPs: []net.IP{{176, 61, 146, 111}, {176, 61, 146, 123}}},
{Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 242}}},
{Region: "Romania", IPs: []net.IP{{86, 106, 137, 147}, {86, 106, 137, 149}}},
{Region: "Russia Moscow", IPs: []net.IP{{213, 183, 56, 145}, {213, 183, 56, 160}}},
{Region: "Russia St. Petersburg", IPs: []net.IP{{213, 183, 54, 23}, {213, 183, 54, 165}}},
{Region: "Serbia", IPs: []net.IP{{37, 120, 193, 53}, {152, 89, 160, 211}}},
{Region: "Singapore", IPs: []net.IP{{89, 187, 162, 186}, {89, 187, 163, 210}}},
{Region: "Singapore Hong Kong", IPs: []net.IP{{206, 189, 83, 129}}},
{Region: "Singapore Netherlands", IPs: []net.IP{{104, 248, 148, 18}}},
{Region: "Singapore in", IPs: []net.IP{{128, 199, 193, 35}}},
{Region: "Singapore mp001", IPs: []net.IP{{206, 189, 94, 229}}},
{Region: "Singapore st001", IPs: []net.IP{{217, 138, 201, 91}}},
{Region: "Singapore st002", IPs: []net.IP{{217, 138, 201, 93}}},
{Region: "Singapore st003", IPs: []net.IP{{84, 247, 49, 19}}},
{Region: "Singapore st004", IPs: []net.IP{{84, 247, 49, 21}}},
{Region: "Slovekia", IPs: []net.IP{{37, 120, 221, 3}, {193, 37, 255, 39}}},
{Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 40}, {195, 158, 249, 50}}},
{Region: "South Africa", IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 228}}},
{Region: "Spain Barcelona", IPs: []net.IP{{185, 188, 61, 5}, {185, 188, 61, 13}}},
{Region: "Spain Madrid", IPs: []net.IP{{89, 37, 95, 13}, {188, 208, 141, 36}}},
{Region: "Spain Valencia", IPs: []net.IP{{196, 196, 150, 85}, {196, 196, 150, 101}}},
{Region: "Sweden", IPs: []net.IP{{185, 76, 9, 36}, {185, 76, 9, 44}}},
{Region: "Switzerland", IPs: []net.IP{{37, 120, 213, 5}}},
{Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 27}, {103, 98, 75, 71}}},
{Region: "Thailand", IPs: []net.IP{{103, 253, 74, 3}, {103, 253, 74, 7}}},
{Region: "Slovekia", IPs: []net.IP{{193, 37, 255, 39}, {193, 37, 255, 41}}},
{Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 38}, {195, 158, 249, 42}}},
{Region: "South Africa", IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 232}}},
{Region: "Spain Barcelona", IPs: []net.IP{{185, 188, 61, 15}, {185, 188, 61, 25}}},
{Region: "Spain Madrid", IPs: []net.IP{{188, 208, 141, 18}, {188, 208, 141, 20}}},
{Region: "Spain Valencia", IPs: []net.IP{{185, 153, 150, 48}, {196, 196, 150, 71}}},
{Region: "Sweden", IPs: []net.IP{{45, 83, 91, 149}, {185, 76, 9, 41}}},
{Region: "Switzerland", IPs: []net.IP{{84, 17, 53, 219}, {84, 17, 53, 221}}},
{Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 5}, {2, 58, 241, 43}}},
{Region: "Thailand", IPs: []net.IP{{45, 64, 186, 132}, {45, 64, 186, 163}}},
{Region: "Turkey", IPs: []net.IP{{185, 195, 79, 5}, {185, 195, 79, 19}}},
{Region: "Turkey Istanbul", IPs: []net.IP{{107, 150, 95, 147}, {107, 150, 95, 163}}},
{Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 33}, {185, 108, 105, 151}}},
{Region: "UK London", IPs: []net.IP{{178, 239, 166, 231}, {185, 16, 206, 75}}},
{Region: "Turkey Istanbul", IPs: []net.IP{{107, 150, 95, 155}, {107, 150, 95, 157}}},
{Region: "UK France", IPs: []net.IP{{188, 166, 168, 247}}},
{Region: "UK Germany", IPs: []net.IP{{45, 77, 58, 16}}},
{Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 157}}},
{Region: "UK London", IPs: []net.IP{{178, 239, 166, 218}, {185, 44, 78, 164}}},
{Region: "UK London mp001", IPs: []net.IP{{206, 189, 119, 92}}},
{Region: "UK London st001", IPs: []net.IP{{217, 146, 82, 83}}},
{Region: "UK London st002", IPs: []net.IP{{185, 134, 22, 80}}},
{Region: "UK London st003", IPs: []net.IP{{185, 134, 22, 92}}},
{Region: "UK London st004", IPs: []net.IP{{185, 44, 76, 186}}},
{Region: "UK London st005", IPs: []net.IP{{185, 44, 76, 188}}},
{Region: "UK Manchester", IPs: []net.IP{{89, 238, 140, 227}, {193, 148, 17, 131}}},
{Region: "US Bend", IPs: []net.IP{{45, 43, 14, 83}, {45, 43, 14, 85}}},
{Region: "US Boston", IPs: []net.IP{{192, 34, 83, 232}, {199, 217, 107, 25}}},
{Region: "US Charlotte", IPs: []net.IP{{192, 154, 254, 137}, {192, 154, 255, 54}}},
{Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 183}, {89, 187, 182, 173}}},
{Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 146}, {212, 102, 40, 71}}},
{Region: "US Denver", IPs: []net.IP{{174, 128, 245, 5}, {212, 102, 44, 88}}},
{Region: "US Gahanna", IPs: []net.IP{{104, 244, 208, 37}, {104, 244, 208, 213}}},
{Region: "US Houston", IPs: []net.IP{{104, 148, 30, 39}, {199, 10, 64, 69}}},
{Region: "US Kansas City", IPs: []net.IP{{107, 150, 39, 45}, {204, 12, 208, 117}}},
{Region: "US Las Vegas", IPs: []net.IP{{185, 242, 5, 147}, {185, 242, 5, 155}}},
{Region: "US Latham", IPs: []net.IP{{45, 43, 19, 66}, {45, 43, 19, 84}}},
{Region: "US Los Angeles", IPs: []net.IP{{192, 111, 134, 205}, {192, 111, 134, 222}}},
{Region: "US Miami", IPs: []net.IP{{172, 83, 42, 53}, {172, 83, 42, 156}}},
{Region: "US New York City", IPs: []net.IP{{84, 17, 35, 66}, {84, 17, 35, 76}}},
{Region: "UK Manchester", IPs: []net.IP{{193, 148, 17, 83}, {217, 138, 196, 91}}},
{Region: "US Atlanta", IPs: []net.IP{{66, 115, 166, 147}, {66, 115, 166, 151}}},
{Region: "US Bend", IPs: []net.IP{{45, 43, 14, 95}}},
{Region: "US Boston", IPs: []net.IP{{173, 237, 207, 13}, {199, 217, 107, 20}}},
{Region: "US Buffalo", IPs: []net.IP{{107, 174, 20, 130}}},
{Region: "US Charlotte", IPs: []net.IP{{66, 11, 124, 136}, {192, 154, 254, 135}}},
{Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 197}, {89, 187, 182, 173}}},
{Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 133}, {66, 115, 177, 158}}},
{Region: "US Denver", IPs: []net.IP{{212, 102, 44, 76}, {212, 102, 44, 98}}},
{Region: "US Gahanna", IPs: []net.IP{{104, 244, 209, 99}, {104, 244, 211, 171}}},
{Region: "US Houston", IPs: []net.IP{{104, 148, 30, 53}, {199, 10, 64, 115}}},
{Region: "US Kansas City", IPs: []net.IP{{173, 208, 202, 59}, {173, 208, 202, 61}}},
{Region: "US Las Vegas", IPs: []net.IP{{89, 187, 187, 149}, {185, 242, 5, 215}}},
{Region: "US Latham", IPs: []net.IP{{45, 43, 19, 74}, {45, 43, 19, 92}}},
{Region: "US Los Angeles", IPs: []net.IP{{38, 95, 110, 73}, {192, 111, 134, 202}}},
{Region: "US Maryland", IPs: []net.IP{{23, 82, 8, 173}, {23, 105, 163, 94}}},
{Region: "US Miami", IPs: []net.IP{{89, 187, 173, 250}, {172, 83, 42, 143}}},
{Region: "US Netherlands", IPs: []net.IP{{142, 93, 58, 71}}},
{Region: "US New York City", IPs: []net.IP{{84, 17, 35, 78}, {89, 187, 178, 92}}},
{Region: "US New York City mp001", IPs: []net.IP{{45, 55, 60, 159}}},
{Region: "US New York City st001", IPs: []net.IP{{92, 119, 177, 19}}},
{Region: "US New York City st002", IPs: []net.IP{{92, 119, 177, 21}}},
{Region: "US New York City st003", IPs: []net.IP{{92, 119, 177, 23}}},
{Region: "US New York City st004", IPs: []net.IP{{193, 148, 18, 51}}},
{Region: "US New York City st005", IPs: []net.IP{{193, 148, 18, 53}}},
{Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 85}, {198, 147, 22, 135}}},
{Region: "US Phoenix", IPs: []net.IP{{184, 170, 240, 179}, {199, 58, 187, 10}}},
{Region: "US Saint Louis", IPs: []net.IP{{148, 72, 169, 209}, {148, 72, 174, 51}}},
{Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 172}, {104, 200, 131, 229}}},
{Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 37}, {209, 58, 128, 48}}},
{Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 212}, {209, 216, 92, 222}}},
{Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 135}, {198, 147, 22, 213}}},
{Region: "US Phoenix", IPs: []net.IP{{184, 170, 240, 179}, {199, 58, 187, 3}}},
{Region: "US Portugal", IPs: []net.IP{{142, 93, 81, 242}}},
{Region: "US Saint Louis", IPs: []net.IP{{148, 72, 174, 43}, {148, 72, 174, 51}}},
{Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 165}, {104, 200, 131, 249}}},
{Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 39}, {107, 181, 166, 83}}},
{Region: "US San Francisco mp001", IPs: []net.IP{{165, 232, 53, 25}}},
{Region: "US Seatle", IPs: []net.IP{{199, 229, 250, 163}}},
{Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 197}, {209, 216, 92, 205}}},
{Region: "Ukraine", IPs: []net.IP{{45, 9, 238, 23}, {45, 9, 238, 30}}},
{Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 249, 245}, {45, 9, 249, 247}}},
{Region: "Vietnam", IPs: []net.IP{{202, 143, 111, 211}, {202, 143, 111, 213}}},
{Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 250, 99}, {45, 9, 250, 103}}},
{Region: "Vietnam", IPs: []net.IP{{202, 143, 110, 29}, {202, 143, 110, 32}}},
}
}

View File

@@ -7,15 +7,18 @@ import (
)
func uniqueSortedIPs(ips []net.IP) []net.IP {
uniqueIPs := make(map[string]struct{})
uniqueIPs := make(map[string]struct{}, len(ips))
for _, ip := range ips {
uniqueIPs[ip.String()] = struct{}{}
key := ip.String()
uniqueIPs[key] = struct{}{}
}
ips = make([]net.IP, len(uniqueIPs))
i := 0
for ip := range uniqueIPs {
ips[i] = net.ParseIP(ip)
i++
ips = make([]net.IP, 0, len(uniqueIPs))
for key := range uniqueIPs {
ip := net.ParseIP(key)
if ipv4 := ip.To4(); ipv4 != nil {
ip = ipv4
}
ips = append(ips, ip)
}
sort.Slice(ips, func(i, j int) bool {
return bytes.Compare(ips[i], ips[j]) < 0

View File

@@ -0,0 +1,41 @@
package updater
import (
"net"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_uniqueSortedIPs(t *testing.T) {
t.Parallel()
testCases := map[string]struct {
inputIPs []net.IP
outputIPs []net.IP
}{
"nil": {
inputIPs: nil,
outputIPs: []net.IP{},
},
"empty": {
inputIPs: []net.IP{},
outputIPs: []net.IP{},
},
"single IPv4": {
inputIPs: []net.IP{{1, 1, 1, 1}},
outputIPs: []net.IP{{1, 1, 1, 1}},
},
"two IPv4s": {
inputIPs: []net.IP{{1, 1, 2, 1}, {1, 1, 1, 1}},
outputIPs: []net.IP{{1, 1, 1, 1}, {1, 1, 2, 1}},
},
}
for name, testCase := range testCases {
testCase := testCase
t.Run(name, func(t *testing.T) {
t.Parallel()
outputIPs := uniqueSortedIPs(testCase.inputIPs)
assert.Equal(t, testCase.outputIPs, outputIPs)
})
}
}

View File

@@ -11,7 +11,12 @@ import (
)
func (u *updater) updateSurfshark(ctx context.Context) (err error) {
servers, err := findSurfsharkServers(ctx, u.lookupIP)
servers, warnings, err := findSurfsharkServers(ctx, u.lookupIP)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Surfshark: %s", warning)
}
}
if err != nil {
return fmt.Errorf("cannot update Surfshark servers: %w", err)
}
@@ -23,51 +28,54 @@ func (u *updater) updateSurfshark(ctx context.Context) (err error) {
return nil
}
func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.SurfsharkServer, err error) {
const zipURL = "https://account.surfshark.com/api/v1/server/configurations"
func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.SurfsharkServer, warnings []string, err error) {
const zipURL = "https://my.surfshark.com/vpn/api/v1/server/configurations"
contents, err := fetchAndExtractFiles(zipURL)
if err != nil {
return nil, err
return nil, nil, err
}
mapping := surfsharkSubdomainToRegion()
for fileName, content := range contents {
if err := ctx.Err(); err != nil {
return nil, err
return nil, warnings, err
}
if strings.HasSuffix(fileName, "_tcp.ovpn") {
continue // only parse UDP files
}
remoteLines := extractRemoteLinesFromOpenvpn(content)
if len(remoteLines) == 0 {
return nil, 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)
if len(hosts) == 0 {
return nil, 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 {
warning := fmt.Sprintf("more than one host in %q, only taking first one %q into account", fileName, hosts[0])
warnings = append(warnings, warning)
}
var IPs []net.IP
var region string
for _, host := range hosts {
host := hosts[0]
if net.ParseIP(host) != nil {
// only a few IP addresses, no idea for what region
// ignore them
warning := fmt.Sprintf("ignoring IP address host %q in %q", host, fileName)
warnings = append(warnings, warning)
continue
}
const repetition = 3
newIPs, err := resolveRepeat(ctx, lookupIP, host, repetition)
const repetition = 5
IPs, err := resolveRepeat(ctx, lookupIP, host, repetition)
if err != nil {
return nil, err
return nil, warnings, err
} else if len(IPs) == 0 {
warning := fmt.Sprintf("no IP address found for host %q", host)
warnings = append(warnings, warning)
continue
}
IPs = append(IPs, newIPs...)
if region == "" {
subdomain := strings.TrimSuffix(host, ".prod.surfshark.com")
region = surfsharkSubdomainToRegion(subdomain)
}
}
if len(IPs) == 0 {
continue // only IPs, no hostnames found
}
if region == "" { // region not found in mapping
region, ok := mapping[subdomain]
if ok {
delete(mapping, subdomain)
} else {
region = strings.TrimSuffix(hosts[0], ".prod.surfshark.com")
warning := fmt.Sprintf("subdomain %q not found in Surfshark mapping", subdomain)
warnings = append(warnings, warning)
}
server := models.SurfsharkServer{
Region: region,
@@ -75,10 +83,45 @@ func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers [
}
servers = append(servers, server)
}
// process entries in mapping that were not in zip file
remainingServers, newWarnings, err := getRemainingServers(ctx, mapping, lookupIP)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
servers = append(servers, remainingServers...)
sort.Slice(servers, func(i, j int) bool {
return servers[i].Region < servers[j].Region
})
return servers, nil
return servers, warnings, nil
}
func getRemainingServers(ctx context.Context, mapping map[string]string, lookupIP lookupIPFunc) (
servers []models.SurfsharkServer, warnings []string, err error) {
for subdomain, region := range mapping {
if err := ctx.Err(); err != nil {
return servers, warnings, err
}
host := subdomain + ".prod.surfshark.com"
const repetition = 3
IPs, err := resolveRepeat(ctx, lookupIP, host, repetition)
if err != nil {
warning := fmt.Sprintf("subdomain %q for region %q from mapping: %s", subdomain, region, err)
warnings = append(warnings, warning)
continue
} else if len(IPs) == 0 {
warning := fmt.Sprintf("subdomain %q for region %q from mapping did not resolve to any IP address", subdomain, region)
warnings = append(warnings, warning)
continue
}
server := models.SurfsharkServer{
Region: region,
IPs: uniqueSortedIPs(IPs),
}
servers = append(servers, server)
}
return servers, warnings, nil
}
func stringifySurfsharkServers(servers []models.SurfsharkServer) (s string) {
@@ -92,7 +135,7 @@ func stringifySurfsharkServers(servers []models.SurfsharkServer) (s string) {
return s
}
func surfsharkSubdomainToRegion(subdomain string) (region string) {
func surfsharkSubdomainToRegion() (mapping map[string]string) {
return map[string]string{
"ae-dub": "United Arab Emirates",
"al-tia": "Albania",
@@ -248,5 +291,9 @@ func surfsharkSubdomainToRegion(subdomain string) (region string) {
"ar-bua": "Argentina Buenos Aires",
"tr-ist": "Turkey Istanbul",
"mx-mex": "Mexico City Mexico",
}[subdomain]
"ca-tor-mp001": "Canada Toronto mp001",
"de-fra-mp001": "Germany Frankfurt mp001",
"nl-ams-mp001": "Netherlands Amsterdam mp001",
"us-sfo-mp001": "US San Francisco mp001",
}
}