]>
git.proxmox.com Git - mirror_frr.git/blob - tools/nhrpd-event-handler.sh
4 #Released to public domain
14 EV_LADDR
="local_address"
15 EV_VCINIT
="vc_initiated"
18 EV_RADDR
="remote_addr"
19 EV_RNBMA
="remote_nbma"
20 EV_RCERT
="remote_cert"
24 echo "Usage: $PROGNAME [-s nhrp-sock] [-d] [-i interface-name] [-t table] [-e execute-cmd] [-u user] [-g group] [-r] [-l logfile]"
26 echo "-s nhrp-sock file"
27 echo "-i interface-name to execute on, may be repeated multiple times"
28 echo "-t tableid to execute on for immdiate preceeding interface"
29 echo "-e execute command for immmediate preceeding interface"
30 echo " The command will be passed the following arguments $EV_ID $EV_TYPE $EV_INT $EV_LNMBA $EV_RADDR $EV_RNBMA int_table"
31 echo "-u user to own the sock"
32 echo "-g group to own the sock"
33 echo "-r send rejection (testing)"
34 echo "-l logfile to record conversation with nhrpd"
43 SOCK
="/var/run/frr/nhrp.sock"
50 while getopts rds
:i
:u
:g
:l
:t
:e
: opt
; do
59 INTARR
[((j
++))]="$OPTARG"
62 if [[ "$j" == "0" ]] ||
[[ "${INTARR[((j-1))]}" == "" ]]; then
63 echo "execute argument must follow interface argument"
66 EXECARR
["${INTARR[((j-1))]}"]="$OPTARG"
69 if [[ "$j" == "0" ]] ||
[[ "${INTARR[((j-1))]}" == "" ]]; then
70 echo "execute argument must follow interface argument"
73 TABLEARR
["${INTARR[((j-1))]}"]="$OPTARG"
90 if [[ "$EVLOGFILE" != "" ]]; then
91 if [[ ! -w "${EVLOGFILE}" ]]; then
92 touch "$EVLOGFILE" ||
( echo "Cannot write to logfile $EVLOGFILE" ; usage
)
94 echo -e "PROG: $0 Startup\nPROG: Arguments $*" >> $EVLOGFILE
101 if [[ "$EVLOGFILE" != "" ]]; then
102 echo -e "PROG: `date -R`\nPROG: Starting mainloop" >> $EVLOGFILE
105 coproc socat
- UNIX-LISTEN
:$SOCK,unlink-early
,setuid-early
=$USER,unlink-close
=0 ||
exit 1
106 test -S $SOCK && chown
$USER:$GROUP $SOCK
113 if [[ "$EVLOGFILE" != "" ]]; then
114 echo "IN: $S" >> $EVLOGFILE
116 if [[ "$S" == "" ]]; then
117 if [[ "${NHRPEVENT[$EV_ID]}" != "" ]]; then
118 OUTMSG
="eventid=${NHRPEVENT[$EV_ID]}\nresult=$RESULT\n"
119 echo -e "$OUTMSG" >&"${COPROC[1]}"
120 if [[ "$EVLOGFILE" != "" ]]; then
121 echo -e "OUT:\n${OUTMSG}" >> $EVLOGFILE;
126 for((i
=0;i
<${#INTARR[@]};i
++)); do
127 if [[ "${NHRPEVENT[$EV_INT]}" == "" ]]; then break; fi
128 if [[ "${INTARR[$i]}" != "${NHRPEVENT[$EV_INT]}" ]]; then continue; fi
129 EVINT
="${NHRPEVENT[$EV_INT]}"
130 if [[ "${NHRPEVENT[$EV_RADDR]}" == "" ]]; then break; fi
131 if [[ "${NHRPEVENT[$EV_RNBMA]}" == "" ]]; then break; fi
132 if [[ "${NHRPEVENT[$EV_TYPE]}" != "dynamic" ]]; then break; fi
134 INTEXEC
=${EXECARR["$EVINT"]}
135 INTABLE
=${TABLEARR["$EVINT"]}
139 CMDADD
="ip neigh add "
140 CMDREPL
="ip neigh replace"
142 if [[ "$INTEXEC" != "" ]]; then
143 CMD
="$INTEXEC ${NHRPEVENT[$EV_ID]:-nil}"
144 CMD
="$CMD ${NHRPEVENT[$EV_TYPE]:-nil}"
145 CMD
="$CMD ${NHRPEVENT[$EV_INT]:-nil}"
146 CMD
="$CMD ${NHRPEVENT[$EV_LNBMA]:-nil}"
147 CMD
="$CMD ${NHRPEVENT[$EV_RADDR]:-nil}"
148 CMD
="$CMD ${NHRPEVENT[$EV_RNBMA]:-nil}"
149 CMD
="$CMD ${INTABLE:-nil}"
152 CMDTAB
="${INTABLE:+${TABLE}${INTABLE}}"
153 CMDEND
="$CMDEND ${NHRPEVENT[$EV_RADDR]} dev $EVINT lladdr ${NHRPEVENT[$EV_RNBMA]} nud noarp"
157 for ((k
=0;k
<2;k
++)); do
158 for ((l
=0;l
<2;l
++)); do
159 if [[ "$EVLOGFILE" != "" ]]; then
160 echo "PROG: Executing $CMD" >> $EVLOGFILE
161 CMDOUT
=`$CMDBEG $CMD $CMDTAB 2>&1`
163 if [[ "$CMDOUT" != "" ]]; then
164 echo "PROG: Execution output: $CMDOUT" >> $EVLOGFILE
169 if [[ "$CMDTAB" == "" ]] ||
[[ "$INTEXEC" != "" ]]; then break; fi
171 if [[ "$INTEXEC" != "" ]] ||
[[ "$CMDRET" == "0" ]]; then
180 declare -Ag NHRPEVENT
187 eval NHRPEVENT
[${SA[0]}]="\"${SA[1]}\""
189 done <&"${COPROC[0]}"
191 if [[ "$COPROC_PID" != "" ]]; then kill "$COPROC_PID"; fi
197 if [[ "$DAEMON" == "0" ]]; then