function weathermap_run_maps($mydir) { global $config; global $weathermap_debugging, $WEATHERMAP_VERSION; global $weathermap_map; global $weathermap_warncount; global $weathermap_poller_start_time; include_once($mydir.DIRECTORY_SEPARATOR."lib".DIRECTORY_SEPARATOR."HTML_ImageMap.class.php"); include_once($mydir.DIRECTORY_SEPARATOR."lib".DIRECTORY_SEPARATOR."Weathermap.class.php"); $total_warnings = 0; $warning_notes = ""; $start_time = time(); if($weathermap_poller_start_time==0) $weathermap_poller_start_time = $start_time; $outdir = $mydir.DIRECTORY_SEPARATOR.'output'; $confdir = $mydir.DIRECTORY_SEPARATOR.'configs'; $mapcount = 0; // take our debugging cue from the poller - turn on Poller debugging to get weathermap debugging if (read_config_option("log_verbosity") >= POLLER_VERBOSITY_DEBUG) { $weathermap_debugging = TRUE; $mode_message = "DEBUG mode is on"; } else { $mode_message = "Normal logging mode. Turn on DEBUG in Cacti for more information"; } $quietlogging = read_config_option("weathermap_quiet_logging"); // moved this outside the module_checks, so there should always be something in the logs! if($quietlogging==0) cacti_log("Weathermap $WEATHERMAP_VERSION starting - $mode_message\n",true,"WEATHERMAP"); if(wm_module_checks()) { weathermap_memory_check("MEM Initial"); // move to the weathermap folder so all those relatives paths don't *have* to be absolute $orig_cwd = getcwd(); chdir($mydir); db_execute("replace into settings values('weathermap_last_start_time','".mysql_real_escape_string(time())."')"); // first, see if the output directory even exists if(is_dir($outdir)) { // next, make sure that we stand a chance of writing files //// $testfile = realpath($outdir."weathermap.permissions.test"); $testfile = $outdir.DIRECTORY_SEPARATOR."weathermap.permissions.test"; $testfd = fopen($testfile, 'w'); if($testfd) { fclose($testfd); unlink($testfile); $queryrows = db_fetch_assoc("select m.*, g.name as groupname from weathermap_maps m,weathermap_groups g where m.group_id=g.id and active='on' order by sortorder,id"); if( is_array($queryrows) ) { wm_debug("Iterating all maps."); $imageformat = strtolower(read_config_option("weathermap_output_format")); $rrdtool_path = read_config_option("path_rrdtool"); foreach ($queryrows as $map) { // reset the warning counter $weathermap_warncount=0; // this is what will prefix log entries for this map $weathermap_map = "[Map ".$map['id']."] ".$map['configfile']; wm_debug("FIRST TOUCH\n"); if(weathermap_check_cron($weathermap_poller_start_time,$map['schedule'])) { $mapfile = $confdir.DIRECTORY_SEPARATOR.$map['configfile']; $htmlfile = $outdir.DIRECTORY_SEPARATOR.$map['filehash'].".html"; $imagefile = $outdir.DIRECTORY_SEPARATOR.$map['filehash'].".".$imageformat; $thumbimagefile = $outdir.DIRECTORY_SEPARATOR.$map['filehash'].".thumb.".$imageformat; if(file_exists($mapfile)) { if($quietlogging==0) wm_warn("Map: $mapfile -> $htmlfile & $imagefile\n",TRUE); db_execute("replace into settings values('weathermap_last_started_file','".mysql_real_escape_string($weathermap_map)."')"); $map_start = time(); weathermap_memory_check("MEM starting $mapcount"); $wmap = new Weathermap; $wmap->context = "cacti"; // we can grab the rrdtool path from Cacti's config, in this case $wmap->rrdtool = $rrdtool_path; $wmap->ReadConfig($mapfile); $wmap->add_hint("mapgroup",$map['groupname']); $wmap->add_hint("mapgroupextra",($map['group_id'] ==1 ? "" : $map['groupname'] )); # in the order of precedence - global extras, group extras, and finally map extras $queries = array(); $queries[] = "select * from weathermap_settings where mapid=0 and groupid=0"; $queries[] = "select * from weathermap_settings where mapid=0 and groupid=".intval($map['group_id']); $queries[] = "select * from weathermap_settings where mapid=".intval($map['id']); foreach ($queries as $sql) { $settingrows = db_fetch_assoc($sql); if( is_array($settingrows) && count($settingrows) > 0 ) { foreach ($settingrows as $setting) { if($setting['mapid']==0 && $setting['groupid']==0) { wm_debug("Setting additional (all maps) option: ".$setting['optname']." to '".$setting['optvalue']."'\n"); $wmap->add_hint($setting['optname'],$setting['optvalue']); } elseif($setting['groupid']!=0) { wm_debug("Setting additional (all maps in group) option: ".$setting['optname']." to '".$setting['optvalue']."'\n"); $wmap->add_hint($setting['optname'],$setting['optvalue']); } else { wm_debug("Setting additional map-global option: ".$setting['optname']." to '".$setting['optvalue']."'\n"); $wmap->add_hint($setting['optname'],$setting['optvalue']); } } } } weathermap_memory_check("MEM postread $mapcount"); $wmap->ReadData(); weathermap_memory_check("MEM postdata $mapcount"); // why did I change this before? It's useful... // $wmap->imageuri = $config['url_path'].'/plugins/weathermap/output/weathermap_'.$map['id'].".".$imageformat; $wmap->imageuri = 'weathermap-cacti-plugin.php?action=viewimage&id='.$map['filehash']."&time=".time(); if($quietlogging==0) wm_warn("About to write image file. If this is the last message in your log, increase memory_limit in php.ini [WMPOLL01]\n",TRUE); weathermap_memory_check("MEM pre-render $mapcount"); $wmap->DrawMap($imagefile,$thumbimagefile,read_config_option("weathermap_thumbsize")); if($quietlogging==0) wm_warn("Wrote map to $imagefile and $thumbimagefile\n",TRUE); $fd = @fopen($htmlfile, 'w'); if($fd != FALSE) { fwrite($fd, $wmap->MakeHTML('weathermap_'.$map['filehash'].'_imap')); fclose($fd); wm_debug("Wrote HTML to $htmlfile"); } else { if(file_exists($htmlfile)) { wm_warn("Failed to overwrite $htmlfile - permissions of existing file are wrong? [WMPOLL02]\n"); } else { wm_warn("Failed to create $htmlfile - permissions of output directory are wrong? [WMPOLL03]\n"); } } $processed_title = $wmap->ProcessString($wmap->title,$wmap); db_execute("update weathermap_maps set titlecache='".mysql_real_escape_string($processed_title)."' where id=".intval($map['id'])); if(intval($wmap->thumb_width) > 0) { db_execute("update weathermap_maps set thumb_width=".intval($wmap->thumb_width).", thumb_height=".intval($wmap->thumb_height)." where id=".intval($map['id'])); } $wmap->CleanUp(); unset($wmap); $map_duration = time() - $map_start; wm_debug("TIME: $mapfile took $map_duration seconds.\n"); weathermap_memory_check("MEM after $mapcount"); $mapcount++; db_execute("replace into settings values('weathermap_last_finished_file','".mysql_real_escape_string($weathermap_map)."')"); } else { wm_warn("Mapfile $mapfile is not readable or doesn't exist [WMPOLL04]\n"); } db_execute("update weathermap_maps set warncount=".intval($weathermap_warncount)." where id=".intval($map['id'])); $total_warnings += $weathermap_warncount; $weathermap_warncount = 0; $weathermap_map=""; } else { wm_debug("Skipping ".$map['id']." (".$map['configfile'].") due to schedule.\n"); } } wm_debug("Iterated all $mapcount maps.\n"); } else { if($quietlogging==0) wm_warn("No activated maps found. [WMPOLL05]\n"); } } else { wm_warn("Output directory ($outdir) isn't writable (tried to create '$testfile'). No maps created. You probably need to make it writable by the poller process (like you did with the RRA directory) [WMPOLL06]\n"); $total_warnings++; $warning_notes .= " (Permissions problem prevents any maps running WMPOLL06)"; } } else { wm_warn("Output directory ($outdir) doesn't exist!. No maps created. You probably need to create that directory, and make it writable by the poller process (like you did with the RRA directory) [WMPOLL07]\n"); $total_warnings++; $warning_notes .= " (Output directory problem prevents any maps running WMPOLL07)"; } weathermap_memory_check("MEM Final"); chdir($orig_cwd); $duration = time() - $start_time; $stats_string = date(DATE_RFC822) . ": $mapcount maps were run in $duration seconds with $total_warnings warnings." . $warning_notes; if($quietlogging==0) wm_warn("STATS: Weathermap $WEATHERMAP_VERSION run complete - $stats_string\n", TRUE); db_execute("replace into settings values('weathermap_last_stats','".mysql_real_escape_string($stats_string)."')"); db_execute("replace into settings values('weathermap_last_finish_time','".mysql_real_escape_string(time())."')"); } else { wm_warn("Required modules for PHP Weathermap $WEATHERMAP_VERSION were not present. Not running. [WMPOLL08]\n"); } }
/** * @param $mapParameters * @param $configDirectory * @param $outputDirectory * @param $imageFormat * @param $quietLogging * @param $global_debug * @param $mapCount * @param $rrdtool_path * @param $weathermap_error_suppress * @param $weathermap_poller_start_time * @param $total_warnings * @return array */ function weathermap_run_map($mapParameters, $configDirectory, $outputDirectory, $imageFormat, $quietLogging, $global_debug, $mapCount, $rrdtool_path, $weathermap_error_suppress, $weathermap_poller_start_time, $total_warnings) { global $weathermap_debugging; global $weathermap_error_suppress; // reset the warning counter $weathermap_warncount = 0; // this is what will prefix log entries for this map $logTag = "[Map " . $mapParameters['id'] . "] " . $mapParameters['configfile']; wm_debug("{$logTag} - FIRST TOUCH\n"); $runner = new WeatherMapRunner($configDirectory, $outputDirectory, $mapParameters['configfile'], $mapParameters['filehash'], $imageFormat); if ($global_debug === false && ($mapParameters['debug'] == 'on' || $mapParameters['debug'] == 'once')) { $weathermap_debugging = true; $runner->setDebug(true); wm_debug("{$logTag} - Per-map debugging enabled for this map.\n"); } else { $weathermap_debugging = $global_debug; $runner->setDebug(false); } $runner->setRrdtool($rrdtool_path); // Log where we are up to so the Cacti UI can tell someone WMCactiAPI::setConfigOption("weaathermap_last_started_file", $logTag); $runner->LoadMap(); $mapStartTime = microtime(true); weathermap_memory_check("MEM starting {$mapCount}"); // $weathermapObject = new Weathermap; // $weathermapObject->context = "cacti"; // we can grab the rrdtool path from Cacti's config, in this case // $weathermapObject->rrdtool = $rrdtool_path; // $weathermapObject->ReadConfig($mapfile); $runner->applyAllHints($mapParameters); // weathermap_memory_check("MEM postread"); // $weathermapObject->readData(); // weathermap_memory_check("MEM postdata"); if ($quietLogging == 0) { wm_warn("About to write image file. If this is the last message in your log, increase memory_limit in php.ini [WMPOLL01]\n", true); } weathermap_memory_check("MEM pre-render"); // used to write files before moving them into place // $tempImageFilename = $outputDirectory . DIRECTORY_SEPARATOR . $mapParameters['filehash'] . '.tmp.png'; // $imageFilename = $outputDirectory . DIRECTORY_SEPARATOR . $mapParameters['filehash'] . "." . $imageFormat; // $thumbImageFilename = $outputDirectory . DIRECTORY_SEPARATOR . $mapParameters['filehash'] . ".thumb." . $imageFormat; // $thumb48ImageFilename = $outputDirectory . DIRECTORY_SEPARATOR . $mapParameters['filehash'] . ".thumb48." . $imageFormat; // Write the image to a temporary file first - it turns out that libpng is not that fast // and this way we avoid showing half a map // $weathermapObject->drawMapImage($tempImageFilename, $thumbImageFilename, read_config_option("weathermap_thumbsize")); $runner->run(); // // Firstly, don't move or delete anything if the image saving failed // if (file_exists($tempImageFilename)) { // // Don't try and delete a non-existent file (first run) // if (file_exists($imageFilename)) { // unlink($imageFilename); // } // rename($tempImageFilename, $imageFilename); // } // // $gdThumbImage = imagecreatefrompng($thumbImageFilename); // $gdThumb48Image = imagecreatetruecolor(48, 48); // imagecopyresampled($gdThumb48Image, $gdThumbImage, 0, 0, 0, 0, 48, 48, imagesx($gdThumbImage), imagesy($gdThumbImage)); // imagepng($gdThumb48Image, $thumb48ImageFilename); // imagedestroy($gdThumb48Image); // imagedestroy($gdThumbImage); // $configured_imageuri = $weathermapObject->imageuri; // $weathermapObject->imageuri = 'weathermap-cacti-plugin.php?action=viewimage&id=' . $mapParameters['filehash'] . "&time=" . time(); // if ($quietLogging == 0) { // wm_warn("Wrote map to $imageFilename and $thumbImageFilename\n", true); // } $runner->createAllHTML(); $runner->writeDataFile(); // $weathermapObject->writeDataFile($dataFilename); // put back the configured imageuri // $weathermapObject->imageuri = $configured_imageuri; // if an htmloutputfile was configured, output the HTML there too // but using the configured imageuri and imagefilename // if ($weathermapObject->htmloutputfile != "") { // $htmlFilename = $weathermapObject->htmloutputfile; // // $fileHandle = @fopen($htmlFilename, 'w'); // // if ($fileHandle !== false) { // fwrite( // $fileHandle, // $weathermapObject->makeHTML('weathermap_' . $mapParameters['filehash'] . '_imap') // ); // fclose($fileHandle); // wm_debug("Wrote HTML to %s\n", $htmlFilename); // } else { // if (true === file_exists($htmlFilename)) { // wm_warn('Failed to overwrite ' . $htmlFilename // . " - permissions of existing file are wrong? [WMPOLL02]\n"); // } else { // wm_warn('Failed to create ' . $htmlFilename // . " - permissions of output directory are wrong? [WMPOLL03]\n"); // } // } // } // if ($weathermapObject->imageoutputfile != "" && $weathermapObject->imageoutputfile != "weathermap.png" && file_exists($imageFilename)) { // // copy the existing file to the configured location too // @copy($imageFilename, $weathermapObject->imageoutputfile); // } // If archiving is enabled for this map, then save copies with datestamps, for animation etc if ($mapParameters['archiving'] == 'on') { // TODO - additionally save a copy with a datestamp file format $archiveDatestamp = strftime("%Y-%m-%d-%H-%M", $weathermap_poller_start_time); $archiveFilename = $outputDirectory . DIRECTORY_SEPARATOR . sprintf("%s-archive-%s.%s", $mapParameters['filehash'], $archiveDatestamp, $imageFormat); @copy($imageFilename, $archiveFilename); weathermap_manage_archiving($mapParameters['filehash'] . "-archive-", $outputDirectory); } db_execute("update weathermap_maps set titlecache='" . mysql_real_escape_string($runner->getProcessedTitle()) . "' where id=" . intval($mapParameters['id'])); $runner->cleanUp(); unset($runner); // $weathermapObject->cleanUp(); // unset($weathermapObject); $mapEndTime = microtime(true); $mapDuration = $mapEndTime - $mapStartTime; wm_debug("TIME: %s took %f seconds.\n", $mapParameters['configfile'], $mapDuration); weathermap_memory_check("MEM after"); WMCactiAPI::setConfigOption("weaathermap_last_finished_file", $logTag); // if the debug mode was set to once for this map, then that // time has now passed, and it can be turned off again. $newDebugState = $mapParameters['debug']; if ($newDebugState == 'once') { $newDebugState = 'off'; } WMCactiAPI::executeDBQuery(sprintf("update weathermap_maps set warncount=%d, runtime=%f, debug='%s',lastrun=NOW() where id=%d", $weathermap_warncount, $mapDuration, $newDebugState, $mapParameters['id'])); // $total_warnings += $weathermap_warncount; return; }
public function run() { if (!$this->canRun()) { wm_warn("Couldn't run {$this->mapConfigFileName}\n", true); return; } $this->startTime = microtime(true); weathermap_memory_check("MEM postread"); $this->mapObject->ReadData(); weathermap_memory_check("MEM postdata"); $this->mapObject->runProcessorPlugins("post"); weathermap_memory_check("MEM pre-render"); $this->dataTime = microtime(true); $this->mapObject->drawMapImage($this->workingImageFileName, $this->thumbnailImageFileName, intval(read_config_option("weathermap_thumbsize"))); $this->endTime = microtime(true); $this->processedTitle = $this->mapObject->processString($this->mapObject->title, $this->mapObject); $this->processImages(); if ($this->quietLogging == 0) { wm_warn("Wrote: {$this}\n", true); } }