621e8895c9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
3.2 KiB
Bash
82 lines
3.2 KiB
Bash
#!/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
|
|
}
|