Add logic to have multiple available servers
SERVERS contains 1 or more servers to send backup files to. Each day a primary backup server is chosen. If it's not available the script falls back to the next server, and the next…
This commit is contained in:
parent
6f8217001e
commit
b5f1e13685
|
@ -14,13 +14,11 @@
|
||||||
# Licence: AGPLv3
|
# Licence: AGPLv3
|
||||||
#
|
#
|
||||||
# The following variables must be changed:
|
# The following variables must be changed:
|
||||||
# SSH_PORT: The Port used for the ssh(1) jail on the backup server
|
|
||||||
# MAIL: The email address to send notifications to.
|
# MAIL: The email address to send notifications to.
|
||||||
# SRV: The hostname or IP address of the backup server.
|
# SERVERS: The list of hosts (hostname or IP address) and SSH port
|
||||||
#
|
# to send backup files to.
|
||||||
# You must then uncomment the various
|
|
||||||
# examples that best suit your case
|
|
||||||
#
|
#
|
||||||
|
# You must then uncomment the various examples that best suit your case.#
|
||||||
|
|
||||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
||||||
|
|
||||||
|
@ -46,20 +44,62 @@ fi
|
||||||
echo "$$" > $PIDFILE
|
echo "$$" > $PIDFILE
|
||||||
trap "rm -f $PIDFILE" EXIT
|
trap "rm -f $PIDFILE" EXIT
|
||||||
|
|
||||||
# port SSH
|
|
||||||
SSH_PORT=2XXX
|
|
||||||
|
|
||||||
# email adress for notifications
|
# email adress for notifications
|
||||||
MAIL=jdoe@example.com
|
MAIL=jdoe@example.com
|
||||||
|
|
||||||
# choose "linux" or "bsd"
|
# choose "linux" or "bsd"
|
||||||
SYSTEM=$(uname | tr '[:upper:]' '[:lower:]')
|
SYSTEM=$(uname | tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
# Variable to choose different backup server with date
|
SERVERS="node0.backup.example.com:2XXX node1.backup.example.com:2XXX"
|
||||||
NODE=$(($(date +%e) % 2))
|
SSH_CONNECT_TIMEOUT=10
|
||||||
|
|
||||||
# serveur address for rsync
|
test_server() {
|
||||||
SRV="node$NODE.backup.example.com"
|
item=$1
|
||||||
|
host=$(echo ${item} | cut -d':' -f1)
|
||||||
|
port=$(echo ${item} | cut -d':' -f2)
|
||||||
|
|
||||||
|
# Test if the server is accepting connections
|
||||||
|
ssh -q -o "ConnectTimeout ${SSH_CONNECT_TIMEOUT}" ${host} -p ${port} -t "exit"
|
||||||
|
|
||||||
|
if [ $? = 0 ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Failed to connect to \`${item}' within ${SSH_CONNECT_TIMEOUT} seconds" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
pick_server() {
|
||||||
|
inc=${1:-0}
|
||||||
|
list_length=$(echo "${SERVERS}" | wc -w)
|
||||||
|
|
||||||
|
if [ "${inc}" -ge "${list_length}" ]; then
|
||||||
|
echo "No more server available" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
salt=$(hostname | cksum | cut -d' ' -f1)
|
||||||
|
item=$(echo $(( ($(date +%d) + salt + inc) % list_length )))
|
||||||
|
field=$(( item + 1 ))
|
||||||
|
|
||||||
|
echo "${SERVERS}" | cut -d' ' -f${field}
|
||||||
|
}
|
||||||
|
|
||||||
|
n=0
|
||||||
|
SERVER=""
|
||||||
|
while :; do
|
||||||
|
server=$(pick_server "${n}")
|
||||||
|
test $? = 0 || exit 2
|
||||||
|
|
||||||
|
if test_server "${server}"; then
|
||||||
|
SERVER="${server}"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
n=$(( n + 1 ))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
SSH_SERVER=$(echo $SERVER | cut -d':' -f1)
|
||||||
|
SSH_PORT=$(echo $SERVER | cut -d':' -f2)
|
||||||
|
|
||||||
## We use /home/backup : feel free to use your own dir
|
## We use /home/backup : feel free to use your own dir
|
||||||
mkdir -p -m 700 /home/backup
|
mkdir -p -m 700 /home/backup
|
||||||
|
@ -249,8 +289,8 @@ rsync -avzh --stats --delete --delete-excluded --force --ignore-errors --partial
|
||||||
/var \
|
/var \
|
||||||
/home \
|
/home \
|
||||||
/srv \
|
/srv \
|
||||||
-e "ssh -p $SSH_PORT" \
|
-e "ssh -p ${SSH_PORT}" \
|
||||||
"root@$SRV:/var/backup/" \
|
"root@${SSH_SERVER}:/var/backup/" \
|
||||||
| tail -30 >> /var/log/evobackup.log
|
| tail -30 >> /var/log/evobackup.log
|
||||||
|
|
||||||
END=$(/bin/date +"%d-%m-%Y ; %H:%M")
|
END=$(/bin/date +"%d-%m-%Y ; %H:%M")
|
||||||
|
|
Loading…
Reference in a new issue