89 lines
2.1 KiB
Bash
89 lines
2.1 KiB
Bash
#!/bin/sh
|
|
|
|
set -u
|
|
set -e
|
|
|
|
# Input values
|
|
STATE=$1
|
|
VRID=$2
|
|
VIRTUAL_IP=$3
|
|
INTERFACE_NAME=$4
|
|
LABEL=$5
|
|
PRIORITY=$6
|
|
ADVERT_INT=$7
|
|
PREEMPT=$8
|
|
OTHER=${9:-}
|
|
|
|
LOG_DIR=/var/log/vrrpd/
|
|
[ ! -d "${LOG_DIR}" ] && mkdir -p "${LOG_DIR}"
|
|
LOG_FILE="${LOG_DIR}/state.${VRID}"
|
|
|
|
STATE_DIR=/var/run/vrrpd/
|
|
[ ! -d "${STATE_DIR}" ] && mkdir -p "${STATE_DIR}"
|
|
STATE_FILE="${STATE_DIR}/vrrp-${LABEL}"
|
|
|
|
# Log state change to file
|
|
printf "%s %s %s %s %s %s %s %s : %s\n" \
|
|
"${STATE}" \
|
|
"${VIRTUAL_IP}" \
|
|
"${INTERFACE_NAME}" \
|
|
"${LABEL}" \
|
|
"${PRIORITY}" \
|
|
"${ADVERT_INT}" \
|
|
"${PREEMPT}" \
|
|
"${OTHER}" \
|
|
"$(date)" \
|
|
>> "${LOG_FILE}"
|
|
|
|
# Replace information in state file
|
|
{
|
|
echo "VRRP - ${LABEL}"
|
|
echo "Group ${VRID}"
|
|
echo "State is ${STATE}"
|
|
echo "Virtual IP address is ${VIRTUAL_IP}"
|
|
} > "${STATE_FILE}"
|
|
|
|
# Choose virtual interface name (limited in size)
|
|
INTERFACE_PREFIX="vrrp_${VRID}_"
|
|
INTERFACE_PREFIX_LEN=${#INTERFACE_PREFIX}
|
|
INTERFACE_LEN=$(( ${#INTERFACE_PREFIX} + ${#INTERFACE_NAME} ))
|
|
INTERFACE_MAX_LEN=15
|
|
|
|
if [ ${INTERFACE_LEN} -gt ${INTERFACE_MAX_LEN} ]; then
|
|
INTERFACE_SUFFIX=$(echo "${INTERFACE_NAME}" | tail -c $(( INTERFACE_MAX_LEN + 1 - INTERFACE_PREFIX_LEN )))
|
|
else
|
|
INTERFACE_SUFFIX="${INTERFACE_NAME}"
|
|
fi
|
|
VIRTUAL_INTERFACE_NAME="${INTERFACE_PREFIX}${INTERFACE_SUFFIX}"
|
|
|
|
# Apply state
|
|
case "${STATE}" in
|
|
|
|
"master" )
|
|
# Choose a MAC address
|
|
MAC_SUFFIX=$(printf %02x "${VRID}")
|
|
MAC="00:00:5e:00:01:${MAC_SUFFIX}"
|
|
# Create macvlan interface
|
|
ip link add link "${INTERFACE_NAME}" address "${MAC}" "${VIRTUAL_INTERFACE_NAME}" type macvlan
|
|
# Add IP to interface
|
|
ip address add "${VIRTUAL_IP}" dev "${VIRTUAL_INTERFACE_NAME}"
|
|
# Enable interface
|
|
ip link set dev "${VIRTUAL_INTERFACE_NAME}" up
|
|
;;
|
|
|
|
"slave" )
|
|
# Delete interface if it exists
|
|
if ip link show "${VIRTUAL_INTERFACE_NAME}" >/dev/null 2>&1; then
|
|
ip link delete "${VIRTUAL_INTERFACE_NAME}"
|
|
fi
|
|
;;
|
|
|
|
* )
|
|
# Error on unknown value for state
|
|
echo "Unknown state '${STATE}'" >&2
|
|
exit 1
|
|
;;
|
|
|
|
esac
|
|
|
|
exit 0
|