Handle overloaded VPN gateways
re-check if the connected gateway is overloaded and move automatically to a different one. Also see leap/container-platform/openvpn#7
This is my first POC to solve the problem. Idea: run forever in background. Sleep x. Check if VPN is connected. Check if gateway is overloaded. If so: fetch gateways, reload firewall, restart vpn
Implementaion: checkOverload
gets run as go routinge:
func (b *Bitmask5) checkOverload() {
for true {
log.Trace().Msg("Checking gateway overload")
status, _ := b.GetStatus()
if status == On {
overloaded, err := b.menshen.IsGatewayOverloaded()
if err != nil {
log.Warn().
Err(err).
Msg("Could not check if current connected gateway is overloaded")
}
log.Trace().
Str("vpnStatus", status).
Bool("overloaded", overloaded).
Msg("OpenVPN gateway status")
if overloaded {
log.Info().Msg("Current connected gateway is overloaded. Fetching gateways and restarting")
err := b.menshen.FetchGateways("openvpn")
if err != nil {
log.Warn().
Err(err).
Msg("Could not fetch gateways")
continue
}
err = b.ReloadFirewall()
if err != nil {
log.Warn().
Err(err).
Msg("Could not reload firewall")
continue
}
err = b.Reconnect()
if err != nil {
log.Warn().
Err(err).
Msg("Could not reconnect OpenVPN")
}
}
}
time.Sleep(10 * time.Second)
}
}
This should use bitmask-core to do a check like /v5/gateway/<gateway identifier>/overloaded
func (m *Menshen) IsGatewayOverloaded() (bool, error) {
random := rand.Intn(10)
log.Debug().
Int("random", random).
Msg("oracle")
overloaded := random > 5
return overloaded, nil
}
The Poc is simple and it works FetchGateways
I don't have a gateway from "Amsterdam". What to do...
Edited by Pea Nut