Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/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