SNMPtraps

This commit is contained in:
Vincent Riquer 2012-03-16 12:17:41 +01:00
parent 8c5a6358b6
commit 3b02d0bfd6
3 changed files with 120 additions and 50 deletions

7
debian/changelog vendored
View File

@ -1,3 +1,10 @@
remote-backup (1.6.0) stable; urgency=low
* lock targets individually, skip if stored pid matches a running instance
* SNMP traps
-- Vincent Riquer <v.riquer@b2f-concept.com> Fri, 16 Mar 2012 12:15:45 +0100
remote-backup (1.5.3) stable; urgency=low
* Use rsync --fake-super when running as user

View File

@ -10,4 +10,10 @@ TIMEOUT=1800
RETRY=5
RETRY_DELAY=60
#generate output
EMAIL=1
#SNMP Traps
SNMPDEST=holay.b2f-concept.net
SNMPCOMM=b2f
ADDITIONAL_RSYNC_OPTS=""

View File

@ -66,34 +66,37 @@ do
esac
done
declare -a failedBackups
declare -A failedWith
declare -a backupIndex
declare -a backupStatus
declare -a backupStatusInfo
declare -a snmpTrapContent
RETRY=5
RETRY_DELAY=60
failRsync() {
nameFailed="$1"
code=$2
path="$3"
failedBackups+=( "$nameFailed" )
if [ -d "$3" ]
code=$1
path="$2"
if [ -d "$2" ]
then
touch "$3/unfinished.remote-backup"
failedWith["$nameFailed"]="RSYNC_PARTIAL $code"
touch "$2/unfinished.remote-backup"
backupStatus+=( 2 )
backupStatusInfo+=( "rsync errno: $code" )
else
failedWith["$nameFailed"]="RSYNC_FAILED $code"
backupStatus+=( 1 )
backupStatusInfo+=( "rsync_errno: $code" )
fi
}
openLog() {
exec 3>&1
exec 4>&2
exec 1>> /var/log/remote-backup
exec 2>&1
}
closeLog() {
exec 1>&3
exec 2>&3
exec 2>&4
}
doBackup() {
@ -101,23 +104,24 @@ doBackup() {
if [ ! -e "$config" ]
then
echo "No backups defined, dying." >&2
echo "No backups defined, dying." >&3
echo "No backups defined, dying." >&4
exit 128
fi
source /etc/remote-backup/defaults.conf
source "$config"
backupIndex+=( "$NAME" )
echo "Debut de backup de ${REMOTE_LOCATION} vers ${SNAPSHOT_RW}/${NAME}/ a $(date +"%H:%M, le %d/%m/%Y")"
if [[ "$REMOUNT" == "true" ]]
then
# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw "$MOUNT_DEVICE" "$SNAPSHOT_RW" ;
mountMsg="$( $MOUNT -o remount,rw "$MOUNT_DEVICE" "$SNAPSHOT_RW" 2>&1 )" ;
if (( $? ))
then
echo "snapshot: could not remount $SNAPSHOT_RW readwrite" >&2
failedBackups+=( "$NAME" )
failedReason["$NAME"]="REMOUNT_RW $MOUNT_DEVICE"
backupStatus+=( 4 )
backupStatusInfo+=( "$MOUNT_DEVICE: $mountMsg" )
return 1
fi
fi
@ -132,11 +136,20 @@ doBackup() {
runBackup emerg.$(date +%Y%m%d%H%M)
else
if [ -f "$SNAPSHOT_RW/$NAME/.lock" ] \
&& [ -r /proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/comm ] \
&& [[ $(</proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/comm) = remote-backup ]]
&& [ -r /proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/cmdline ]
then
failedBackups+=( "$NAME" )
failedReason["$NAME"]=LOCKED
progname=$(</proc/$(<"$snapshot_rw/$name/.lock")/cmdline)
progname=${progname##*/}
if [[ $progname = remote-backup ]]
then
backupStatus+=( 5 )
backupStatusInfo+=( "Process $(<"$SNAPSHOT_RW/$NAME/.lock") still running" )
else
echo $$ > "$SNAPSHOT_RW/$NAME/.lock"
rotateBackup
runBackup daily.0
rm "$SNAPSHOT_RW/$NAME/.lock"
fi
else
echo $$ > "$SNAPSHOT_RW/$NAME/.lock"
rotateBackup
@ -240,6 +253,7 @@ runBackup() {
returncode=$?
case $returncode in
0)
backupStatus+=( 0 )
break
;;
2)
@ -273,7 +287,7 @@ runBackup() {
2)
if (( proto29 ))
then
fail "$NAME" PROTO_MISMATCH
failRsync PROTO_MISMATCH
else
cat <<-EOF
@ -284,7 +298,7 @@ runBackup() {
fi
;;
*)
failRsync "$NAME" $returncode "$SNAPSHOT_RW/$NAME/$1"
failRsync $returncode "$SNAPSHOT_RW/$NAME/$1"
;;
esac
@ -295,6 +309,54 @@ runBackup() {
unset proto29
}
mailStatus() {
backup=$1
if (( backupStatus[$backup] != 0 ))
then
echo -n "${backupIndex[$backup]} failed: "
case ${backupStatus[$backup]} in
1) #RSYNC_FAILED
echo "No files transferred - ${backupStatusInfo[$backup]}"
;;
2) #RSYNC_PARTIAL
echo "Partial transfer, will *NOT* get rotated - ${backupStatusInfo[$backup]}"
;;
3) #PROTO_MISMATCH
echo "No files transferred - Protocol mismatch - Upgrade rsync daemon"
;;
4) #REMOUNT_RW
echo "${backupStatusInfo[$backup]}"
;;
5) #LOCKED
echo "Previous backup still running."
;;
*) #OTHER
echo "$info $moreinfo"
;;
esac
fi
}
snmpStatus() {
# Id. 1.3.6.1.4.1.39402.1.1.2.1
# Name 1.3.6.1.4.1.39402.1.1.2.2
# Status 1.3.6.1.4.1.39402.1.1.2.3.1
# Stat. Inf. 1.3.6.1.4.1.39402.1.1.2.3.2
backup=$1
snmpTrapContent+=( "1.3.6.1.4.1.39402.1.1.2.1.$backup" )
snmpTrapContent+=( "i" )
snmpTrapContent+=( "$backup" )
snmpTrapContent+=( "1.3.6.1.4.1.39402.1.1.2.2.$backup" )
snmpTrapContent+=( "s" )
snmpTrapContent+=( "${backupIndex[$backup]}" )
snmpTrapContent+=( "1.3.6.1.4.1.39402.1.1.2.3.1.$backup" )
snmpTrapContent+=( "i" )
snmpTrapContent+=( "${backupStatus[$backup]}" )
snmpTrapContent+=( "1.3.6.1.4.1.39402.1.1.2.3.2.$backup" )
snmpTrapContent+=( "s" )
snmpTrapContent+=( "${backupStatusInfo[$backup]}" )
}
openLog
if [ -n "$EMERG" ]
@ -309,35 +371,30 @@ fi
closeLog
if (( ${#failedBackups} ))
if (( EMAIL ))
then
for backup in ${backupStatus[@]}
do
if (( $backup ))
then
cat <<-EOF
Some backups exited non-zero.
See the logfile for more detail.
EOF
for backup in ${failedBackups[@]}
do
echo -n "$backup failed: "
read info more_info <<< "${failedWith["$backup"]}"
case $info in
RSYNC_PARTIAL)
echo "Partial transfer, will *NOT* get rotated - rsync returned $more_info."
;;
RSYNC_FAILED)
echo "No files transferred - rsync returned $more_info."
;;
PROTO_MISMATCH)
echo "No files transferred - Protocol mismatch - Upgrade rsync daemon"
;;
REMOUNT_RW)
echo "Target device $more_info could not be mounted ReadWrite."
;;
LOCKED)
echo "Previous backup still running."
*)
echo "$info $moreinfo"
;;
esac
break
fi
done
fi
for backup in ${!backupIndex[@]}
do
(( EMAIL )) && mailStatus $backup
snmpStatus $backup
done
if [ -n "$SNMPCOMM" -a -n "$SNMPDEST" ]
then
read uptime discard < /proc/uptime
unset discard
snmptrap -v 2c -c $SNMPCOMM $SNMPDEST ${uptime/./} 1.3.6.1.4.1.39402.1.1.1 "${snmpTrapContent[@]}"
fi