#!/bin/sh # Skript zum Laden eines Plattenbackups, soll mirrornfs ersetzen. # $Id: suckdisk,v 1.19 2001-01-16 16:08:41+01 czyborra Exp $ case $# in 0|1|2|3) echo "Usage: suckdisk /mirror 15 localhost / /var /mloc" exit esac # Argumente cpio="/mach/bin/cpio --quiet" perl=/usr/local/bin/perl backup=$1; shift; cd $backup age=$1; shift; export age host=$1; shift; case $host in localhost) remote() { sh -c "cd / && exec $*"; };; *) remote() { ssh -x -c blowfish $host "cd / && exec $*"; };; esac # Verzögerte Löschung find='sub find { local($dir,$nl,$sdir,$path)=@_; $nl = (lstat _)[3] - 2; opendir(DIR,"."); for (reverse sort readdir DIR) { next if /^[.][.]?$/; $path="$dir/$_"; $sdir = $nl && lstat && -d _ && chdir $_ && &find($path) && $nl--; $age && m=~/|~$= ? /~{$age}$/ ? $sdir ? rmdir : unlink : rename $_,"$_~" : print($path); } chdir ".."; } $age=$ENV{"age"}; -d "." && &find(".");' case $age in [1-9]*) $perl -le "$find" | remote "$perl -nle 'lstat||print' 'cd /var/log;rm -f verschw* backup|' -" | $perl -ple 'rename $_, "$_~"' > var/log/verschwunden date +"[%T] $backup entruempelt" esac # Dateiattributvergleich attr='s=^/=./=; s=/$=/.=; ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = lstat; $mode = sprintf ("%04o", $mode & 07777); ($major, $minor) = $rdev ? $rdev > 0xFFFF ? ($rdev >> 18, $rdev & 0x3FFFF) : ($rdev >> 8, $rdev & 0xFF) : (); $attr= -l _ ? "=>".readlink : -d _ ? "=d$mode $uid.$gid" : -f _ ? "=f$mode $uid.$gid $mtime $size" : -c _ ? "=c$mode $uid.$gid $major,$minor" : -b _ ? "=b$mode $uid.$gid $major,$minor" : -p _ ? "=p$mode $uid.$gid" : -s _ ? "=s$mode $uid.$gid" : "=???";' print='next if m=^$|~$|~/=; print; print $attr;' check='chop($rattr=<>); next if $attr eq $rattr; rename $_,"$_~" unless -d _ && $rattr =~ /^=d/; print;' echo "$attr;$print" | remote "$perl -nl - 'find $* -xdev -print|'" | $perl -nle "$attr;$check" | tee var/log/backup~ | remote "$cpio -oaHcrc" | $cpio -iumd --sparse --no-absolute-filenames date +"[%T] $backup nachgeladen"