Refactored Dev class (#649)

This commit is contained in:
Roman Kelesidis 2023-03-20 23:28:10 +07:00 committed by GitHub
commit bcf9465dc0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 218 additions and 161 deletions

View file

@ -52,6 +52,12 @@ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
}
require_once __DIR__ . '/vendor/autoload.php';
/**
* Progressive error reporting
*/
define('DBG_USER', (isset($_COOKIE[COOKIE_DBG])));
\TorrentPier\Dev::debug_init();
/**
* Gets the value of an environment variable.
*
@ -80,9 +86,6 @@ define('FORUM_PATH', $bb_cfg['script_path']);
define('FULL_URL', $server_protocol . $bb_cfg['server_name'] . $server_port . $bb_cfg['script_path']);
unset($server_protocol, $server_port);
// Debug options
define('DBG_USER', (isset($_COOKIE[COOKIE_DBG])));
// Board / tracker shared constants and functions
define('BB_BT_TORRENTS', 'bb_bt_torrents');
define('BB_BT_TRACKER', 'bb_bt_tracker');
@ -108,47 +111,6 @@ define('TOR_TYPE_SILVER', 2);
define('GUEST_UID', -1);
define('BOT_UID', -746);
/**
* Progressive error reporting
*/
if ($bb_cfg['bugsnag']['enabled']) {
if (env('APP_ENV', 'production') !== 'local') {
/** @var Bugsnag\Handler $bugsnag */
$bugsnag = Bugsnag\Client::make($bb_cfg['bugsnag']['api_key']);
Bugsnag\Handler::register($bugsnag);
}
} else {
if (DBG_USER) {
/** @var Whoops\Run $whoops */
$whoops = new \Whoops\Run;
/**
* Show errors on page
*/
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
/**
* Show log in browser console
*/
$loggingInConsole = new \Whoops\Handler\PlainTextHandler();
$loggingInConsole->loggerOnly(true);
$loggingInConsole->setLogger((new \Monolog\Logger(getenv('APP_NAME', 'TorrentPier'), [(new \Monolog\Handler\BrowserConsoleHandler())->setFormatter((new \Monolog\Formatter\LineFormatter(null, null, true)))])));
$whoops->pushHandler($loggingInConsole);
/**
* Log errors in file
*/
if (ini_get('log_errors') == 1) {
$loggingInFile = new \Whoops\Handler\PlainTextHandler();
$loggingInFile->loggerOnly(true);
$loggingInFile->setLogger((new \Monolog\Logger(getenv('APP_NAME', 'TorrentPier'), [(new \Monolog\Handler\StreamHandler(bb_log('', WHOOPS_LOG_FILE, true)))->setFormatter((new \Monolog\Formatter\LineFormatter(null, null, true)))])));
$whoops->pushHandler($loggingInFile);
}
$whoops->register();
}
}
/**
* Database
*/
@ -217,25 +179,6 @@ if (CHECK_REQIREMENTS['status'] && !CACHE('bb_cache')->get('system_req')) {
CACHE('bb_cache')->set('system_req', true);
}
function sql_dbg_enabled()
{
return (SQL_DEBUG && DBG_USER && !empty($_COOKIE['sql_log']));
}
function short_query($sql, $esc_html = false)
{
$max_len = 100;
$sql = str_compact($sql);
if (!empty($_COOKIE['sql_log_full'])) {
if (mb_strlen($sql, 'UTF-8') > $max_len) {
$sql = mb_substr($sql, 0, 50) . ' [...cut...] ' . mb_substr($sql, -50);
}
}
return $esc_html ? htmlCHR($sql, true) : $sql;
}
// Functions
function utime()
{

View file

@ -71,7 +71,7 @@ if (!empty($_COOKIE['explain'])) {
}
}
$sql_log = !empty($_COOKIE['sql_log']) ? \TorrentPier\Legacy\Dev::get_sql_log() : '';
$sql_log = !empty($_COOKIE['sql_log']) ? \TorrentPier\Dev::get_sql_log() : '';
if ($sql_log) {
echo '<div class="sqlLog" id="sqlLog">' . ($sql_log ?: '') . '</div><!-- / sqlLog --><br clear="all" />';

177
src/Dev.php Normal file
View file

@ -0,0 +1,177 @@
<?php
/**
* TorrentPier Bull-powered BitTorrent tracker engine
*
* @copyright Copyright (c) 2005-2023 TorrentPier (https://torrentpier.com)
* @link https://github.com/torrentpier/torrentpier for the canonical source repository
* @license https://github.com/torrentpier/torrentpier/blob/master/LICENSE MIT License
*/
namespace TorrentPier;
use Bugsnag\Client;
use Bugsnag\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\BrowserConsoleHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Whoops\Handler\PlainTextHandler;
use Whoops\Handler\PrettyPageHandler;
use Whoops\Run;
use Exception;
/**
* Class Dev
* @package TorrentPier
*/
class Dev
{
/**
* Base debug functionality init
*
* @return void
*/
public static function debug_init(): void
{
global $bb_cfg;
if ($bb_cfg['bugsnag']['enabled']) {
if (env('APP_ENV', 'production') !== 'local') {
$bugsnag = Client::make($bb_cfg['bugsnag']['api_key']);
Handler::register($bugsnag);
}
} else {
if (DBG_USER) {
$whoops = new Run;
/**
* Show errors on page
*/
$whoops->pushHandler(new PrettyPageHandler);
/**
* Show log in browser console
*/
$loggingInConsole = new PlainTextHandler();
$loggingInConsole->loggerOnly(true);
$loggingInConsole->setLogger((new Logger(getenv('APP_NAME', 'TorrentPier'), [(new BrowserConsoleHandler())->setFormatter((new LineFormatter(null, null, true)))])));
$whoops->pushHandler($loggingInConsole);
/**
* Log errors in file
*/
if (ini_get('log_errors') == 1) {
$loggingInFile = new PlainTextHandler();
$loggingInFile->loggerOnly(true);
$loggingInFile->setLogger((new Logger(getenv('APP_NAME', 'TorrentPier'), [(new StreamHandler(bb_log('', WHOOPS_LOG_FILE, true)))->setFormatter((new LineFormatter(null, null, true)))])));
$whoops->pushHandler($loggingInFile);
}
$whoops->register();
}
}
}
/**
* Get SQL debug log
*
* @return string
* @throws Exception
*/
public static function get_sql_log(): string
{
global $DBS, $CACHES, $datastore;
$log = '';
foreach ($DBS->srv as $srv_name => $db_obj) {
$log .= !empty($db_obj) ? self::get_sql_log_html($db_obj, "$srv_name [MySQL]") : '';
}
foreach ($CACHES->obj as $cache_name => $cache_obj) {
if (!empty($cache_obj->db)) {
$log .= self::get_sql_log_html($cache_obj->db, "cache: $cache_name [{$cache_obj->db->engine}]");
} elseif (!empty($cache_obj->engine)) {
$log .= self::get_sql_log_html($cache_obj, "cache: $cache_name [{$cache_obj->engine}]");
}
}
if (!empty($datastore->db->dbg)) {
$log .= self::get_sql_log_html($datastore->db, 'cache: datastore [' . $datastore->engine . ']');
} elseif (!empty($datastore->dbg)) {
$log .= self::get_sql_log_html($datastore, 'cache: datastore [' . $datastore->engine . ']');
}
return $log;
}
/**
* Sql debug status
*
* @return bool
*/
public static function sql_dbg_enabled(): bool
{
return (SQL_DEBUG && DBG_USER && !empty($_COOKIE['sql_log']));
}
/**
* Short query
*
* @param string $sql
* @param bool $esc_html
* @return string
*/
public static function short_query(string $sql, bool $esc_html = false): string
{
$max_len = 100;
$sql = str_compact($sql);
if (!empty($_COOKIE['sql_log_full'])) {
if (mb_strlen($sql, 'UTF-8') > $max_len) {
$sql = mb_substr($sql, 0, 50) . ' [...cut...] ' . mb_substr($sql, -50);
}
}
return $esc_html ? htmlCHR($sql, true) : $sql;
}
/**
* Get SQL query html log
*
* @param object $db_obj
* @param string $log_name
*
* @return string
* @throws Exception
*/
private static function get_sql_log_html(object $db_obj, string $log_name): string
{
$log = '';
foreach ($db_obj->dbg as $i => $dbg) {
$id = "sql_{$i}_" . random_int(0, mt_getrandmax());
$sql = self::short_query($dbg['sql'], true);
$time = sprintf('%.4f', $dbg['time']);
$perc = @sprintf('[%2d]', $dbg['time'] * 100 / $db_obj->sql_timetotal);
$info = !empty($dbg['info']) ? $dbg['info'] . ' [' . $dbg['src'] . ']' : $dbg['src'];
$log .= ''
. '<div onmouseout="$(this).removeClass(\'sqlHover\');" onmouseover="$(this).addClass(\'sqlHover\');" onclick="$(this).toggleClass(\'sqlHighlight\');" class="sqlLogRow" title="' . $info . '">'
. '<span style="letter-spacing: -1px;">' . $time . ' </span>'
. '<span class="copyElement" data-clipboard-target="#' . $id . '" title="Copy to clipboard" style="color: gray; letter-spacing: -1px;">' . $perc . '</span>'
. ' '
. '<span style="letter-spacing: 0;" id="' . $id . '">' . $sql . '</span>'
. '<span style="color: gray"> # ' . $info . ' </span>'
. '</div>'
. "\n";
}
return '
<div class="sqlLogTitle">' . $log_name . '</div>
' . $log . '
';
}
}

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy;
use TorrentPier\Dev;
/**
* Class Ajax
* @package TorrentPier\Legacy

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Cache;
use TorrentPier\Dev;
/**
* Class Common
* @package TorrentPier\Legacy\Cache
@ -67,7 +69,7 @@ class Common
if ($mode == 'start') {
$this->sql_starttime = utime();
$dbg['sql'] = isset($cur_query) ? short_query($cur_query) : short_query($this->cur_query);
$dbg['sql'] = Dev::short_query($cur_query ?? $this->cur_query);
$dbg['src'] = $this->debug_find_source();
$dbg['file'] = $this->debug_find_source('file');
$dbg['line'] = $this->debug_find_source('line');

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Cache;
use TorrentPier\Dev;
/**
* Class File
* @package TorrentPier\Legacy\Cache
@ -24,7 +26,7 @@ class File extends Common
{
$this->dir = $dir;
$this->prefix = $prefix;
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function get($name, $get_miss_key_callback = '', $ttl = 0)

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Cache;
use TorrentPier\Dev;
/**
* Class Memcache
* @package TorrentPier\Legacy\Cache
@ -31,7 +33,7 @@ class Memcache extends Common
$this->cfg = $cfg;
$this->prefix = $prefix;
$this->memcache = new \Memcache();
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function connect()

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Cache;
use TorrentPier\Dev;
/**
* Class Redis
* @package TorrentPier\Legacy\Cache
@ -31,7 +33,7 @@ class Redis extends Common
$this->cfg = $cfg;
$this->prefix = $prefix;
$this->redis = new \Redis();
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function connect()

View file

@ -10,6 +10,7 @@
namespace TorrentPier\Legacy\Cache;
use SQLite3;
use TorrentPier\Dev;
/**
* Class SqliteCommon
@ -37,7 +38,7 @@ class SqliteCommon extends Common
public function __construct($cfg)
{
$this->cfg = array_merge($this->cfg, $cfg);
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function connect()

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Datastore;
use TorrentPier\Dev;
/**
* Class Common
* @package TorrentPier\Legacy\Datastore
@ -142,7 +144,7 @@ class Common
if ($mode == 'start') {
$this->sql_starttime = utime();
$dbg['sql'] = isset($cur_query) ? short_query($cur_query) : short_query($this->cur_query);
$dbg['sql'] = Dev::short_query($cur_query ?? $this->cur_query);
$dbg['src'] = $this->debug_find_source();
$dbg['file'] = $this->debug_find_source('file');
$dbg['line'] = $this->debug_find_source('line');

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Datastore;
use TorrentPier\Dev;
/**
* Class File
* @package TorrentPier\Legacy\Datastore
@ -23,7 +25,7 @@ class File extends Common
{
$this->prefix = $prefix;
$this->dir = $dir;
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function store($title, $var)

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Datastore;
use TorrentPier\Dev;
/**
* Class Memcache
* @package TorrentPier\Legacy\Datastore
@ -30,7 +32,7 @@ class Memcache extends Common
$this->cfg = $cfg;
$this->prefix = $prefix;
$this->memcache = new \Memcache();
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function connect()

View file

@ -9,6 +9,8 @@
namespace TorrentPier\Legacy\Datastore;
use TorrentPier\Dev;
/**
* Class Redis
* @package TorrentPier\Legacy\Datastore
@ -29,7 +31,7 @@ class Redis extends Common
$this->cfg = $cfg;
$this->redis = new \Redis();
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
$this->prefix = $prefix;
}

View file

@ -10,6 +10,7 @@
namespace TorrentPier\Legacy\Datastore;
use SQLite3;
use TorrentPier\Dev;
/**
* Class SqliteCommon
@ -37,7 +38,7 @@ class SqliteCommon extends Common
public function __construct($cfg)
{
$this->cfg = array_merge($this->cfg, $cfg);
$this->dbg_enabled = sql_dbg_enabled();
$this->dbg_enabled = Dev::sql_dbg_enabled();
}
public function connect()

View file

@ -1,84 +0,0 @@
<?php
/**
* TorrentPier Bull-powered BitTorrent tracker engine
*
* @copyright Copyright (c) 2005-2023 TorrentPier (https://torrentpier.com)
* @link https://github.com/torrentpier/torrentpier for the canonical source repository
* @license https://github.com/torrentpier/torrentpier/blob/master/LICENSE MIT License
*/
namespace TorrentPier\Legacy;
/**
* Class Dev
* @package TorrentPier\Legacy
*/
class Dev
{
/**
* Get SQL debug log
*
* @return string
*/
public static function get_sql_log()
{
global $DBS, $CACHES, $datastore;
$log = '';
foreach ($DBS->srv as $srv_name => $db_obj) {
$log .= !empty($db_obj) ? self::get_sql_log_html($db_obj, "$srv_name [MySQL]") : '';
}
foreach ($CACHES->obj as $cache_name => $cache_obj) {
if (!empty($cache_obj->db)) {
$log .= self::get_sql_log_html($cache_obj->db, "cache: $cache_name [{$cache_obj->db->engine}]");
} elseif (!empty($cache_obj->engine)) {
$log .= self::get_sql_log_html($cache_obj, "cache: $cache_name [{$cache_obj->engine}]");
}
}
if (!empty($datastore->db->dbg)) {
$log .= self::get_sql_log_html($datastore->db, 'cache: datastore [' . $datastore->engine . ']');
} elseif (!empty($datastore->dbg)) {
$log .= self::get_sql_log_html($datastore, 'cache: datastore [' . $datastore->engine . ']');
}
return $log;
}
/**
* Get SQL query html log
*
* @param object $db_obj
* @param string $log_name
*
* @return string
*/
private static function get_sql_log_html($db_obj, $log_name)
{
$log = '';
foreach ($db_obj->dbg as $i => $dbg) {
$id = "sql_{$i}_" . random_int(0, mt_getrandmax());
$sql = short_query($dbg['sql'], true);
$time = sprintf('%.4f', $dbg['time']);
$perc = @sprintf('[%2d]', $dbg['time'] * 100 / $db_obj->sql_timetotal);
$info = !empty($dbg['info']) ? $dbg['info'] . ' [' . $dbg['src'] . ']' : $dbg['src'];
$log .= ''
. '<div onmouseout="$(this).removeClass(\'sqlHover\');" onmouseover="$(this).addClass(\'sqlHover\');" onclick="$(this).toggleClass(\'sqlHighlight\');" class="sqlLogRow" title="' . $info . '">'
. '<span style="letter-spacing: -1px;">' . $time . ' </span>'
. '<span class="copyElement" data-clipboard-target="#' . $id . '" title="Copy to clipboard" style="color: gray; letter-spacing: -1px;">' . $perc . '</span>'
. ' '
. '<span style="letter-spacing: 0;" id="' . $id . '">' . $sql . '</span>'
. '<span style="color: gray"> # ' . $info . ' </span>'
. '</div>'
. "\n";
}
return '
<div class="sqlLogTitle">' . $log_name . '</div>
' . $log . '
';
}
}

View file

@ -11,6 +11,7 @@ namespace TorrentPier\Legacy;
use mysqli_result;
use TorrentPier\Common\Http;
use TorrentPier\Dev;
/**
* Class SqlDb
@ -58,7 +59,7 @@ class SqlDb
global $DBS;
$this->cfg = array_combine($this->cfg_keys, $cfg_values);
$this->dbg_enabled = (sql_dbg_enabled() || !empty($_COOKIE['explain']));
$this->dbg_enabled = (Dev::sql_dbg_enabled() || !empty($_COOKIE['explain']));
$this->do_explain = ($this->dbg_enabled && !empty($_COOKIE['explain']));
$this->slow_time = SQL_SLOW_QUERY_TIME;
@ -896,7 +897,7 @@ class SqlDb
$msg[] = sprintf('%-4s', round(sys('la'), 1));
$msg[] = sprintf('%05d', getmypid());
$msg[] = $this->db_server;
$msg[] = short_query($this->cur_query);
$msg[] = Dev::short_query($this->cur_query);
$msg = implode(LOG_SEPR, $msg);
$msg .= ($info = $this->query_info()) ? ' # ' . $info : '';
$msg .= ' # ' . $this->debug_find_source() . ' ';
@ -1001,7 +1002,7 @@ class SqlDb
</tr>
<tr><td colspan="2">' . $this->explain_hold . '</td></tr>
</table>
<div class="sqlLog"><div id="' . $htid . '" class="sqlLogRow sqlExplain" style="padding: 0;">' . short_query($dbg['sql'], true) . '&nbsp;&nbsp;</div></div>
<div class="sqlLog"><div id="' . $htid . '" class="sqlLogRow sqlExplain" style="padding: 0;">' . Dev::short_query($dbg['sql'], true) . '&nbsp;&nbsp;</div></div>
<br />';
break;