#!/usr/bin/perl
use warnings;
use strict;
$|=1;

my $opt_f = "/proc/meminfo"; # file to read from
my $opt_v = 0;

my $opt_w = 30;
my $opt_c = 35;

use Getopt::Long qw(:config no_ignore_case bundling);
GetOptions(
        'f=s' => \$opt_f,
        'w=s' => \$opt_w,
        'c=s' => \$opt_c,
        'v'   => \$opt_v,
        ) or die "funnyargs";


my ($msg, $perf,);
my $ec = 3;

my %STATS = ();
my $rc = eval { 
	&do_meminfo($opt_f); 

	my %d = ();
	$d{memfree}  = $STATS{MemFree};
	$d{membuff}  = $STATS{Buffers};
	$d{memswap}  = $STATS{SwapCached};
	$d{memcache} = $STATS{Cached};
	$d{memused}  = $STATS{MemTotal}-$STATS{MemFree}-$STATS{Buffers}-$STATS{Cached}-$STATS{SwapCached};

	$d{swapfree} = $STATS{SwapFree};
	$d{swapused} = $STATS{SwapTotal}-$STATS{SwapFree};

	$msg = sprintf "%i read, %i perf", scalar keys %STATS, scalar keys %d; 
	$perf = join(" ",map({sprintf "%s=%s;",$_,($d{$_}*1024);} sort keys %d));

	return "ok";
};

if (defined $rc && $rc eq 'ok') {
	$msg ||= sprintf "%i perfbytes", length $perf;
	$ec = 0;
} else {
	$ec = 3;
	if ($@) {
		chomp $@;
		$msg = "EXCEPTION: '$@'";
	} else {
		$msg = "UNKNOWNRC: '$rc'";
	}
}
unless (defined $msg && length $msg) {
	$msg = "NOMESSAGE";
	$ec = 3;
}

#TODO
$perf ||= "";

my $st = {
		0 => 'OK',
		1 => 'WARNING',
		2 => 'CRITICAL',
		3 => 'UNKNOWN',
	}->{$ec}||"EC$ec";

printf "%s - %s|%s\n", $st, $msg, $perf;

exit $ec;


sub do_meminfo($) {
	my ($fn,) = @_;

	die "'$fn' does not exist" unless -e $fn;
	die "'$fn' not a file" unless -f $fn;
	open IF, "<", $fn or die "open($fn): $!";

	while (<IF>) {
		s/[\s\r\n]+/ /g;
		s/(^ | $)//g;

		if (/^(\w+): *(\d+) kB$/) {
			die "dupe stat $1" if exists $STATS{$1};
			$STATS{$1} = $2;
		}
	}
	close IF;

	return "ok";
}

