#!/bin/bash
# Description : Arrêt des services AX.25 (FPAC, FBB, daemons, modules noyau)
# this script file is /usr/local/sbin/ax25stop
#
# Auteurs : K4GBB C. Schuman k4gbb1@gmail.com (script original),
#           Bernard Pidoux F6BVP (adaptation Linux)
# Date    : 2026-05-27
# Modifs  : suppression doublons ax25ipd/netromd, nettoyage commentaires,
#           modernisation (ip au lieu de ifconfig)

echo "=== Stopping AX.25 Services ==="

# Stop FPAC (intégré depuis myfpac.sh -stop)
echo "Stopping FPAC..."
FPAC_DIR="/usr/local/sbin"

# 1. Arrêter fpacnode et fpacshell (sessions utilisateurs actives)
for PROC_NAME in fpacnode fpacshell; do
    PID=$(pidof -x $PROC_NAME)
    if [ -n "$PID" ]; then
        echo -n "  Stopping $PROC_NAME (PID: $PID)... "
        kill -TERM $PID
        for i in {1..5}; do
            sleep 1
            if ! pidof -x $PROC_NAME > /dev/null 2>&1; then
                echo "OK"
                break
            fi
            if [ $i -eq 5 ]; then
                echo "TIMEOUT, forcing..."
                kill -9 $PID > /dev/null 2>&1
            fi
        done
    fi
done

# 2. Arrêter les démons FPAC
for PROC_NAME in flexd fpacroute fpacstat fpacwpd fpad fpacwdog mailbbs kissattach; do
    PID=$(pidof -x $FPAC_DIR/$PROC_NAME)
    if [ -n "$PID" ]; then
        echo -n "  Stopping $PROC_NAME (PID: $PID)... "
        kill -TERM $PID > /dev/null 2>&1
        for i in {1..5}; do
            sleep 1
            if ! pidof -x $FPAC_DIR/$PROC_NAME > /dev/null 2>&1; then
                echo "OK"
                break
            fi
            if [ $i -eq 5 ]; then
                echo "TIMEOUT, forcing..."
                kill -9 $PID > /dev/null 2>&1
                sleep 1
            fi
        done
    fi
done
sleep 2

# Stop BBS
echo "Stopping FBB..."
PID=$(pidof xfbbd)  # sans -x : xfbbd est un binaire compilé, pas un script
if [ -n "$PID" ]; then
    echo -n "Stopping xfbbd (PID: $PID)... "
    kill -TERM $PID > /dev/null 2>&1
    for i in {1..5}; do
        sleep 1
        if ! pidof xfbbd > /dev/null 2>&1; then
            echo "OK"
            break
        fi
        if [ $i -eq 5 ]; then
            echo "TIMEOUT, forcing..."
            kill -9 $PID > /dev/null 2>&1
            sleep 1
        fi
    done
else
    echo "xfbbd not running"
fi

# Save NetRom routes
echo "Saving NetRom routes..."
/usr/local/sbin/nodesave -p /usr/local/sbin/ /var/ax25/nrsave && echo "N/R routes saved"

# Stop Ax25 support processes
echo "Stopping AX.25 daemons..."
for PROC_NAME in beacon ax25d ax25ipd ax25rtd mheardd listen saxIgate netromd
do
    PID=$(pidof -x $PROC_NAME)
    if [ -n "$PID" ]; then
        echo -n "Stopping $PROC_NAME (PID: $PID)... "
        kill -TERM $PID > /dev/null 2>&1
        
        # Attendre max 5 secondes
        for i in {1..5}; do
            sleep 1
            if ! pidof -x $PROC_NAME > /dev/null 2>&1; then
                echo "OK"
                break
            fi
            if [ $i -eq 5 ]; then
                echo "TIMEOUT, forcing..."
                kill -9 $PID > /dev/null 2>&1
                sleep 1
            fi
        done
    fi
done

# Attendre que les sockets se ferment
echo "Waiting for sockets to close..."
sleep 3

