add new package keepalived-sync to synchronize files and data between master and backup node. The master node uses SSH over rsync to send and the backup node will use inotifywatch to watch received files. The master node can track rsync.sh script to send configuration file on a backup node based on the vrrp_script configuration of the same script. The backup node will have a keepalived-inotify service, which would watch for newly received files and it would call hotplug event. Each service can keep its respective script under the keepalived hotplug directory and executes commands to stop, start service or update any config in real-time. Whenever a switchover will happen, the backup node would have the latest config and data files from the master node. Hotplug events can be used to apply config when files are received. Signed-off-by: Jaymin Patel <jem.patel@gmail.com>
54 lines
1.3 KiB
Bash
54 lines
1.3 KiB
Bash
#!/bin/sh
|
|
|
|
# shellcheck shell=ash
|
|
|
|
# shellcheck source=/dev/null
|
|
. /lib/functions/keepalived/common.sh
|
|
|
|
if [ $# -lt 3 ]; then
|
|
echo "$0 <vrrp_instance> <peer> <rsync_dir>"
|
|
exit 1
|
|
fi
|
|
|
|
VRRP_INSTANCE=$1
|
|
PEER=$2
|
|
RSYNC_DIR=$3
|
|
|
|
INOTIFY_ACTIONS="create,delete,modify,move,moved_to,moved_from"
|
|
INOTIFY_PID=""
|
|
TMP_DIR=/tmp/keepalived
|
|
FIFO_FILE="$TMP_DIR"/inotifywait-$PEER.fifo
|
|
|
|
daemonize_inotifywait() {
|
|
/usr/bin/inotifywait -q -r --exclude '/\..+' -o "$FIFO_FILE" -m "$RSYNC_DIR" -e ${INOTIFY_ACTIONS} 2> /dev/null &
|
|
INOTIFY_PID="$!"
|
|
}
|
|
|
|
main() {
|
|
local inotify_action inotify_dir inotify_file
|
|
local source_file target_file
|
|
|
|
[ ! -d "$TMP_DIR" ] && mkdir "$TMP_DIR"
|
|
mkfifo "${FIFO_FILE}" || exit 1
|
|
|
|
daemonize_inotifywait
|
|
|
|
while read -r inotify_dir inotify_action inotify_file; do
|
|
source_file="${inotify_dir}${inotify_file}"
|
|
target_file=$(echo "${inotify_dir}" | sed -e "s:${RSYNC_DIR}::g")"${inotify_file}"
|
|
|
|
log_debug "received $target_file ($inotify_action) in $source_file"
|
|
|
|
ACTION=NOTIFY_SYNC TYPE=peer NAME=$PEER INSTANCE=$VRRP_INSTANCE \
|
|
RSYNC_SOURCE="${source_file}" RSYNC_TARGET="${target_file}" \
|
|
/sbin/hotplug-call keepalived
|
|
done < "$FIFO_FILE"
|
|
}
|
|
|
|
TRAP() {
|
|
[ -n "$INOTIFY_PID" ] && kill "$INOTIFY_PID"
|
|
[ -e "$FIFO_FILE" ] && rm -f "$FIFO_FILE"
|
|
}
|
|
|
|
trap TRAP TERM INT
|
|
main "$@"
|