#!/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"
