#!/usr/bin/perl

# alex@noris.de
# 2013-03-25

# check free space while using thin provisioned volumes
# critical if biggest thin volume has not enough space to grow complete

use lib "/usr/lib/netapp-manageability-sdk-5.0/lib/perl/NetApp";
use NaServer;
use NaElement;
use strict;
use warnings;
use Data::Dumper;

my $s = NaServer->new ($ARGV[0], 1, 3);

$s->set_transport_type("HTTPS");
$s->set_style("LOGIN");
$s->set_admin_user($ARGV[1], $ARGV[2]);
$s->set_timeout(60);

my $output = $s->invoke("volume-list-info");

if ($output->results_errno != 0) {
        my $r = $output->results_reason();
        print "UNKNOWN - Timeout: $r\n";
        exit 3;
}

my $volumes = $output->child_get("volumes");
my @result = $volumes->children_get();
my %maximum_free_per_vol;

foreach my $vol (@result){

	my $vol_state = $vol->child_get_string("state");

        if(($vol_state ne "offline") && ($vol_state ne "unknown") && ($vol_state ne "restricted")){

		my $vol_aggr = $vol->child_get_string("containing-aggregate");
		my $vol_reserv = $vol->child_get_string("space-reserve");
		my $vol_name = $vol->child_get_string("name");
		my $vol_size_total = $vol->child_get_int("size-total");
		my $vol_size_used = $vol->child_get_int("size-used");
		my $vol_size_needed = $vol_size_total - $vol_size_used;

		if($vol_reserv eq "none"){

			if(defined($maximum_free_per_vol{$vol_aggr})){
				if($vol_size_needed >= $maximum_free_per_vol{$vol_aggr}{'size_needed'}){
					$maximum_free_per_vol{$vol_aggr}{'size_needed'} = $vol_size_needed;
				}
			} else {
				$maximum_free_per_vol{$vol_aggr}{'size_needed'} = $vol_size_needed;
			}
		}
	}
}

#########

$output = $s->invoke("aggr-space-list-info");

if ($output->results_errno != 0) {
        my $r = $output->results_reason();
        print "Failed: $r\n";
        exit 2;
}

my %aggr_freespace;

my $aggrs = $output->child_get("aggregates");
my @result_aggrs = $aggrs->children_get();

foreach my $aggr (@result_aggrs){

        my $aggr_name = $aggr->child_get_string("aggregate-name");
        my $aggr_free = $aggr->child_get_string("size-free");
	
	$aggr_freespace{$aggr_name} = $aggr_free;
}

my $critical = 0;
my $critical_text;
my $warning = 0;
my $warning_text;

foreach (keys %maximum_free_per_vol){

	my $almost_full = $maximum_free_per_vol{$_}->{'size_needed'}*1.2;

	if($almost_full >= $aggr_freespace{$_}){
		$warning += 1;
		if($warning_text){
			$warning_text .= " and " . $_;
		} else {
			$warning_text = "WARNING: almost not enough space on " . $_;
		}
	}

	if($maximum_free_per_vol{$_}->{'size_needed'} >= $aggr_freespace{$_}){
		$critical += 1;
		if($critical_text){
			$critical_text .= " and " . $_;
		} else {
			$critical_text = "CRITICAL: not enough space on " . $_;
		}
	}
}

if($critical > 0){
        print $critical_text . "\n";
        exit 2;
} elsif($warning >0){
	print $warning_text . "\n";
	exit 1;
} else {
        print "OK: enough space for all volumes\n";
        exit 0;
}
