#!/bin/sh # # backup handling . /etc/init.d/rc.functions action="$1" name="$2" backup_type="$3" server="$BACKUP_SERVER" clientdir="$(hostname)_$(ifconfig | grep HWaddr | awk '{print $5}')" status=0 update_menu() { path="$(readlink /data/backup | sed 's|/[^/]*/[^/]*/||')" dev="$(readlink /data/backup | cut -d / -f3)" id="$(blkid | grep /dev/$dev | sed 's/.*UUID="\([^"]*\).*/UUID=\1/')" cd /data/backup find /data/backup/ -maxdepth 1 ! -path /data/backup/ -printf "%TY-%Tm-%Td %f\n" | sort | while read date name; do echo "label $date $name" echo " kernel /$path/$name/boot/kernel" echo " append initrd=/$path/$name/boot/initramfs dev=$id vga=0x314 splash=silent quiet apm=off" done > /boot/isolinux/backup_menu.conf } case "$action" in l | list) { find /mnt/data/backup/ -maxdepth 1 ! -path /mnt/data/backup/ -printf "%TY-%Tm-%Td - %f\n" 2>/dev/null find /data/backup/ -maxdepth 1 ! -path /data/backup/ -printf "%TY-%Tm-%Td - %f (bootable)\n" find /media/Backup/$server/$clientdir/ -maxdepth 1 ! -path /media/Backup/$server/$clientdir/ -printf "%TY-%Tm-%Td - %f (server)\n" } | sort ;; c | create) # Backup erstellen static=/etc/backup-exclude-static.list custom=/etc/backup-exclude-custom.list if [ -n "$name" ]; then if [ "$backup_type" = "bootable" -a -e "/data/backup/$name" -o "$backup_type" = "normal" -a -e "/mnt/data/backup/$name" -o "$backup_type" = "server" -a -e "/media/Backup/$server/$clientdir/$name" ]; then echo "Backup already exists: $name" >&2; status=1 elif [ "$backup_type" = "bootable" ]; then if [ ! -e "/src/backup_workdir/bootable/lastbackup" ]; then mkdir -p "/data/backup/$name" || status=1 mkdir -p "/src/backup_workdir/bootable" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static /mnt/system/* "/data/backup/$name" || status=1 ln -nsf "/data/backup/$name" "/src/backup_workdir/bootable/lastbackup" || status=1 test $status = 1 && rm -r "/data/backup/$name" && rm -r "/src/backup_workdir/bootable/lastbackup" update_menu else mkdir -p "/data/backup/$name" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static --link-dest="/src/backup_workdir/bootable/lastbackup/" /mnt/system/* "/data/backup/$name" || status=1 ln -nsf "/data/backup/$name" "/src/backup_workdir/bootable/lastbackup" || status=1 test $status = 1 && rm -r "/data/backup/$name" && rm -r "/src/backup_workdir/bootable/lastbackup" update_menu fi elif [ "$backup_type" = "server" ]; then if [ ! -e "/media/Backup/$server" ]; then echo "Server not available." elif [ ! -e "/src/backup_workdir/server/$server/$clientdir/lastbackup" ]; then mkdir -p "/media/Backup/$server/$clientdir/$name" || status=1 mkdir -p "/src/backup_workdir/server/$server/$clientdir" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static /mnt/system/* "/media/Backup/$server/$clientdir/$name" || status=1 ln -nsf "/media/Backup/$server/$clientdir/$name" "/src/backup_workdir/server/$server/$clientdir/lastbackup" || status=1 test $status = 1 && rm -r "/media/Backup/$server/$clientdir/$name" && rm -r "/src/backup_workdir/server/$server/$clientdir/lastbackup" update_menu else mkdir -p "/media/Backup/$server/$clientdir/$name" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static --link-dest="/src/backup_workdir/server/$server/$clientdir/lastbackup/" /mnt/system/* "/media/Backup/$server/$clientdir/$name" || status=1 ln -nsf "/media/Backup/$server/$clientdir/$name" "/src/backup_workdir/server/$server/$clientdir/lastbackup" || status=1 test $status = 1 && rm -r "/media/Backup/$server/$clientdir/$name" && rm -r "/src/backup_workdir/server/$server/$clientdir/lastbackup" update_menu fi elif [ "$backup_type" = "normal" ]; then if [ ! -e "/src/backup_workdir/normal/lastbackup" ]; then mkdir -p "/mnt/data/backup/$name" || status=1 mkdir -p "/src/backup_workdir/normal" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static /mnt/system/* "/mnt/data/backup/$name" || status=1 ln -nsf "/mnt/data/backup/$name" "/src/backup_workdir/normal/lastbackup" || status=1 test $status = 1 && rm -r "/mnt/data/backup/$name" && rm -r "/src/backup_workdir/normal/lastbackup" update_menu else mkdir -p "/mnt/data/backup/$name" || status=1 rsync -a --delete --exclude-from=$custom --exclude-from=$static --link-dest="/src/backup_workdir/normal/lastbackup/" /mnt/system/* "/mnt/data/backup/$name" || status=1 ln -nsf "/mnt/data/backup/$name" "/src/backup_workdir/normal/lastbackup" || status=1 test $status = 1 && rm -r "/mnt/data/backup/$name" && rm -r "/src/backup_workdir/normal/lastbackup" update_menu fi else echo "No Backup can be create. Please check your configs!" fi fi ;; r | restore) # Backup zurückspielen name="${name%% (*)}" if [ -n "$name" ]; then if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$name" -a ! -e "/media/Backup/$server/$clientdir/$name" ]; then name="${name#* - }" fi if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$name" -a ! -e "/media/Backup/$server/$clientdir/$name" ]; then echo "Backup not found: $name" >&2; status=1 else path="$(readlink /mnt/system | sed 's|\(/[^/]*/[^/]*\)/.*|\1|')" old_dir="$(readlink $path/mld)" if [ -e /tmp/backup ]; then old_name="mld-mv" else old_name="mld-old" rm -rf $path/mld-old touch /tmp/backup fi if [ -e "/media/Backup/$server/$clientdir/$name" ]; then rsync -a "/media/Backup/$server/$clientdir/$name" $path/mld-new || status=1 elif [ -e "/mnt/data/backup/$name" ]; then rsync -a "/mnt/data/backup/$name" $path/mld-new || status=1 else rsync -a "/data/backup/$name" $path/mld-new || status=1 fi if [ $status = 1 ]; then rm -r $path/mld-new else rm -r $path/mld-new/boot/isolinux || status=1 mv $path/mld/boot/isolinux $path/mld-new/boot/isolinux || status=1 ln -fsn mld-new $path/mld || status=1 mv "$path/$old_dir" "$path/$old_name" || status=1 ln -fsn "$old_name" $path/mld || status=1 mv $path/mld-new $path/$old_dir || status=1 ln -fsn $old_dir $path/mld || status=1 rm -rf $path/mld-mv || status=1 fi fi fi ;; d | delete) # Backup löschen name="${name%% (*)}" if [ -n "$name" ]; then if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$name" ]; then name="${name#* - }" fi if [ -e "/media/Backup/$server/$clientdir/$name" ]; then rm -r "/media/Backup/$server/$clientdir/$name" || status=1 update_menu elif [ -e "/mnt/data/backup/$name" ]; then rm -r "/mnt/data/backup/$name" || status=1 update_menu elif [ -e "/data/backup/$name" ]; then rm -r "/data/backup/$name" || status=1 update_menu else echo "Backup not found: $name" >&2; status=1 fi fi ;; u | update) update_menu ;; *) echo "Usage: ${0##*/} {list | create | restore | delete | update} [BACKUP_NAME]" ;; esac exit $status