Files
elmprodvpn/selective-vpn-api/app/transport_backends.go

74 lines
1.8 KiB
Go

package app
import (
"strings"
"time"
)
const (
transportBackendActionTimeout = 20 * time.Second
transportBackendHealthTimeout = 5 * time.Second
transportBackendProbeTimeout = 900 * time.Millisecond
)
var transportSystemdUnitsDir = "/etc/systemd/system"
type transportCommandRunner func(timeout time.Duration, name string, args ...string) (string, string, int, error)
var transportRunCommand transportCommandRunner = runCommandTimeout
type transportBackendActionResult struct {
OK bool
Code string
Message string
ExitCode int
Stdout string
Stderr string
Retryable bool
}
type transportBackendHealthResult struct {
OK bool
Code string
Message string
Status TransportClientStatus
LatencyMS int
Retryable bool
}
type transportBackendAdapter interface {
ID() string
Action(client TransportClient, action string) transportBackendActionResult
Health(client TransportClient) transportBackendHealthResult
Provision(client TransportClient) transportBackendActionResult
Cleanup(client TransportClient) transportBackendActionResult
}
func selectTransportBackend(client TransportClient) transportBackendAdapter {
mode := transportRuntimeMode(client.Config)
switch mode {
case "exec":
// Continue with current runner-based backend selection.
case "embedded", "sidecar":
return transportUnsupportedRuntimeBackend{mode: mode}
default:
return transportUnsupportedRuntimeBackend{mode: mode}
}
runner := strings.ToLower(strings.TrimSpace(transportConfigString(client.Config, "runner")))
unit := strings.TrimSpace(transportConfigString(client.Config, "unit"))
switch runner {
case "systemd":
return transportSystemdBackend{}
case "mock":
return transportMockBackend{}
case "":
if unit != "" {
return transportSystemdBackend{}
}
return transportMockBackend{}
default:
return transportMockBackend{}
}
}