#!/usr/bin/env ruby

require 'erb'

# Nagios CSV Fields
HOST_NAME = 0
SERVICE_DESCRIPTION = 1
TIME_OK_SCHEDULED = 2
PERCENT_TIME_OK_SCHEDULED = 3
PERCENT_KNOWN_TIME_OK_SCHEDULED = 4
TIME_OK_UNSCHEDULED = 5
PERCENT_TIME_OK_UNSCHEDULED = 6
PERCENT_KNOWN_TIME_OK_UNSCHEDULED = 7
TOTAL_TIME_OK = 8
PERCENT_TOTAL_TIME_OK = 9
PERCENT_KNOWN_TIME_OK = 10
TIME_WARNING_SCHEDULED = 11
PERCENT_TIME_WARNING_SCHEDULED = 12
PERCENT_KNOWN_TIME_WARNING_SCHEDULED = 13
TIME_WARNING_UNSCHEDULED = 14
PERCENT_TIME_WARNING_UNSCHEDULED = 15
PERCENT_KNOWN_TIME_WARNING_UNSCHEDULED = 16
TOTAL_TIME_WARNING = 17
PERCENT_TOTAL_TIME_WARNING = 18
PERCENT_KNOWN_TIME_WARNING = 19
TIME_UNKNOWN_SCHEDULED = 20
PERCENT_TIME_UNKNOWN_SCHEDULED = 21
PERCENT_KNOWN_TIME_UNKNOWN_SCHEDULED = 22
TIME_UNKNOWN_UNSCHEDULED = 23
PERCENT_TIME_UNKNOWN_UNSCHEDULED = 24
PERCENT_KNOWN_TIME_UNKNOWN_UNSCHEDULED = 25
TOTAL_TIME_UNKNOWN = 26
PERCENT_TOTAL_TIME_UNKNOWN = 27
PERCENT_KNOWN_TIME_UNKNOWN = 28
TIME_CRITICAL_SCHEDULED = 29
PERCENT_TIME_CRITICAL_SCHEDULED = 30
PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED = 31
TIME_CRITICAL_UNSCHEDULED = 32
PERCENT_TIME_CRITICAL_UNSCHEDULED = 33
PERCENT_KNOWN_TIME_CRITICAL_UNSCHEDULED = 34
TOTAL_TIME_CRITICAL = 35
PERCENT_TOTAL_TIME_CRITICAL = 36
PERCENT_KNOWN_TIME_CRITICAL = 37
TIME_UNDETERMINED_NOT_RUNNING = 38
PERCENT_TIME_UNDETERMINED_NOT_RUNNING = 39
TIME_UNDETERMINED_NO_DATA = 40
PERCENT_TIME_UNDETERMINED_NO_DATA = 41
TOTAL_TIME_UNDETERMINED = 42
PERCENT_TOTAL_TIME_UNDETERMINED = 43

