#!/usr/bin/php
<?php 
// PHP Weathermap 0.97b
// Copyright Howard Jones, 2005-2012 howie@thingy.com
// http://www.network-weathermap.com/
// Released under the GNU Public License
require_once 'Console/Getopt.php';
require_once "lib/Weathermap.class.php";
if (!wm_module_checks()) {
    die("Quitting: Module checks failed.\n");
}
//    $weathermap_debugging=TRUE;
$output = "html";
$configfile = "weathermap.conf";
$htmlfile = '';
$imagefile = '';
$dumpafter = 0;
$dumpstats = 0;
$randomdata = 0;
$dumpconfig = '';
$defines = array();
$daemon = 0;
$daemon_args = "";
// **************************************************************************************
// THIS IS THE ONE LINE IN HERE YOU MIGHT HAVE TO CHANGE!
$rrdtool = "/usr/bin/rrdtool";
// (on Windows, use / instead of \ in pathnames - c:/rrdtool/bin/rrdtool.exe for example)
// **************************************************************************************
// initialize object
$cg = new Console_Getopt();
$short_opts = '';
Пример #2
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");
	}
}
function weathermap_run_maps($mydir, $map_id = -1)
{
    global $weathermap_debugging;
    global $WEATHERMAP_VERSION;
    global $weathermap_warncount;
    global $weathermap_poller_start_time;
    global $weathermap_error_suppress;
    global $weathermap_mem_highwater;
    $weathermap_mem_highwater = 0;
    // This one makes Cacti's database.php puke...
    // WMMemoryNote('weathermap_initial_memory');
    require_once "all.php";
    // and this..
    // WMMemoryNote('weathermap_loaded_memory');
    $total_warnings = 0;
    $warning_notes = "";
    $start_time = microtime(true);
    if ($weathermap_poller_start_time == 0) {
        $weathermap_poller_start_time = $start_time;
    }
    $outputDirectory = realpath($mydir . DIRECTORY_SEPARATOR . 'output');
    $configDirectory = realpath($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";
        $global_debug = true;
    } else {
        $mode_message = "Normal logging mode. Turn on DEBUG in Cacti for more information";
        $global_debug = false;
    }
    $quietLogging = intval(WMCactiAPI::getConfigOption("weathermap_quiet_logging"), 0);
    // 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()) {
        wm_warn("Required modules for PHP Weathermap {$WEATHERMAP_VERSION} were not present. Not running. [WMPOLL08]\n");
        return;
    }
    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);
    WMCactiAPI::setConfigOption("weathermap_last_start_time", $start_time);
    // first, see if the output directory exists and is writable
    if (weathermap_directory_writeable($outputDirectory)) {
        $mapList = weathermap_get_runlist($map_id, $quietLogging);
        wm_debug("Iterating all maps.");
        $imageFormat = strtolower(WMCactiAPI::getConfigOption("weathermap_output_format", "png"));
        $rrdtool_path = read_config_option("path_rrdtool");
        foreach ($mapList as $mapParameters) {
            $weathermap_warncount = 0;
            weathermap_run_map($mapParameters, $configDirectory, $outputDirectory, $imageFormat, $quietLogging, $global_debug, $mapCount, $rrdtool_path, $weathermap_error_suppress, $weathermap_poller_start_time, $total_warnings);
            $total_warnings += $weathermap_warncount;
            $mapCount++;
        }
        wm_debug("Iterated all {$mapCount} maps.\n");
    } else {
        wm_warn("Output directory ({$outputDirectory}) 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);
    $end_time = microtime(true);
    $duration = $end_time - $start_time;
    $stats_string = sprintf('%s: %d maps were run in %.2f seconds with %d warnings', date(DATE_RFC822), $mapCount, $duration, $total_warnings);
    if (true === function_exists("memory_get_peak_usage")) {
        $peak_memory = memory_get_peak_usage();
        WMCactiAPI::setConfigOption("weathermap_peak_memory", WMUtility::formatNumberWithMetricPrefix($peak_memory));
        $stats_string .= sprintf(" using %sbytes peak memory", $peak_memory);
    }
    if ($quietLogging == 0) {
        wm_warn("STATS: Weathermap {$WEATHERMAP_VERSION} run complete - {$stats_string}\n", true);
    }
    WMCactiAPI::setConfigOption("weathermap_last_stats", $stats_string);
    WMCactiAPI::setConfigOption("weathermap_last_finish_time", $end_time);
    WMCactiAPI::setConfigOption("weathermap_last_map_count", $mapCount);
    if (true === function_exists('memory_get_usage')) {
        WMCactiAPI::setConfigOption("weathermap_final_memory", memory_get_usage());
        WMCactiAPI::setConfigOption("weathermap_highwater_memory", $weathermap_mem_highwater);
    }
    if (true === function_exists("memory_get_peak_usage")) {
        WMCactiAPI::setConfigOption("weathermap_peak_memory", memory_get_peak_usage());
    }
}
 function moduleChecks()
 {
     if (!wm_module_checks()) {
         print "<b>Required PHP extensions are not present in your mod_php/ISAPI PHP module. Please check your PHP setup to ensure you have the GD extension installed and enabled.</b><p>";
         print "If you find that the weathermap tool itself is working, from the command-line or Cacti poller, then it is possible that you have two different PHP installations. The Editor uses the same PHP that webpages on your server use, but the main weathermap tool uses the command-line PHP interpreter.<p>";
         print "<p>You should also run <a href=\"check.php\">check.php</a> to help make sure that there are no problems.</p><hr/>";
         exit;
     }
 }