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 remote-backup (1.5.3) stable; urgency=low
* Use rsync --fake-super when running as user * Use rsync --fake-super when running as user

View File

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

View File

@ -66,34 +66,37 @@ do
esac esac
done done
declare -a failedBackups declare -a backupIndex
declare -A failedWith declare -a backupStatus
declare -a backupStatusInfo
declare -a snmpTrapContent
RETRY=5 RETRY=5
RETRY_DELAY=60 RETRY_DELAY=60
failRsync() { failRsync() {
nameFailed="$1" code=$1
code=$2 path="$2"
path="$3" if [ -d "$2" ]
failedBackups+=( "$nameFailed" )
if [ -d "$3" ]
then then
touch "$3/unfinished.remote-backup" touch "$2/unfinished.remote-backup"
failedWith["$nameFailed"]="RSYNC_PARTIAL $code" backupStatus+=( 2 )
backupStatusInfo+=( "rsync errno: $code" )
else else
failedWith["$nameFailed"]="RSYNC_FAILED $code" backupStatus+=( 1 )
backupStatusInfo+=( "rsync_errno: $code" )
fi fi
} }
openLog() { openLog() {
exec 3>&1 exec 3>&1
exec 4>&2
exec 1>> /var/log/remote-backup exec 1>> /var/log/remote-backup
exec 2>&1 exec 2>&1
} }
closeLog() { closeLog() {
exec 1>&3 exec 1>&3
exec 2>&3 exec 2>&4
} }
doBackup() { doBackup() {
@ -101,23 +104,24 @@ doBackup() {
if [ ! -e "$config" ] if [ ! -e "$config" ]
then then
echo "No backups defined, dying." >&2 echo "No backups defined, dying." >&2
echo "No backups defined, dying." >&3 echo "No backups defined, dying." >&4
exit 128 exit 128
fi fi
source /etc/remote-backup/defaults.conf source /etc/remote-backup/defaults.conf
source "$config" source "$config"
backupIndex+=( "$NAME" )
echo "Debut de backup de ${REMOTE_LOCATION} vers ${SNAPSHOT_RW}/${NAME}/ a $(date +"%H:%M, le %d/%m/%Y")" echo "Debut de backup de ${REMOTE_LOCATION} vers ${SNAPSHOT_RW}/${NAME}/ a $(date +"%H:%M, le %d/%m/%Y")"
if [[ "$REMOUNT" == "true" ]] if [[ "$REMOUNT" == "true" ]]
then then
# attempt to remount the RW mount point as RW; else abort # 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 (( $? )) if (( $? ))
then then
echo "snapshot: could not remount $SNAPSHOT_RW readwrite" >&2 echo "snapshot: could not remount $SNAPSHOT_RW readwrite" >&2
failedBackups+=( "$NAME" ) backupStatus+=( 4 )
failedReason["$NAME"]="REMOUNT_RW $MOUNT_DEVICE" backupStatusInfo+=( "$MOUNT_DEVICE: $mountMsg" )
return 1 return 1
fi fi
fi fi
@ -132,11 +136,20 @@ doBackup() {
runBackup emerg.$(date +%Y%m%d%H%M) runBackup emerg.$(date +%Y%m%d%H%M)
else else
if [ -f "$SNAPSHOT_RW/$NAME/.lock" ] \ if [ -f "$SNAPSHOT_RW/$NAME/.lock" ] \
&& [ -r /proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/comm ] \ && [ -r /proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/cmdline ]
&& [[ $(</proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/comm) = remote-backup ]]
then then
failedBackups+=( "$NAME" ) progname=$(</proc/$(<"$snapshot_rw/$name/.lock")/cmdline)
failedReason["$NAME"]=LOCKED 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 else
echo $$ > "$SNAPSHOT_RW/$NAME/.lock" echo $$ > "$SNAPSHOT_RW/$NAME/.lock"
rotateBackup rotateBackup
@ -240,6 +253,7 @@ runBackup() {
returncode=$? returncode=$?
case $returncode in case $returncode in
0) 0)
backupStatus+=( 0 )
break break
;; ;;
2) 2)
@ -273,7 +287,7 @@ runBackup() {
2) 2)
if (( proto29 )) if (( proto29 ))
then then
fail "$NAME" PROTO_MISMATCH failRsync PROTO_MISMATCH
else else
cat <<-EOF cat <<-EOF
@ -284,7 +298,7 @@ runBackup() {
fi fi
;; ;;
*) *)
failRsync "$NAME" $returncode "$SNAPSHOT_RW/$NAME/$1" failRsync $returncode "$SNAPSHOT_RW/$NAME/$1"
;; ;;
esac esac
@ -295,6 +309,54 @@ runBackup() {
unset proto29 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 openLog
if [ -n "$EMERG" ] if [ -n "$EMERG" ]
@ -309,35 +371,30 @@ fi
closeLog closeLog
if (( ${#failedBackups} )) if (( EMAIL ))
then then
for backup in ${backupStatus[@]}
do
if (( $backup ))
then
cat <<-EOF cat <<-EOF
Some backups exited non-zero. Some backups exited non-zero.
See the logfile for more detail. See the logfile for more detail.
EOF EOF
for backup in ${failedBackups[@]} break
do fi
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
done done
fi 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