czaks
10 years ago
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