#! /usr/bin/perl

use Date::Calc qw(:all);

sub Nth_Weekday_of_Month
  {
  my ($_day) = @_;
  my $_i;
  if($_day < 1 || $_day > 31) { return 0; }
  for($_i = 1; $_i <= 5; ++$_i)
    {
    if($_day <= ($_i*7)) { return $_i; }
    }
  }
  
sub writeLog
  {
  my($_file, $_msg) = @_;
  my($_year,$_month,$_day,$_hour,$_min,$_sec);
  my($_hour,$_min,$_sec);
  if($_msg eq "__START_SCRIPT__")
    {
    ($_year,$_month,$_day,$_hour,$_min,$_sec) = Today_and_Now();
    $_msg = "=== $_day/$_month/$_year = Script démarré à $_hour:$_min:$_sec ===============";
    }
  elsif($_msg eq "__STOP_SCRIPT__")
    {
    ($_year,$_month,$_day,$_hour,$_min,$_sec) = Today_and_Now();
    $_msg = "=== $_day/$_month/$_year = Script terminé à $_hour:$_min:$_sec ===============\n";
    }
  else
    {
    ($_hour,$_min,$_sec) = Now();
    $_msg = "$_hour:$_min:$_sec > ".$_msg;
    }
  open LOGFILE,">>", $_file;
  print LOGFILE $_msg."\n";
  close LOGFILE;
  return 0;
  }

sub stopScript
  {
  writeLog($fileLog,"__STOP_SCRIPT__");
  system "halt";
  exit;
  }

($year,$month,$day) = Today();
$dow = Day_of_Week($year,$month,$day);
$pathData       = "/Data/Data";
$pathTemp       = "/Data/Backup/Temp";
$pathArchives   = "/Data/Backup/Archives";
$pathArchivesCp = "/Data/Backup/ArchivesCp";
$fileLog        = "/Data/Backup/Log/backup.log";

writeLog($fileLog,"__START_SCRIPT__");

if($dow < 5)
  {
  $filesList = $pathTemp."/files.list";
  $fileArchive = $pathArchives."/jour_$dow.7z";
  $fileArchiveCp = $pathArchivesCp."/partiel.7z";
  writeLog($fileLog,"Sauvegarde partielle dans le fichier $fileArchive");
  system "find $pathData -mtime -".($dow+2)." -type f -print > $filesList";
  if($? != 0)
    {
    writeLog $fileLog,"Echec de la création de la liste des fichiers à sauvegarder ($?).";
    stopScript;
    }
  writeLog $fileLog,"Résultat de la sauvegarde:";
  system "7z a -t7z -mx=9 $fileArchive \@$filesList >> $fileLog";
  if($? != 0)
    {
    writeLog $fileLog,"Echec de la sauvegarde. Code de retour: $?";
    stopScript;
    }
  if(-e $filesList) { unlink $filesList; }
  if(-e $fileArchiveCp) { unlink $fileArchiveCp; }
  system "cp $fileArchive $fileArchiveCp";
  if($? != 0)
    {
    writeLog $fileLog,"Echec de la copie de la sauvegarde. Code de retour: $?";
    stopScript;
    }
  }
elsif($dow == 5)
  {
  $fileArchive = $pathArchives."/semaine_".Nth_Weekday_of_Month($day).".7z";
  $fileArchiveCp = $pathArchivesCp."/complet.7z";
  writeLog $fileLog,"Sauvegarde complète dans le fichier $fileArchive";
  if(-e $fileArchive) { unlink $fileArchive; }
  system "7z a -t7z -mx=9 -r $fileArchive $pathData >> $fileLog";
  if($? != 0)
    {
    writeLog $fileLog,"Echec de la sauvegarde. Code de retour: $?";
    stopScript;
    }
  if(-e $fileArchiveCp) { unlink $fileArchiveCp; }
  system "cp $fileArchive $fileArchiveCp";
  if($? != 0)
    {
    writeLog $fileLog,"Echec de la copie de la sauvegarde. Code de retour: $?";
    stopScript;
    }
  }

stopScript;
