#!/usr/bin/perl -w use strict; use File::Find; use Net::FTP; # # Copyright (c) 2002 Peter Kaagman bilbo@nedlinux.nl # # # Generiek backup script voor op linux hosts # # backup vanaf: # - nfs filesystems # - smb filesystems # - local filesystems # # Mogelijkheid voor full en incremental. # # Wijzigingen: # # 10 feb 2003: # - sub remove_files toegevoegd om oude backups te kunnen # verwijderen # 11 feb 2003: # - functie voor het samenstellen van de filelist verwijdert, # het bleek dat bij een smb filesysteem niet alle bestanden # gevonden werden wat incomplete backups tengevolge had # - cpio ipv tar, tar gaf problemen met het gebruik van filelists # samengesteld door find # Wensen # - soort van check of de directorie waarin de backup komt # te staan wel gemount is. #########Globals##################################### my $Prefix; my %Options; my @Options; my %ToDo; my @ToDo; my $Label; my $Dir; my $TimeStamp; my @Done; #############Begin Subs############################## # # remove_files # # een functie om oude backup te verwijderen # sub remove_files(){ sub remove(){ my $which = shift; /^.*(tar|tgz|zip|gz)$/ && #print "Remove $_\n"; unlink($_); } my $where = shift; find(\&remove, "$where") } # Toon usage scherm sub usage{ print "Usage\n"; exit(1); } # Generieke methode om een timestamp te krijgen sub GetTimeStamp{ use Time::localtime; my $tm = localtime; my($Dy, $Mnth, $Yr, $Hr, $Min, $Sec) = ($tm->mday, $tm->mon+1, $tm->year+1900, $tm->hour, $tm->min, $tm->sec); $Dy = sprintf("%02s", $Dy); $Mnth = sprintf("%02s", $Mnth); $Hr = sprintf("%02s", $Hr); $Min = sprintf("%02s", $Min ); $Sec = sprintf("%02s", $Sec ); if (defined ($_[0])){ my $TimeStamp = "$Yr$Mnth$Dy-$Hr$Min$Sec"; }else{ my $TimeStamp = "$Yr$Mnth$Dy"; } } #############Einde Subs############################## # # Initialisatie $TimeStamp = GetTimeStamp(1); # Haal de opties uit het cfg bestand open (FILE, "$0.cfg") or die "Geen cfg bestand\n"; while (){ chomp; if ( ! /^#/){ # Ignore commentlines # Strip trailing comments if (/#/){ my @line_split = split(/#/); $_ = $line_split[0]; } push(@Options, split(/ +/)); } } %Options = @Options; # Doen we een full of incremental SWITCH: { if ((defined($ARGV[0]))&&($ARGV[0] =~ /^inc/)){ $Prefix = "inc"; last SWITCH; }; if ((defined($ARGV[0]))&&($ARGV[0] =~ /^full/)){ $Prefix = "full"; `touch $0.lastfull`; &remove_files($Options{BackupDir}); last SWITCH; }; usage(); } # Laten we beginnen met local filesystemen open (FILE , "$0.list") or die "Kan $0.list niet openen\n"; while (){ chomp; if (/^local/){ if (/#/){ my @Tmp = split (/#/); $_ = $Tmp[0]; } my @Tmp = split (/ +/); push @ToDo, $Tmp[1], $Tmp[2]; } } %ToDo = @ToDo; undef(@Done); while (($Label, $Dir) = each (%ToDo)){ print "Label:$Label en Dir:$Dir\n"; my $arg; if (($Prefix eq "inc") && (-f "$0.lastfull")){ $arg = ("find $Dir -newer $0.lastfull > $0.todo") } else { $arg = ("find $Dir > $0.todo") } system($arg) == 0 or die "system $arg failed: $?"; my $Target = "$Options{BackupDir}/$Prefix$Label$TimeStamp.tgz"; #system ("tar -czf $Target -T $0.todo"); system ("/bin/cpio -o -H ustar < $0.todo |/bin/gzip > $Target"); push @Done, $Target; } my $ftp = Net::FTP->new($Options{ftp_server}, Debug => 0); $ftp->login($Options{ftp_user},$Options{ftp_pass}); $ftp->binary(); $ftp->cwd("archives"); foreach (@Done){ $ftp->put($_); } $ftp->quit;