#!/usr/bin/perl -w

=head1 NAME
    
    downtime-monitor

=head1 DESCRIPTION
    
    Следим за предстоящими отключениями с помощью API Голема
        http://clubs.at.yandex-team.ru/4611686018427387924/replies.xml?item_no=150
    Ищем себя в хостах, указанных в /etc/downtime-monitor.d/*
    (пропускает строки, начинающиеся с #, так что в /etc/downtime-monitor.d/* можно писать комментарии)

=cut

use strict;
use warnings;
use utf8;
use open ':std' => ':utf8';

use File::Slurp;
use Getopt::Long;
use Pid::File::Flock qw/:auto/;
use Yandex::Hostname;

use Yandex::Golem qw/downtime_check/;

GetOptions(
    "help" => sub {system("podselect -section NAME -section DESCRIPTION $0 | pod2text-utf8 >&2"); exit 0;},
) || die "Error occured";

my $CONF_DIR = '/etc/downtime-monitor.d';
my $THRESHOLD = 2; # в часах
my $HOSTNAME = Yandex::Hostname::hostfqdn();

opendir(my $dh, $CONF_DIR) || die "can't opendir $CONF_DIR: $!";
my @files = grep {-f "$CONF_DIR/$_" && !/^\.|\.dpkg-(\w+)$/} readdir($dh);
closedir $dh;

foreach my $file (@files) {
    my @lines = read_file("$CONF_DIR/$file");
    foreach my $line (@lines) {
        # Явно разрешаем комментарии в файле с хостами.
        # Это может показаться излишним, т. к. такая строка и так будет пропущена, как не соответствующая ни одному хостнейму, но если формат конфига захочется расширить, полезно не забывать, что там могут быть комментарии
        next if $line =~ /^#/;

        my $host = $line;
        $host =~ s/^\s+|\s+$//g;

        next unless grep {$host eq $_} ('localhost', '127.0.0.1', $HOSTNAME);

        my $result = 'ok';
        if (my $downtime = downtime_check($HOSTNAME)) {
            my $start = $downtime->[0];
            if ($start && int((time() - $start) / 3600) < $THRESHOLD) {
                $result = $file;
            }
        }
        print $result;
        exit 0;
    }
}
