diff --git a/templates/themes/rrdtool/info.php b/templates/themes/rrdtool/info.php index 4655d5bf..61bb15ee 100644 --- a/templates/themes/rrdtool/info.php +++ b/templates/themes/rrdtool/info.php @@ -5,7 +5,7 @@ $theme['name'] = 'RRDtool'; // Description (you can use Tinyboard markup here) $theme['description'] = 'Graph basic statistics using the PHP RRDtool extension.'; - $theme['version'] = 'v0.1'; + $theme['version'] = 'v0.2'; // Theme configuration $theme['config'] = Array(); @@ -40,14 +40,58 @@ 'default' => implode(' ', $__default_boards) ); + $theme['config'][] = Array( + 'title' => 'Excluded Boards', + 'name' => 'boards_exclude', + 'type' => 'text', + 'comment' => '(above boards to exclude from the "combined" graph)', + 'size' => 24 + ); + + $theme['config'][] = Array( + 'title' => 'Interval', + 'name' => 'interval', + 'type' => 'text', + 'comment' => '(minutes between updates; max: 86400)', + 'size' => 3, + 'default' => '2' + ); + + $theme['config'][] = Array( + 'title' => 'Width', + 'name' => 'width', + 'type' => 'text', + 'comment' => '(graph width)', + 'size' => 3, + 'default' => '700' + ); + + $theme['config'][] = Array( + 'title' => 'Height', + 'name' => 'height', + 'type' => 'text', + 'comment' => '(graph height)', + 'size' => 3, + 'default' => '150' + ); + $theme['install_callback'] = 'rrdtool_install'; if(!function_exists('rrdtool_install')) { function rrdtool_install($settings) { global $config; - $job = '*/2 * * * * php -q ' . str_replace('\\', '/', dirname(__FILE__)) . '/cron.php' . PHP_EOL; + if(!is_numeric($settings['interval']) || $settings['interval'] < 1 || $settings['interval'] > 86400) + return Array(false, 'Invalid interval: ' . $settings['interval'] . '. Must be an integer greater than 1 and less than 86400.'); + + if(!is_numeric($settings['width']) || $settings['width'] < 1) + return Array(false, 'Invalid width: ' . $settings['width'] . '!'); + + if(!is_numeric($settings['height']) || $settings['height'] < 1) + return Array(false, 'Invalid height: ' . $settings['height'] . '!'); + + $job = '*/' . $settings['interval'] . ' * * * * php -q ' . str_replace('\\', '/', dirname(__FILE__)) . '/cron.php' . PHP_EOL; - if(function_exists('system')) { + if(function_exists('system') && false) { $crontab = tempnam($config['tmp'], 'tinyboard-rrdtool'); file_write($crontab, $job); @system('crontab ' . escapeshellarg($crontab), $ret); @@ -57,12 +101,12 @@ return ''; // it seems to install okay? } - return '

I couldn\'t install the crontab!

' . - 'In order to use this plugin, you must add the following crontab entry:' . - '
' . $job . '
'; + return Array(true, '

I couldn\'t install the crontab!

