mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-26 20:36:27 +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)
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package vpn
|
|
|
|
import (
|
|
"github.com/qdm12/gluetun-servers/pkg/constants"
|
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
|
"github.com/qdm12/gluetun/internal/netlink"
|
|
)
|
|
|
|
func (l *Loop) isIPv6Used(settings settings.VPN) bool {
|
|
if !l.ipv6SupportLevel.IsSupported() {
|
|
return false
|
|
}
|
|
switch settings.Type {
|
|
case constants.AmneziaWg:
|
|
for _, prefix := range settings.AmneziaWg.Wireguard.Addresses {
|
|
if prefix.Addr().Is6() {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
case constants.OpenVPN:
|
|
link, err := l.netLinker.LinkByName(settings.OpenVPN.Interface)
|
|
if err != nil {
|
|
l.logger.Warnf("assuming IPv6 is not supported, cannot get OpenVPN link by name: %v", err)
|
|
return false
|
|
}
|
|
ipv6Prefixes, err := l.netLinker.AddrList(link.Index, netlink.FamilyV6)
|
|
if err != nil {
|
|
l.logger.Warnf("assuming IPv6 is not supported, cannot list OpenVPN link addresses: %v", err)
|
|
return false
|
|
}
|
|
for _, prefix := range ipv6Prefixes {
|
|
if prefix.Addr().IsGlobalUnicast() && !prefix.Addr().IsPrivate() {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
case constants.Wireguard:
|
|
for _, prefix := range settings.Wireguard.Addresses {
|
|
if prefix.Addr().Is6() {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
default:
|
|
panic("vpn type not implemented: " + settings.Type)
|
|
}
|
|
}
|