#!/usr/bin/ruby

require 'optparse'

options = {}

### DEFAULT WERTE
options[:crit]="90%"
options[:warn]="75%"

OptionParser.new do |opts|
  opts.banner = "Usage: check_openfiles [options]"

  opts.on("-c v", "--critical v", "Wert als Prozent oder Wert ab dem der Check Kritisch werden soll. Default ist #{options[:crit]}.") do |v|
    options[:crit]=v
  end

  opts.on("-w v", "--warning v", "Wert als Prozent oder Wert ab dem der Check Warnung werden soll. Default ist #{options[:warn]}.") do |v|
    options[:warn]=v
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end

end.parse!

stats=`cat /proc/sys/fs/file-nr`
temp=stats.split(' ')
openfiles=temp[0].to_i
totalfiles=temp[2].to_i

#### Ist Wert ein Prozent oder totaler Wert?
if options[:warn] =~ /%$/
  w=options[:warn].to_i
  warn_i=totalfiles*w/100
else
  warn_i=options[:warn].to_i
end

#### Ist Wert ein Prozent oder totaler Wert?
if options[:crit] =~ /%$/
  c=options[:crit].to_i
  crit_i=totalfiles*c/100
else
  crit_i=options[:crit].to_i
end

if openfiles >= warn_i and openfiles <= crit_i 
  puts "WARNING: too many openfiles|openfiles=#{openfiles};#{warn_i};#{crit_i};0;#{totalfiles}"
  exit 1
end

if openfiles >= crit_i
  puts "CRITICAL: too many openfiles|openfiles=#{openfiles};#{warn_i};#{crit_i};0;#{totalfiles}"
  exit 2
end

puts "OK|openfiles=#{openfiles};#{warn_i};#{crit_i};0;#{totalfiles}"
exit 0
