Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- $version = '0.6.7-Bret';
- /*////////////////////////////////////////////////////////////////////////////////////
- memCron - DreamHost PS Memory Manager
- Author : Yaosan Yeo
- Version : 0.6
- Date : 22 March 2010
- URL : http://memcron.com/
- History :
- 0.6 [2010.03.22] - Added: Support for target memory and cached memory
- - Added: Version info to the footer
- - Changed: Now display http server name instead of actual PS name for extra security
- 0.4.1 [2009.08.10] - Added: favicon for easier recognition of memCron tab in browser
- - Fixed: Proper max axis value for "Used + Total Memory"
- - Fixed: Memory calculation due to the 2x increase of swap memory by DreamHost
- 0.4 [2009.06.28] - Changed: Tooltip for the resources usage graph is now cuter i.e. in yellow! :)
- - Fixed: Total memory is now displayed correctly on the resources graph by accounting for max swap memory, which is capped at 450MB
- 0.3 [2009.05.27] - Added: Customizable chart formatting (y-axis) for resource usage graph
- - Added: New "css" folder to hold css stylesheets (no more css snippet in html head)
- - Added: Charset information to http header
- - Added: Generator meta information to XHTML head section
- - Changed: Chart title changed from "Memory Usage" to "Resources Usage"
- - Changed: #memchart width increased from 80% to 93%
- - Fixed: Tooltip fade in now works better in IE (remove filter to restore ClearType)
- 0.2 [2009.05.03] - Nothing changed.
- 0.1 [2009.04.30] - Initial release
- ////////////////////////////////////////////////////////////////////////////////////*/
- header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
- header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
- header("Content-type: text/html; charset=iso-8859-1");
- //
- // get configuration settings
- //
- $config = dirname(__FILE__) . "/config.cfg";
- $fp = fopen($config, 'r') or die ("Can't open config file!");
- $settings = array();
- while ( $line = fgets($fp) ) {
- if ( substr($line, 0, 1) == '$') {
- $s = preg_split('/[\s]+=[\s]+/', $line);
- $key = substr($s[0],1);
- foreach( preg_split('/[";]+/', $s[1]) as $v ) {
- $v = trim($v);
- if ( !empty($v) ) {
- $value = $v;
- }
- }
- $settings[$key] = $value;
- }
- }
- fclose($fp);
- // $server_name = preg_replace( '/(\w+\.)?([\w-]+)\.(\w+)$/i', '$2.$3', $_SERVER['SERVER_NAME'] );
- $server_name = $_SERVER['SERVER_NAME'];
- $ps = php_uname('n');
- $num_data_max = $settings['num_data_csv'];
- $dateTimeZone = new DateTimeZone("America/Los_Angeles");
- $dateTime = new DateTime("now", $dateTimeZone);
- $timeOffset = $dateTimeZone->getOffset($dateTime);
- $gmt_offset = $timeOffset/3600;
- //$gmt_offset = -7;
- $num_data_default = 300;
- $log = dirname(__FILE__) . "/logs/$ps.csv";
- //
- // get form parameters
- //
- $axis = array( "mem", "memt", "mem_used", "mem_free", "mem_total", "cpu_load", "mem_mean", "mem_stdev", "mem_used_tolerance", "mem_free_tolerance", "downsize_count", "mem_target", "mem_cached" );
- $num_data = ( is_numeric($_GET['n']) ) ? $_GET['n'] : $num_data_default;
- $y1 = ( isset($_GET['y1']) && in_array($_GET['y1'], $axis) ) ? $_GET['y1'] : "memt";
- $y2 = ( isset($_GET['y2']) && in_array($_GET['y2'], $axis) ) ? $_GET['y2'] : "cpu_load";
- if ( $num_data > $num_data_max ) {
- $num_data = $num_data_max;
- } else if ( $num_data < 1 ) {
- $num_data = 1;
- }
- $fp = fopen($log, 'r') or die ("Can't open log file!");
- $unix_time = array();
- $mem_total = array();
- $mem_used = array();
- $mem_free = array();
- $cpu_load = array();
- $mem_mean = array();
- $mem_stdev = array();
- $mem_used_tolerance = array();
- $mem_free_tolerance = array();
- $downsize_count = array();
- $mem_target = array();
- $mem_cached = array();
- // generate data array from log file
- while ( $y = trim( fgets($fp) ) ) {
- list($t,$mt,$mu,$cpu,$mm,$ms,$mut,$mft,$dc,$mtg,$mc) = explode(",", $y);
- $t = ( $t + $gmt_offset*3600 ) * 1000;
- array_push( $unix_time, $t );
- array_push( $mem_total, $mt );
- array_push( $mem_used, $mu );
- array_push( $mem_free, $mt-$mu-$mc );
- array_push( $cpu_load, $cpu );
- array_push( $mem_mean, $mm );
- array_push( $mem_stdev, $ms );
- array_push( $mem_used_tolerance, $mut );
- array_push( $mem_free_tolerance, $mft );
- array_push( $downsize_count, $dc );
- array_push( $mem_target, $mtg );
- array_push( $mem_cached, $mc );
- }
- fclose($fp);
- // slice array based on "n"
- function sliceArray($arg, $num) {
- return array_slice( $arg, count($arg) - $num );
- }
- if ( $num_data < count($mem_total) ) {
- $unix_time = sliceArray( $unix_time, $num_data );
- $mem_total = sliceArray( $mem_total, $num_data );
- $mem_used = sliceArray( $mem_used, $num_data );
- $mem_free = sliceArray( $mem_free, $num_data );
- $cpu_load = sliceArray( $cpu_load, $num_data );
- $mem_mean = sliceArray( $mem_mean, $num_data );
- $mem_stdev = sliceArray( $mem_stdev, $num_data );
- $mem_used_tolerance = sliceArray( $mem_used_tolerance, $num_data );
- $mem_free_tolerance = sliceArray( $mem_free_tolerance, $num_data );
- $downsize_count = sliceArray( $downsize_count, $num_data );
- $mem_target = sliceArray( $mem_target, $num_data );
- $mem_cached = sliceArray( $mem_cached, $num_data );
- } else {
- $num_data = count($mem_total);
- }
- // get option values for y axis
- function getOptions($axis) {
- global $mem_total, $mem_used, $mem_free,
- $cpu_load, $mem_mean, $mem_stdev,
- $mem_used_tolerance, $mem_free_tolerance, $downsize_count,
- $mem_target, $mem_cached;
- $min = 0;
- $max = max($mem_total);
- $max = ($max < 450) ? $max * 2 : $max + 450;
- switch ($axis) {
- case "mem":
- $unit = "mb";
- break;
- case "memt":
- $max = max( $max, max($mem_target) );
- $unit = "mb";
- break;
- case "mem_total":
- $unit = "mb";
- break;
- case "mem_used":
- $unit = "mb";
- break;
- case "mem_free":
- $unit = "mb";
- break;
- case "cpu_load":
- $max = max( max($cpu_load), 3 );
- $unit = " load";
- break;
- case "mem_mean":
- $max = max($mem_mean);
- $min = min($mem_mean);
- $diff = round(($max-$min)*0.1);
- $max += $diff;
- $min -= $diff;
- $unit = "mb";
- break;
- case "mem_stdev":
- $max = max($mem_stdev);
- $min = min($mem_stdev);
- $diff = round(($max-$min)*0.1);
- $max += $diff;
- $min -= $diff;
- $unit = "mb";
- break;
- case "mem_used_tolerance":
- $max = max($mem_used_tolerance);
- $unit = "mb";
- break;
- case "mem_free_tolerance":
- $max = max($mem_free_tolerance);
- $unit = "mb";
- break;
- case "downsize_count":
- $max = max($downsize_count);
- $unit = " count";
- break;
- case "mem_target":
- $max = max( $max, max($mem_target) );
- $unit = "mb";
- break;
- case "mem_cached":
- $unit = "mb";
- break;
- }
- return array($max, $min, $unit);
- }
- $y1_options = getOptions($y1);
- $y2_options = getOptions($y2);
- $y1_unit = array_pop($y1_options);
- $y2_unit = array_pop($y2_options);
- $y1_min = array_pop($y1_options);
- $y2_min = array_pop($y2_options);
- $y1_max = array_pop($y1_options);
- $y2_max = array_pop($y2_options);
- // construct data array for js
- function getData($axis) {
- global $mem_total, $mem_used, $mem_free,
- $cpu_load, $mem_mean, $mem_stdev,
- $mem_used_tolerance, $mem_free_tolerance, $downsize_count,
- $mem_target, $mem_cached;
- switch ($axis) {
- case "mem":
- array_push( $mem_used, "Used Memory" );
- array_push( $mem_total, "Total Memory" );
- $data = array( $mem_used, $mem_total );
- array_pop($mem_used);
- array_pop($mem_total);
- break;
- case "memt":
- array_push( $mem_used, "Used Memory" );
- array_push( $mem_total, "Total Memory" );
- array_push( $mem_target, "Target Memory");
- $data = array( $mem_used, $mem_total, $mem_target );
- array_pop($mem_used);
- array_pop($mem_total);
- array_pop($mem_target);
- break;
- case "mem_total":
- array_push( $mem_total, "Total Memory" );
- $data = $mem_total;
- array_pop($mem_total);
- break;
- case "mem_used":
- array_push( $mem_used, "Used Memory" );
- $data = $mem_used;
- array_pop($mem_used);
- break;
- case "mem_free":
- array_push( $mem_free, "Free Memory" );
- $data = $mem_free;
- array_pop($mem_free);
- break;
- case "cpu_load":
- array_push( $cpu_load, "CPU Load" );
- $data = $cpu_load;
- array_pop($cpu_load);
- break;
- case "mem_mean":
- array_push( $mem_mean, "Mean (used memory)" );
- $data = $mem_mean;
- array_pop($mem_mean);
- break;
- case "mem_stdev":
- array_push( $mem_stdev, "Standard Deviation (used memory)" );
- $data = $mem_stdev;
- array_pop($mem_stdev);
- break;
- case "mem_used_tolerance":
- array_push( $mem_used_tolerance, "Tolerance (used memory)" );
- $data = $mem_used_tolerance;
- array_pop($mem_used_tolerance);
- break;
- case "mem_free_tolerance":
- array_push( $mem_free_tolerance, "Tolerance (free memory)" );
- $data = $mem_free_tolerance;
- array_pop($mem_free_tolerance);
- break;
- case "downsize_count":
- array_push( $downsize_count, "Downsize Count");
- $data = $downsize_count;
- array_pop($downsize_count);
- break;
- case "mem_target":
- array_push( $mem_target, "Target Memory");
- $data = $mem_target;
- array_pop($mem_target);
- break;
- case "mem_cached":
- array_push( $mem_cached, "Cached Memory");
- $data = $mem_cached;
- array_pop($mem_cached);
- break;
- }
- return $data;
- }
- $d1 = getData($y1);
- if ( is_array($d1[0]) ) {
- $d5 = $d1[2];
- $d2 = $d1[1];
- $d1 = $d1[0];
- }
- $d3 = getData($y2);
- if ( is_array($d3[0]) ) {
- $d6 = $d3[2];
- $d4 = $d3[1];
- $d3 = $d3[0];
- }
- // get label
- $d1_label = array_pop($d1);
- if ($d2) { $d2_label = array_pop($d2); }
- if ($d5) { $d5_label = array_pop($d5); }
- $d3_label = array_pop($d3);
- if ($d4) { $d4_label = array_pop($d4); }
- if ($d6) { $d6_label = array_pop($d6); }
- $i = 0;
- foreach ( $unix_time as $t ) {
- $d1[$i] = "[$t," . $d1[$i]. "]";
- if ($d2) { $d2[$i] = "[$t," . $d2[$i]. "]"; }
- if ($d5) { $d5[$i] = "[$t," . $d5[$i]. "]"; }
- $d3[$i] = "[$t," . $d3[$i]. "]";
- if ($d4) { $d4[$i] = "[$t," . $d4[$i]. "]"; }
- if ($d6) { $d6[$i] = "[$t," . $d6[$i]. "]"; }
- $i++;
- }
- // get line width
- $line_width = 3;
- if ( $num_data >= 200 ) {
- $line_width = 3 - ( $num_data - 200 ) / 200;
- $line_width = max(1, $line_width);
- $line_width = round($line_width, 0);
- }
- ?>
- <!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
- <meta name="robots" content="noindex" />
- <meta name="generator" content="memCron <?php echo $version; ?>" />
- <title>Resources Usage for <?php echo $ps; ?> « memCron</title>
- <link rel="icon" href="/favicon.ico" />
- <!--[if IE]><script language="javascript" type="text/javascript" src="js/excanvas.pack.js"></script><![endif]-->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
- <script type="text/javascript" src="js/jquery.flot.pack.js"></script>
- <script type="text/javascript" src="js/thickbox-compressed.js"></script>
- <link rel="stylesheet" href="css/memcron.css" type="text/css" media="screen" />
- <link rel="stylesheet" href="css/thickbox.css" type="text/css" media="screen" />
- </head>
- <body id="memcron">
- <h1>Resources Usage for <?php echo "$server_name [$ps]"; ?></h1>
- <div id="content">
- <div id="memchart"></div>
- <noscript><p>Please turn on Javascript to see the graph</p></noscript>
- <form method="get" action="./">
- <p>
- <input type="hidden" name="y1" id="y1" value="<?php echo $y1 ?>" />
- <input type="hidden" name="y2" id="y2" value="<?php echo $y2 ?>" />
- Display <input type="text" name="n" id="n" value="<?php echo $num_data ?>" maxlength="<?php echo floor(log10($num_data_max)+1) ?>"></input> data points<a href="#TB_inline?&height=220&width=350&inlineId=customize&modal=true" class="thickbox"><img src="images/chart.png" alt="Customize chart" /></a>
- </p>
- </form>
- </div>
- <div id="customize" style="display:none;">
- <h2>Chart Formatting</h2>
- <p>
- y1 axis:
- <select name="y1axis" id="y1axis">
- <option value="mem">Used & Total Memory</option>
- <option value="memt" selected="selected">Used, Total & Target Memory</option>
- <option value="mem_used">Used Memory</option>
- <option value="mem_free">Free Memory</option>
- <option value="mem_total">Total Memory</option>
- <option value="cpu_load">CPU Load</option>
- <option value="mem_mean">Mean (used memory)</option>
- <option value="mem_stdev">Standard Deviation (used memory)</option>
- <option value="mem_used_tolerance">Tolerance (used memory)</option>
- <option value="mem_free_tolerance">Tolerance (free memory)</option>
- <option value="downsize_count">Downsize Count</option>
- <option value="mem_target">Target Memory</option>
- <option value="mem_cached">Cached Memory</option>
- </select>
- </p>
- <p>
- y2 axis:
- <select name="y2axis" id="y2axis">
- <option value="mem">Used & Total Memory</option>
- <option value="memt">Used, Total & Target Memory</option>
- <option value="mem_used">Used Memory</option>
- <option value="mem_free">Free Memory</option>
- <option value="mem_total">Total Memory</option>
- <option value="cpu_load">CPU Load</option>
- <option value="mem_mean">Mean (used memory)</option>
- <option value="mem_stdev">Standard Deviation (used memory)</option>
- <option value="mem_used_tolerance">Tolerance (used memory)</option>
- <option value="mem_free_tolerance">Tolerance (free memory)</option>
- <option value="downsize_count">Downsize Count</option>
- <option value="mem_target">Target Memory</option>
- <option value="mem_cached">Cached Memory</option>
- </select>
- </p>
- <p>
- <button type="submit" id="ok" onclick="submitForm()">OK</button>
- <button id="cancel" onclick="tb_remove()">Cancel</button>
- </p>
- <script type="text/javascript">
- $("#y1axis option[value='<?php echo $y1 ?>']").attr('selected', 'selected');
- $("#y2axis option[value='<?php echo $y2 ?>']").attr('selected', 'selected');
- </script>
- </div>
- <p class="footer">
- Powered by <a href="http://memcron.com/" title="memCron - DreamHost PS Memory Manager"><img src="images/logo.png" alt="memCron" /></a> <?php echo $version; ?>
- </p>
- <script type="text/javascript">
- //<![CDATA[
- (function($) {
- $.fn.customFadeIn = function(speed, callback) {
- $(this).fadeIn(speed, function() {
- if(jQuery.browser.msie)
- $(this).get(0).style.removeAttribute('filter');
- if(callback != undefined)
- callback();
- });
- };
- $.fn.customFadeOut = function(speed, callback) {
- $(this).fadeOut(speed, function() {
- if(jQuery.browser.msie)
- $(this).get(0).style.removeAttribute('filter');
- if(callback != undefined)
- callback();
- });
- };
- })(jQuery);
- function showTooltip(x, y, contents) {
- $('<div id="tooltip">' + contents + '<\/div>').css( {
- position: 'absolute',
- display: 'none',
- top: y + 7,
- left: x + 7,
- border: '4px solid #f9e98e',
- padding: '10px 12px',
- color: '#95693d',
- 'background-color': '#fbf6aa',
- opacity: 0.99
- }).appendTo("body").customFadeIn(200);
- }
- var previousPoint = null;
- $("#memchart").bind("plothover", function (event, pos, item) {
- if (item) {
- if (previousPoint != item.datapoint) {
- previousPoint = item.datapoint;
- $("#tooltip").remove();
- var dt = new Date();
- var x = new Date(item.datapoint[0] + dt.getTimezoneOffset()*60000),
- y = item.datapoint[1];
- var h = x.getHours();
- var m = x.getMinutes();
- if (h < 10) { h = "0" + h; }
- if (m < 10) { m = "0"+ m; }
- x = h + ":" + m;
- showTooltip(item.pageX, item.pageY,
- item.series.label + " at " + x + " = " + y);
- }
- }
- else {
- $("#tooltip").remove();
- previousPoint = null;
- }
- });
- function submitForm() {
- if( $("#y1axis :selected").val() == $("#y2axis :selected").val() ) {
- alert("Data for y1 axis and y2 axis cannot be the same!");
- } else {
- tb_remove();
- $("#y1").val( $("#y1axis").val() );
- $("#y2").val( $("#y2axis").val() );
- $("form").submit();
- }
- }
- function resizeGraph() {
- var w = Math.round($(window).width()*0.93);
- var h = Math.round($(window).height()-263);
- if (w < 350) { w = 350; }
- if (h < 200) { h = 200; }
- $('#memchart').width(w);
- $('#memchart').height(h);
- $.plot($("#memchart"), [ <?php echo "d1" . ( (!empty($d2)) ? ", d2" : "" ) . ", d3" . ( (!empty($d4)) ? ", d4" : "" ) . ( (!empty($d5)) ? ", d5" : "" ) . ( (!empty($d6)) ? ", d6" : "" ); ?> ], options );
- }
- var d1 = {
- label: "<?php echo $d1_label ?>",
- data: [ <?php echo implode( ",", $d1 ); ?> ],
- yaxis: 1
- };
- <?php if ($d2) { ?>
- var d2 = {
- label: "<?php echo $d2_label ?>",
- data: [ <?php echo implode( ",", $d2 ); ?> ],
- yaxis: 1
- };
- <?php } ?>
- <?php if ($d5) { ?>
- var d5 = {
- label: "<?php echo $d5_label ?>",
- data: [ <?php echo implode( ",", $d5 ); ?> ],
- yaxis: 1
- };
- <?php } ?>
- var d3 = {
- label: "<?php echo $d3_label ?>",
- data: [ <?php echo implode( ",", $d3 ); ?> ],
- yaxis: 2
- };
- <?php if ($d4) { ?>
- var d4 = {
- label: "<?php echo $d4_label ?>",
- data: [ <?php echo implode( ",", $d4 ); ?> ],
- yaxis: 2
- };
- <?php } ?>
- <?php if ($d6) { ?>
- var d6 = {
- label: "<?php echo $d6_label ?>",
- data: [ <?php echo implode( ",", $d6 ); ?> ],
- yaxis: 2
- };
- <?php } ?>
- var options = {
- lines: { show: true, lineWidth: <?php echo $line_width ?> },
- points: { show: <?php echo ($line_width >= 3) ? "true" : "false"; ?> },
- selection: { mode: "xy" },
- legend: { position: 'nw' },
- grid: { hoverable: true, clickable: false },
- shadowSize: 3,
- xaxis: { mode: "time", timeformat: "%H:%M" },
- yaxis: { min: <?php echo $y1_min ?>, max: <?php echo $y1_max ?>, tickFormatter: function (v, axis) { return v.toFixed(axis.tickDecimals) + "<?php echo $y1_unit ?>" } },
- y2axis: { min: <?php echo $y2_min ?>, max: <?php echo $y2_max ?>, tickFormatter: function (v, axis) { return v.toFixed(axis.tickDecimals) + "<?php echo $y2_unit ?>" } }
- };
- $(window).resize(function() { resizeGraph(); });
- $(document).ready(function() {
- resizeGraph();
- });
- //]]>
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement