E. Scripts de contrôle d'état de liens

Les deux scripts ci-dessous assurent un contrôle permanent sur les deux liens entre l'aire OSPF et le routeur ISP à l'aide des messages d'information ICMP echo/reply. Le propriétaire du processus doit avoir la capacité à ajouter ou supprimer une route au niveau noyau.

  • Sur le routeur R1, la passerelle à joindre est à l'adresse 10.1.30.2. Le code du script est téléchargeable à partir du lien suivant : r1-keepalive.sh.

    #!/bin/bash
    
    #* Adaptation d'un script publié par Lukas Ruf en 2006
    #* License: GPL3
    
    neighbor=10.1.30.2
    
    scriptname=$(basename "$0")
    scriptname=${scriptname%.*}
    delay=10                              # sleep time
    logfile=/var/log/${scriptname}.log    # file for debug messages
    lockfile=/var/lock/${scriptname}.lock # locking to avoid races
    
    # control where to log debug messages to:
    # debugfile = 0 : log to /dev/null
    # debugfile = 1 : log to file specified in ${logfile}
    debugfile=1
    
    # log a message to the log-file specified by debugfile
    function keepalive_debug() {
    
            local msg="$1"
            local dat
            dat=$(date "+%b %d %H:%M:%S") # time stamp
    
            if [[ ${debugfile} == "1" ]]; then
                    if lockfile -r 1 "${lockfile}"; then
                            touch "${logfile}" >/dev/null 2>&1
                            chmod 0644 "${logfile}" >/dev/null 2>&1
                            echo -n "${dat}: " >>"${logfile}" 2>&1
                            echo "${msg}" >>"${logfile}" 2>&1
                            rm -f "${lockfile}" >/dev/null 2>&1
                    fi
            else
                    echo "${msg}" >/dev/null 2>&1
            fi
    }
    
    # ping the ${neighbor} and sleep ${delay} seconds
    function alive_ping() {
    
            local msg=""
    
            keepalive_debug "alive_ping"
            while true; do
                    msg=$(/bin/ping -W 2 -n -c 1 "${neighbor}" 2>&1 | grep -E '(bytes from|100% packet loss)' || true)
    
                    if [[ ${msg} =~ "bytes from" ]] && [[ ! -e /tmp/${neighbor}_up ]]; then
                            ip route add default via "${neighbor}"
                            touch /tmp/"${neighbor}"_up
                            keepalive_debug "${neighbor} is reachable, default route added"
                    fi
    
                    if [[ ${msg} =~ "100% packet loss" ]] && [[ -e /tmp/${neighbor}_up ]]; then
                            ip route del default via "${neighbor}"
                            rm -f /tmp/"${neighbor}"_up
                            keepalive_debug "${neighbor} is not reachable, default route deleted"
                    fi
    
                    sleep "${delay}"
            done
    }
    
    # start up and handle proper daemonization
    function main() {
    
            local argument="daemon"
    
            if [[ $1 == "${argument}" ]]; then
                    alive_ping
            else
                    keepalive_debug "START"
                    keepalive_debug "daemonize $0"
                    nohup /bin/bash "$0" "${argument}" "$*" >/dev/null 2>&1 &
                    keepalive_debug "daemonized $0"
            fi
    }
    
    main "$*"
    
    exit 0
    
  • Sur le routeur R3, la passerelle à joindre est à l'adresse 10.1.30.10. Le code du script est téléchargeable à partir du lien suivant : r3-keepalive.sh.

    Le code de ce script est identique au précédent à l'exception de la valeur attribuée à la variable ${neighbor}.