Files
gluetun/internal/vpn/cleanup.go
T
Quentin McGaw d9cc7dcffb refactor(storage): new storage file structure
- 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)
2026-05-11 04:53:04 +00:00

60 lines
1.4 KiB
Go

package vpn
import (
"context"
"errors"
"strings"
"github.com/qdm12/gluetun-servers/pkg/constants"
"github.com/qdm12/gluetun/internal/configuration/settings"
)
func (l *Loop) cleanup() {
settings := l.GetSettings()
var err error
if *settings.DownCommand != "" {
commandString := strings.ReplaceAll(*settings.DownCommand, "{{VPN_INTERFACE}}", getVPNInterface(settings))
err = l.cmder.RunAndLog(context.Background(), commandString, l.logger)
if err != nil {
l.logger.Error("failed to run VPN down command: " + err.Error())
}
}
for _, vpnPort := range l.vpnInputPorts {
err := l.fw.RemoveAllowedPort(context.Background(), vpnPort)
if err != nil {
l.logger.Error("cannot remove allowed input port from firewall: " + err.Error())
}
}
err = l.publicip.ClearData()
if err != nil {
l.logger.Error("clearing public IP data: " + err.Error())
}
err = l.stopPortForwarding()
if err != nil {
portForwardingAlreadyStopped := errors.Is(err, context.Canceled)
if !portForwardingAlreadyStopped {
l.logger.Error("stopping port forwarding: " + err.Error())
}
}
err = l.boringPoll.Stop()
if err != nil {
l.logger.Error("stopping boring poll: " + err.Error())
}
}
func getVPNInterface(settings settings.VPN) string {
switch settings.Type {
case constants.OpenVPN:
return settings.OpenVPN.Interface
case constants.Wireguard:
return settings.Wireguard.Interface
default:
panic("invalid VPN type: " + settings.Type)
}
}