diff --git a/executor-scripts/linux/batman b/executor-scripts/linux/batman new file mode 100644 index 0000000..886377e --- /dev/null +++ b/executor-scripts/linux/batman @@ -0,0 +1,96 @@ +#!/bin/sh +# +# Maximilian Wilhelm +# -- Wed 26 Aug 2020 08:15:58 PM CEST +# +# This executor is responsible for setting up the main B.A.T.M.A.N. adv. interface (eg. bat0) +# as well as managing settings of the underlying interfaces (hardifs). +# +# Know options for the main interface are: +# IF_BATMAN_IFACES Space separated list of interfaces to be part of this B.A.T.M.A.N. adv. instance +# IF_BATMAN_IFACES_IGNORE_REGEX Interfaces to ignore when verifying configuration (regexp) +# IF_BATMAN_DISTRIBUTED_ARP_TABLE 'enable' or 'disable' DAT of this B.A.T.M.A.N. adv. instance +# IF_BATMAN_MULTICAST_MODE 'enable' or 'disable' the multicast mode of this B.A.T.M.A.N. adv. instance +# IF_BATMAN_GW_MODE Set the gateway mode of this B.A.T.M.A.N. adv. instance +# IF_BATMAN_HOP_PENALTY Set the hop penalty of this B.A.T.M.A.N. adv. instance +# +# Known options for underlying interfaces are: +# IF_BATMAN_IFACE_PENALTY Set the hop penalty of this B.A.T.M.A.N. adv. interface +# +set -e + +if [ "$VERBOSE" ]; then + set -x +fi + +if [ "${IF_BATMAN_IFACES}" -o "${IF_BATMAN_IFACE_PENALTY}" ]; then + if ! which batctl >/dev/null 2>&1; then + echo "Error: batctl utility not found!" >&2 + exit 1 + fi +fi + +# +# Compatiblity glue: Newer versions of batctl print a deprecation +# warning when called with -m . Avoid spamming the log and +# producting SPAM by silently handling this here. +mesh_if_param="-m" +if batctl -h 2>&1 | grep -q "meshif"; then + mesh_if_param="meshif" +fi + +# +# Functions to manage main B.A.T.M.A.N. adv. interface +batctl_if () { + for iface in ${IF_BATMAN_IFACES}; do + ${MOCK} batctl "${mesh_if_param}" "${IFACE}" interface "$1" "${iface}" + done +} + +set_batmam_params () { + [ "${IF_BATMAN_DISTRIBUTED_ARP_TABLE}" ] && ${MOCK} batctl "${mesh_if_param}" "${IFACE}" distributed_arp_table "${IF_BATMAN_DISTRIBUTED_ARP_TABLE}" + [ "${IF_BATMAN_MULTICAST_MODE}" ] && ${MOCK} batctl "${mesh_if_param}" "${IFACE}" multicast_mode "${IF_BATMAN_MULTICAST_MODE}" + [ "${IF_BATMAN_HOP_PENALTY}" ] && ${MOCK} batctl "${mesh_if_param}" "${IFACE}" hop_penalty "${IF_BATMAN_HOP_PENALTY}" + [ "${IF_BATMAN_GW_MODE}" ] && ${MOCK} batctl "${mesh_if_param}" "${IFACE}" gw_mode "${IF_BATMAN_GW_MODE}" +} + +# +# Functions to manage B.A.T.M.A.N. adv. underlying interfaces +set_iface_penalty () { + ${MOCK} batctl hardif "${IFACE}" hop_penalty "${IF_BATMAN_IFACE_PENALTY}" +} + + +case "${PHASE}" in + depend) + if [ "${IF_BATMAN_IFACES}" ]; then + echo "${IF_BATMAN_IFACES}" + fi + ;; + + pre-up) + # Main B.A.T.M.A.N. adv. interface + if [ "${IF_BATMAN_IFACES}" ]; then + batctl "${mesh_if_param}" "${IFACE}" interface create || true + batctl_if add + set_batmam_params + + # B.A.T.M.A.N. adv. underlying interface + elif [ "${IF_BATMAN_IFACE_PENALTY}" ]; then + set_iface_penalty + fi + ;; + + post-down) + if [ "${IF_BATMAN_IFACES}" ]; then + # Newer versions of batctl provide the "interface destroy" API, try to use it + if ! batctl "${mesh_if_param}" "${IFACE}" interface destroy 2>/dev/null; then + # Fall back to old style member interface removal + batctl_if del + fi + fi + ;; + + *) exit 0 + ;; +esac