From ed0a64badb8b01f070b10723950279391a2230eb Mon Sep 17 00:00:00 2001 From: glix08 Date: Mon, 27 Jun 2011 21:37:28 +0000 Subject: [PATCH] r24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Экспорт. Коммит №23. Поправил php анонсер. _Xz_. git-svn-id: https://torrentpier2.googlecode.com/svn/trunk@24 a8ac35ab-4ca4-ca47-4c2d-a49a94f06293 --- upload/bt/announce.php | 317 +++++++++++++++++++++++++- upload/bt/includes/init_tr.php | 264 ++++++++------------- upload/bt/includes/tr_announcer.php | 248 -------------------- upload/bt/includes/tr_ratio.php | 76 ------ upload/bt/includes/tr_scraper.php | 25 -- upload/bt/scrape.php | 21 +- upload/templates/default/css/main.css | 18 +- 7 files changed, 440 insertions(+), 529 deletions(-) delete mode 100644 upload/bt/includes/tr_announcer.php delete mode 100644 upload/bt/includes/tr_ratio.php delete mode 100644 upload/bt/includes/tr_scraper.php diff --git a/upload/bt/announce.php b/upload/bt/announce.php index 25b949875..3cda7ff00 100644 --- a/upload/bt/announce.php +++ b/upload/bt/announce.php @@ -162,8 +162,6 @@ function drop_fast_announce ($lp_info) return; // if announce interval correct } - if (DBG_LOG) dbg_log(' ', 'drop_fast_announce-'. (!empty(DB()) ? 'DB' : 'CACHE')); - $new_ann_intrv = $lp_info['update_time'] + $announce_interval - TIMENOW; dummy_exit($new_ann_intrv); @@ -190,5 +188,318 @@ function msg_die ($msg) // Start announcer define('TR_ROOT', './'); require(TR_ROOT .'includes/init_tr.php'); -require(TR_ROOT .'includes/tr_announcer.php'); + +$seeder = ($left == 0) ? 1 : 0; +$stopped = ($event === 'stopped'); + +// Stopped event +if ($stopped) +{ + CACHE('tr_cache')->rm(PEER_HASH_PREFIX . $peer_hash); + if (DBG_LOG) dbg_log(' ', 'stopped'); +} + +// Get last peer info from DB +if (!CACHE('tr_cache')->used && !$lp_info) +{ + $lp_info = DB()->fetch_row(" + SELECT * FROM ". BB_BT_TRACKER ." WHERE peer_hash = '$peer_hash' LIMIT 1 + "); + + if (DBG_LOG) dbg_log(' ', '$lp_info-get_from-DB-'. ($lp_info ? 'hit' : 'miss')); +} + +if ($lp_info) +{ + if (!$stopped) + { + drop_fast_announce($lp_info); + } + + $user_id = $lp_info['user_id']; + $topic_id = $lp_info['topic_id']; + $releaser = $lp_info['releaser']; + $tor_type = $lp_info['tor_type']; +} +else +{ + // Verify if torrent registered on tracker and user authorized + $info_hash_sql = rtrim(DB()->escape($info_hash), ' '); + $passkey_sql = DB()->escape($passkey); + + $sql = " + SELECT tor.topic_id, tor.poster_id, tor.tor_type, u.* + FROM ". BB_BT_TORRENTS ." tor + LEFT JOIN ". BB_BT_USERS ." u ON u.auth_key = '$passkey_sql' + WHERE tor.info_hash = '$info_hash_sql' + LIMIT 1 + "; + + $row = DB()->fetch_row($sql); + + if (empty($row['topic_id'])) + { + msg_die('Torrent not registered, info_hash = ' . bin2hex($info_hash_sql)); + } + if (empty($row['user_id'])) + { + msg_die('Please LOG IN and REDOWNLOAD this torrent (user not found)'); + } + + $user_id = $row['user_id']; + $topic_id = $row['topic_id']; + $releaser = (int) ($user_id == $row['poster_id']); + $tor_type = $row['tor_type']; + + // Ratio limits + if ((TR_RATING_LIMITS || $tr_cfg['limit_concurrent_ips']) && !$stopped) + { + $user_ratio = ($row['u_down_total'] && $row['u_down_total'] > MIN_DL_FOR_RATIO) ? ($row['u_up_total'] + $row['u_up_release'] + $row['u_up_bonus']) / $row['u_down_total'] : 1; + $rating_msg = ''; + + if (!$seeder) + { + foreach ($rating_limits as $ratio => $limit) + { + if ($user_ratio < $ratio) + { + $tr_cfg['limit_active_tor'] = 1; + $tr_cfg['limit_leech_count'] = $limit; + $rating_msg = " (ratio < $ratio)"; + break; + } + } + } + + // Limit active torrents + if (!isset($bb_cfg['unlimited_users'][$user_id]) && $tr_cfg['limit_active_tor'] && (($tr_cfg['limit_seed_count'] && $seeder) || ($tr_cfg['limit_leech_count'] && !$seeder))) + { + $sql = "SELECT COUNT(DISTINCT topic_id) AS active_torrents + FROM ". BB_BT_TRACKER ." + WHERE user_id = $user_id + AND seeder = $seeder + AND topic_id != $topic_id"; + + if (!$seeder && $tr_cfg['leech_expire_factor'] && $user_ratio < 0.5) + { + $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); + } + $sql .= " GROUP BY user_id"; + + if ($row = DB()->fetch_row($sql)) + { + if ($seeder && $tr_cfg['limit_seed_count'] && $row['active_torrents'] >= $tr_cfg['limit_seed_count']) + { + msg_die('Only '. $tr_cfg['limit_seed_count'] .' torrent(s) allowed for seeding'); + } + else if (!$seeder && $tr_cfg['limit_leech_count'] && $row['active_torrents'] >= $tr_cfg['limit_leech_count']) + { + msg_die('Only '. $tr_cfg['limit_leech_count'] .' torrent(s) allowed for leeching'. $rating_msg); + } + } + } + + // Limit concurrent IPs + if ($tr_cfg['limit_concurrent_ips'] && (($tr_cfg['limit_seed_ips'] && $seeder) || ($tr_cfg['limit_leech_ips'] && !$seeder))) + { + $sql = "SELECT COUNT(DISTINCT ip) AS ips + FROM ". BB_BT_TRACKER ." + WHERE topic_id = $topic_id + AND user_id = $user_id + AND seeder = $seeder + AND ip != '$ip_sql'"; + + if (!$seeder && $tr_cfg['leech_expire_factor']) + { + $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); + } + $sql .= " GROUP BY topic_id"; + + if ($row = DB()->fetch_row($sql)) + { + if ($seeder && $tr_cfg['limit_seed_ips'] && $row['ips'] >= $tr_cfg['limit_seed_ips']) + { + msg_die('You can seed only from '. $tr_cfg['limit_seed_ips'] ." IP's"); + } + else if (!$seeder && $tr_cfg['limit_leech_ips'] && $row['ips'] >= $tr_cfg['limit_leech_ips']) + { + msg_die('You can leech only from '. $tr_cfg['limit_leech_ips'] ." IP's"); + } + } + } + } +} + +// Up/Down speed +$speed_up = $speed_down = 0; + +if ($lp_info && $lp_info['update_time'] < TIMENOW) +{ + if ($uploaded > $lp_info['uploaded']) + { + $speed_up = ceil(($uploaded - $lp_info['uploaded']) / (TIMENOW - $lp_info['update_time'])); + } + if ($downloaded > $lp_info['downloaded']) + { + $speed_down = ceil(($downloaded - $lp_info['downloaded']) / (TIMENOW - $lp_info['update_time'])); + } +} + +// Up/Down addition +$up_add = ($lp_info && $uploaded > $lp_info['uploaded']) ? $uploaded - $lp_info['uploaded'] : 0; +$down_add = ($lp_info && $downloaded > $lp_info['downloaded']) ? $downloaded - $lp_info['downloaded'] : 0; + +// Gold/Silver releases +if ($bb_cfg['gold_silver_enabled'] && $down_add) +{ + if ($tor_type == TOR_TYPE_GOLD) + { + $down_add = 0; + } + // Silver releases + else if ($tor_type == TOR_TYPE_SILVER) + { + $down_add = ceil($down_add/2); + } +} + +// Insert/update peer info +$peer_info_updated = false; +$update_time = ($stopped) ? 0 : TIMENOW; + +if ($lp_info) +{ + $sql = "UPDATE ". BB_BT_TRACKER ." SET update_time = $update_time"; + + $sql .= ", seeder = $seeder"; + $sql .= ($releaser != $lp_info['releaser']) ? ", releaser = $releaser" : ''; + + $sql .= ($tor_type != $lp_info['tor_type']) ? ", tor_type = $tor_type" : ''; + + $sql .= ($uploaded != $lp_info['uploaded']) ? ", uploaded = $uploaded" : ''; + $sql .= ($downloaded != $lp_info['downloaded']) ? ", downloaded = $downloaded" : ''; + $sql .= ", remain = $left"; + + $sql .= ($up_add) ? ", up_add = up_add + $up_add" : ''; + $sql .= ($down_add) ? ", down_add = down_add + $down_add" : ''; + + $sql .= ", speed_up = $speed_up"; + $sql .= ", speed_down = $speed_down"; + + $sql .= " WHERE peer_hash = '$peer_hash'"; + $sql .= " LIMIT 1"; + + DB()->query($sql); + + $peer_info_updated = DB()->affected_rows(); + + if (DBG_LOG) dbg_log(' ', 'this_peer-update'. ($peer_info_updated ? '' : '-FAIL')); +} + +if (!$lp_info || !$peer_info_updated) +{ + $columns = 'peer_hash, topic_id, user_id, ip, port, seeder, releaser, tor_type, uploaded, downloaded, remain, speed_up, speed_down, up_add, down_add, update_time'; + $values = "'$peer_hash', $topic_id, $user_id, '$ip_sql', $port, $seeder, $releaser, $tor_type, $uploaded, $downloaded, $left, $speed_up, $speed_down, $up_add, $down_add, $update_time"; + + DB()->query("REPLACE INTO ". BB_BT_TRACKER ." ($columns) VALUES ($values)"); + + if (DBG_LOG) dbg_log(' ', 'this_peer-insert'); +} + +// Exit if stopped +if ($stopped) +{ + silent_exit(); +} + +// Store peer info in cache +$lp_info = array( + 'downloaded' => (float) $downloaded, + 'releaser' => (int) $releaser, + 'seeder' => (int) $seeder, + 'topic_id' => (int) $topic_id, + 'update_time' => (int) TIMENOW, + 'uploaded' => (float) $uploaded, + 'user_id' => (int) $user_id, + 'tor_type' => (int) $tor_type, +); + +$lp_info_cached = CACHE('tr_cache')->set(PEER_HASH_PREFIX . $peer_hash, $lp_info, PEER_HASH_EXPIRE); + +if (DBG_LOG && !$lp_info_cached) dbg_log(' ', '$lp_info-caching-FAIL'); + +// Get cached output +$output = CACHE('tr_cache')->get(PEERS_LIST_PREFIX . $topic_id); + +if (DBG_LOG) dbg_log(' ', '$output-get_from-CACHE-'. ($output !== false ? 'hit' : 'miss')); + +if (!$output) +{ + // Retrieve peers + $numwant = (int) $tr_cfg['numwant']; + $compact_mode = ($tr_cfg['compact_mode'] || !empty($compact)); + + $rowset = DB()->fetch_rowset(" + SELECT ip, port + FROM ". BB_BT_TRACKER ." + WHERE topic_id = $topic_id + ORDER BY RAND() + LIMIT $numwant + "); + + if ($compact_mode) + { + $peers = ''; + + foreach ($rowset as $peer) + { + $peers .= pack('Nn', ip2long(decode_ip($peer['ip'])), $peer['port']); + } + } + else + { + $peers = array(); + + foreach ($rowset as $peer) + { + $peers[] = array( + 'ip' => decode_ip($peer['ip']), + 'port' => intval($peer['port']), + ); + } + } + + $seeders = 0; + $leechers = 0; + + if ($tr_cfg['scrape']) + { + $row = DB()->fetch_row(" + SELECT seeders, leechers + FROM ". BB_BT_TRACKER_SNAP ." + WHERE topic_id = $topic_id + LIMIT 1 + "); + + $seeders = $row['seeders']; + $leechers = $row['leechers']; + } + + $output = array( + 'interval' => (int) $announce_interval, + 'min interval' => (int) $announce_interval, + 'peers' => $peers, + 'complete' => (int) $seeders, + 'incomplete' => (int) $leechers, + ); + + $peers_list_cached = CACHE('tr_cache')->set(PEERS_LIST_PREFIX . $topic_id, $output, PEERS_LIST_EXPIRE); + + if (DBG_LOG && !$peers_list_cached) dbg_log(' ', '$output-caching-FAIL'); +} + +// Return data to client +echo bencode($output); + +tracker_exit(); exit; \ No newline at end of file diff --git a/upload/bt/includes/init_tr.php b/upload/bt/includes/init_tr.php index 394872a12..86ed7e9e7 100644 --- a/upload/bt/includes/init_tr.php +++ b/upload/bt/includes/init_tr.php @@ -5,12 +5,7 @@ if (!defined('IN_TRACKER')) die(basename(__FILE__)); // Exit if tracker is disabled if ($tr_cfg['off']) { - msg_die($tr_cfg['off_reason']); -} -// Redirect browser -if ($tr_cfg['browser_redirect_url']) -{ - browser_redirect(); + tr_die($tr_cfg['off_reason']); } // @@ -20,29 +15,24 @@ function tracker_exit () { global $DBS; - if (DBG_LOG) + if (DBG_LOG && DBG_LOG_GENTIME) { - $gen_time = utime() - TIMESTART; - $num_queries = !empty($DBS) ? DB()->num_queries : '-'; - $sql_inittime = !empty($DBS) ? DB()->sql_inittime : ' -- '; - $sql_timetotal = !empty($DBS) ? DB()->sql_timetotal : ' -- '; - $sql_init_perc = !empty($DBS) ? round($sql_inittime*100/$gen_time) : ' - '; - $sql_total_perc = !empty($DBS) ? round($sql_timetotal*100/$gen_time) : ' - '; + if ($gen_time = utime() - TIMESTART) + { + $sql_init_perc = round($DBS->sql_inittime*100/$gen_time); + $sql_total_perc = round($DBS->sql_timetotal*100/$gen_time); - $str = array(); - $str[] = substr(time(), -4, 4); - $str[] = sprintf('%.4f', $gen_time); - $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $sql_inittime, $sql_init_perc); - $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $sql_timetotal, $sql_total_perc); - $str[] = $num_queries; - $str[] = sprintf('%.1f', LOADAVG); - $str = join(LOG_SEPR, $str) . LOG_LF; - dbg_log($str, '!!gentime'); + $str = array(); + $str[] = substr(time(), -4, 4); + $str[] = sprintf('%.4f', $gen_time); + $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $DBS->sql_inittime, $sql_init_perc); + $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $DBS->sql_timetotal, $sql_total_perc); + $str[] = $DBS->num_queries; + $str[] = sprintf('%.1f', sys('la')); + $str = join(LOG_SEPR, $str) . LOG_LF; + dbg_log($str, '!!gentime'); + } } -/**!/ - bb_log("##\n". ob_get_contents() ."\n##", 'tr_output_'. date('m-d_H')); -#*/ - exit; } @@ -67,129 +57,105 @@ function error_exit ($msg = '') tracker_exit(); } -function browser_redirect () -{ - if (empty($_SERVER['HTTP_USER_AGENT'])) return; - - $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); - - $browser_ids = array( - 'amaya', - 'crawler', - 'dillo', - 'elinks', - 'gecko', - 'googlebot', - 'ibrowse', - 'icab', - 'konqueror', - 'lynx', - 'mozilla', - 'msie', - 'msnbot', - 'netpositive', - 'omniweb', - 'opera', - 'safari', - 'slurp', - 'w3m', - 'wget', - ); - - foreach ($browser_ids as $browser) - { - if (strpos($user_agent, $browser) !== false) - { - if (DBG_LOG) - { - dbg_log(' ', "redirect/$browser"); - - dbg_log( - TIMENOW . LOG_SEPR . - encode_ip($_SERVER['REMOTE_ADDR']) . LOG_SEPR . - $_SERVER['REMOTE_ADDR'] . LOG_SEPR . - $_SERVER['QUERY_STRING'] . LOG_SEPR . - $_SERVER['HTTP_USER_AGENT'] . LOG_SEPR . - LOG_LF, - "redirect/$browser.q.log" - ); - } - - header('Location: '. $GLOBALS['tr_cfg']['browser_redirect_url']); - tracker_exit(); - } - } -} - // Database class sql_db { + var $cfg = array(); + var $cfg_keys = array('dbhost', 'dbname', 'dbuser', 'dbpasswd', 'charset', 'persist'); var $link = null; var $result = null; + var $db_server = ''; var $selected_db = null; - var $pconnect = false; var $locked = false; var $num_queries = 0; var $sql_starttime = 0; var $sql_inittime = 0; var $sql_timetotal = 0; + var $sql_last_time = 0; + var $slow_time = 0; var $dbg = array(); var $dbg_id = 0; - var $dbg_user = false; + var $dbg_enabled = false; var $cur_query = null; + var $DBS = array(); + /** * Constructor */ - function sql_db ($cfg) + function sql_db ($cfg_values) { - $this->dbg_user = (SQL_DEBUG && $cfg['dbg_user']); - $this->pconnect = $cfg['persist']; + global $DBS; + $this->cfg = array_combine($this->cfg_keys, $cfg_values); + $this->dbg_enabled = sql_dbg_enabled(); + $this->slow_time = SQL_SLOW_QUERY_TIME; + + $this->DBS['num_queries'] =& $DBS->num_queries; + $this->DBS['sql_inittime'] =& $DBS->sql_inittime; + $this->DBS['sql_timetotal'] =& $DBS->sql_timetotal; + } + + /** + * Initialize connection + */ + function init () + { // Connect to server - $this->link = @$this->connect($cfg); + $this->link = $this->connect(); // Select database - $this->selected_db = @$this->select_db($cfg); + $this->selected_db = $this->select_db(); // Set charset - if ($cfg['charset'] && !@$this->sql_query("SET NAMES {$cfg['charset']}")) + if ($this->cfg['charset'] && !@mysql_set_charset($this->cfg['charset'], $this->link)) { - error_exit("Could not set MySQL charset '{$cfg['charset']}'"); + if (!$this->sql_query("SET NAMES {$this->cfg['charset']}")) + { + error_exit("Could not set charset {$this->cfg['charset']}"); + } } $this->num_queries = 0; $this->sql_inittime = $this->sql_timetotal; + $this->DBS['sql_inittime'] += $this->sql_inittime; } /** * Open connection */ - function connect ($cfg) + function connect () { $this->cur_query = 'connect'; $this->debug('start'); - $connect_type = ($this->pconnect) ? 'mysql_pconnect' : 'mysql_connect'; + $connect_type = ($this->cfg['persist']) ? 'mysql_pconnect' : 'mysql_connect'; - if (!$link = $connect_type($cfg['dbhost'], $cfg['dbuser'], $cfg['dbpasswd'])) + if (!$link = $connect_type($this->cfg['dbhost'], $this->cfg['dbuser'], $this->cfg['dbpasswd'])) { $this->log_error(); } - register_shutdown_function(array(&$this, 'sql_close')); + register_shutdown_function(array(&$this, 'close')); $this->debug('end'); $this->cur_query = null; - if (DBG_LOG) dbg_log(' ', 'DB-connect'. ($link ? '' : '-FAIL')); +# if (DBG_LOG) dbg_log(' ', 'DB-connect'. ($link ? '' : '-FAIL')); if (!$link) { - dummy_exit(1200); + if (function_exists('dummy_exit')) + { + dummy_exit(mt_rand(1200, 2400)); + } + else + { + die; + } } return $link; @@ -198,34 +164,36 @@ class sql_db /** * Select database */ - function select_db ($cfg) + function select_db () { $this->cur_query = 'select db'; $this->debug('start'); - if (!mysql_select_db($cfg['dbname'], $this->link)) + if (!mysql_select_db($this->cfg['dbname'], $this->link)) { $this->log_error(); - error_exit("Could not select database '{$cfg['dbname']}'"); + error_exit("Could not select database '{$this->cfg['dbname']}'"); } $this->debug('end'); $this->cur_query = null; - return $cfg['dbname']; + return $this->cfg['dbname']; } /** * Base query method */ - function sql_query ($query, $type = 'buffered') + function sql_query ($query) { + if (!is_resource($this->link)) + { + $this->init(); + } $this->cur_query = $query; $this->debug('start'); - $query_function = ($type === 'unbuffered') ? 'mysql_unbuffered_query' : 'mysql_query'; - - if (!$this->result = $query_function($query, $this->link)) + if (!$this->result = mysql_query($query, $this->link)) { $this->log_error(); } @@ -234,6 +202,7 @@ class sql_db $this->cur_query = null; $this->num_queries++; + $this->DBS['num_queries']++; return $this->result; } @@ -241,11 +210,11 @@ class sql_db /** * Execute query WRAPPER (with error handling) */ - function query ($query, $err_msg = '') + function query ($query) { if (!$result = $this->sql_query($query)) { - $this->trigger_error($err_msg); + $this->trigger_error(); } return $result; @@ -271,33 +240,33 @@ class sql_db */ function affected_rows () { - return (is_resource($this->link)) ? mysql_affected_rows($this->link) : -1; + return is_resource($this->link) ? mysql_affected_rows($this->link) : -1; } /** * Fetch current row */ - function sql_fetchrow ($result, $result_type = MYSQL_ASSOC) + function sql_fetchrow ($result) { - return (is_resource($result)) ? mysql_fetch_array($result, $result_type) : false; + return is_resource($result) ? mysql_fetch_assoc($result) : false; } /** * Alias of sql_fetchrow() */ - function fetch_next ($result, $result_type = MYSQL_ASSOC) + function fetch_next ($result) { - return $this->sql_fetchrow($result, $result_type); + return $this->sql_fetchrow($result); } /** * Fetch row WRAPPER (with error handling) */ - function fetch_row ($query, $err_msg = '') + function fetch_row ($query) { if (!$result = $this->sql_query($query)) { - $this->trigger_error($err_msg); + $this->trigger_error(); } return $this->sql_fetchrow($result); @@ -306,11 +275,11 @@ class sql_db /** * Fetch all rows */ - function sql_fetchrowset ($result, $result_type = MYSQL_ASSOC) + function sql_fetchrowset ($result) { $rowset = array(); - while ($row = mysql_fetch_array($result, $result_type)) + while ($row = mysql_fetch_assoc($result)) { $rowset[] = $row; } @@ -321,11 +290,11 @@ class sql_db /** * Fetch all rows WRAPPER (with error handling) */ - function fetch_rowset ($query, $err_msg = '') + function fetch_rowset ($query) { - if (!$result = $this->sql_query($query, 'buffered')) + if (!$result = $this->sql_query($query)) { - $this->trigger_error($err_msg); + $this->trigger_error(); } return $this->sql_fetchrowset($result); @@ -336,6 +305,10 @@ class sql_db */ function escape ($v, $check_type = false) { + if (!is_resource($this->link)) + { + $this->init(); + } if (!$check_type) { return mysql_real_escape_string($v); @@ -377,7 +350,7 @@ class sql_db /** * Close sql connection */ - function sql_close () + function close () { if (is_resource($this->link)) { @@ -386,7 +359,7 @@ class sql_db $this->link = $this->selected_db = null; - if (DBG_LOG) dbg_log(str_repeat(' ', $this->num_queries), 'DB-num_queries'); + if (DBG_LOG) dbg_log(str_repeat(' ', $this->num_queries), 'DB-num_queries-'. php_sapi_name()); } /** @@ -425,20 +398,22 @@ class sql_db if (SQL_CALC_QUERY_TIME || DBG_LOG || SQL_LOG_SLOW_QUERIES) { $this->sql_starttime = utime(); + $this->sql_last_time = 0; } } else if ($mode == 'end') { if (SQL_CALC_QUERY_TIME || DBG_LOG || SQL_LOG_SLOW_QUERIES) { - $cur_query_time = utime() - $this->sql_starttime; - $this->sql_timetotal += $cur_query_time; + $this->sql_last_time = utime() - $this->sql_starttime; + $this->sql_timetotal += $this->sql_last_time; + $this->DBS['sql_timetotal'] += $this->sql_last_time; - if (SQL_LOG_SLOW_QUERIES && $cur_query_time > SQL_SLOW_QUERY_TIME) + if (SQL_LOG_SLOW_QUERIES && $this->sql_last_time > $this->slow_time) { $msg = date('m-d H:i:s') . LOG_SEPR; - $msg .= sprintf('%03d', round($cur_query_time)); - $msg .= defined('LOADAVG') ? LOG_SEPR . sprintf('%.1f', LOADAVG) : ''; + $msg .= sprintf('%03d', round($this->sql_last_time)); + $msg .= LOG_SEPR . sprintf('%.1f', sys('la')); $msg .= LOG_SEPR . str_compact($this->cur_query); $msg .= LOG_SEPR .' # '. $this->query_info(); $msg .= LOG_SEPR . $this->debug_find_source(); @@ -484,7 +459,7 @@ class sql_db { if ($trace['file'] !== __FILE__) { - $source = str_replace(BB_PATH . DIR_SEPR, '', $trace['file']) .'('. $trace['line'] .')'; + $source = str_replace(BB_PATH . DIRECTORY_SEPARATOR, '', $trace['file']) .'('. $trace['line'] .')'; break; } } @@ -518,42 +493,3 @@ class sql_db bb_log($msg, 'sql_error_tr'); } } - -// Make the database connection -function db_init () -{ - if (defined('SQL_LAYER')) - { - return; - } - define('SQL_LAYER', 'mysql'); - - DB() = new sql_db(array( - 'dbms' => DBMS, - 'dbhost' => DBHOST, - 'dbname' => DBNAME, - 'dbuser' => DBUSER, - 'dbpasswd' => DBPASSWD, - 'charset' => DBCHARSET, - 'collation' => DBCOLLATION, - 'persist' => PCONNECT, - 'dbg_user' => false, - )); -} - -##### LOG ##### // User req (by passkey) -if ($log_passkey && isset($log_passkey[$_GET[$passkey_key]])) -{ - bb_log( - md5($_GET['info_hash']) . LOG_SEPR . - date('His') . LOG_SEPR . - TIMENOW . LOG_SEPR . - $_SERVER['QUERY_STRING'] . LOG_SEPR . - $_SERVER['REMOTE_ADDR'] . LOG_SEPR . - @$_SERVER['HTTP_X_FORWARDED_FOR'] . LOG_SEPR . - @$_SERVER['HTTP_USER_AGENT'] . LOG_SEPR . - LOG_LF, - 'passkey_'. $log_passkey[$_GET[$passkey_key]] - ); -} -### LOG END ### \ No newline at end of file diff --git a/upload/bt/includes/tr_announcer.php b/upload/bt/includes/tr_announcer.php deleted file mode 100644 index f55607c18..000000000 --- a/upload/bt/includes/tr_announcer.php +++ /dev/null @@ -1,248 +0,0 @@ -rm(PEER_HASH_PREFIX . $peer_hash); - if (DBG_LOG) dbg_log(' ', 'stopped'); -} - -// Get last peer info from DB -if (!CACHE('tr_cache')->used && !$lp_info) -{ - $lp_info = DB()->fetch_row(" - SELECT * FROM ". BB_BT_TRACKER ." WHERE peer_hash = '$peer_hash' LIMIT 1 - "); - - if (DBG_LOG) dbg_log(' ', '$lp_info-get_from-DB-'. ($lp_info ? 'hit' : 'miss')); -} - -if ($lp_info) -{ - if (!$stopped) - { - drop_fast_announce($lp_info); - } - - $user_id = $lp_info['user_id']; - $topic_id = $lp_info['topic_id']; - $releaser = $lp_info['releaser']; - $tor_type = $lp_info['tor_type']; -} -else -{ - // Verify if torrent registered on tracker and user authorized - $info_hash_sql = rtrim(DB()->escape($info_hash), ' '); - $passkey_sql = DB()->escape($passkey); - - $sql = " - SELECT tor.topic_id, tor.poster_id, tor.tor_type, u.* - FROM ". BB_BT_TORRENTS ." tor - LEFT JOIN ". BB_BT_USERS ." u ON u.auth_key = '$passkey_sql' - WHERE tor.info_hash = '$info_hash_sql' - LIMIT 1 - "; - - $row = DB()->fetch_row($sql); - - if (empty($row['topic_id'])) - { - msg_die('Torrent not registered, info_hash = ' . bin2hex($info_hash_sql)); - } - if (empty($row['user_id'])) - { - msg_die('Please LOG IN and REDOWNLOAD this torrent (user not found)'); - } - - $user_id = $row['user_id']; - $topic_id = $row['topic_id']; - $releaser = (int) ($user_id == $row['poster_id']); - $tor_type = $row['tor_type']; - - // Ratio limits - if ((TR_RATING_LIMITS || $tr_cfg['limit_concurrent_ips']) && !$stopped) - { - $user_ratio = ($row['u_down_total'] && $row['u_down_total'] > MIN_DL_FOR_RATIO) ? ($row['u_up_total'] + $row['u_up_release'] + $row['u_up_bonus']) / $row['u_down_total'] : 1; - require(TR_ROOT .'includes/tr_ratio.php'); - } -} - -// Up/Down speed -$speed_up = $speed_down = 0; - -if ($lp_info && $lp_info['update_time'] < TIMENOW) -{ - if ($uploaded > $lp_info['uploaded']) - { - $speed_up = ceil(($uploaded - $lp_info['uploaded']) / (TIMENOW - $lp_info['update_time'])); - } - if ($downloaded > $lp_info['downloaded']) - { - $speed_down = ceil(($downloaded - $lp_info['downloaded']) / (TIMENOW - $lp_info['update_time'])); - } -} - -// Up/Down addition -$up_add = ($lp_info && $uploaded > $lp_info['uploaded']) ? $uploaded - $lp_info['uploaded'] : 0; -$down_add = ($lp_info && $downloaded > $lp_info['downloaded']) ? $downloaded - $lp_info['downloaded'] : 0; - -// Gold/Silver releases -if ($bb_cfg['gold_silver_enabled'] && $down_add) -{ - if ($tor_type == TOR_TYPE_GOLD) - { - $down_add = 0; - } - // Silver releases - else if ($tor_type == TOR_TYPE_SILVER) - { - $down_add = ceil($down_add/2); - } -} - -// Insert/update peer info -$peer_info_updated = false; -$update_time = ($stopped) ? 0 : TIMENOW; - -if ($lp_info) -{ - $sql = "UPDATE ". BB_BT_TRACKER ." SET update_time = $update_time"; - - $sql .= ", seeder = $seeder"; - $sql .= ($releaser != $lp_info['releaser']) ? ", releaser = $releaser" : ''; - - $sql .= ($tor_type != $lp_info['tor_type']) ? ", tor_type = $tor_type" : ''; - - $sql .= ($uploaded != $lp_info['uploaded']) ? ", uploaded = $uploaded" : ''; - $sql .= ($downloaded != $lp_info['downloaded']) ? ", downloaded = $downloaded" : ''; - $sql .= ", remain = $left"; - - $sql .= ($up_add) ? ", up_add = up_add + $up_add" : ''; - $sql .= ($down_add) ? ", down_add = down_add + $down_add" : ''; - - $sql .= ", speed_up = $speed_up"; - $sql .= ", speed_down = $speed_down"; - - $sql .= " WHERE peer_hash = '$peer_hash'"; - $sql .= " LIMIT 1"; - - DB()->query($sql); - - $peer_info_updated = DB()->affected_rows(); - - if (DBG_LOG) dbg_log(' ', 'this_peer-update'. ($peer_info_updated ? '' : '-FAIL')); -} - -if (!$lp_info || !$peer_info_updated) -{ - $columns = 'peer_hash, topic_id, user_id, ip, port, seeder, releaser, tor_type, uploaded, downloaded, remain, speed_up, speed_down, up_add, down_add, update_time'; - $values = "'$peer_hash', $topic_id, $user_id, '$ip_sql', $port, $seeder, $releaser, $tor_type, $uploaded, $downloaded, $left, $speed_up, $speed_down, $up_add, $down_add, $update_time"; - - DB()->query("REPLACE INTO ". BB_BT_TRACKER ." ($columns) VALUES ($values)"); - - if (DBG_LOG) dbg_log(' ', 'this_peer-insert'); -} - -// Exit if stopped -if ($stopped) -{ - silent_exit(); -} - -// Store peer info in cache -$lp_info = array( - 'downloaded' => (float) $downloaded, - 'releaser' => (int) $releaser, - 'seeder' => (int) $seeder, - 'topic_id' => (int) $topic_id, - 'update_time' => (int) TIMENOW, - 'uploaded' => (float) $uploaded, - 'user_id' => (int) $user_id, - 'tor_type' => (int) $tor_type, -); - -$lp_info_cached = CACHE('tr_cache')->set(PEER_HASH_PREFIX . $peer_hash, $lp_info, PEER_HASH_EXPIRE); - -if (DBG_LOG && !$lp_info_cached) dbg_log(' ', '$lp_info-caching-FAIL'); - -// Get cached output -$output = CACHE('tr_cache')->get(PEERS_LIST_PREFIX . $topic_id); - -if (DBG_LOG) dbg_log(' ', '$output-get_from-CACHE-'. ($output !== false ? 'hit' : 'miss')); - -if (!$output) -{ - // Retrieve peers - $numwant = (int) $tr_cfg['numwant']; - $compact_mode = ($tr_cfg['compact_mode'] || !empty($compact)); - - $rowset = DB()->fetch_rowset(" - SELECT ip, port - FROM ". BB_BT_TRACKER ." - WHERE topic_id = $topic_id - ORDER BY RAND() - LIMIT $numwant - "); - - if ($compact_mode) - { - $peers = ''; - - foreach ($rowset as $peer) - { - $peers .= pack('Nn', ip2long(decode_ip($peer['ip'])), $peer['port']); - } - } - else - { - $peers = array(); - - foreach ($rowset as $peer) - { - $peers[] = array( - 'ip' => decode_ip($peer['ip']), - 'port' => intval($peer['port']), - ); - } - } - - $seeders = 0; - $leechers = 0; - - if ($tr_cfg['scrape']) - { - $row = DB()->fetch_row(" - SELECT seeders, leechers - FROM ". BB_BT_TRACKER_SNAP ." - WHERE topic_id = $topic_id - LIMIT 1 - "); - - $seeders = $row['seeders']; - $leechers = $row['leechers']; - } - - $output = array( - 'interval' => (int) $announce_interval, - 'min interval' => (int) $announce_interval, - 'peers' => $peers, - 'complete' => (int) $seeders, - 'incomplete' => (int) $leechers, - ); - - $peers_list_cached = CACHE('tr_cache')->set(PEERS_LIST_PREFIX . $topic_id, $output, PEERS_LIST_EXPIRE); - - if (DBG_LOG && !$peers_list_cached) dbg_log(' ', '$output-caching-FAIL'); -} - -// Return data to client -echo bencode($output); - -tracker_exit(); diff --git a/upload/bt/includes/tr_ratio.php b/upload/bt/includes/tr_ratio.php deleted file mode 100644 index 4cc148f54..000000000 --- a/upload/bt/includes/tr_ratio.php +++ /dev/null @@ -1,76 +0,0 @@ - $limit) - { - if ($user_ratio < $ratio) - { - $tr_cfg['limit_active_tor'] = 1; - $tr_cfg['limit_leech_count'] = $limit; - $rating_msg = " (ratio < $ratio)"; - break; - } - } -} - -// Limit active torrents -if (!isset($bb_cfg['unlimited_users'][$user_id]) && $tr_cfg['limit_active_tor'] && (($tr_cfg['limit_seed_count'] && $seeder) || ($tr_cfg['limit_leech_count'] && !$seeder))) -{ - $sql = "SELECT COUNT(DISTINCT topic_id) AS active_torrents - FROM ". BB_BT_TRACKER ." - WHERE user_id = $user_id - AND seeder = $seeder - AND topic_id != $topic_id"; - - if (!$seeder && $tr_cfg['leech_expire_factor'] && $user_ratio < 0.5) - { - $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); - } - $sql .= " GROUP BY user_id"; - - if ($row = DB()->fetch_row($sql)) - { - if ($seeder && $tr_cfg['limit_seed_count'] && $row['active_torrents'] >= $tr_cfg['limit_seed_count']) - { - msg_die('Only '. $tr_cfg['limit_seed_count'] .' torrent(s) allowed for seeding'); - } - else if (!$seeder && $tr_cfg['limit_leech_count'] && $row['active_torrents'] >= $tr_cfg['limit_leech_count']) - { - msg_die('Only '. $tr_cfg['limit_leech_count'] .' torrent(s) allowed for leeching'. $rating_msg); - } - } -} - -// Limit concurrent IPs -if ($tr_cfg['limit_concurrent_ips'] && (($tr_cfg['limit_seed_ips'] && $seeder) || ($tr_cfg['limit_leech_ips'] && !$seeder))) -{ - $sql = "SELECT COUNT(DISTINCT ip) AS ips - FROM ". BB_BT_TRACKER ." - WHERE topic_id = $topic_id - AND user_id = $user_id - AND seeder = $seeder - AND ip != '$ip_sql'"; - - if (!$seeder && $tr_cfg['leech_expire_factor']) - { - $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); - } - $sql .= " GROUP BY topic_id"; - - if ($row = DB()->fetch_row($sql)) - { - if ($seeder && $tr_cfg['limit_seed_ips'] && $row['ips'] >= $tr_cfg['limit_seed_ips']) - { - msg_die('You can seed only from '. $tr_cfg['limit_seed_ips'] ." IP's"); - } - else if (!$seeder && $tr_cfg['limit_leech_ips'] && $row['ips'] >= $tr_cfg['limit_leech_ips']) - { - msg_die('You can leech only from '. $tr_cfg['limit_leech_ips'] ." IP's"); - } - } -} \ No newline at end of file diff --git a/upload/bt/includes/tr_scraper.php b/upload/bt/includes/tr_scraper.php deleted file mode 100644 index bc8776e67..000000000 --- a/upload/bt/includes/tr_scraper.php +++ /dev/null @@ -1,25 +0,0 @@ -escape($info_hash), ' '); - -$row = DB()->fetch_row(" - SELECT tor.complete_count, snap.seeders, snap.leechers - FROM ". BB_BT_TORRENTS ." tor - LEFT JOIN ". BB_BT_TRACKER_SNAP ." snap ON (snap.topic_id = tor.topic_id) - WHERE tor.info_hash = '$info_hash_sql' - LIMIT 1 -"); - -$output['files'][$info_hash] = array( - 'complete' => (int) $row['seeders'], - 'downloaded' => (int) $row['complete_count'], - 'incomplete' => (int) $row['leechers'], -); - -echo bencode($output); - -tracker_exit(); \ No newline at end of file diff --git a/upload/bt/scrape.php b/upload/bt/scrape.php index 15db1ebc4..f68835768 100644 --- a/upload/bt/scrape.php +++ b/upload/bt/scrape.php @@ -37,5 +37,24 @@ function msg_die ($msg) define('TR_ROOT', './'); require(TR_ROOT .'includes/init_tr.php'); -require(TR_ROOT .'includes/tr_scraper.php'); + +$info_hash_sql = rtrim(DB()->escape($info_hash), ' '); + +$row = DB()->fetch_row(" + SELECT tor.complete_count, snap.seeders, snap.leechers + FROM ". BB_BT_TORRENTS ." tor + LEFT JOIN ". BB_BT_TRACKER_SNAP ." snap ON (snap.topic_id = tor.topic_id) + WHERE tor.info_hash = '$info_hash_sql' + LIMIT 1 +"); + +$output['files'][$info_hash] = array( + 'complete' => (int) $row['seeders'], + 'downloaded' => (int) $row['complete_count'], + 'incomplete' => (int) $row['leechers'], +); + +echo bencode($output); + +tracker_exit(); exit; \ No newline at end of file diff --git a/upload/templates/default/css/main.css b/upload/templates/default/css/main.css index 7ab0998ac..f89486836 100644 --- a/upload/templates/default/css/main.css +++ b/upload/templates/default/css/main.css @@ -640,16 +640,12 @@ table.forums { width: 100%; } .last_topic { margin-top: 1px; white-space: nowrap; } .last_topic a { text-decoration: none; } .last_post_time { margin-top: 2px; font-size: 10px; white-space: nowrap; } - .last_time {} .last_author { padding-left: 3px; } .f_stat_inline { /* Posts: xx Topics: xx */ margin-top: 1px; white-space: nowrap; } .f_stat_topics {} .f_stat_posts { padding-left: 3px; } -.forums thead { /* Forum TH-Headers */ - display: none; -} .f_icon { /* Forum Icon cell */ width: 46px; padding: 6px 0 !important; @@ -671,14 +667,12 @@ table.forums { width: 100%; } } table.forums { border-collapse: collapse; } -.cat_title { border: 0 none; - border-top: 1px solid #B7C0C5; - border-bottom: 1px solid #C3CBD1; } -.f_tbl_wrap, #board_stats_wrap { - border: 0 none; } -.forums td.row1 { border: solid #FDFDFD; border-width: 0 1px 1px 0; } -.forums td.row2 { border: solid #F5F5F5; border-width: 0 1px 1px 0; } -td.f_titles { border-right-color: #FAFCFD !important; } +.cat_title { border: 1px solid #C3CBD1; } +.f_tbl_wrap, #board_stats_wrap { border: solid #C3CBD1; border-width: 0 1px; } +table.forums th { border-bottom: 1px solid #C3CBD1; } +.forums td.row1 { border: solid #C3CBD1; border-width: 0 1px 1px 0; } +.forums td.row2 { border: solid #C3CBD1; border-width: 0 1px 1px 0; } +td.f_titles { border-right-color: #C3CBD1 !important; } td.last_td { border-right-width: 0 !important; } .cat_footer {