' . + 'In order to use this plugin, you must add the following crontab entry (`crontab -e`):' . + '
' . $job . '
'); } } // Unique function name for building everything $theme['build_function'] = 'rrdtool_build'; -?> \ No newline at end of file +?> diff --git a/templates/themes/rrdtool/theme.php b/templates/themes/rrdtool/theme.php index 91bc7f01..caae0987 100644 --- a/templates/themes/rrdtool/theme.php +++ b/templates/themes/rrdtool/theme.php @@ -17,13 +17,14 @@ public function build($action, $settings) { global $config, $_theme, $argv; + if(!$settings) { + error('This theme is not currently installed.'); + } + $this->boards = explode(' ', $settings['boards']); - $this->spans = Array('minute', 'hour', 'day', 'week', 'month', 'year'); - $this->interval = 120; - $this->height = 150; - $this->width = 700; - // exclude boards from the "combiend" graph - $this->combined_exclude = Array('dome9001', 'mod', 'test'); + $this->spans = Array('hour', 'day', 'week', 'month', 'year'); + // exclude boards from the "combined" graph + $this->combined_exclude = Array(); if($action == 'cron') { if(!file_exists($settings['path'])) @@ -37,26 +38,22 @@ if(!file_exists($file)) { // Create graph if(!rrd_create($file, Array( - '-s ' . $this->interval, - 'DS:posts:GAUGE:' . ($this->interval * 2) . ':0:10000', - - 'RRA:MIN:0:1:' . (3600/$this->interval), // hour - 'RRA:MIN:0:1:' . (86400/$this->interval), // day - 'RRA:MIN:0:30:' . (604800/$this->interval), // week - 'RRA:MIN:0:120:' . (2592000/$this->interval), // month - 'RRA:MIN:0:1440:' . (31536000/$this->interval), // year + '-s 60', + 'DS:posts:COUNTER:86400:0:10000', - 'RRA:AVERAGE:0:1:' . (3600/$this->interval), // hour - 'RRA:AVERAGE:0:1:' . (86400/$this->interval), // day - 'RRA:AVERAGE:0:60:' . (604800/$this->interval), // week - 'RRA:AVERAGE:0:120:' . (2592000/$this->interval), // month - 'RRA:AVERAGE:0:1440:' . (31536000/$this->interval), // year + 'RRA:AVERAGE:0:1:60', + 'RRA:AVERAGE:0:1:1440', + 'RRA:AVERAGE:0:30:10080', + 'RRA:AVERAGE:0:120:43829', + 'RRA:AVERAGE:0:1440:525948', + 'RRA:AVERAGE:0:2880:1051897', - 'RRA:MAX:0:1:' . (3600/$this->interval), // hour - 'RRA:MAX:0:1:' . (86400/$this->interval), // day - 'RRA:MAX:0:30:' . (604800/$this->interval), // week - 'RRA:MAX:0:120:' . (2592000/$this->interval), // month - 'RRA:MAX:0:1440:' . (31536000/$this->interval), // year + 'RRA:MAX:0:1:60', + 'RRA:MAX:0:1:1440', + 'RRA:MAX:0:30:10080', + 'RRA:MAX:0:120:43829', + 'RRA:MAX:0:1440:525948', + 'RRA:MAX:0:2880:1051897' ))) error('RRDtool failed: ' . htmlentities(rrd_error())); } @@ -64,11 +61,9 @@ // debug just the graphing (not updating) with the --debug switch if(!isset($argv[1]) || $argv[1] != '--debug') { // Update graph - $query = prepare(sprintf("SELECT COUNT(*) AS `count` FROM `posts_%s` WHERE `time` >= :time", $board)); - $query->bindValue(':time', time() - $this->interval, PDO::PARAM_INT); - $query->execute() or error(db_error($query)); + $query = query(sprintf("SELECT MAX(`id`) AS `count` FROM `posts_%s`", $board)); $count = $query->fetch(); - $count = $count['count'] / 2; + $count = $count['count']; if(!rrd_update($file, Array( '-t', @@ -84,7 +79,7 @@ '-t Posts on ' . sprintf($config['board_abbreviation'], $board) .' this ' . $span, '--lazy', '-l 0', - '-h', $this->height, '-w', $this->width, + '-h', $settings['height'], '-w', $settings['width'], '-a', 'PNG', '-R', 'mono', '-W', 'Powered by Tinyboard', @@ -93,10 +88,11 @@ '-Y', '-v posts/minute', 'DEF:posts=' . $file . ':posts:AVERAGE', - 'LINE2:posts#663300:Posts', - 'GPRINT:posts:MAX:Max\\: %5.2lf', - 'GPRINT:posts:AVERAGE:Average\\: %5.2lf', - 'GPRINT:posts:LAST:Current\\: %5.2lf posts/min', + 'CDEF:posts-min=posts,60,*', + 'LINE2:posts-min#663300:Posts', + 'GPRINT:posts-min:MAX:Max\\: %5.2lf', + 'GPRINT:posts-min:AVERAGE:Average\\: %5.2lf', + 'GPRINT:posts-min:LAST:Current\\: %5.2lf posts/min', 'HRULE:0#000000'))) error('RRDtool failed: ' . htmlentities(rrd_error())); } @@ -109,7 +105,7 @@ '-t Posts this ' . $span, '--lazy', '-l 0', - '-h', $this->height, '-w', $this->width, + '-h', $settings['height'], '-w', $settings['width'], '-a', 'PNG', '-R', 'mono', '-W', 'Powered by Tinyboard', @@ -135,7 +131,8 @@ str_pad(dechex($blue*85), 2, '0', STR_PAD_LEFT); $options[] = 'DEF:posts' . $board . '=' . $settings['path'] . '/' . $board . '.rrd' . ':posts:AVERAGE'; - $options[] = 'LINE2:posts' . $board . '#' . $color . ':' . + $options[] = 'CDEF:posts' . $board . '-min=posts' . $board . ',60,*'; + $options[] = 'LINE2:posts' . $board . '-min#' . $color . ':' . sprintf($config['board_abbreviation'], $board); // Randomize colors using this horrible undocumented algorithm I threw together while debugging