Exemplo n.º 1
0
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);
     }
 }