]>
git.proxmox.com Git - mirror_frr.git/blob - tools/nhrpd-event-handler.sh
2 # SPDX-License-Identifier: GPL-2.0-or-later
5 # Released to public domain
16 EV_LADDR
="local_address"
17 EV_VCINIT
="vc_initiated"
20 EV_RADDR
="remote_addr"
21 EV_RNBMA
="remote_nbma"
22 EV_RCERT
="remote_cert"
26 echo "Usage: $PROGNAME [-s nhrp-sock] [-d] [-i interface-name] [-t table] [-e execute-cmd] [-u user] [-g group] [-r] [-l logfile]"
28 echo "-s nhrp-sock file"
29 echo "-i interface-name to execute on, may be repeated multiple times"
30 echo "-t tableid to execute on for immdiate preceeding interface"
31 echo "-e execute command for immmediate preceeding interface"
32 echo " The command will be passed the following arguments $EV_ID $EV_TYPE $EV_INT $EV_LNMBA $EV_RADDR $EV_RNBMA int_table"
33 echo "-u user to own the sock"
34 echo "-g group to own the sock"
35 echo "-r send rejection (testing)"
36 echo "-l logfile to record conversation with nhrpd"
45 SOCK
="/var/run/frr/nhrp.sock"
52 while getopts rds
:i
:u
:g
:l
:t
:e
: opt
; do
61 INTARR
[((j
++))]="$OPTARG"
64 if [[ "$j" == "0" ]] ||
[[ "${INTARR[((j-1))]}" == "" ]]; then
65 echo "execute argument must follow interface argument"
68 EXECARR
["${INTARR[((j-1))]}"]="$OPTARG"
71 if [[ "$j" == "0" ]] ||
[[ "${INTARR[((j-1))]}" == "" ]]; then
72 echo "execute argument must follow interface argument"
75 TABLEARR
["${INTARR[((j-1))]}"]="$OPTARG"
92 if [[ "$EVLOGFILE" != "" ]]; then
93 if [[ ! -w "${EVLOGFILE}" ]]; then
94 touch "$EVLOGFILE" ||
( echo "Cannot write to logfile $EVLOGFILE" ; usage
)
96 echo -e "PROG: $0 Startup\nPROG: Arguments $*" >> $EVLOGFILE
103 if [[ "$EVLOGFILE" != "" ]]; then
104 echo -e "PROG: `date -R`\nPROG: Starting mainloop" >> $EVLOGFILE
107 coproc socat
- UNIX-LISTEN
:$SOCK,unlink-early
,setuid-early
=$USER,unlink-close
=0 ||
exit 1
108 test -S $SOCK && chown
$USER:$GROUP $SOCK
115 if [[ "$EVLOGFILE" != "" ]]; then
116 echo "IN: $S" >> $EVLOGFILE
118 if [[ "$S" == "" ]]; then
119 if [[ "${NHRPEVENT[$EV_ID]}" != "" ]]; then
120 OUTMSG
="eventid=${NHRPEVENT[$EV_ID]}\nresult=$RESULT\n"
121 echo -e "$OUTMSG" >&"${COPROC[1]}"
122 if [[ "$EVLOGFILE" != "" ]]; then
123 echo -e "OUT:\n${OUTMSG}" >> $EVLOGFILE;
128 for((i
=0;i
<${#INTARR[@]};i
++)); do
129 if [[ "${NHRPEVENT[$EV_INT]}" == "" ]]; then break; fi
130 if [[ "${INTARR[$i]}" != "${NHRPEVENT[$EV_INT]}" ]]; then continue; fi
131 EVINT
="${NHRPEVENT[$EV_INT]}"
132 if [[ "${NHRPEVENT[$EV_RADDR]}" == "" ]]; then break; fi
133 if [[ "${NHRPEVENT[$EV_RNBMA]}" == "" ]]; then break; fi
134 if [[ "${NHRPEVENT[$EV_TYPE]}" != "dynamic" ]]; then break; fi
136 INTEXEC
=${EXECARR["$EVINT"]}
137 INTABLE
=${TABLEARR["$EVINT"]}
141 CMDADD
="ip neigh add "
142 CMDREPL
="ip neigh replace"
144 if [[ "$INTEXEC" != "" ]]; then
145 CMD
="$INTEXEC ${NHRPEVENT[$EV_ID]:-nil}"
146 CMD
="$CMD ${NHRPEVENT[$EV_TYPE]:-nil}"
147 CMD
="$CMD ${NHRPEVENT[$EV_INT]:-nil}"
148 CMD
="$CMD ${NHRPEVENT[$EV_LNBMA]:-nil}"
149 CMD
="$CMD ${NHRPEVENT[$EV_RADDR]:-nil}"
150 CMD
="$CMD ${NHRPEVENT[$EV_RNBMA]:-nil}"
151 CMD
="$CMD ${INTABLE:-nil}"
154 CMDTAB
="${INTABLE:+${TABLE}${INTABLE}}"
155 CMDEND
="$CMDEND ${NHRPEVENT[$EV_RADDR]} dev $EVINT lladdr ${NHRPEVENT[$EV_RNBMA]} nud noarp"
159 for ((k
=0;k
<2;k
++)); do
160 for ((l
=0;l
<2;l
++)); do
161 if [[ "$EVLOGFILE" != "" ]]; then
162 echo "PROG: Executing $CMD" >> $EVLOGFILE
163 CMDOUT
=`$CMDBEG $CMD $CMDTAB 2>&1`
165 if [[ "$CMDOUT" != "" ]]; then
166 echo "PROG: Execution output: $CMDOUT" >> $EVLOGFILE
171 if [[ "$CMDTAB" == "" ]] ||
[[ "$INTEXEC" != "" ]]; then break; fi
173 if [[ "$INTEXEC" != "" ]] ||
[[ "$CMDRET" == "0" ]]; then
182 declare -Ag NHRPEVENT
189 eval NHRPEVENT
[${SA[0]}]="\"${SA[1]}\""
191 done <&"${COPROC[0]}"
193 if [[ "$COPROC_PID" != "" ]]; then kill "$COPROC_PID"; fi
199 if [[ "$DAEMON" == "0" ]]; then