#! /usr/bin/perl -w

# Copyright (C) 2024 Arne Wichmann
#
# This little thing is distributed under the GNU General Public License,
# version 2. If you need the license, ask your distributor for it.

# Tell Perl what we need to use
use strict;

my(@crit)=(90,90,90,0,1,1,1,0,50,50,50,0,20,20,20,0,50,50,50,0,
  20,20,20,0,17,17,17);
my(@warn)=(80,80,80,0,1,1,1,0,30,30,30,0,10,10,10,0,30,30,30,0,
  10,10,10,0,16,16,16);
my(@name)=("some_cpu10","some_cpu60","some_cpu300","some_cputot",
  "full_cpu10","full_cpu60","full_cpu300","full_cputot",
  "some_io10","some_io60","some_io300","some_iotot",
  "full_io10","full_io60","full_io300","full_iotot",
  "some_mem10","some_mem60","some_mem300","some_memtot",
  "full_mem10","full_mem60","full_mem300","full_memtot",
  "load1","load5","load15");

open(_,"/proc/pressure/cpu")
  || finish("CRITICAL - Could not open /proc/pressure/cpu: $!",2);
$_=<_>;
/^some avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
  or finish("CRITICAL - Cpu line one wrong format",2);
my(@pressure)=($1,$2,$3,$4);
if ($_=<_>) {
  /^full avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
    or finish("CRITICAL - Cpu line two wrong format",2);
  push(@pressure,$1,$2,$3,$4);
} else { push(@pressure,0,0,0,0) }


open(_,"/proc/pressure/io")
  || finish("CRITICAL - Could not open /proc/pressure/io: $!",2);
$_=<_>;
/^some avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
  or finish("CRITICAL - IO line one wrong format",2);
push(@pressure,$1,$2,$3,$4);
$_=<_>;
/^full avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
  or finish("CRITICAL - IO line two wrong format",2);
push(@pressure,$1,$2,$3,$4);

open(_,"/proc/pressure/memory")
  || finish("CRITICAL - Could not open /proc/pressure/memory: $!",2);
$_=<_>;
/^some avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
  or finish("CRITICAL - Memory line one wrong format",2);
push(@pressure,$1,$2,$3,$4);
$_=<_>;
/^full avg10=([0-9.]+) avg60=([0-9.]+) avg300=([0-9.]+) total=([0-9]+)$/
  or finish("CRITICAL - Memory line two wrong format",2);
push(@pressure,$1,$2,$3,$4);

open(_,"/proc/loadavg")
  || finish("CRITICAL - Could not open /proc/loadavg: $!",2);
$_=<_>;
/^([0-9.]+) ([0-9.]+) ([0-9.]+) [0-9]+\/[0-9]+ [0-9]+$/
  or finish("CRITICAL - Loadavg line wrong format",2);
push(@pressure,$1,$2,$3);

close(_) || finish("CRITICAL - Close failed: $!,2");

my($perfdata)="|PRESSURE=".join(";",@pressure);

my($crit)='';

for (0..$#pressure) {
  next unless $crit[$_];
  $pressure[$_]>$crit[$_] and $crit.=", ".$name[$_]."=".$pressure[$_];
}

if ($crit) {
  $crit=~s/^,//;
  finish("CRITICAL - pressure over limit for $crit!$perfdata",2);
}

my($warn)='';

for (0..$#pressure) {
  next unless $warn[$_];
  $pressure[$_]>$warn[$_] and $warn.=", ".$name[$_];
}

if ($warn) {
  $warn=~s/^,//;
  finish("WARNING - pressure over limit for $warn$perfdata",1);
}

finish("OK - ok$perfdata",0);

# Show usage
sub usage() {
  print "usage:\n";
  print " $0\n\n";
  exit -1;
}

sub finish {
    my ($msg,$state) = @_;

    # if ($strange) {
    #   open(D,">>/tmp/debug.drbdnagios");
    #   print D $debugout;
    #   print D "$msg\n";
    #   close(D);
    # }
    print "$msg\n";
    exit $state;
}

