#!/bin/sh
# speedtest_ex600_vpn.sh - Speed test a traves de la VPN WireGuard (interfaz "vpn")
# para Genexis EX600 (GenXOS/IOPSYS, OpenWrt 21.02). Compatible con BusyBox ash.
# Fuerza todo el trafico de prueba (ping, descarga y subida) por la interfaz VPN
# y registra en CSV para comparar la estabilidad del tunel en el tiempo.
#
# Uso:      sh speedtest_ex600_vpn.sh          (una medicion)
#           sh speedtest_ex600_vpn.sh test     (verifica interfaz y dependencias)
# Cron:     */30 * * * * /root/speedtest_ex600_vpn.sh >/dev/null 2>&1

# ---------- Configuracion ----------
IFACE="vpn"                              # interfaz WireGuard
LOG_FILE="/root/speedtest_vpn_log.csv"   # /root sobrevive reinicios; /tmp no
DL_BYTES=50000000                        # 50 MB de descarga
UL_MB=15                                 # 15 MB de subida
MAX_TIME=45                              # timeout por prueba (s); VPN suele ser mas lenta
MAX_LINES=3000                           # rotacion del log
PING_HOST="1.1.1.1"
DL_URL="https://speed.cloudflare.com/__down?bytes=${DL_BYTES}"
UL_URL="https://speed.cloudflare.com/__up"
# -----------------------------------

command -v curl >/dev/null 2>&1 || { echo "ERROR: curl no esta disponible en este firmware"; exit 1; }

# La interfaz debe existir y estar levantada
if ! ip link show "$IFACE" >/dev/null 2>&1; then
    echo "ERROR: la interfaz '$IFACE' no existe"
    exit 1
fi
if ! ip link show "$IFACE" 2>/dev/null | grep -q "UP"; then
    echo "ERROR: la interfaz '$IFACE' esta caida"
    exit 1
fi

if [ "$1" = "test" ]; then
    echo "curl: $(curl --version | head -1)"
    echo "interfaz $IFACE: $(ip -4 addr show "$IFACE" | awk '/inet /{print $2}')"
    ping -I "$IFACE" -c1 -W3 "$PING_HOST" >/dev/null 2>&1 \
        && echo "ping via $IFACE: OK" || echo "ping via $IFACE: FALLO (revisa allowed-ips/rutas)"
    echo "Log: $LOG_FILE"
    exit 0
fi

TS=$(date '+%Y-%m-%d %H:%M:%S')

# --- Latencia y jitter via VPN (5 pings) ---
PING_OUT=$(ping -I "$IFACE" -c5 -W3 "$PING_HOST" 2>/dev/null | tail -1)
LAT_AVG=$(echo "$PING_OUT" | awk -F'=' '{print $2}' | awk -F'/' '{print $2}')
LAT_MAX=$(echo "$PING_OUT" | awk -F'=' '{print $2}' | awk -F'/' '{print $3}' | awk '{print $1}')
[ -z "$LAT_AVG" ] && LAT_AVG="ERR" && LAT_MAX="ERR"

# --- Descarga via VPN (bytes/s -> Mbps) ---
DL_BPS=$(curl -s --interface "$IFACE" -o /dev/null --max-time "$MAX_TIME" \
    -w '%{speed_download}' "$DL_URL" 2>/dev/null)
DL_MBPS=$(awk -v b="${DL_BPS:-0}" 'BEGIN{printf "%.1f", b*8/1000000}')

# --- Subida via VPN (bytes/s -> Mbps) ---
UL_BPS=$(dd if=/dev/zero bs=1048576 count="$UL_MB" 2>/dev/null | \
    curl -s --interface "$IFACE" -o /dev/null --max-time "$MAX_TIME" \
    -w '%{speed_upload}' -H 'Content-Type: application/octet-stream' \
    --data-binary @- "$UL_URL" 2>/dev/null)
UL_MBPS=$(awk -v b="${UL_BPS:-0}" 'BEGIN{printf "%.1f", b*8/1000000}')

# --- Registro CSV ---
[ -f "$LOG_FILE" ] || echo "fecha,latencia_ms,latencia_max_ms,descarga_mbps,subida_mbps" > "$LOG_FILE"
echo "$TS,$LAT_AVG,$LAT_MAX,$DL_MBPS,$UL_MBPS" >> "$LOG_FILE"

# --- Rotacion ---
LINES=$(wc -l < "$LOG_FILE")
if [ "$LINES" -gt "$MAX_LINES" ]; then
    { head -1 "$LOG_FILE"; tail -n "$MAX_LINES" "$LOG_FILE"; } > "${LOG_FILE}.tmp" \
        && mv "${LOG_FILE}.tmp" "$LOG_FILE"
fi

echo "$TS [VPN:$IFACE] | ping ${LAT_AVG}ms | down ${DL_MBPS} Mbps | up ${UL_MBPS} Mbps"