# Here is the template for the final html output
template = %{
<style type="text/css">
TABLE.data { font-family: arial,serif; font-size: 10pt; background-color: white; padding: 2; }
TH.data { font-family: arial,serif; font-size: 10pt; background-color: white; text-align: left; background-color: #999797; color: #DCE5C1; }
.serviceOK { font-family: arial,serif; font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; }
.serviceCRITICAL { font-family: arial,serif; font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; }
</style>

<TABLE BORDER=0 CLASS='data'>
<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>Service</TH><TH CLASS='data'>% Uptime</TH>
<% newarray.each do |line| -%>
<tr><td CLASS='data'><%= line[0] %></td><td CLASS='serviceOK'><%= line[1] %></td><td CLASS='serviceCRITICAL'><%= line[2] %></td></tr>
<% end -%>
</TABLE>
}

# Some bash to get things started. After getting the files we remove passive
# checks (save nexpose since its passive is more accurate than its active).
# We also remove some hosts that are just noise. Everything else is self-
# explanatory.
`rm -rf *.csv \
&& wget --http-user=BLOCKED --http-password=BLOCKEDOUT --no-check-certificate -O nagios1.csv 'https://10.1.1.1/nagios/cgi-bin/avail.cgi?host=all&service=all&timeperiod=last7days&rpttimeperiod=&assumeinitialstates=yes&assumestateretention=yes&assumestatesduringnotrunning=yes&includesoftstates=no&initialassumedhoststate=0&initialassumedservicestate=1&backtrack=4&csvoutput=' \
&& wget --http-user=BLOCKED --http-password=BLOCKEDOUT --no-check-certificate -O nagios2.csv 'https://10.1.1.2/nagios/cgi-bin/avail.cgi?host=all&service=all&timeperiod=last7days&rpttimeperiod=&assumeinitialstates=yes&assumestateretention=yes&assumestatesduringnotrunning=yes&includesoftstates=no&initialassumedhoststate=0&initialassumedservicestate=1&backtrack=4&csvoutput=' \
&& sed -i '1d' nagios1.csv \
&& sed -i '1d' nagios2.csv \
&& cat nagios2.csv >> nagios1.csv \
&& sort -u nagios1.csv >> sorted.csv \
&& sed -i -e '/^.*Engine Check.*$/d' -e 's/Engine (Passive)/Engine/g' sorted.csv \
&& grep -v '^".*", ".*(Passive)", .*' sorted.csv >> ready.csv \
&& sed -i -e '/^"hostedengine-01",.*$/d' \
-e '/^"mail-001",.*$/d' \
-e '/^"www-02",.*$/d' \
-e '/^".*", "CPU Load",.*$/d' \
-e '/^".*", "Drive Space -.*",.*$/d' \
-e '/^".*", "Memory Usage",.*$/d' \
-e '/^".*", "NSClient++ Version",.*$/d' \
-e '/^".*", "Uptime",.*$/d' \
ready.csv`

# Set up template
html = ERB.new(template)

# Now for the rooby. We'll be reading the file in its entirety into csvarray
# then printing selectively into newarray.
csvarray = []
newarray = []

csvfile = File.open("./ready.csv")
csvfile.each_line do |line|
csvarray.push line
end
csvfile.close

# The following block says "if the service is ssh and the previous or next
# line is for the same box, don't print this line". I do this because SSH
# should only ever be printed if it is the only service monitored on the
# box. Next, we take the lesser or two duplicate lines, meaning we
# want the crappier statistic so as to not look like we are making ourselves
# look good.
csvarray.each_with_index do |line,index|
if ((index) < (csvarray.size - 1))
if line.split(',')[1].strip == "\"SSH\"" and ( (csvarray[index - 1].split(',')[0] == line.split(',')[0]) or (csvarray[index + 1].split(',')[0] == line.split(',')[0]) )
next
end

if (line.split(',')[0].strip == csvarray[index + 1].split(',')[0].strip) and (line.split(',')[1].strip == csvarray[index + 1].split(',')[1].strip)
if (line.split(',')[PERCENT_KNOWN_TIME_OK].to_f + line.split(',')[PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED].to_f + line.split(',')[PERCENT_KNOWN_TIME_WARNING_SCHEDULED].to_f) > (csvarray[index + 1].split(',')[PERCENT_KNOWN_TIME_OK].to_f + csvarray[index + 1].split(',')[PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED].to_f + csvarray[index + 1].split(',')[PERCENT_KNOWN_TIME_WARNING_SCHEDULED].to_f)
next
end
end

if (line.split(',')[0].strip == csvarray[index - 1].split(',')[0].strip) and (line.split(',')[1].strip == csvarray[index - 1].split(',')[1].strip)
if (line.split(',')[PERCENT_KNOWN_TIME_OK].to_f + line.split(',')[PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED].to_f + line.split(',')[PERCENT_KNOWN_TIME_WARNING_SCHEDULED].to_f) > (csvarray[index - 1].split(',')[PERCENT_KNOWN_TIME_OK].to_f + csvarray[index - 1].split(',')[PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED].to_f + csvarray[index - 1].split(',')[PERCENT_KNOWN_TIME_WARNING_SCHEDULED].to_f)
next
end
end
end

if line.split(',')[0].strip.include?("nagios") and line.split(',')[1].strip != "\"HTTPS\""
next
end

if line.split(',')[0].strip.include?("www") and line.split(',')[1].strip != "\"HTTP\""
next
end

newarray.push(line.split(',')[0] + "," + line.split(',')[1].strip + "," + String( line.split(',')[PERCENT_KNOWN_TIME_OK].to_f + line.split(',')[PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED].to_f + line.split(',')[PERCENT_KNOWN_TIME_WARNING_SCHEDULED].to_f ) )
end

newarray.uniq!
html.result(binding)
newfile = File.open("./availomate.csv", "w+")
newfile.puts newarray
newfile.close