#!/bin/perl
# Script de purge de fichiers
# Version 2.0
# Historique:
# 2008/10 (A. Klein) : Ajout de la duree de retention en fonction de la frequance
# 2002/06 (E. Angenault) : Suppression des fichiers a n jours
use Getopt::Std;
getopts( 'p:y:m:d:c:w:h') or usage();
usage() if $opt_h;
#Declaration des variables
my $standard = '^.{3}([YMWDC])\-.{6}';
my $year_to_keep;
my $month_to_keep;
my $day_to_keep;
my $cycl_to_keep;
my $week_to_keep;
my ($rep, $file, $f);
my ($periode, $indice);
my $defaut_periode = 14;
my @Delete;
$keep_year = $opt_y || 400; #400
$month_to_keep = $opt_m || 40; #40
$day_to_keep = $opt_d || 7; #7
$week_to_keep = $opt_w || 30; #30
$cycl_to_keep = $opt_c || 3; #3
$rep = $opt_p || die "Repertoire de purge non defini";
# Affichage des parametres
print "Parameters :\n";
print "\tDay :\t$day_to_keep\n";
print "\tWeek :\t$week_to_keep\n";
print "\tMonth :\t$month_to_keep\n";
print "\tYear :\t$keep_year\n\n";
#verification de la validite des parametres rentres
check_arg($keep_year);
check_arg($month_to_keep);
check_arg($day_to_keep);
check_arg($week_to_keep);
check_arg($cycl_to_keep);
#Repertoire existe?
if (! -d $rep )
{
print " le repertoire $rep n\'existe pas!\n";
exit 1;
}
#Lecture du repertoire source
opendir(DIR, $rep) || die "$rep n\'existe pas";
my @Dir = readdir (DIR);
foreach $f (sort @Dir)
{
$file="$rep/$f";
#On ne traite que les fichiers
if ( -f $file)
{
# On recupere toutes les informations de chaque fichier
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($file);
#On s'occupe des auto_rem en fonction des logs. On ne les purge pas directement
next if ($f =~ /auto_rem/);
#Analyse du nom du fichier pour traitement de la duree de retention
#La lettre a analyser est la 4eme lettre du nom xxx[Y|M|W|D|C]-xxxxxx..
#Apres analyse on set la duree de retention en fonction des paremetres
#passes au script
if ( $f =~ /${standard}/)
{
$indice=$1;
$periode = $year_to_keep if ( $indice eq "Y");
$periode = $month_to_keep if ( $indice eq "M");
$periode = $week_to_keep if ( $indice eq "W");
$periode = $day_to_keep if ( $indice eq "D");
$periode = $cycl_to_keep if ( $indice eq "C");
}
else
{
#Cas des fichiers standards ou fichier avec une periodicite "inconnue" et non "auto_rem"
$periode = $defaut_periode;
}
#On selectionne ceux de plus de $periode jours
$age = int(time/86400) - int($mtime/86400);
$Size[$age]+=$size;
$Count[$age]++;
$older=$age if ($age>$older);
if ($age>=$periode)
{
#Le fichier est a supprime
#On verifie qu'un eventuel fichier auto_rem associe n'existe pas
#L'auto_rem associe possede la meme sequence de fin que le fichier log
$f =~ /\-(\d*)\-(\d*)$/ ;
push @autorem , (grep /^auto_rem.*$1\.$2$/, @Dir);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
printf ("%4d/%02d/%02d %2d:%02d\t$f\n",$year+1900,$mon+1,$mday,$hour,$min,$f);
push(@Delete,$file);
}
}
}
#Suppression des doublons de la liste des auto_rem
my %dejavu;
map {$dejavu{$_}++} @autorem;
@unique_autorem = sort keys %dejavu;
@unique_autorem = map ( $rep."/$_", @unique_autorem);
#Integration des auto_rem dans le report
foreach $r (@unique_autorem)
{
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat("$r");
$age = int(time/86400) - int($mtime/86400);
$Size[$age]+=$size;
$Count[$age]++;
$older=$age if ($age>$older)
}
#Suppression des deux listes de fichiers
unlink @Delete;
unlink @unique_autorem;
printf("==== ============= =====\n");
print "Days Size (Ko) Count\n";
printf("==== ============= =====\n");
for ($i=0;$i<$older;$i++)
{
if ($Count[$i]>0)
{
$delete += $Size[$i];
$nbdel += $Count[$i];
printf("%4s %13.2f %5d\n",$i,$Size[$i]/1024,$Count[$i]);
}
}
printf("---- ------------- -----\n");
printf("Del %13.2f %5d\n",$delete/1024,$nbdel);
printf("==== ============= =====\n");
exit ;
sub usage
{
print "$0 -p PATH [-y] [-m] [-d] [-c]\n";
print "definition en jour en fonction de la periodicite de la retention\n";
print "\ty: annees, defaut=300\n";
print "\tm: mois, defaut=40\n";
print "\td: jours, defaut=7\n";
print "\tw: semaine, defaut=30\n";
print "\tc: traitements cycliques, defaut=3\n";
exit 0;
}
sub check_arg
{
my ($var)= @_ ;
if (!( $var =~ /\d*/ and $var > 0 ))
{
print " parametre incorrect: $var ! \n Verifiez les arguments passes en parametre\n";
exit 1;
}
}