1 | 85 | simandl | <?php |
2 | | | |
3 | | | // Cacti thold/monitor DS plugin |
4 | | | // Can read state of Thresholds from the THold Cacti plugin |
5 | | | // and also overall host state, in the style of the Monitor plugin (it doesn't depend on that plugin to do this) |
6 | | | // |
7 | | | // It DOES depend on THold though, obviously! |
8 | | | // |
9 | | | // Possible TARGETs: |
10 | | | // |
11 | | | // cactithold:234 |
12 | | | // (internal thold id - returns 0 for OK, and 1 for breach) |
13 | | | // |
14 | | | // cactithold:12:444 |
15 | | | // (the two IDs seen in thold URLs- also returns 0 for OK, and 1 for breach) |
16 | | | // |
17 | | | // cactimonitor:22 |
18 | | | // (cacti hostid - returns host state (0-3) or 4 for failing some thresholds) |
19 | | | // also sets all the same variables as cactihost: would, and a new possible 'state' name of 'tholdbreached' |
20 | | | // |
21 | | | // Original development for this plugin was paid for by |
22 | | | // Stellar Consulting |
23 | | | |
24 | | | class WeatherMapDataSource_cactithold extends WeatherMapDataSource { |
25 | | | |
26 | | | function Init(&$map) |
27 | | | { |
28 | | | global $plugins; |
29 | | | |
30 | | | if($map->context == 'cacti') |
31 | | | { |
32 | | | if( !function_exists('db_fetch_row') ) |
33 | | | { |
34 | | | debug("ReadData CactiTHold: Cacti database library not found. [THOLD001]\n"); |
35 | | | return(FALSE); |
36 | | | } |
37 | | | |
38 | | | $thold_present = false; |
39 | | | |
40 | | | if (function_exists("api_plugin_is_enabled")) { |
41 | | | if (api_plugin_is_enabled('thold')) { |
42 | | | $thold_present = true; |
43 | | | } |
44 | | | } |
45 | | | |
46 | | | if ( isset($plugins) && in_array('thold',$plugins)) { |
47 | | | $thold_present = true; |
48 | | | } |
49 | | | |
50 | | | if ( !$thold_present) { |
51 | | | debug("ReadData CactiTHold: THold plugin not enabled. [THOLD002]\n"); |
52 | | | } |
53 | | | |
54 | | | $sql = "show tables"; |
55 | | | $result = db_fetch_assoc($sql) or die (mysql_error()); |
56 | | | $tables = array(); |
57 | | | |
58 | | | foreach($result as $index => $arr) { |
59 | | | foreach ($arr as $t) { |
60 | | | $tables[] = $t; |
61 | | | } |
62 | | | } |
63 | | | |
64 | | | if( !in_array('thold_data', $tables) ) |
65 | | | { |
66 | | | debug('ReadData CactiTHold: thold_data database table not found. [THOLD003]\n'); |
67 | | | return(FALSE); |
68 | | | } |
69 | | | |
70 | | | return(TRUE); |
71 | | | } |
72 | | | else |
73 | | | { |
74 | | | debug("ReadData CactiTHold: Can only run from Cacti environment. [THOLD004]\n"); |
75 | | | } |
76 | | | |
77 | | | return(FALSE); |
78 | | | } |
79 | | | |
80 | | | function Recognise($targetstring) |
81 | | | { |
82 | | | if(preg_match("/^cacti(thold|monitor):(\d+)$/",$targetstring,$matches)) |
83 | | | { |
84 | | | return TRUE; |
85 | | | } |
86 | | | elseif(preg_match("/^cactithold:(\d+):(\d+)$/",$targetstring,$matches)) |
87 | | | { |
88 | | | return TRUE; |
89 | | | } |
90 | | | else |
91 | | | { |
92 | | | return FALSE; |
93 | | | } |
94 | | | } |
95 | | | |
96 | | | function ReadData($targetstring, &$map, &$item) |
97 | | | { |
98 | | | |
99 | | | $data[IN] = NULL; |
100 | | | $data[OUT] = NULL; |
101 | | | $data_time = 0; |
102 | | | |
103 | | | if(preg_match("/^cactithold:(\d+):(\d+)$/",$targetstring,$matches)) |
104 | | | { |
105 | | | // Returns 0 if threshold is not breached, 1 if it is. |
106 | | | // use target aggregation to build these up into a 'badness' percentage |
107 | | | // takes the same two values that are visible in thold's own URLs (the actual thold ID isn't shown anywhere) |
108 | | | |
109 | | | $rra_id = intval($matches[1]); |
110 | | | $data_id = intval($matches[2]); |
111 | | | |
112 | | | $SQL2 = "select thold_alert from thold_data where rra_id=$rra_id and data_id=$data_id and thold_enabled='on'"; |
113 | | | $result = db_fetch_row($SQL2); |
114 | | | if(isset($result)) |
115 | | | { |
116 | | | if($result['thold_alert'] > 0) { $data[IN]=1; } |
117 | | | else { $data[IN] = 0; } |
118 | | | $data[OUT] = 0; |
119 | | | } |
120 | | | } |
121 | | | elseif(preg_match("/^cacti(thold|monitor):(\d+)$/",$targetstring,$matches)) |
122 | | | { |
123 | | | $type = $matches[1]; |
124 | | | $id = intval($matches[2]); |
125 | | | |
126 | | | if($type=='thold') |
127 | | | { |
128 | | | // VERY simple. Returns 0 if threshold is not breached, 1 if it is. |
129 | | | // use target aggregation to build these up into a 'badness' percentage |
130 | | | $SQL2 = "select thold_alert from thold_data where id=$id and thold_enabled='on'"; |
131 | | | $result = db_fetch_row($SQL2); |
132 | | | if(isset($result)) |
133 | | | { |
134 | | | if($result['thold_alert'] > 0) { $data[IN]=1; } |
135 | | | else { $data[IN] = 0; } |
136 | | | $data[OUT] = 0; |
137 | | | } |
138 | | | } |
139 | | | |
140 | | | if($type=='monitor') |
141 | | | { |
142 | | | debug("CactiTHold ReadData: Getting cacti basic state for host $id\n"); |
143 | | | $SQL = "select * from host where id=$id"; |
144 | | | |
145 | | | // 0=disabled |
146 | | | // 1=down |
147 | | | // 2=recovering |
148 | | | // 3=up |
149 | | | // 4=tholdbreached |
150 | | | |
151 | | | $state = -1; |
152 | | | $statename = ''; |
153 | | | $result = db_fetch_row($SQL); |
154 | | | if(isset($result)) |
155 | | | { |
156 | | | // create a note, which can be used in icon filenames or labels more nicely |
157 | | | if($result['status'] == 1) { $state = 1; $statename = 'down'; } |
158 | | | if($result['status'] == 2) { $state = 2; $statename = 'recovering'; } |
159 | | | if($result['status'] == 3) { $state = 3; $statename = 'up'; } |
160 | | | if($result['disabled']) { $state = 0; $statename = 'disabled'; } |
161 | | | |
162 | | | $data[IN] = $state; |
163 | | | $data[OUT] = 0; |
164 | | | $item->add_note("state",$statename); |
165 | | | $item->add_note("cacti_description",$result['description']); |
166 | | | |
167 | | | $item->add_note("cacti_hostname",$result['hostname']); |
168 | | | $item->add_note("cacti_curtime",$result['cur_time']); |
169 | | | $item->add_note("cacti_avgtime",$result['avg_time']); |
170 | | | $item->add_note("cacti_mintime",$result['min_time']); |
171 | | | $item->add_note("cacti_maxtime",$result['max_time']); |
172 | | | $item->add_note("cacti_availability",$result['availability']); |
173 | | | |
174 | | | $item->add_note("cacti_faildate",$result['status_fail_date']); |
175 | | | $item->add_note("cacti_recdate",$result['status_rec_date']); |
176 | | | } |
177 | | | debug("CactiTHold ReadData: Basic state for host $id is $state/$statename\n"); |
178 | | | |
179 | | | debug("CactiTHold ReadData: Checking threshold states for host $id\n"); |
180 | | | $numthresh = 0; |
181 | | | $numfailing = 0; |
182 | | | $SQL2 = "select rra_id, data_id, thold_alert from thold_data,data_local where thold_data.rra_id=data_local.id and data_local.host_id=$id and thold_enabled='on'"; |
183 | | | # $result = db_fetch_row($SQL2); |
184 | | | $queryrows = db_fetch_assoc($SQL2); |
185 | | | if( is_array($queryrows) ) |
186 | | | { |
187 | | | foreach ($queryrows as $th) { |
188 | | | $desc = $th['rra_id']."/".$th['data_id']; |
189 | | | $v = $th['thold_alert']; |
190 | | | $numthresh++; |
191 | | | if(intval($th['thold_alert']) > 0) |
192 | | | { |
193 | | | debug("CactiTHold ReadData: Seen threshold $desc failing ($v)for host $id\n"); |
194 | | | $numfailing++; |
195 | | | } |
196 | | | else |
197 | | | { |
198 | | | debug("CactiTHold ReadData: Seen threshold $desc OK ($v) for host $id\n"); |
199 | | | } |
200 | | | } |
201 | | | } |
202 | | | else |
203 | | | { |
204 | | | debug("CactiTHold ReadData: Failed to get thold info for host $id\n"); |
205 | | | } |
206 | | | |
207 | | | debug("CactiTHold ReadData: Checked $numthresh and found $numfailing failing\n"); |
208 | | | |
209 | | | if( ($numfailing > 0) && ($numthresh > 0) && ($state==3) ) |
210 | | | { |
211 | | | $state = 4; |
212 | | | $statename = "tholdbreached"; |
213 | | | $item->add_note("state",$statename); |
214 | | | $item->add_note("thold_failcount",$numfailing); |
215 | | | $item->add_note("thold_failpercent",($numfailing/$numthresh)*100); |
216 | | | $data[IN] = $state; |
217 | | | $data[OUT] = $numfailing; |
218 | | | debug("CactiTHold ReadData: State is $state/$statename\n"); |
219 | | | } |
220 | | | elseif( $numthresh>0 ) |
221 | | | { |
222 | | | $item->add_note("thold_failcount",0); |
223 | | | $item->add_note("thold_failpercent",0); |
224 | | | debug("CactiTHold ReadData: Leaving state as $state\n"); |
225 | | | } |
226 | | | } |
227 | | | } |
228 | | | |
229 | | | debug ("CactiTHold ReadData: Returning (".($data[IN]===NULL?'NULL':$data[IN]).",".($data[OUT]===NULL?'NULL':$data[OUT]).",$data_time)\n"); |
230 | | | |
231 | | | return( array($data[IN], $data[OUT], $data_time) ); |
232 | | | } |
233 | | | } |
234 | | | |
235 | | | |
236 | | | // vim:ts=4:sw=4: |
237 | | | ?> |