#!/usr/bin/perl -w
use strict;

my $arg ="";
my $state = "OK";
my $message = "";

my %proc_full;
my %proc_bin;

my @processes = split /\n/, `ps -aef`;
foreach my $process (@processes) {
    my ($user, $pid, $ppid, $c, $stime, $tty, $time, $cmd) = split /\s+/, $process, 8;
    next if $cmd =~ m#$0#;

    $proc_full{$cmd}++;
    
    my ($proc_bin_name) = $cmd =~ m#^([^\s]+)#;
    $proc_bin{$proc_bin_name}++;
}

my @process_full_names = keys %proc_full;
my @process_bin_names = keys %proc_bin;

my $count = 0;
while ($arg = shift @ARGV) {
    my ($process, $min, $max) = $arg =~ m#(.*):(\d+):(\d+)$#;
    $max ||= 99999;

    my $grep_result = "";
    my $proc_count;
    if ($process =~ m#\s#) {
        ($grep_result) = grep {/$process/} @process_full_names;
        $proc_count = $proc_full{$grep_result||""};
    } else {
        ($grep_result) = grep {/$process/} @process_bin_names;
        $proc_count = $proc_bin{$grep_result||""};
    }
    $proc_count ||= 0;

    if ($proc_count >= $min && $proc_count <= $max) {
        $message .= " - ${process} OK";
    } else {
        $message .= " - ${process} found:${proc_count} min:${min} max:${max}";
        $state = "CRITICAL";
    }

    $count++;
}

if ($count == 0) {
    print "WARNING - Configuration error : missing checkarray name:min [name:min:max] etc (max is optional)\n";
    exit 1;
}

if ($state eq "OK") {
    print "${state}${message}\n";
    exit 0;
} else {
    print "${state}${message}\n";
    exit 2;
}

