#!/usr/bin/perl

use strict;

our $max_areas = 30;
our $ipcs = "/usr/bin/ipcs";
our $sudo = "/usr/bin/sudo";
our $ps = "/bin/ps";

sub main() {

	my @ret;
	my %shmem_areas;
	my $critical = 0;
	my $output_str = "";
	my $areas_counter = 0;

	@ret = `$sudo $ipcs -m -p`;

	foreach(@ret) {
		# 729287229  root       11288      11288
		if (m/^\d+\s+.+\s+(\d+)\s+\d+.*$/) {
			$areas_counter++;
			$shmem_areas{$1}++;
		}
	}

	foreach (keys %shmem_areas) {
		if ($shmem_areas{$_} >= $max_areas) {
			$critical = 1;
			$output_str .= get_process($_);
		}
	}

	if ($critical) {
		print("CRITICAL - $output_str |areas=$areas_counter;$max_areas;$max_areas;0;\n");
		exit 2;
	}

	print("OK - Shared memory allocation |areas=$areas_counter;$max_areas;$max_areas;0;\n");
	exit 0;

}

sub get_process() {
	my $pid = shift;
	my @ret;

	@ret = `$ps -p $pid`;
	chomp(@ret);

	if ($#ret == 0) {
		return "(unable to find process name)";
	}

	return "(".$ret[1].")";
}


main();
