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

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

my $opt_i = ""; # interface

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

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

die "no interface" unless length $opt_i;

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

my $rc = eval { &do_if($opt_f, $opt_i); };

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|%s\n", $st, $opt_i, $msg, $perf;

exit $ec;


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

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

	my $d;
	while (<IF>) {
		if (/^\s*$if:([\s\d]+[\r\n]*)$/) {
			$d = $1;
			last;
		}
	}
	close IF;

	die "no interface data found" unless defined $d && length $d;

	$d =~ s/[\s\r\n]+/ /g;
	$d =~ s/(^ | $)//g;

	my @d = split / /, $d;
	unless (scalar @d == 16) {
		die "bad datacount: ".scalar(@d);
	}

#OK - eth0: UP|if0=19729359;3947873904;0;22075631;4085969718;0; if1=0;0;0;0;0;0; 
#  eth0: 3947883296 19729407    0    0    0     0          0         0 4085973953 22075678    0    0    0     0       0          0

	$perf = sprintf "if0=%s; if1=0;0;0;0;0;0;",
		join(";",@d[1,0,2, 9,8,10,]);
	
	return "ok";
}

