okay. um das verständnis zu erhöhen, weil ich die lösung für daheim als sehr geeignet empfinde, hier der server:
erstmal die "drumrums":
/etc/services:
backup 5001/tcp # UnixIron backup
/etc/inetd.conf:
backup stream tcp nowait root /usr/local/bin/backup backup
und der eigentlich "server", /usr/local/bin/backup:
Code:
#!/bin/sh
CURRDATE=`date +%Y%m%d`
CURRMONTH=`date +%Y%m`
CURRWEEK=`date +%U`
LASTWEEK="never"
LASTMONTH="never"
BFS=""
read fs
logger "backup: request for $fs"
case "$fs" in
root)
BFS="/"
;;
usr)
BFS="/usr"
;;
var)
BFS="/var"
;;
export)
BFS="/export"
;;
home)
BFS="/export/home"
;;
*)
exit 1
;;
esac
[ -f /var/tmp/lastbackup-$fs ] && . /var/tmp/lastbackup-$fs
LEVEL=2
[ "x$CURRWEEK" != "x$LASTWEEK" ] && LEVEL=1
[ "x$CURRMONTH" != "x$LASTMONTH" ] && LEVEL=0
FILENAME="$fs-$LEVEL-$CURRDATE.dump"
echo "$FILENAME"
logger "backup: ready for a dump of $BFS with level $LEVEL"
read md5
[ "x`echo "$FILENAME-mysecrethashkey" | md5`" = "x$md5" ] && {
logger "backup: dumping filesystem"
dump -$LEVEL -a -f - -u $BFS 2>/dev/zero && {
logger "backup: dump completed"
rm -f /var/tmp/lastbackup-$fs
echo "LASTWEEK=$CURRWEEK" >>/var/tmp/lastbackup-$fs
echo "LASTMONTH=$CURRMONTH" >>/var/tmp/lastbackup-$fs
}
logger "backup: finished."
}
das server-script muss entsprechend angepasst werden, klar. vor allem ist in server und client das "mysecrethashkey" durch was "ultimativ streng geheimes" zu ersetzen

und: das ding ist insofern komplett ranzig, dass es halt "einfach tut". bloss nicht in unsichere netze raus stellen, das sollte wirklich nur in kontrollierten umgebungen laufen, also nur client mit server. viele fehlerprüfungen sind da nämlich nicht drin

aber dafür machts sauberes generations-handling:
level 0 - monatlich
level 1 - wöchentlich
level 2 - täglich
aufgerufen wirds aus dem cron-script auf dem client dann z.b. so:
Code:
cd /export/backups/calchas
/export/home/michael/bin/backup calchas root
/export/home/michael/bin/backup calchas usr
/export/home/michael/bin/backup calchas var
/export/home/michael/bin/cleanup.pl
und der vollständigkeit halber das cleanup.pl:
Code:
#!/usr/bin/perl
use strict;
use POSIX;
for my $host (qw(calchas)) {
my $path = '/export/backups/' . $host;
my $deldate = strftime('%Y%m%d', localtime(time - (7 * 24 * 60 * 60)));
opendir(DH, $path) or die "nope";
my @files = readdir(DH);
closedir(DH);
my %backups = ();
for my $file (@files) {
if($file =~ /^([^-]*)-([0-9])-([0-9]{8,8})(\.dump.*)$/) {
my $fs = $1;
my $lev = $2;
my $date = $3;
my $suff = $4;
if(-f $path . '/' . $file) {
$backups{$fs}{$date}{level} = $lev;
$backups{$fs}{$date}{file} = $path . '/' . $file;
}
}
}
for my $fs (sort keys %backups) {
my $mylev = 999;
for my $date (sort {$b cmp $a} keys %{$backups{$fs}}) {
my $level = $backups{$fs}{$date}{level};
if($level >= $mylev && $date le $deldate) {
print 'deleting old backup file ' . $backups{$fs}{$date}{file} . "\n";
unlink $backups{$fs}{$date}{file};
} else {
$mylev = $level;
}
}
}
}
und nochmal der client:
Code:
#!/usr/local/bin/bash
3<>/dev/tcp/$1/5001
echo "$2" >>/dev/fd/3
read </dev/fd/3 a
echo "`date +%H:%M:%S` $a"
echo "$a-mysecrethashkey" | /sbin/md5 >>/dev/fd/3
cat </dev/fd/3 >$a
3<&-
so. "backup in a nutshell", use on your own risk, aber wir gesagt, hier läufts seit jahren, erfüllt seinen zweck, nie probleme gehabt (ausser wenn /export/backup mal voll war
