[FROG] nhrpd event manager

Joe Maimon jmaimon at jmaimon.com
Sun Mar 15 21:11:01 EDT 2020


Fix is pretty straightforward.

--- a/nhrpd/nhrp_event.c
+++ b/nhrpd/nhrp_event.c
@@ -59,9 +59,9 @@
                 buf[len] = 0;

                 debugf(NHRP_DEBUG_EVENT, "evmgr: msg: %s", buf);
-               if (sscanf(buf, "eventid=%" SCNu32, &eventid) != 1)
+               if (sscanf(buf, "eventid=%" SCNu32, &eventid) == 1)
                         continue;
-               if (sscanf(buf, "result=%63s", result) != 1)
+               if (sscanf(buf, "result=%63s", result) == 1)
                         continue;
         }
         debugf(NHRP_DEBUG_EVENT, "evmgr: received: eventid=%d result=%s",

Fledgling script actually works now, forgive email formatting errors

---------cut here----

#!/bin/bash

PROGNAME=`basename $0`
VERSION="0.0.2"

usage()
{
         echo "Usage: $PROGNAME -s nhrp-sock [-i interface-name] [-u 
user] [-g group] "
         echo ""
         echo "-s nhrp-sock file"
         echo "-i interface-name to execute on, may be repeated multiple 
times"
         echo "-u user to own the sock"
         echo "-g group to own the sock"

         exit 1
}

SOCK="/var/run/frr/nhrp.sock"
USER="frr"
GROUP="frr"
j=0

while getopts s:i:u:g: opt; do
         case "$opt" in
                 s)
                         SOCK="$OPTARG"
                         ;;
                 i)
                         INTARR[((j++))]="$OPTARG"
                         ;;
                 u)
                         USER="$OPTARG"
                         ;;
                 g)
                         GROUP="$OPTARG"
                         ;;
         esac;
done

coproc socat - UNIX-LISTEN:$SOCK,unlink-early,setuid-early=$USER || exit 1
chown $USER:$GROUP $SOCK

OLDIFS="$IFS"

while read -r S; do
         if [[ "$S" == "" ]]; then
                 if [[ "$EVID" != "" ]]; then
                         echo -e "eventid=$EVID\nresult=accept\n";
                 fi

                 for((i=0;i<${#INTARR[@]};i++)); do
                         if [[ "$EVINT" == "" ]]; then break; fi
                         if [[ "${INTARR[$i]}" != "$EVINT" ]]; then 
continue; fi
                         if [[ "$EVREM" == "" ]]; then break; fi
                         if [[ "$EVNBMA" == "" ]]; then break; fi
                         if [[ "$EVTYPE" != "dynamic" ]]; then break; fi

                         ip neigh add $EVREM dev $EVINT lladdr $EVNBMA 
nud noarp
                         if [[ "$?" != "0" ]]; then
                                 ip neigh replace $EVREM dev $EVINT 
lladdr $EVNBMA nud noarp
                         fi
                         break
                 done

                 unset EVID
                 unset EVINT
                 unset EVREM
                 unset EVNBMA
                 unset EVTYPE
                 continue;
         fi
         IFS="${IFS}="
         SA=($S)
         IFS="$OLDIFS"
         case "${SA[0]}" in
                 eventid)
                         EVID="${SA[1]}"
                         ;;
                 interface)
                         EVINT="${SA[1]}"
                         ;;
                 type)
                         EVTYPE="${SA[1]}"
                         ;;
                 remote_addr)
                         EVREM="${SA[1]}"
                         ;;
                 remote_nbma)
                        EVNBMA="${SA[1]}"
                         ;;
         esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"

kill "$COPROC_PID"





More information about the frog mailing list