#!/usr/bin/bash
#
# Configure RoCE Interfaces via NetworkManager Dispatcher
#

# Only consider up events
[ $# -ge 2 ] && [ "$2" != "up" ] && exit 0

# If running interactively we must be root
if [ "$(id -u)" != 0 ]; then
   >&2 echo "$0: Must run as root!"
   exit 1
fi

INTF_NAME=$1
ACTION=$2
SCRIPT=$(basename "$0")

>&2 echo "$SCRIPT: Starting RoCE configuration for '$INTF_NAME $ACTION':"

# Read configuration variables required to continue from ROCE_PARAMS:
#    ROCE_CONFIG          - The script used to configured interfaces for RoCE
#    ROCE_INTERFACES_LIST - A list of interfaces names to try to match exactly
#    ROCE_INTERFACES_BASE - An interface base name to match as a wildcard
ROCE_PARAMS="/etc/rdma/roce-interfaces.conf"

if [[ ! -r $ROCE_PARAMS ]]; then
    >&2 echo "$SCRIPT:  - Configuration file '$ROCE_PARAMS' is not readable"
    >&2 echo "$SCRIPT: Nothing to do for $INTF_NAME."
    exit 1
else
    . $ROCE_PARAMS
fi

# If ROCE_PARAMS does not specify any RoCE interfaces then there is
# nothing to do
if [[ -z $ROCE_INTERFACES_LIST ]] && [[ -z $ROCE_INTERFACES_BASE ]]; then
    >&2 echo "$SCRIPT:  - No RoCE interfaces specified in '$ROCE_PARAMS'"
    >&2 echo "$SCRIPT: Nothing to do for $INTF_NAME."
    exit 1
fi

# Check if the current interface is a RoCE interface - if not, exit and we
# are done
if [[ $ROCE_INTERFACES_LIST =~ (^|[[:space:]])"$INTF_NAME"($|[[:space:]]) ]]; then
    >&2 echo "$SCRIPT:  + Matched (exact) interface $INTF_NAME"
    >&2 echo "$SCRIPT:  + Running $ROCE_CONFIG -i $INTF_NAME..."
    $ROCE_CONFIG -i "$INTF_NAME"
elif [[ ${INTF_NAME} =~ ^"${ROCE_INTERFACES_BASE}"[[:digit:]]+$ ]]; then
    >&2 echo "$SCRIPT:  + Matched (wildcard) interface $INTF_NAME"
    >&2 echo "$SCRIPT:  + Running $ROCE_CONFIG -i $INTF_NAME..."
    $ROCE_CONFIG -i "$INTF_NAME"
else
    >&2 echo "$SCRIPT:  - Interface $INTF_NAME not matched in '$ROCE_PARAMS'."
    >&2 echo "$SCRIPT: Nothing to do for $INTF_NAME."
    exit 0
fi

>&2 echo "$SCRIPT: Finished RoCE configuration for '$INTF_NAME $ACTION'."
