diff --git a/debian/changelog b/debian/changelog index 3613df1..5c4de2a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 Fri, 16 Mar 2012 12:15:45 +0100 + remote-backup (1.5.3) stable; urgency=low * Use rsync --fake-super when running as user diff --git a/defaults.conf b/defaults.conf index 780663c..8159374 100644 --- a/defaults.conf +++ b/defaults.conf @@ -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="" diff --git a/remote-backup b/remote-backup index 1630c24..6dddf70 100755 --- a/remote-backup +++ b/remote-backup @@ -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 @@ -131,12 +135,21 @@ doBackup() { then runBackup emerg.$(date +%Y%m%d%H%M) else - if [ -f "$SNAPSHOT_RW/$NAME/.lock" ] \ - && [ -r /proc/$(<"$SNAPSHOT_RW/$NAME/.lock")/comm ] \ - && [[ $( "$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 - cat <<-EOF - Some backups exited non-zero. - See the logfile for more detail. - - EOF - for backup in ${failedBackups[@]} + for backup in ${backupStatus[@]} 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 + if (( $backup )) + then + cat <<-EOF + Some backups exited non-zero. + See the logfile for more detail. + + EOF + 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