hotfix(vpn): inject cmder object for up/down commands and fix cleanup panic

This commit is contained in:
Quentin McGaw
2026-03-08 23:06:32 +00:00
parent 57c53bc19e
commit d98afce793
4 changed files with 10 additions and 13 deletions
+3 -5
View File
@@ -100,10 +100,12 @@ type PublicIPLoop interface {
ClearData() (err error) ClearData() (err error)
} }
type CmdStarter interface { type Cmder interface {
Start(cmd *exec.Cmd) ( Start(cmd *exec.Cmd) (
stdoutLines, stderrLines <-chan string, stdoutLines, stderrLines <-chan string,
waitError <-chan error, startErr error) waitError <-chan error, startErr error)
RunAndLog(ctx context.Context, command string,
logger command.Logger) (err error)
} }
type HealthChecker interface { type HealthChecker interface {
@@ -121,7 +123,3 @@ type Service interface {
Start() (runError <-chan error, err error) Start() (runError <-chan error, err error)
Stop() error Stop() error
} }
type Cmder interface {
RunAndLog(ctx context.Context, command string, logger command.Logger) (err error)
}
+5 -6
View File
@@ -17,7 +17,6 @@ type Loop struct {
state *state.State state *state.State
providers Providers providers Providers
storage Storage storage Storage
cmder Cmder
healthSettings settings.Health healthSettings settings.Health
healthChecker HealthChecker healthChecker HealthChecker
healthServer HealthServer healthServer HealthServer
@@ -36,9 +35,9 @@ type Loop struct {
dnsLooper DNSLoop dnsLooper DNSLoop
boringPoll Service boringPoll Service
// Other objects // Other objects
starter CmdStarter // for OpenVPN cmder Cmder // for OpenVPN and up/down commands
logger log.LoggerInterface logger log.LoggerInterface
client *http.Client client *http.Client
// Internal channels and values // Internal channels and values
stop <-chan struct{} stop <-chan struct{}
stopped chan<- struct{} stopped chan<- struct{}
@@ -57,7 +56,7 @@ func NewLoop(vpnSettings settings.VPN, ipv6Supported bool, vpnInputPorts []uint1
providers Providers, storage Storage, boringPoll Service, providers Providers, storage Storage, boringPoll Service,
healthSettings settings.Health, healthChecker HealthChecker, healthServer HealthServer, healthSettings settings.Health, healthChecker HealthChecker, healthServer HealthServer,
openvpnConf OpenVPN, netLinker NetLinker, fw Firewall, routing Routing, openvpnConf OpenVPN, netLinker NetLinker, fw Firewall, routing Routing,
portForward PortForward, starter CmdStarter, portForward PortForward, cmder Cmder,
publicip PublicIPLoop, dnsLooper DNSLoop, publicip PublicIPLoop, dnsLooper DNSLoop,
logger log.LoggerInterface, client *http.Client, logger log.LoggerInterface, client *http.Client,
buildInfo models.BuildInformation, versionInfo bool, buildInfo models.BuildInformation, versionInfo bool,
@@ -90,7 +89,7 @@ func NewLoop(vpnSettings settings.VPN, ipv6Supported bool, vpnInputPorts []uint1
portForward: portForward, portForward: portForward,
publicip: publicip, publicip: publicip,
dnsLooper: dnsLooper, dnsLooper: dnsLooper,
starter: starter, cmder: cmder,
logger: logger, logger: logger,
client: client, client: client,
start: start, start: start,
+1 -1
View File
@@ -14,7 +14,7 @@ import (
// It returns a serverName for port forwarding (PIA) and an error if it fails. // It returns a serverName for port forwarding (PIA) and an error if it fails.
func setupOpenVPN(ctx context.Context, fw Firewall, func setupOpenVPN(ctx context.Context, fw Firewall,
openvpnConf OpenVPN, providerConf provider.Provider, openvpnConf OpenVPN, providerConf provider.Provider,
settings settings.VPN, ipv6Supported bool, starter CmdStarter, settings settings.VPN, ipv6Supported bool, starter Cmder,
logger openvpn.Logger) (runner *openvpn.Runner, connection models.Connection, err error, logger openvpn.Logger) (runner *openvpn.Runner, connection models.Connection, err error,
) { ) {
connection, err = providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported) connection, err = providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported)
+1 -1
View File
@@ -36,7 +36,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
if settings.Type == vpn.OpenVPN { if settings.Type == vpn.OpenVPN {
vpnInterface = settings.OpenVPN.Interface vpnInterface = settings.OpenVPN.Interface
vpnRunner, connection, err = setupOpenVPN(ctx, l.fw, vpnRunner, connection, err = setupOpenVPN(ctx, l.fw,
l.openvpnConf, providerConf, settings, l.ipv6Supported, l.starter, subLogger) l.openvpnConf, providerConf, settings, l.ipv6Supported, l.cmder, subLogger)
} else { // Wireguard } else { // Wireguard
vpnInterface = settings.Wireguard.Interface vpnInterface = settings.Wireguard.Interface
vpnRunner, connection, err = setupWireguard(ctx, l.netLinker, l.fw, vpnRunner, connection, err = setupWireguard(ctx, l.netLinker, l.fw,