#! /usr/bin/env perl
# vim: set filetype=perl ts=4 sw=4 sts=4 et:
#
# DESC: Warn if a more recent bastion version is available

use strict;
use warnings;
use File::Basename;
use Getopt::Long;

my $PROBE_NAME = basename($0);
my $debug;

## no critic (Subroutines::RequireFinalReturn)
## no critic (InputOutput::ProhibitBacktickOperators)

sub _out {
    my ($criticity, $msg) = @_;
    printf "%s %4s - %s\n", $PROBE_NAME, $criticity, $msg;
}

sub _dbg  { _out('dbg',  $_[0]) if $debug; }
sub _info { _out('info', $_[0]); }
sub _warn { _out('WARN', $_[0]); }
sub _err  { _out('ERR!', $_[0]); }

sub success { my $msg = shift; _info($msg) if $msg; _info("status=OK");      exit(0); }
sub warning { my $msg = shift; _warn($msg) if $msg; _info("status=WARN");    exit(1); }
sub failure { my $msg = shift; _err($msg)  if $msg; _info("status=FAILURE"); exit(2); }
sub unknown { my $msg = shift; _err($msg)  if $msg; _info("status=UNKNOWN"); exit(3); }

# OPTIONS

GetOptions(
    "help"            => \my $help,
    "debug!"          => \$debug,
    "basedir=s"       => \my $basedir,
    "no-warn-on-diff" => \my $noWarnOnDiff,
) or unknown("Failed parsing command-line");

# HELP

if ($help) {
    print <<"EOF";

$PROBE_NAME [options]

        --help             This help message
        --debug            Increase verbosity of logs
        --basedir DIR      Specify the base directory of The Bastion (default: /opt/bastion)
        --no-warn-on-diff  Never return a WARN code even if we find a git diff

EOF
    unknown();
}

$basedir ||= "/opt/bastion";

# CODE

# get current version
my $current_version;
if (open(my $fh, '<', "$basedir/lib/perl/OVH/Bastion.pm")) {
    while (<$fh>) {
        if (m{^\s*our\s+\$VERSION\s*=\s*.([0-9a-zA-Z.-]+)}) {
            $current_version = $1;
        }
    }
    close($fh);
    if ($current_version) {
        _info("Bastion version $current_version found");
    }
    else {
        unknown("Couldn't find version in Bastion.pm file!");
    }
}
else {
    unknown("Couldn't find current bastion version ($!)");
}

my @out;
my $ret;

if (!chdir("$basedir")) {
    unknown("Couldn't chdir to $basedir!");
}

@out = qx{git rev-parse --abbrev-ref HEAD};
$ret = $?;
if ($ret != 0) {
    _info("Bastion main path is not a git repo, or failed to rev-parse");
}
else {
    _dbg("output: $_") for @out;
    my $branch = $out[0];
    chomp $branch;
    _info("Bastion is on branch $branch");
}

@out = qx{git rev-parse HEAD};
$ret = $?;
if ($ret != 0) {
    _info("Bastion main path is not a git repo, or failed to rev-parse");
}
else {
    _dbg("output: $_") for @out;
    my $commit = $out[0];
    chomp $commit;
    _info("Bastion is on commit $commit");
}

@out = qx{git diff};
if ($ret != 0) {
    _info("Bastion main path is not a git repo, or failed to diff");
}
else {
    _dbg("output: $_") for @out;
    my $difflines = @out;
    if ($difflines > 0) {
        if ($noWarnOnDiff) {
            success("Found $difflines lines of diff");
        }
        else {
            warning("Found $difflines lines of diff");
        }
    }
    else {
        success("Found no git diff");
    }
}
