weathermap |
Subversion Repositories: |
Line No. | Rev | Author | Line |
---|---|---|---|
1 | 85 | simandl | <?php |
2 | |
||
3 | # |
||
4 | # Change the uncommented line to point to your Cacti installation |
||
5 | # |
||
6 | $cacti_base = dirname(__FILE__)."/../../"; |
||
7 | # $cacti_base = "C:/xampp/htdocs/cacti/"; |
||
8 | # $cacti_base = "/var/www/html/cacti/"; |
||
9 | # $cacti_base = "/Applications/XAMPP/htdocs/cacti/"; |
||
10 | |
||
11 | // check if the goalposts have moved |
||
12 | if( is_dir($cacti_base) && file_exists($cacti_base."/include/global.php") ) |
||
13 | { |
||
14 | // include the cacti-config, so we know about the database |
||
15 | require_once($cacti_base."/include/global.php"); |
||
16 | } |
||
17 | elseif( is_dir($cacti_base) && file_exists($cacti_base."/include/config.php") ) |
||
18 | { |
||
19 | // include the cacti-config, so we know about the database |
||
20 | require_once($cacti_base."/include/config.php"); |
||
21 | } |
||
22 | else |
||
23 | { |
||
24 | die("Couldn't find a usable Cacti config - check the first few lines of ".__FILE__."\n"); |
||
25 | } |
||
26 | |
||
27 | require_once 'Weathermap.class.php'; |
||
28 | require_once 'Console/Getopt.php'; |
||
29 | |
||
30 | $reverse = 0; |
||
31 | $inputfile = ""; |
||
32 | $outputfile = ""; |
||
33 | $converted = 0; |
||
34 | $candidates = 0; |
||
35 | $totaltargets = 0; |
||
36 | |
||
37 | $cg=new Console_Getopt(); |
||
38 | $short_opts=''; |
||
39 | $long_opts=array |
||
40 | ( |
||
41 | "help", |
||
42 | "input=", |
||
43 | "output=", |
||
44 | "debug", |
||
45 | "reverse", |
||
46 | ); |
||
47 | |
||
48 | $args=$cg->readPHPArgv(); |
||
49 | $ret=$cg->getopt($args, $short_opts, $long_opts); |
||
50 | |
||
51 | if (PEAR::isError($ret)) { die ("Error in command line: " . $ret->getMessage() . "\n (try --help)\n"); } |
||
52 | |
||
53 | $gopts=$ret[0]; |
||
54 | |
||
55 | if (sizeof($gopts) > 0) |
||
56 | { |
||
57 | foreach ($gopts as $o) |
||
58 | { |
||
59 | switch ($o[0]) |
||
60 | { |
||
61 | case '--debug': |
||
62 | $weathermap_debugging=TRUE; |
||
63 | break; |
||
64 | case '--input': |
||
65 | $inputfile=$o[1]; |
||
66 | break; |
||
67 | case '--output': |
||
68 | $outputfile=$o[1]; |
||
69 | break; |
||
70 | case '--reverse': |
||
71 | $reverse = 1; |
||
72 | break; |
||
73 | case 'help': |
||
74 | default: |
||
75 | print "Weathermap DSStats converter. Converts rrd targets to DSStats\n"; |
||
76 | print "-------------------------------------------------------------\n"; |
||
77 | print "Usage: php convert-to-dstats.php [options]\n\n"; |
||
78 | print " --input {filename} - File to read from\n"; |
||
79 | print " --output {filename} - File to write to\n"; |
||
80 | # print " --reverse - Convert from DSStats to RRDtool instead\n"; |
||
81 | print " --debug - Enable debugging output\n"; |
||
82 | print " --help - Show this message\n"; |
||
83 | exit(); |
||
84 | } |
||
85 | } |
||
86 | } |
||
87 | |
||
88 | if($inputfile == "" || $outputfile == "") |
||
89 | { |
||
90 | print "You must specify an input and output file. See --help.\n"; |
||
91 | exit(); |
||
92 | } |
||
93 | |
||
94 | $map = new WeatherMap; |
||
95 | |
||
96 | $map->context = 'cacti'; |
||
97 | $map->rrdtool = read_config_option("path_rrdtool"); |
||
98 | |
||
99 | print "Reading config from $inputfile\n"; |
||
100 | |
||
101 | $map->ReadConfig($inputfile); |
||
102 | |
||
103 | $map->DatasourceInit(); |
||
104 | $map->ProcessTargets(); |
||
105 | |
||
106 | $allitems = array(&$map->links, &$map->nodes); |
||
107 | reset($allitems); |
||
108 | |
||
109 | while( list($kk,) = each($allitems)) |
||
110 | { |
||
111 | unset($objects); |
||
112 | $objects = &$allitems[$kk]; |
||
113 | |
||
114 | reset($objects); |
||
115 | while (list($k,) = each($objects)) |
||
116 | { |
||
117 | unset($myobj); |
||
118 | $myobj = &$objects[$k]; |
||
119 | |
||
120 | $type = $myobj->my_type(); |
||
121 | |
||
122 | $name=$myobj->name; |
||
123 | debug ("ReadData for $type $name: \n"); |
||
124 | |
||
125 | if( ($type=='LINK' && isset($myobj->a)) || ($type=='NODE' && !is_null($myobj->x) ) ) |
||
126 | { |
||
127 | if (count($myobj->targets)>0) |
||
128 | { |
||
129 | $totaltargets++; |
||
130 | $tindex = 0; |
||
131 | foreach ($myobj->targets as $target) |
||
132 | { |
||
133 | debug ("ReadData: New Target: $target[4]\n"); |
||
134 | |
||
135 | $targetstring = $target[0]; |
||
136 | $multiply = $target[1]; |
||
137 | |
||
138 | if($reverse == 0 && $target[5] == "WeatherMapDataSource_rrd") |
||
139 | { |
||
140 | $candidates++; |
||
141 | # list($in,$out,$datatime) = $map->plugins['data'][ $target[5] ]->ReadData($targetstring, $map, $myobj); |
||
142 | debug("ConvertDS: $targetstring is a candidate for conversion."); |
||
143 | $rrdfile = $targetstring; |
||
144 | $multiplier = 8; |
||
145 | $dsnames[IN] = "traffic_in"; |
||
146 | $dsnames[OUT] = "traffic_out"; |
||
147 | |
||
148 | if(preg_match("/^(.*\.rrd):([\-a-zA-Z0-9_]+):([\-a-zA-Z0-9_]+)$/",$targetstring,$matches)) |
||
149 | { |
||
150 | $rrdfile = $matches[1]; |
||
151 | |
||
152 | $dsnames[IN] = $matches[2]; |
||
153 | $dsnames[OUT] = $matches[3]; |
||
154 | |
||
155 | debug("ConvertDS: Special DS names seen (".$dsnames[IN]." and ".$dsnames[OUT].").\n"); |
||
156 | } |
||
157 | if(preg_match("/^rrd:(.*)/",$rrdfile,$matches)) |
||
158 | { |
||
159 | $rrdfile = $matches[1]; |
||
160 | } |
||
161 | if(preg_match("/^gauge:(.*)/",$rrdfile,$matches)) |
||
162 | { |
||
163 | $rrdfile = $matches[1]; |
||
164 | $multiplier = 1; |
||
165 | } |
||
166 | if(preg_match("/^scale:([+-]?\d*\.?\d*):(.*)/",$rrdfile,$matches)) |
||
167 | { |
||
168 | $rrdfile = $matches[2]; |
||
169 | $multiplier = $matches[1]; |
||
170 | } |
||
171 | |
||
172 | $path_rra = $config["rra_path"]; |
||
173 | $db_rrdname = $rrdfile; |
||
174 | $db_rrdname = str_replace($path_rra,"<path_rra>",$db_rrdname); |
||
175 | # special case for relative paths |
||
176 | $db_rrdname = str_replace("../../rra","<path_rra>",$db_rrdname); |
||
177 | |
||
178 | if($db_rrdname != $rrdfile) |
||
179 | { |
||
180 | debug("ConvertDS: Looking for $db_rrdname in the database."); |
||
181 | |
||
182 | $SQLcheck = "select data_template_data.local_data_id from data_template_data,data_template_rrd where data_template_data.local_data_id=data_template_rrd.local_data_id and data_template_data.data_source_path='".mysql_real_escape_string($db_rrdname)."'"; |
||
183 | debug("ConvertDS: ".$SQLcheck); |
||
184 | $results = db_fetch_assoc($SQLcheck); |
||
185 | |
||
186 | if( (sizeof($results) > 0) && (isset($results[0]['local_data_id']) ) ) |
||
187 | { |
||
188 | $new_target = sprintf("dsstats:%d:%s:%s", $results[0]['local_data_id'], $dsnames[IN], $dsnames[OUT]); |
||
189 | $m = $multiply * $multiplier; |
||
190 | if( $m != 1) |
||
191 | { |
||
192 | if($m == -1) $new_target = "-".$new_target; |
||
193 | if($m == intval($m)) |
||
194 | { |
||
195 | $new_target = sprintf("%d*%s",$m,$new_target); |
||
196 | } |
||
197 | else |
||
198 | { |
||
199 | $new_target = sprintf("%f*%s",$m,$new_target); |
||
200 | } |
||
201 | |
||
202 | } |
||
203 | |
||
204 | debug("ConvertDS: Converting to $new_target"); |
||
205 | $converted++; |
||
206 | |
||
207 | if($type == 'NODE') |
||
208 | { |
||
209 | $map->nodes[$name]->targets[$tindex][4] = $new_target; |
||
210 | } |
||
211 | if($type == 'LINK') |
||
212 | { |
||
213 | $map->links[$name]->targets[$tindex][4] = $new_target; |
||
214 | } |
||
215 | |
||
216 | } |
||
217 | else |
||
218 | { |
||
219 | warn("ConvertDS: Failed to find a match for $db_rrdname - can't convert to DSStats."); |
||
220 | } |
||
221 | } |
||
222 | else |
||
223 | { |
||
224 | warn("ConvertDS: $rrdfile doesn't match with $path_rra - not bothering to look in the database."); |
||
225 | } |
||
226 | } |
||
227 | |
||
228 | // XXX - not implemented yet! |
||
229 | if($reverse == 1 && $target[5] == "WeatherMapDataSource_dsstats" && 1==0) |
||
230 | { |
||
231 | $candidates++; |
||
232 | # list($in,$out,$datatime) = $map->plugins['data'][ $target[5] ]->ReadData($targetstring, $map, $myobj); |
||
233 | debug("ConvertDS: $targetstring is a candidate for conversion."); |
||
234 | |
||
235 | $multiplier = 1; |
||
236 | $dsnames[IN] = "traffic_in"; |
||
237 | $dsnames[OUT] = "traffic_out"; |
||
238 | |
||
239 | $path_rra = $config["rra_path"]; |
||
240 | $db_rrdname = $rrdfile; |
||
241 | $db_rrdname = str_replace($path_rra,"<path_rra>",$db_rrdname); |
||
242 | # special case for relative paths |
||
243 | $db_rrdname = str_replace("../../rra","<path_rra>",$db_rrdname); |
||
244 | |
||
245 | |
||
246 | debug("ConvertDS: Looking for $db_rrdname in the database."); |
||
247 | |
||
248 | $SQLcheck = "select data_template_data.local_data_id from data_template_data,data_template_rrd where data_template_data.local_data_id=data_template_rrd.local_data_id and data_template_data.data_source_path='".mysql_real_escape_string($db_rrdname)."'"; |
||
249 | debug("ConvertDS: ".$SQLcheck); |
||
250 | $results = db_fetch_assoc($SQLcheck); |
||
251 | |
||
252 | if( (sizeof($results) > 0) && (isset($results[0]['local_data_id']) ) ) |
||
253 | { |
||
254 | $new_target = sprintf("dsstats:%d:%s:%s", $results[0]['local_data_id'], $dsnames[IN], $dsnames[OUT]); |
||
255 | $m = $multiply * $multiplier; |
||
256 | if( $m != 1) |
||
257 | { |
||
258 | if($m == -1) $new_target = "-".$new_target; |
||
259 | if($m == intval($m)) |
||
260 | { |
||
261 | $new_target = sprintf("%d*%s",$m,$new_target); |
||
262 | } |
||
263 | else |
||
264 | { |
||
265 | $new_target = sprintf("%f*%s",$m,$new_target); |
||
266 | } |
||
267 | |
||
268 | } |
||
269 | |
||
270 | debug("ConvertDS: Converting to $new_target"); |
||
271 | $converted++; |
||
272 | |
||
273 | if($type == 'NODE') |
||
274 | { |
||
275 | $map->nodes[$name]->targets[$tindex][4] = $new_target; |
||
276 | } |
||
277 | if($type == 'LINK') |
||
278 | { |
||
279 | $map->links[$name]->targets[$tindex][4] = $new_target; |
||
280 | } |
||
281 | |
||
282 | } |
||
283 | else |
||
284 | { |
||
285 | warn("ConvertDS: Failed to find a match for $db_rrdname - can't convert back to rrdfile."); |
||
286 | } |
||
287 | |
||
288 | } |
||
289 | |
||
290 | $tindex++; |
||
291 | } |
||
292 | |
||
293 | debug ("ReadData complete for $type $name\n"); |
||
294 | } |
||
295 | else |
||
296 | { |
||
297 | debug("ReadData: No targets for $type $name\n"); |
||
298 | } |
||
299 | } |
||
300 | else |
||
301 | { |
||
302 | debug("ReadData: Skipping $type $name that looks like a template\n."); |
||
303 | } |
||
304 | |
||
305 | unset($myobj); |
||
306 | } |
||
307 | } |
||
308 | |
||
309 | $map->WriteConfig($outputfile); |
||
310 | |
||
311 | print "Wrote new config to $outputfile\n"; |
||
312 | |
||
313 | print "$totaltargets targets, $candidates rrd-based targets, $converted were actually converted.\n"; |
||
314 | |
||
315 | // vim:ts=4:sw=4: |
||
316 | ?> |