mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-23 10:56:22 +02:00
d9cc7dcffb
- new directory structure containing manifest.json and one json file per provider, by default. - the manifest.json file can specify a filepath for each vpn provider - each vpn provider json data file can contain the `"preferred": true` field to enforce it is used even if outdated, unless there is a version mismatch - `STORAGE_SERVERS_DIRECTORY_PATH` replaces `STORAGE_FILEPATH` (which is now a migration source only). It sets the directory where server manifest and per-provider JSON files are stored (default: `/gluetun/servers/`). - First-run migration: On startup, gluetun checks for the old /gluetun/servers.json file; if found and no new manifest exists, it automatically migrates all data to /gluetun/servers/ directory structure - Silent fallback: If legacy file isn't found, uses the new directory path normally - Legacy cleanup: After successful migration, attempts to remove the old fat JSON file (logs warning only if removal fails, e.g., read-only bind mounts)
59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package hidemyass
|
|
|
|
import (
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func parseOpenvpnURL(url, protocol string) (country, region, city string) {
|
|
lastSlashIndex := strings.LastIndex(url, "/")
|
|
url = url[lastSlashIndex+1:]
|
|
|
|
suffix := "." + strings.ToUpper(protocol) + ".ovpn"
|
|
url = strings.TrimSuffix(url, suffix)
|
|
|
|
parts := strings.Split(url, ".")
|
|
|
|
switch len(parts) {
|
|
case 1:
|
|
country = parts[0]
|
|
return country, "", ""
|
|
case 2: //nolint:mnd
|
|
country = parts[0]
|
|
city = parts[1]
|
|
default:
|
|
country = parts[0]
|
|
region = parts[1]
|
|
city = parts[2]
|
|
}
|
|
|
|
country = camelCaseToWords(country)
|
|
region = camelCaseToWords(region)
|
|
city = camelCaseToWords(city)
|
|
|
|
country = mutateSpecialCountryCases(country)
|
|
|
|
return country, region, city
|
|
}
|
|
|
|
func camelCaseToWords(camelCase string) (words string) {
|
|
wasLowerCase := false
|
|
for _, r := range camelCase {
|
|
if wasLowerCase && unicode.IsUpper(r) {
|
|
words += " "
|
|
}
|
|
wasLowerCase = unicode.IsLower(r)
|
|
words += string(r)
|
|
}
|
|
return words
|
|
}
|
|
|
|
func mutateSpecialCountryCases(country string) string {
|
|
switch country {
|
|
case "Coted`Ivoire":
|
|
return "Cote d'Ivoire"
|
|
default:
|
|
return country
|
|
}
|
|
}
|