#!/usr/bin/perl

use constant 'WARNPERCENT'  => 65;
use constant 'ERRORPERCENT' => 70;

use strict;
use warnings;
use open ':std', ':encoding(UTF-8)';

use DateTime;
use Sys::Hostname;
use Capture::Tiny(qw/capture/);

use lib '/app/tools/common/lib';
use Common::Session;
use Common::Amazon::Mail;

my $dbh   = Common::Session::getdbh('admindb');
my $hosts = $dbh->selectcol_arrayref(qq{SELECT hostname FROM report.d_aws_host WHERE is_production = 1 ORDER BY hostname});

my $separator = '-' x 80;
my $email_body;
my $email_errors;
foreach my $host ( sort @{$hosts} ) {
    my $hdr = "$separator\n$host\n$separator";

	## don't ssh to the local server
    my $cmd;
    if ( Sys::Hostname::hostname eq $host ) {
        $cmd = "df -h | grep -v shared | grep -v media";
    } else {
        $cmd = "ssh $host \"df -h | grep -v shared | grep -v media\"";
    }

    my ( $stdin, $stderr, $exit ) = capture { system $cmd };
    if ($exit) {
        $email_errors .= "$hdr\n$stderr\n";
    } else {
        my $_body;
        $email_body .= "$hdr\n";
        map {
            my ($perc) = $_ =~ m/.*\s(.*)%/;
            $perc = 0 if $perc =~ m/Use/i;
            if ( $perc >= WARNPERCENT and $perc < ERRORPERCENT ) {
                $_body .= "<em style=\"color:gold\">$_</em>";
            } elsif ( $perc >= ERRORPERCENT ) {
                $_body .= "<em style=\"color:red\">$_</em>";
            } else {
                $_body .= $_;
            }
            $_body .= "\n";
        } split "\n", $stdin;
        $email_body .= "$_body\n";
    }
}

my $date    = DateTime->now->ymd('');
my $subject = "CRON: Daily Server Space Report $date";
if ($email_errors) {
    $email_body = "<font color=\"red\">ERRORS:\n$email_errors</font>\n\n$email_body";
    $subject    = "ERROR: $subject";
}

my $amz_mail = Common::Amazon::Mail->new('html');
$amz_mail->to( 'sysadmin@royaltyshare.com' );
$amz_mail->cc( $amz_mail->list->system );
$amz_mail->subject($subject);
$amz_mail->body("<pre>$email_body</pre>");
$amz_mail->sendit;
