#!/usr/bin/perl

use strict;
use File::Path;
use FileHandle;
use POSIX "strftime";
use DBI;

use Unix::Syslog qw(:macros);  # Syslog macros
use Unix::Syslog qw(:subs);   
openlog "backupd",LOG_PID, LOG_LOCAL7;

my $str = POSIX::strftime( "%Y%m%d_%H%M",localtime());

$ENV{PATH}="/bin:/usr/bin:/usr/local/bin";

open (STDERR, ">>/tmp/backup.out");
open (LOG, ">>/tmp/backup.log");

$<=0;
$>=0;
my $period = shift;
die "perl $0 daily|weekly|monthly" unless $period =~ /^(daily|weekly|monthly)$/ ;

my $source = "/mnt/easy_web";
my $dest = "//backup/easy_backup";
my $mysql_read_default_file = "/usr/local/etc/my.cnf";
my $webdir = "/clara/web";
my $mode = "0711";
my $mode_user = "770";
my $mode_home = "550";
my $clara_uid = 5000;
my $clara_gid = 5000;

my $dbh=DBI->connect("dbi:mysql:easy;mysql_read_default_file=$mysql_read_default_file;mysql_read_default_group=_");

my ($uid,$p,$d,$countmax,$manage);
my @dir =();

####################################################
my $query= " 	SELECT domain_id,CONCAT('X',LEFT(domain,1),'/X',MID(domain,2,1),'/X',MID(domain,3,1)),domain,manage
		FROM domain 
		WHERE	status='Active' 
			AND (
				FIND_IN_SET('${period}_7',manage)
				OR 
				FIND_IN_SET('${period}_12',manage)
				OR 
				FIND_IN_SET('${period}_5',manage)
				OR 
				FIND_IN_SET('${period}_1',manage)
			)
			AND max_wwwquota < 2001
			";

# periodicity in WHERE condition 

my $cmd = $dbh->prepare($query) ;
$cmd->execute() or die "Cannot query $!" ;

while(($uid,$p,$d,$manage) = $cmd->fetchrow_array) {
	$manage =~ /${period}_(\d+)/ ;
	$countmax = $1 ;
	if (! -d "$source/$p/$d") {
		warn "No source $source/$p/$d !!" ;
		next ;
	}
	if (! -d "$dest/$p/$d") {
		syslog LOG_INFO, "CREATING $dest/$p/$d";
		mk_path("$dest",$p,$d); 
	}
	opendir DIR , "$dest/$p/$d" or syslog LOG_INFO, "Cannot opendir $dest/$p/$d";
	my $ldir ;
	my $count= 0 ;
	my @tab = () ;
	while ( $ldir=readdir(DIR) ) {
		next unless $ldir =~ /^public_(${period}.*)$/ ;
		$tab[$count] = $1 ;
		$count++ ;
	}
	my @stab = sort @tab ;
	syslog LOG_INFO, "NUMBER OF ${period} VERSION FOR <$d> : <$count> MAXVERSION : <$countmax>";
	closedir DIR ;
	my $ii ;
	foreach ($ii=0;$ii<1+$count-$countmax;$ii++) {
		$ldir="$dest/$p/$d/public_$stab[$ii]"; 
		syslog LOG_INFO, "DEL $ldir";
		unlink $ldir or syslog LOG_INFO, "DEL FAILED $ldir : $!"; 

		$ldir="$dest/$p/$d/index_public_$stab[$ii].txt"; 
		syslog LOG_INFO, "DEL $ldir";
		unlink $ldir or syslog LOG_INFO, "DEL FAILED $ldir : $!"; 
	}
	syslog LOG_INFO, "BEGIN backup_public $source/$p/$d";
	backup_public("$source/$p/$d","$dest/$p/$d","public_${period}_$str.tar.gz");
	syslog LOG_INFO, "END backup_public $source/$p/$d";
}
$dbh->disconnect;
closelog;
####################################################

sub mk_path {
   my $base_dir = shift ;
   my $path = shift ;
   my $domain = shift ;
   my @pa=split("/",$path);
   my ($ddir,$cdir);
   @dir =();

   foreach $ddir ( @pa ) {
	$cdir="$cdir/$ddir";
	mk_subdir("$base_dir$cdir");
   }

   chmod oct($mode) ,@dir if (@dir) ;
   chown $clara_uid, $clara_gid ,@dir if (@dir) ;
  
   my $rep = "$base_dir$cdir/$domain";
   if (! -d $rep ) {  
	mkdir $rep,oct($mode_home); push @dir, $rep ; 
   }
   if ($uid =~ /^(\d+)/) { $uid=$1;}
   if ($clara_gid =~ /^(\d+)/) { $clara_gid=$1;}
   chown $uid, $clara_gid ,@dir if (@dir) ;
}

sub mk_subdir { 
   my $rep=shift;

   if (!-d $rep) {
        if ($rep =~ /^(\/easy_backup.*)/) { $rep = $1 ; }
        mkdir $rep,oct($mode);
        push @dir, $rep ;
   }
}

sub backup_public {
   my $sourcedir=shift ;
   my $destdir=shift ;
   my $filename=shift ;

   if ( chdir($sourcedir) ) {
	system("tar -zvcf $destdir/$filename public/ > $destdir/index_$filename.txt");
   } else {
        syslog LOG_INFO, "cannot chdir $sourcedir";
   }
   chown $uid, $clara_gid , "$destdir/$filename", "$destdir/index_$filename.txt";
}
