#!/usr/bin/perl

# ---------------------------------------------------------------
# Prontus CMS
# http://www.prontus.cl
# by Altavoz.net
#
# licensed under LGPL license.
# http://www.prontus.cl/license.html
# ---------------------------------------------------------------

# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO.
# -----------
# Indexa solo los tiempos de modificación de los artículos
# ---------------------------------------------------------------
# LLAMADAS A ARCHIVOS EXTERNOS.
# ------------------------------
#
# ---------------------------------------------------------------
# INVOCACIONES ACEPTADAS.
# ------------------------
# Por linea de comando
# ---------------------------------------------------------------

# ---------------------------------------------------------------
# DIRECTIVAS DE COMPILACION.
# ---------------------------
use utf8;
use strict;

BEGIN {
    use FindBin qw($Bin);
    my $pathLibsProntus = $Bin;
    unshift(@INC,$pathLibsProntus);
    $pathLibsProntus =~ s/\/[^\/]+\/?$//;
    unshift(@INC,$pathLibsProntus);
}

END {
    &tareas_salida();
}

use sigtrap 'handler' => \&signal_catch, 'INT';
use sigtrap 'handler' => \&signal_catch, 'TERM';
use sigtrap 'handler' => \&signal_catch, 'KILL';

# Captura STDERR
use lib_stdlog;
&lib_stdlog::set_stdlog($0, 51200);

use lib_waitlock;
use lib_maxrunning;
use glib_fildir_03;
use prontus_varglb; &prontus_varglb::init();
use glib_html_03;
use lib_prontus;

my $LOCK = '';
my $LOCKFH;

main: {
    &lib_prontus::setUtf8();

    if (scalar @ARGV < 1) {
        print "Parámetros insuficientes. Modo de uso:\n";
        print "perl $0 <prontus_id>\n\n";
        exit;
    }

    if (&myself_running() > 1) {
        print STDERR " Hay otro proceso corriendo: $0 $ARGV[0]\n";
        exit;
    }

    $prontus_varglb::PRONTUS_ID = $ARGV[0];

    if (!lib_prontus::valida_prontus($prontus_varglb::PRONTUS_ID)) {
        print STDERR "Prontus ID no es válido\n";
        exit;
    }

    my $msg_load = &lib_prontus::load_config_by_id($prontus_varglb::PRONTUS_ID);
    if ($msg_load ne '') {
        print STDERR "Error al cargar configuracion: $msg_load\n";
        exit;
    }

    my $msg_err_bd = '';
    ($prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID}, $msg_err_bd) = &lib_prontus::conectar_prontus_bd();
    if (! ref($prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID})) {
        print STDERR "ERROR al conectar a BD: $msg_err_bd\n";
        print STDERR "No se procesará este prontus\n";
        exit;
    }

    my $ruta_dir = $prontus_varglb::DIR_SERVER . $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'} . $prontus_varglb::DIR_ARTIC;

    my @lisdir = &glib_fildir_03::lee_dir($ruta_dir);
    @lisdir = grep !/^\./, @lisdir; # Elimina directorios . y ..

    # Para cada dirfecha
    foreach my $dirfecha (@lisdir) {
        print STDERR "Procesando artics de [$prontus_varglb::PRONTUS_ID][$dirfecha/xml]\n";
        if (-d "$ruta_dir/$dirfecha/xml") {
            &procesa_files("$ruta_dir/$dirfecha/xml", $prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID});
        }
    }
}

# ---------------------------------------------------------------
sub procesa_files {
    # Lee todos los articulos del directorio y agrega la info a la bd.
    my $ruta_dir_xml = $_[0];
    my $base = $_[1];

    my @lisfile = &glib_fildir_03::lee_dir($ruta_dir_xml);

    foreach my $k_xml (@lisfile) {
        if ((-s "$ruta_dir_xml/$k_xml") && ($k_xml =~ /^(\d{14})\.(xml)$/) && (! -d "$ruta_dir_xml/$k_xml")) {
            my $ts = $1;

            # se asegura el xml mientras se edita y guarda
            $LOCK = "$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_LOCKS'}/$ts.mutex";
            $LOCKFH = &lib_waitlock::lock_file($LOCK);

            my $xml = &glib_fildir_03::read_file("$ruta_dir_xml/$k_xml");

            my $modtime = 0;
            if ($xml =~ /<_modtime>(\d+)<\/_modtime>/) {
                $modtime = $1;
            } else {
                $modtime = (stat("$ruta_dir_xml/$k_xml"))[9];
                $xml = &lib_prontus::replace_in_xml($xml, "_modtime", $modtime, 0);
                &glib_fildir_03::write_file("$ruta_dir_xml/$k_xml", $xml);
            }

            # xml de articulo ya se actualizó, se libera el mutex
            &lib_waitlock::unlock_file($LOCK, $LOCKFH);

            # ingresamos el nuevo dato a la tabla
            my $sql = "update ART set ART_MODTIME = ? where ART_ID = ?";
            my @params = ($modtime, $ts);
            my $res = &glib_dbi_03::ejecutar_sql_param($prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID}, $sql, \@params);

            if (!$res) {
                print STDERR  "Error actualizando la tabla ART: sql[$sql][$!]";
            }
        }
    }
}

# ----------------------------------------------------------------------------- #
# Detecta cuantas copias de este script estan corriendo.
sub myself_running {
    my(@result) = qx/ps axww | grep $0 | grep '$ARGV[0]' | grep -v ' grep ' | grep -v 'nice' | grep -v 'editor' | grep -v 'sh -c' | grep -v execIfMaster | grep -v 'tail'/; # wc -l
    my $res = 0;
    foreach my $line (@result) {
        #print "line = [$line] [$0]\n";
        $res++;
    }
    return $res;
}

# ---------------------------------------------------------------
# funcion para capturar las señales INT y TERM y logearlas
sub signal_catch {
    print STDERR  "Terminado por signal @_\n";
    exit(0);
}

sub tareas_salida {
    if ($LOCK ne '') {
        &lib_waitlock::unlock_file($LOCK, $LOCKFH);
    }
}
