#!/usr/bin/bash -e

export PLUGIN_ARGS="$@"

gawk '
  BEGIN {
    kb = 1024
    ret = 0
  }
  function show(name, val) {
    gsub(":", "", name)
    reply = reply sprintf(" %s=%dB;%d;%d;0;%d",
                    name, val*kb, total*0.97, total*0.999, total)
  }
  function show_counter(name, val) {
    gsub(":", "", name)
    reply = reply sprintf(" %s=%dc", name, val*kb)
  }
  /^MemTotal:/ {
    total = $2
    total_stat = sprintf("%1.1f GB mem total", $2/kb/kb)
    reply = sprintf("Total=%dB", total*kb)
  }
  /^MemFree:/ {
    show("Used", total-$2)
  }
  /^(Buffers|Cached|Shmem):/ {
    show($1, $2)
  }
  /^SwapTotal:/ {
    swap = $2
  }
  /^SwapFree:/ {
    show("Swap", swap-$2)
    if (swap==0) {
      swap_stat = "NO SWAP!"
    } else {
      swap_stat = sprintf("%d%% swap in use", 100-$2/swap*100)
    }
    split(ENVIRON["PLUGIN_ARGS"], arg, " ?-")
    for(i in arg) {
      if (arg[i]) {
        split(arg[i], kv, " ")
        key = kv[1]
        value = kv[2]
        last = substr(value, length(value))
        if (last=="%") {
          free = $2
          req = swap*substr(value, 1, length(value)-1)/100
        } else {
          free = $2*1024
          req = value
        }
        if (free<req) {
          if (ret==0 && key=="w") ret = 1
          if (key=="c") ret = 2
        }
      }
    }
  }
  /^pswpin/ {
    show_counter("PageIn", $2*4096)
  }
  /^pswpout/ {
    show_counter("PageOut", $2*4096)
  }
  END {
    reply = sprintf("%s, %s|%s", total_stat, swap_stat, reply)
    if (ret==2) {
      print "swap CRITICAL -", reply
    } else if (ret==1) {
      print "swap WARNING -", reply
    } else {
      print "mem OK -", reply
    }
    exit ret
  }
' /proc/meminfo /proc/vmstat
