#!/usr/bin/perl

=head1 NAME

octo_scheduler - Octopussy Scheduler program

=head1 SYNOPSIS

octo_scheduler

=head1 DESCRIPTION

octo_scheduler is the program used by the Octopussy Project 
to launch Report that have been scheduled 
and generate Syslog Activity RRD Graphs 

=cut

use strict;
use warnings;

use POSIX qw( strftime );
use Time::Piece;
use Time::Seconds;

use AAT::Utils;
use Octopussy;
use Octopussy::App;
use Octopussy::Report;
use Octopussy::RRDTool;
use Octopussy::Schedule;

my $PROG_NAME = 'octo_scheduler';

=head1 FUNCTIONS

=head2 Launch_Report($sched)

Launches Report

=cut

sub Launch_Report
{
    my $sched       = shift;
    my $start_day   = $sched->{start_day};
    my $start_hour  = $sched->{start_hour};
    my $finish_day  = $sched->{finish_day};
    my $finish_hour = $sched->{finish_hour};
    $start_day   =~ s/Day-(\d+)/$1/i;
    $start_hour  =~ s/Hour-(\d+)/$1/i;
    $finish_day  =~ s/Day-(\d+)/$1/i;
    $finish_hour =~ s/Hour-(\d+)/$1/i;

    my $dt        = Time::Piece->new;
    my $dt_start  = $dt - ($start_day * ONE_DAY) - ($start_hour * ONE_HOUR);
    my $dt_finish = $dt - ($finish_day * ONE_DAY) - ($finish_hour * ONE_HOUR);

    my $start  = $dt_start->strftime('%Y%m%d%H%M');
    my $finish = $dt_finish->strftime('%Y%m%d%H%M');

    print "$start - $finish\n";

    my $report = Octopussy::Report::Configuration($sched->{report});
    if (defined $report)
    {
        print "Launch Report: $sched->{device} $sched->{service}\n";
        print "               $start $finish\n";

        Octopussy::Report::CmdLine(
            $sched->{device},
            $sched->{service},
            ($report->{loglevel} || '-ANY-'),
            ($report->{taxonomy} || '-ANY-'),
            $report,
            $start,
            $finish,
            'sched_' . $report->{name} . "_$$",
            $sched->{mail}[0],
            $sched->{ftp}[0],
            $sched->{scp}[0],
            'EN'
        );

        return (1);
    }

    return (0);
}

#
# MAIN
#
my $counter = 0;

exit if (!Octopussy::App::Valid_User($PROG_NAME));

while (1)
{
    my ($year, $mon, $mday, $hour, $min) = AAT::Utils::Now();
    my $wday = strftime("%w", 0, 0, 0, $mday, $mon - 1, $year - 1900);
    $wday = ($wday == 0 ? $wday = 7 : $wday); # on sunday we want 7 instead of 0
    my %dt = (
        year  => $year,
        month => $mon,
        day   => $mday,
        wday  => $wday,
        hour  => $hour,
        min   => $min
    );
    my @schedules = Octopussy::Schedule::Configurations('title');

    foreach my $sched (@schedules)
    {
        Launch_Report($sched) if (Octopussy::Schedule::Match($sched, \%dt));
    }
    Octopussy::RRDTool::Syslog_By_DeviceType_Hourly_Graph();
    if ($counter % 10 == 0)
    {
        Octopussy::RRDTool::Syslog_By_DeviceType_Daily_Graph();
    }
    if ($counter % 30 == 0)
    {
        Octopussy::RRDTool::Syslog_By_DeviceType_Weekly_Graph();
    }
    if ($counter % 60 == 0)
    {
        Octopussy::RRDTool::Syslog_By_DeviceType_Monthly_Graph();
    }
    if ($counter % 720 == 0)
    {
        Octopussy::RRDTool::Syslog_By_DeviceType_Yearly_Graph();
        $counter = 1;
    }
    $counter++;
    sleep 60;
}

=head1 AUTHOR

Sebastien Thebert <octopussy@onetool.pm>

=head1 SEE ALSO

octo_dispatcher, octo_extractor, octo_parser, octo_uparser, octo_reporter

=cut
