Files
fn_registry/functions/infra/nordvpn_container_start.go
T
egutierrez 2f119478af feat: funciones NordVPN bash y Go — CLI, contenedor Docker y parser de estado
Funciones bash para instalar, conectar, desconectar, estado, IP, ciudades, países y protocolo.
Funciones Go para gestionar contenedor NordVPN (run/start/stop) y parsear estado.
Incluye tipo NordVPNStatus y tests para el parser.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:55:08 +02:00

74 lines
2.0 KiB
Go

package infra
import (
"fmt"
"strings"
"time"
)
// NordVPNContainerOpts opciones para el container gateway NordVPN.
type NordVPNContainerOpts struct {
Token string // Token de acceso NordVPN (obligatorio)
Country string // Pais al que conectar (opcional, ej: "Spain")
City string // Ciudad (opcional, ej: "Madrid")
Protocol string // "NordLynx" o "OpenVPN" (default: NordLynx)
Name string // Nombre del container (default: "nordvpn")
}
// NordVPNContainerStart levanta un container Docker con NordVPN como gateway.
// Otros containers pueden usar su red con --network=container:<name>.
// Espera hasta que el tunel este activo o timeout de 30s.
func NordVPNContainerStart(opts NordVPNContainerOpts) (string, error) {
if opts.Token == "" {
return "", fmt.Errorf("nordvpn token required")
}
if opts.Name == "" {
opts.Name = "nordvpn"
}
if opts.Protocol == "" {
opts.Protocol = "NordLynx"
}
env := map[string]string{
"TOKEN": opts.Token,
"TECHNOLOGY": opts.Protocol,
}
if opts.Country != "" {
connect := opts.Country
if opts.City != "" {
connect += " " + opts.City
}
env["CONNECT"] = connect
}
// Limpiar container previo con el mismo nombre si existe
_ = DockerRemoveContainer(opts.Name, true)
id, err := DockerRunContainer("ghcr.io/bubuntux/nordvpn", DockerRunOpts{
Name: opts.Name,
Env: env,
Detach: true,
CapAdd: []string{"NET_ADMIN", "NET_RAW"},
})
if err != nil {
return "", fmt.Errorf("nordvpn container start: %w", err)
}
// Esperar a que el tunel este activo
for i := 0; i < 30; i++ {
time.Sleep(1 * time.Second)
logs, logErr := DockerContainerLogs(opts.Name, 20)
if logErr != nil {
continue
}
if strings.Contains(logs, "Connected") || strings.Contains(logs, "connected") {
return id, nil
}
if strings.Contains(logs, "error") || strings.Contains(logs, "failed") {
return id, fmt.Errorf("nordvpn connection failed, check logs: docker logs %s", opts.Name)
}
}
return id, fmt.Errorf("nordvpn connection timeout after 30s, check logs: docker logs %s", opts.Name)
}