#!/usr/local/bin/perl
# $Id: rescuefs,v 1.1 2001/09/19 12:59:52 fd Exp $
# Vorbeugen ist besser als Heulen.

# Dieses Skript erstellt eine editierte Version von /etc/fstab und
# legt sie unter /mirror/etc/fstab ab, damit die /mirror-Platte nach
# Ausfall der /-Rootplatte sauber bootfähig ist.

($_=shift) && (($mirror,$fstab)=m%(/[^/].*)(/etc/fstab)%)
    || die "Usage: $0 /rescue/etc/fstab\n";

# Lese die /etc/fstab

$*=1; $/="\0777"; $*=1;
open(STDIN,$fstab) && ($_=<>) || die "$fstab: $!";

# Finde die kaputte Root-Platte

s%[ \t]+% %g; m%^(/dev\S+). / %; $rot=$1
    || die "Cannot find / in $fstab:\n$_";

# Bringe die Backuppartitionen in Amt und Würden:

while (($dev, $part, $type, $opt, $dump, $fsck) =
       m%^(/\S+) $mirror(\S*) (\S+) (\S+) (\d+) (\d+)%g)
{
    s%^$dev.+\n%%; $part||="/";
    s%^$rot. $part .+\n%$dev $part $type $opt 1 1\n#$&%;
}

# Kommentiere wirklich alle Partitionen auf der kaputten Platte aus:

s%^$rot\D%#$&%g;

# Tarne Dich als Original, um nicht vom Backup überschrieben zu werden:

($rstab="$mirror$fstab")
    && (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
         $atime,$mtime,$ctime,$blksize,$blocks) = stat $fstab)
    && s%\n$%' 'x($size-length)."\n"%e
    && open (STDOUT, ">$rstab") && (print) && close STDOUT
    && chown ($uid, $gid, $rstab) && chmod ($mode, $rstab)
    && utime ($atime, $mtime, $rstab) || die "$rstab: $!";
