#!/usr/bin/env bash # wg_install — Instala wireguard + wireguard-tools en Linux (debian/ubuntu/fedora/arch). # Idempotente: si wg ya está instalado emite JSON con status=already-present y sale. # Carga módulo kernel wireguard. Emite JSON a stdout. Logs a stderr con prefijo [wg_install]. # Exit 0 = éxito, 1 = fallo. wg_install() { local distro="" version="" status="" _wg_log() { echo "[wg_install] $*" >&2; } # Detectar distro via /etc/os-release if [[ -f /etc/os-release ]]; then distro=$(. /etc/os-release && echo "${ID:-unknown}") else _wg_log "ERROR: /etc/os-release no encontrado; no se puede detectar distro" return 1 fi _wg_log "Distro detectada: ${distro}" # Comprobar si wg ya está instalado (idempotencia) if command -v wg &>/dev/null; then version=$(wg --version 2>/dev/null | head -n1 || echo "unknown") _wg_log "wireguard-tools ya presente (${version}); cargando módulo kernel" # Intentar cargar módulo igualmente (no fatal) sudo modprobe wireguard 2>/dev/null || true printf '{"status":"already-present","distro":"%s","version":"%s"}\n' "${distro}" "${version}" return 0 fi # Instalar según distro case "${distro}" in debian|ubuntu|linuxmint|pop|kali|raspbian) _wg_log "Usando apt-get (${distro})" sudo apt-get update -y >&2 || { _wg_log "ERROR: apt-get update falló"; return 1; } sudo apt-get install -y wireguard wireguard-tools >&2 \ || { _wg_log "ERROR: apt-get install wireguard falló"; return 1; } ;; fedora) _wg_log "Usando dnf (fedora)" sudo dnf install -y wireguard-tools >&2 \ || { _wg_log "ERROR: dnf install wireguard-tools falló"; return 1; } ;; rhel|centos|rocky|almalinux) _wg_log "Usando dnf (rhel/centos/rocky/alma)" sudo dnf install -y epel-release >&2 || true sudo dnf install -y wireguard-tools >&2 \ || { _wg_log "ERROR: dnf install wireguard-tools falló"; return 1; } ;; arch|manjaro|endeavouros) _wg_log "Usando pacman (arch)" sudo pacman -S --noconfirm wireguard-tools >&2 \ || { _wg_log "ERROR: pacman install wireguard-tools falló"; return 1; } ;; *) _wg_log "ERROR: distro '${distro}' no soportada (soportadas: debian/ubuntu/fedora/rhel/arch)" return 1 ;; esac # Verificar instalación if ! command -v wg &>/dev/null; then _wg_log "ERROR: 'wg' no encontrado tras la instalación" return 1 fi version=$(wg --version 2>/dev/null | head -n1 || echo "unknown") _wg_log "wireguard-tools instalado: ${version}" # Cargar módulo kernel (no fatal: kernels >=5.6 lo incluyen built-in) if sudo modprobe wireguard 2>/dev/null; then _wg_log "Módulo kernel wireguard cargado" else _wg_log "WARN: modprobe wireguard falló (puede estar built-in en el kernel o requerir DKMS)" fi status="installed" printf '{"status":"%s","distro":"%s","version":"%s"}\n' "${status}" "${distro}" "${version}" return 0 }