#!/usr/bin/perl
#
# Script designado para realizar a manutenção do tempo de retenção de gravações
# ficou definido pelo cliente a retenção de áudio de 90 dias
#
# Necessário instalar DBI e Time::Piece
#


use DBI;
use Time::Piece;
use Time::Seconds;
use Log::Logger;


# variaveis do banco de dados

$database = "pabxvirtual";
$dbhost = "localhost";
$dbport   = "3306";
$dbuser   = "asteriskuser";
$dbpass   = "2sf__d09AJDKaef";

$pbxhost = 'pabx';



# Atribuicao de valores para localtime
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);




# preparando o banco de dados

$dsn = "DBI:mysql:database=$database;host=$dbhost;port=$dbport";
$dbh = DBI->connect($dsn, $dbuser, $dbpass);


# Adicionar coluna de retencao diferenciadas, retencao em branco funcionara com 90
$query = "SELECT id,login FROM users where servidor = '$pbxhost'";

my $sth = $dbh->prepare($query);

$sth->execute();

if($sth->rows > 0){

  # iniciando loop nos resultados
  while(my $qResult = $sth->fetchrow_hashref()){

    $mt = 90;

    print "Verificando diretórios de gravacao\n";
    print "ID: $qResult->{id}\n";
    print "Login: $qResult->{login}\n";
    print "Retencao: $mt\n";

    for ( $mt; $mt <= 365; $mt++ ){

      my %nlimit_date = get_limit_date($year, $mon, $mday, $mt);
      $check_dir = "/var/spool/asterisk/monitor/" . $qResult->{'id'} . "/" . $nlimit_date{'year'} . "/" . $nlimit_date{'month'} . "/" . $nlimit_date{'day'};
      if(-e $check_dir){
        print "Diretorio a ser removido: $check_dir\n";
        unlink glob "$check_dir/*" or warn "Arquivo nao removido $!\n";
        rmdir $check_dir or warn "Diretorio não removido $! :: $check_dir\n";
      }


    }

    print "#------------------------------------------#\n";
  }


}else{
  print "Sem resultado do banco\n";
}






sub get_limit_date($$$$){

  # Recebendo variaveis
  my ($year, $mon, $day, $manytimes) = @_;


  # Os diretorios em uso utilizam dois digitos, numeros
  # abaixo de 10 possuem o 0 na frente

  if($day < 10){ $day = "0" . $day};

  $mon = $mon + 1;
  if($mon < 10){ $mon = "0" . $mon};


  # Ajustando ano para notacao correta
  my $cYear = $year + 1900;
  my $cDate = $cYear . "-" . $mon . "-" . $mday;


  # Realizando calculo da data
  my $limit_date = Time::Piece->strptime($cDate, "%Y-%m-%d");

  $limit_date -= ( $manytimes * ONE_DAY );

  my $lYear = $limit_date->year;
  my $lMonth = $limit_date->mon;
  my $lDay = $limit_date->mday;

  if($lDay < 10){
    $lDay = "0" . $lDay;
  }

  if($lMonth < 10){
    $lMonth =  "0" . $lMonth;
  }


  # Retornando valores para array
  return (
    "year" => "$lYear",
    "month" => "$lMonth",
    "day" => "$lDay"
  );


}
