#!/bin/sh # # backup handling . /etc/init.d/rc.functions action="$1" name="$2" bootable="$3" 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" } | sort ;; c | create) # Backup erstellen if [ -n "$name" ]; then if [ -n "$bootable" -a -e "/data/backup/$name" -o -z "$bootable" -a -e "/mnt/data/backup/$name" ]; then echo "Backup already exists: $name" >&2; status=1 elif [ -n "$bootable" ]; then mkdir -p "/data/backup/$name" || status=1 cp -a /mnt/system/* "/data/backup/$name" || status=1 test $status = 1 && rm -r "/data/backup/$name" update_menu else mkdir -p "/mnt/data/backup/$name" || status=1 cp -a /mnt/system/* "/mnt/data/backup/$name" || status=1 test $status = 1 && rm -r "/mnt/data/backup/$name" fi fi ;; r | restore) # Backup zurückspielen name="${name%% (bootable)}" if [ -n "$name" ]; then if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$name" ]; then name="${name#* - }" fi if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$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 "/mnt/data/backup/$name" ]; then cp -a "/mnt/data/backup/$name" $path/mld-new || status=1 else cp -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%% (bootable)}" if [ -n "$name" ]; then if [ ! -e "/data/backup/$name" -a ! -e "/mnt/data/backup/$name" ]; then name="${name#* - }" fi if [ -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