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>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user