Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
#!/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
This paste will be private.
From the Design Piracy series on my blog: