czaks
11 years ago
committed by
Michael Foster
4 changed files with 0 additions and 315 deletions
@ -1,9 +0,0 @@ |
|||
<?php |
|||
$_SERVER = Array('REQUEST_URI' => '', 'HTTP_HOST' => '', 'SCRIPT_FILENAME' => ''); |
|||
chdir(str_replace('\\', '/', dirname(__FILE__)) . '/../../../'); |
|||
|
|||
require 'inc/functions.php'; |
|||
|
|||
require dirname(__FILE__) . '/theme.php'; |
|||
rebuildTheme('rrdtool', 'cron'); |
|||
|
@ -1,122 +0,0 @@ |
|||
<?php |
|||
$theme = Array(); |
|||
|
|||
// Theme name |
|||
$theme['name'] = 'RRDtool'; |
|||
// Description (you can use Tinyboard markup here) |
|||
$theme['description'] = 'Graph basic statistics using the PHP RRDtool extension.'; |
|||
$theme['version'] = 'v0.2'; |
|||
|
|||
// Theme configuration |
|||
$theme['config'] = Array(); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Path', |
|||
'name' => 'path', |
|||
'type' => 'text', |
|||
'default' => str_replace('\\', '/', dirname(__FILE__)) . '/data', |
|||
'size' => '50' |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Images path', |
|||
'name' => 'images', |
|||
'type' => 'text', |
|||
'default' => str_replace('\\', '/', dirname(__FILE__)) . '/images', |
|||
'size' => '50' |
|||
); |
|||
|
|||
$__boards = listBoards(); |
|||
$__default_boards = Array(); |
|||
foreach ($__boards as $__board) |
|||
$__default_boards[] = $__board['uri']; |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Boards', |
|||
'name' => 'boards', |
|||
'type' => 'text', |
|||
'comment' => '(boards to graph; space seperated)', |
|||
'size' => 24, |
|||
'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' => 'Graph Width', |
|||
'name' => 'width', |
|||
'type' => 'text', |
|||
'size' => 3, |
|||
'default' => '700' |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Graph Height', |
|||
'name' => 'height', |
|||
'type' => 'text', |
|||
'size' => 3, |
|||
'default' => '150' |
|||
); |
|||
|
|||
$theme['config'][] = Array( |
|||
'title' => 'Graph Rate', |
|||
'name' => 'rate', |
|||
'type' => 'text', |
|||
'comment' => 'Graph posts per X? ("minute", "day", "year", etc.)', |
|||
'size' => 3, |
|||
'default' => 'hour' |
|||
); |
|||
|
|||
$theme['install_callback'] = 'rrdtool_install'; |
|||
if (!function_exists('rrdtool_install')) { |
|||
function rrdtool_install($settings) { |
|||
global $config; |
|||
|
|||
if (!is_numeric($settings['interval']) || $settings['interval'] < 1 || $settings['interval'] > 86400) |
|||
return Array(false, 'Invalid interval: <strong>' . $settings['interval'] . '</strong>. Must be an integer greater than 1 and less than 86400.'); |
|||
|
|||
if (!is_numeric($settings['width']) || $settings['width'] < 1) |
|||
return Array(false, 'Invalid width: <strong>' . $settings['width'] . '</strong>!'); |
|||
|
|||
if (!is_numeric($settings['height']) || $settings['height'] < 1) |
|||
return Array(false, 'Invalid height: <strong>' . $settings['height'] . '</strong>!'); |
|||
|
|||
if (!in_array($settings['rate'], Array('second', 'minute', 'day', 'hour', 'week', 'month', 'year'))) |
|||
return Array(false, 'Invalid rate: <strong>' . $settings['rate'] . '</strong>!'); |
|||
|
|||
$job = '*/' . $settings['interval'] . ' * * * * php -q ' . str_replace('\\', '/', dirname(__FILE__)) . '/cron.php' . PHP_EOL; |
|||
|
|||
if (function_exists('system')) { |
|||
$crontab = tempnam($config['tmp'], 'tinyboard-rrdtool'); |
|||
file_write($crontab, $job); |
|||
@system('crontab ' . escapeshellarg($crontab), $ret); |
|||
unlink($crontab); |
|||
|
|||
if ($ret === 0) |
|||
return ''; // it seems to install okay? |
|||
} |
|||
|
|||
return Array(true, '<h2>I couldn\'t install the crontab!</h2>' . |
|||
'In order to use this plugin, you must add the following crontab entry (`crontab -e`):' . |
|||
'<pre>' . $job . '</pre>'); |
|||
} |
|||
} |
|||
|
|||
// Unique function name for building everything |
|||
$theme['build_function'] = 'rrdtool_build'; |
|||
?> |
@ -1,184 +0,0 @@ |
|||
<?php |
|||
require 'info.php'; |
|||
|
|||
function rrdtool_build($action, $settings, $board) { |
|||
// Possible values for $action: |
|||
// - all (rebuild everything, initialization) |
|||
// - news (news has been updated) |
|||
// - boards (board list changed) |
|||
// - post (a post has been made) |
|||
|
|||
$b = new TB_RRDTool(); |
|||
$b->build($action, $settings); |
|||
} |
|||
|
|||
// Wrap functions in a class so they don't interfere with normal Tinyboard operations |
|||
class TB_RRDTool { |
|||
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('hour', 'day', 'week', 'month', 'year'); |
|||
// exclude boards from the "combined" graph |
|||
$this->combined_exclude = Array(); |
|||
|
|||
if ($action == 'cron') { |
|||
if (!file_exists($settings['path'])) |
|||
mkdir($settings['path']); |
|||
if (!file_exists($settings['images'])) |
|||
mkdir($settings['images']); |
|||
|
|||
foreach ($this->boards as &$board) { |
|||
$file = $settings['path'] . '/' . $board . '.rrd'; |
|||
|
|||
if (!file_exists($file)) { |
|||
// Create graph |
|||
if (!rrd_create($file, Array( |
|||
'-s 60', |
|||
'DS:posts:COUNTER:86400:0:10000', |
|||
|
|||
'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: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())); |
|||
} |
|||
|
|||
// debug just the graphing (not updating) with the --debug switch |
|||
if (!isset($argv[1]) || $argv[1] != '--debug') { |
|||
// Update graph |
|||
$query = query(sprintf("SELECT MAX(`id`) FROM ``posts_%s``", $board)); |
|||
$count = $query->fetchColumn(); |
|||
|
|||
if (!rrd_update($file, Array( |
|||
'-t', |
|||
'posts', |
|||
'N:' . $count))) |
|||
error('RRDtool failed: ' . htmlentities(rrd_error())); |
|||
} |
|||
|
|||
foreach ($this->spans as &$span) { |
|||
// Graph graph |
|||
if (!rrd_graph($settings['images'] . '/' . $board . '-' . $span . '.png', Array( |
|||
'-s -1' . $span, |
|||
'-t Posts on ' . sprintf($config['board_abbreviation'], $board) .' this ' . $span, |
|||
'--lazy', |
|||
'-l 0', |
|||
'-h', $settings['height'], '-w', $settings['width'], |
|||
'-a', 'PNG', |
|||
'-R', 'mono', |
|||
'-W', 'Powered by Tinyboard', |
|||
'-E', |
|||
'-X', '0', |
|||
'-Y', |
|||
'-v posts/' . $settings['rate'], |
|||
'DEF:posts-second=' . $file . ':posts:AVERAGE', |
|||
'CDEF:posts-minute=posts-second,60,*', |
|||
'CDEF:posts-hour=posts-minute,60,*', |
|||
'CDEF:posts-day=posts-hour,24,*', |
|||
'CDEF:posts-week=posts-day,7,*', |
|||
'CDEF:posts-month=posts-day,28,*', |
|||
'CDEF:posts-year=posts-day,365,*', |
|||
'DEF:posts=' . $file . ':posts:AVERAGE', |
|||
'LINE2:posts-' . $settings['rate'] . '#663300:Posts', |
|||
'GPRINT:posts-' . $settings['rate'] . ':MAX:Max\\: %5.2lf', |
|||
'GPRINT:posts-' . $settings['rate'] . ':AVERAGE:Average\\: %5.2lf', |
|||
'GPRINT:posts-' . $settings['rate'] . ':LAST:Current\\: %5.2lf posts/' . $settings['rate'], |
|||
'HRULE:0#000000'))) |
|||
error('RRDtool failed: ' . htmlentities(rrd_error())); |
|||
} |
|||
} |
|||
|
|||
// combined graph |
|||
foreach ($this->spans as &$span) { |
|||
$options = Array( |
|||
'-s -1' . $span, |
|||
'-t Posts this ' . $span, |
|||
'--lazy', |
|||
'-l 0', |
|||
'-h', $settings['height'], '-w', $settings['width'], |
|||
'-a', 'PNG', |
|||
'-R', 'mono', |
|||
'-W', 'Powered by Tinyboard', |
|||
'-E', |
|||
'-X', '0', |
|||
'-Y', |
|||
'-v posts/' . $settings['rate']); |
|||
|
|||
$red = 0; |
|||
$green = 0; |
|||
$blue = 0; |
|||
$c = 0; |
|||
$cc = 0; |
|||
|
|||
$c = 1; |
|||
$cc = 0; |
|||
$red = 2; |
|||
foreach ($this->boards as &$board) { |
|||
if (in_array($board, $this->combined_exclude)) |
|||
continue; |
|||
$color = str_pad(dechex($red*85), 2, '0', STR_PAD_LEFT) . |
|||
str_pad(dechex($green*85), 2, '0', STR_PAD_LEFT) . |
|||
str_pad(dechex($blue*85), 2, '0', STR_PAD_LEFT); |
|||
|
|||
$options[] = 'DEF:posts' . $board . '-second=' . $settings['path'] . '/' . $board . '.rrd' . ':posts:AVERAGE'; |
|||
$options[] = 'CDEF:posts' . $board . '-minute=posts' . $board . '-second,60,*'; |
|||
$options[] = 'CDEF:posts' . $board . '-hour=posts' . $board . '-minute,60,*'; |
|||
$options[] = 'CDEF:posts' . $board . '-day=posts' . $board . '-hour,24,*'; |
|||
$options[] = 'CDEF:posts' . $board . '-week=posts' . $board . '-day,7,*'; |
|||
$options[] = 'CDEF:posts' . $board . '-month=posts' . $board . '-day,28,*'; |
|||
$options[] = 'CDEF:posts' . $board . '-year=posts' . $board . '-day,365,*'; |
|||
$options[] = 'LINE2:posts' . $board . '-' . $settings['rate'] . '#' . $color . ':' . |
|||
sprintf($config['board_abbreviation'], $board); |
|||
|
|||
// Randomize colors using this horrible undocumented algorithm I threw together while debugging |
|||
if ($c == 0) |
|||
$red++; |
|||
elseif ($c == 1) |
|||
$green++; |
|||
elseif ($c == 2) |
|||
$blue++; |
|||
elseif ($c == 3) |
|||
$green--; |
|||
elseif ($c == 4) |
|||
$red--; |
|||
|
|||
$cc++; |
|||
if ($cc > 2) { |
|||
$c++; |
|||
$cc = 0; |
|||
} |
|||
if ($c > 4) |
|||
$c = 0; |
|||
|
|||
if ($red > 3) |
|||
$red = 0; |
|||
if ($green > 3) |
|||
$green = 0; |
|||
if ($blue > 3) |
|||
$blue = 0; |
|||
} |
|||
$options[] = 'HRULE:0#000000'; |
|||
|
|||
if (!rrd_graph($settings['images'] . '/combined-' . $span . '.png', $options)) |
|||
error('RRDtool failed: ' . htmlentities(rrd_error())); |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
?> |
Before Width: | Height: | Size: 2.9 KiB |
Loading…
Reference in new issue