#!/usr/bin/perl

use strict;
use warnings;
use Carp;
use utf8;

use Basicos::Config;

our $VERSION = '0.1';

my %config = _configure(
                getopt      =>  {
                    man         =>  0,
                    verbose     =>  0,
                },
                variables   =>  {
                    calendar    =>  [ "calendar=s", undef, undef,
                                    '/etc/bacula/calendar.conf' ],
                    date        =>  [ "date=s", undef, undef, undef ],
                    },
            );

# Leemos el calendario
my %calendar = _read_calendar($config{calendar});

#   Obtenemos la clave para la fecha de ejecucin segn parmetros
my $today_key = $config{date} ? $config{date} : _read_today();

#    Tenemos la clave ? 
if (exists($calendar{$today_key})) {
    print STDERR "${today_key} - " . $calendar{$today_key} . "\n"
            if $config{verbose};
    exit(1);
}
else{
    exit(0);
}

sub _read_today {
    my  ($sec, $min, $hour, $mday, $mon, $year, 
        $wday,$yday,$isdst) = localtime(time);

    return sprintf("%s/%s", $mday, $mon + 1);
}    

sub _read_calendar {
    my  $calendar   =   shift;
    my  %return     =   ();
    my  $counter    =   0;

    if (my $fh = IO::File->new( $calendar )) {
        while (my $line = <$fh>) {
            $counter++;
            chomp($line);                
            next if $line =~ m{^#} or $line =~ m{^$};

            if ($line =~ m{^(\d+)/(\d+)\s+(.+)$}) {
                my ($day, $month, $description) = ($1, $2, $3);

                $return{ "${day}/${month}" } = $description;
            }
            else {
                carp "malformed line ${counter} in ${calendar}";
            }
        }
        $fh->close();
    }
    else {
        die "could not open ${calendar} file";
    }        

    return %return;        
}

__END__
=pod

=head1 NAME

holidays - Determina qu das no se ha trabajado 

=head1 USAGE

    holidays [calendar] [date]

=head1 OPTIONS

=over

=item calendar

Determina la ruta de acceso al archivo con el calendario de festivos. El valor
predeterminado es F</etc/bacula/calendar.conf>.

=item date

Indica la fecha a comprobar, en formato "dia_del_mes/numero_de_mes"; si se
omite se utiliza la fecha del sistema.

=item verbose

Si se habilita enva a la salida estndar de errores la descripcin de la
fiesta (segn el calendario) en caso de coincidir con alguna.

=item man 

Muestra esta documentacin.

=back

=head1 DESCRIPTION

Este programa est pensado para I<frenar> la realizacin de copias de
seguridad en aquellos das en los que no se ha trabajado. En concreto parte de
la siguiente base:

=over 

=item Las copias de seguridad se efectan al finalizar el da de trabajo, y no
en la madrugada del siguiente ni horas similares.

=item Los trabajos de copia pueden abortarse sin ms consecuencias.

=back

Para usarlo basta con incluir una clasula similar a la siguiente en la
definicin de un trabajo:

     RunScript {
        RunsWhen        = Before
        AbortJobOnError = Yes
        Command         = "/etc/bacula/scripts/holidays"
    }

El director de copias ejecutar el programa antes de iniciar el trabajo de
copia. Si la fecha de hoy (cuando se inicia el trabajo, ojo) coincide con
alguna de las indicadas en el archivo del calendario, el programa finalizar
con un valor de uno (1). 

Segn la documentacin de Bacula, cualquier valor diferente de cero es
suficiente para considerar fallida la ejecucin.

=head1 DIAGNOSTICS

=over

=item could not open xxxxxx file

El programa muere con este mensaje si no puede abrir el archivo del
calendario.

=item malformed line NNN in XXXX

Mensaje de aviso enviado a la salida estndar de errores indicado algn error
de sntaxis en el archivo del calendario.

=back

Otros mensajes de error pueden deberse parmetros errneos en la lnea de
rdenes y variarn en funcin de la librera L<Basicos::Config>.

=head1 CONFIGURATION AND ENVIRONMENT

El archivo del calendario tiene el siguiente formato:

=over 

=item Los comentarios se indican comenzando la lnea con el carcter #

=item Las lneas en blanco son ignoradas

=item Las lneas que definen fechas deben indicar stas de la siguiente forma:

=over

=item dia_del_mes/numero_de_mes

=item descripcin de la festividad

=back

=back

Como en el siguiente ejemplo:

    1/1     Ao nuevo
    6/1     Reyes
    5/4     Jueves Santo


=head1 DEPENDENCIES

=over

=item L<Basicos::Config>

=back

=head1 BUGS AND LIMITATIONS

There are no known bugs in this module.

Please report problems to the author(s).

Patches are welcome.

=head1 AUTHOR

Vctor Moral <victor@taquiones.net>, Angel Ortega <angel@triptico.com>

=head1 LICENCE AND COPYRIGHT

Copyright (c) 2005 <Venexma Europa, S.L.>. All rights reserved.

This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself. See L<perlartistic>.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