# Désactiver toutes les interfaces AX.25/NetRom/Rose
echo "Bringing down network interfaces..."
for iface in $(ls /sys/class/net/ 2>/dev/null | grep -E '^(ax|nr|rose)'); do
    if ip link show "$iface" > /dev/null 2>&1; then
        echo -n "  Bringing down $iface... "
        ip link set "$iface" down 2>/dev/null && echo "OK" || echo "FAILED"
    fi
done

# Tuer kissattach/mkiss en dernier
echo "Stopping KISS..."
killall -TERM kissattach > /dev/null 2>&1
sleep 2
killall -9 kissattach > /dev/null 2>&1

# CRITIQUE: Attendre que TOUTES les connexions soient fermées
echo ""
echo "Checking for remaining connections..."
sleep 2

# Afficher les connexions restantes
for proto in ax25 rose nr; do
    if [ -f "/proc/net/$proto" ]; then
        LINES=$(wc -l < /proc/net/$proto)
        if [ $LINES -gt 1 ]; then  # Plus que juste l'en-tête
            echo "WARNING: Active $proto connections:"
            cat /proc/net/$proto
            echo ""
        fi
    fi
done

# Afficher les interfaces AX.25 restantes si présentes
if ls /sys/class/net/ 2>/dev/null | grep -qE '^(ax|nr|rose)'; then
    echo "  Liste des interfaces restantes :"
    /usr/sbin/ip address
    sleep 4
fi

# Afficher les sockets actifs si présents
for f in ax25 rose rose_nodes rose_neigh; do
    if [ -f "/proc/net/$f" ] && [ $(wc -l < /proc/net/$f) -gt 1 ]; then
        echo "--- /proc/net/$f ---"
        cat "/proc/net/$f"
    fi
done

# Décharger les modules dans le BON ORDRE
echo "Unloading kernel modules..."
# ORDRE CRITIQUE: netrom et mkiss AVANT rose, rose AVANT ax25
#for module in mkiss 6pack netrom rose ax25; do
for module in mkiss 6pack netrom rose ax25; do
    if lsmod | grep -q "^$module "; then
        echo -n "  Removing $module... "
        
        # Vérifier le compteur d'utilisation
        USE_COUNT=$(lsmod | grep "^$module " | awk '{print $3}')
        if [ "$USE_COUNT" != "0" ] && [ "$USE_COUNT" != "-" ]; then
            echo "WARNING: Module in use (count=$USE_COUNT)"
        fi
        
        # Essayer de retirer le module
        if modprobe -r $module 2>/dev/null; then
            echo "OK"
        else
            echo "FAILED"
            # Afficher pourquoi
            lsmod | grep -E "^$module |Used by" | head -2
        fi
        sleep 1
    fi
done

echo ""
echo "=== AX.25 Shutdown Complete ==="
echo ""

# Rapport final
echo "Remaining modules:"
REMAINING=$(lsmod | grep -E "ax25|rose|netrom|mkiss")
if [ -z "$REMAINING" ]; then
    echo "  None - All modules unloaded successfully!"
else
    echo "$REMAINING"
fi

echo ""
echo "Active network interfaces:"
ls /sys/class/net/ 2>/dev/null | grep -E '^(ax|nr|rose)' || echo "  None"

echo ""
echo "Active connections:"
for proto in ax25 rose nr; do
    if [ -f "/proc/net/$proto" ]; then
        LINES=$(wc -l < /proc/net/$proto)
        if [ $LINES -gt 1 ]; then
            echo "  $proto: $((LINES - 1)) active"
        fi
    fi
done

# Vérification finale
if lsmod | grep -q -E "ax25|rose|netrom|mkiss"; then
    echo ""
    echo "WARNING: Some modules could not be unloaded."
    echo "You may need to reboot or check for stuck processes/sockets."
    exit 1
else
    echo ""
    echo "SUCCESS: All AX.25 modules unloaded cleanly."
    exit 0
fi
