Hello people.
My tracker needs to handle more peers. I guess the problem can be found in announce.php
PHP Code:
<?php
/*
+------------------------------------------------
| TBDev.net BitTorrent Tracker PHP
| =============================================
| by CoLdFuSiOn
| (c) 2003 - 2009 TBDev.Net
| http://www.tbdev.net
| =============================================
| svn: http://sourceforge.net/projects/tbdevnet/
| Licence Info: GPL
+------------------------------------------------
| $Date$
| $Revision$
| $Author$
| $URL$
+------------------------------------------------
*/
error_reporting(0);
////////////////// GLOBAL VARIABLES ////////////////////////////
$TBDEV['baseurl'] = 'http://PRIVATE';
$TBDEV['announce_interval'] = 60 * 50;
$TBDEV['user_ratios'] = 0;
$TBDEV['connectable_check'] = 1;
define('UC_VIP', 7);
define('TIME_NOW', time());
// DB setup
$TBDEV['mysql_host'] = "PRIVATE";
$TBDEV['mysql_user'] = "PRIVATE";
$TBDEV['mysql_pass'] = "PRIVATE";
$TBDEV['mysql_db'] = "PRIVATE";
////////////////// GLOBAL VARIABLES ////////////////////////////
// DO NOT EDIT BELOW UNLESS YOU KNOW WHAT YOU'RE DOING!!
$agent = $_SERVER["HTTP_USER_AGENT"];
// Deny access made with a browser...
//if (ereg("^Mozilla\\/", $agent) || ereg("^Opera\\/", $agent) || ereg("^Links ",
// $agent) || ereg("^Lynx\\/", $agent) || isset($_SERVER['HTTP_COOKIE']) || isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
// isset($_SERVER['HTTP_ACCEPT_CHARSET']))
// err("torrent not registered with this tracker CODE 1");
if (
preg_match('%^Mozilla/|^Opera/|^Links |^Lynx/%i', $agent) ||
isset($_SERVER['HTTP_COOKIE']) ||
isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
isset($_SERVER['HTTP_ACCEPT_CHARSET'])
)
err("torrent not registered with this tracker CODE 1");
/////////////////////// FUNCTION DEFS ///////////////////////////////////
function auto_enter_cheater($userid, $rate, $upthis, $diff, $torrentid, $client,
$ip, $last_up)
{
mysql_query("INSERT INTO cheaters (added, userid, client, rate, beforeup, upthis, timediff, userip, torrentid) VALUES(" .
sqlesc(time()) . ", " . sqlesc($userid) . ", " . sqlesc($client) . ", " . sqlesc
($rate) . ", " . sqlesc($last_up) . ", " . sqlesc($upthis) . ", " . sqlesc($diff) .
", " . sqlesc($ip) . ", " . sqlesc($torrentid) . ")") or sqlerr(__file__,
__line__);
}
function dbconn()
{
global $TBDEV;
if (!@mysql_connect($TBDEV['mysql_host'], $TBDEV['mysql_user'], $TBDEV['mysql_pass'])) {
err('Please call back later');
}
mysql_select_db($TBDEV['mysql_db']) or err('Please call back later');
}
function strip_magic_quotes($arr)
{
foreach ($arr as $k => $v) {
if (is_array($v)) {
$arr[$k] = strip_magic_quotes($v);
} else {
$arr[$k] = stripslashes($v);
}
}
return $arr;
}
if (get_magic_quotes_gpc()) {
if (!empty($_GET)) {
$_GET = strip_magic_quotes($_GET);
}
if (!empty($_POST)) {
$_POST = strip_magic_quotes($_POST);
}
if (!empty($_COOKIE)) {
$_COOKIE = strip_magic_quotes($_COOKIE);
}
}
/*End*/
function err($msg)
{
benc_resp(array('failure reason' => array('type' => 'string', 'value' => $msg)));
exit();
}
function benc_resp($d)
{
benc_resp_raw(benc(array('type' => 'dictionary', 'value' => $d)));
}
function benc_resp_raw($x)
{
header("Content-Type: text/plain");
header("Pragma: no-cache");
if ($_SERVER['HTTP_ACCEPT_ENCODING'] == 'gzip') {
header("Content-Encoding: gzip");
echo gzencode($x, 9, FORCE_GZIP);
} else
echo $x;
}
function benc($obj)
{
if (!is_array($obj) || !isset($obj["type"]) || !isset($obj["value"]))
return;
$c = $obj["value"];
switch ($obj["type"]) {
case "string":
return benc_str($c);
case "integer":
return benc_int($c);
case "list":
return benc_list($c);
case "dictionary":
return benc_dict($c);
default:
return;
}
}
function benc_str($s)
{
return strlen($s) . ":$s";
}
function benc_int($i)
{
return "i" . $i . "e";
}
function benc_list($a)
{
$s = "l";
foreach ($a as $e) {
$s .= benc($e);
}
$s .= "e";
return $s;
}
function benc_dict($d)
{
$s = "d";
$keys = array_keys($d);
sort($keys);
foreach ($keys as $k) {
$v = $d[$k];
$s .= benc_str($k);
$s .= benc($v);
}
$s .= "e";
return $s;
}
function hash_where($name, $hash)
{
$shhash = preg_replace('/ *$/s', "", $hash);
return "($name = " . sqlesc($hash) . " OR $name = " . sqlesc($shhash) . ")";
}
function sqlesc($x)
{
return "'" . mysql_real_escape_string($x) . "'";
}
function portblacklisted($port)
{
// direct connect
if ($port >= 411 && $port <= 413)
return true;
// bittorrent
if ($port >= 6881 && $port <= 6889)
return true;
// kazaa
if ($port == 1214)
return true;
// gnutella
if ($port >= 6346 && $port <= 6347)
return true;
// emule
if ($port == 4662)
return true;
// winmx
if ($port == 6699)
return true;
return false;
}
/////////////////////// FUNCTION DEFS END ///////////////////////////////
$parts = array();
$pattern = '[0-9a-fA-F]{32}';
if (!isset($_GET['passkey']) or !ereg($pattern, $_GET['passkey'], $parts))
err("Invalid Passkey");
else
$GLOBALS['passkey'] = $parts[0];
if(!isset($_GET['info_hash']) || strlen($_GET['info_hash']) != 20) {
preg_match('/info_hash=([^&]+?)&/s', $_SERVER['QUERY_STRING'], $hash);
$_GET['info_hash'] = urldecode($hash['1']);
}
if(!isset($_GET['peer_id']) || strlen($_GET['peer_id']) != 20) {
preg_match('/peer_id=([^&]+?)&/s', $_SERVER['QUERY_STRING'], $hash);
$_GET['peer_id'] = urldecode($hash['1']);
}
foreach (array("info_hash", "peer_id", "event", "ip", "localip") as $x) {
if (isset($_GET["$x"]))
$GLOBALS[$x] = "" . $_GET[$x];
}
foreach (array("port", "downloaded", "uploaded", "left") as $x) {
$GLOBALS[$x] = 0 + $_GET[$x];
}
foreach (array("passkey", "info_hash", "peer_id", "port", "downloaded",
"uploaded", "left") as $x)
if (!isset($x))
err("Missing key: $x");
foreach (array("info_hash", "peer_id") as $x)
if (strlen($GLOBALS[$x]) != 20)
err("Invalid $x (" . strlen($GLOBALS[$x]) . " - " . urlencode($GLOBALS[$x]) .
")");
unset($x);
$info_hash = bin2hex($info_hash);
$ip = $_SERVER['REMOTE_ADDR'];
$ip = str_replace("::ffff:", "", $ip);
$port = 0 + $port;
$downloaded = 0 + $downloaded;
$uploaded = 0 + $uploaded;
$left = 0 + $left;
$rsize = 50;
foreach (array("num want", "numwant", "num_want") as $k) {
if (isset($_GET[$k])) {
$rsize = 0 + $_GET[$k];
break;
}
}
if (!$port || $port > 0xffff)
err("invalid port");
if (!isset($event))
$event = "";
$seeder = ($left == 0) ? "yes" : "no";
// Banned Clients - By Petr1fied
$filename = "include/banned_clients.txt";
if (filesize($filename) == 0 || !file_exists($filename))
$banned_clients = array();
else {
$handle = fopen($filename, "r");
$banned_clients = unserialize(fread($handle, filesize($filename)));
fclose($handle);
}
$client_ban = '';
foreach ($banned_clients as $k => $v) {
if (substr(bin2hex($peer_id), 0, 16) == $v["peer_id"] || substr(bin2hex($peer_id),
0, 6) == $v["peer_id"]) {
$client_ban = array($v["client_name"], $v["reason"]);
}
}
if ($client_ban)
err("I'm sorry, $client_ban[0] is banned from this tracker (" . stripslashes($client_ban[1]) .
")");
// Banned Clients - By Petr1fied
dbconn();
$user_query = mysql_query("SELECT id, uploaded, downloaded, class, parked, highspeed, enabled, free_switch FROM users WHERE passkey=" .
sqlesc($passkey)) or err("Tracker error 2");
if (mysql_num_rows($user_query) != 1)
err("Unknown passkey. Please redownload the torrent from {$TBDEV['baseurl']}.");
$user = mysql_fetch_assoc($user_query);
if ($user['enabled'] == 'no')
err('Permission denied, you\'re not enabled');
$res = mysql_query("SELECT torrents.id, torrents.banned, torrents.free, torrents.double, torrents.dbfl, torrents.seeders + torrents.leechers AS numpeers, torrents.added AS ts, freeslots.free AS freeslot, freeslots.double AS doubleslot, torrents.category, torrents.added, torrents.archive FROM torrents LEFT JOIN freeslots ON (torrents.id=freeslots.tid AND freeslots.uid=" .
sqlesc($user['id']) . ") WHERE info_hash = " . sqlesc($info_hash));
$torrent = mysql_fetch_assoc($res);
if (!$torrent)
err("This torrent is not registered with PRIVATE anymore JUST DELETE IT FROM YOUR CLIENT -_-");
$torrentid = $torrent["id"];
$fields = "seeder, peer_id, ip, port, uploaded, downloaded, userid, last_action AS ts, (" .
time() . " - last_action) AS announcetime";
$numpeers = $torrent["numpeers"];
$limit = "";
if ($numpeers > $rsize)
$limit = "ORDER BY RAND() LIMIT $rsize";
$res = mysql_query("SELECT $fields FROM peers WHERE torrent = $torrentid AND connectable = 'yes' $limit");
//////////////////// START NEW COMPACT MODE/////////////////////////////
if ($_GET['compact'] != 1) {
$resp = "d" . benc_str("interval") . "i" . $TBDEV['announce_interval'] . "e" .
benc_str("peers") . "l";
} else {
$resp = "d" . benc_str("interval") . "i" . $TBDEV['announce_interval'] . "e" .
benc_str("min interval") . "i" . 300 . "e5:" . "peers";
}
$peer = array();
$peer_num = 0;
while ($row = mysql_fetch_assoc($res)) {
$row["ip"] = str_replace("::ffff:", "", $row["ip"]);
if ($_GET['compact'] != 1) {
$row["peer_id"] = str_pad($row["peer_id"], 20);
if ($row["peer_id"] === $peer_id) {
$self = $row;
continue;
}
$resp .= "d" . benc_str("ip") . benc_str($row["ip"]);
if (!$_GET['no_peer_id']) {
$resp .= benc_str("peer id") . benc_str($row["peer_id"]);
}
$resp .= benc_str("port") . "i" . $row["port"] . "e" . "e";
} else {
$peer_ip = explode('.', $row["ip"]);
$peer_ip = pack("C*", $peer_ip[0], $peer_ip[1], $peer_ip[2], $peer_ip[3]);
$peer_port = pack("n*", (int)$row["port"]);
$time = intval((time() % 7680) / 60);
if ($_GET['left'] == 0) {
$time += 128;
}
$time = pack("C", $time);
$peer[] = $time . $peer_ip . $peer_port;
$peer_num++;
}
}
if ($_GET['compact'] != 1)
$resp .= "ee";
else {
$o = "";
for ($i = 0; $i < $peer_num; $i++) {
$o .= substr($peer[$i], 1, 6);
}
$resp .= strlen($o) . ':' . $o . 'e';
}
$selfwhere = "torrent = $torrentid AND " . hash_where("peer_id", $peer_id);
///////////////////////////// END NEW COMPACT MODE////////////////////////////////
if (!isset($self)) {
$res = mysql_query("SELECT $fields FROM peers WHERE $selfwhere");
$row = mysql_fetch_assoc($res);
if ($row) {
$userid = $row["userid"];
$self = $row;
}
}
//// Up/down stats ////////////////////////////////////////////////////////////
if (!isset($self)) {
$valid = @mysql_fetch_row(@mysql_query("SELECT COUNT(*) FROM peers WHERE torrent=$torrentid AND passkey=" .
sqlesc($passkey)));
if ($valid[0] >= 1 && $seeder == 'no')
err("Connection limit exceeded! You may only leech from one location at a time.");
if ($valid[0] >= 3 && $seeder == 'yes')
err("Connection limit exceeded!");
} else {
$upthis = max(0, $uploaded - $self["uploaded"]);
$downthis = max(0, $downloaded - $self["downloaded"]);
$upspeed = ($upthis > 0 ? $upthis / $self["announcetime"] : 0);
$downspeed = ($downthis > 0 ? $downthis / $self["announcetime"] : 0);
// $announcetime = ($self["seeder"] == "yes" ? "seedtime = seedtime + $self[announcetime]" : "leechtime = leechtime + $self[announcetime]");
// $announcetime = ($upthis == 0 ? "seedtime = seedtime + $self[announcetime]" : "leechtime = leechtime + $self[announcetime]");
$announcetime = ($seeder == "yes" ? "seedtime = seedtime + " . $self['announcetime']
: "leechtime = leechtime + " . $self['announcetime']); // sec0r way.
/** free addon start **/
$isfree = $isdouble = '';
include 'cache/free_cache.php';
if (isset($free)) {
foreach ($free as $fl) {
$isfree = (($fl['modifier'] == 1 || $fl['modifier'] == 3) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
$isdouble = (($fl['modifier'] == 2 || $fl['modifier'] == 3) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
$isfree1 = (($fl['modifier'] == 4 || $fl['modifier'] == 6) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
$isdouble1 = (($fl['modifier'] == 5 || $fl['modifier'] == 6) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
$isfree2 = (($fl['modifier'] == 7 || $fl['modifier'] == 9) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
$isdouble2 = (($fl['modifier'] == 8 || $fl['modifier'] == 9) && ($fl['expires'] >
TIME_NOW || $fl['expires'] == 1));
}
}
if (!($user['free_switch'] != 0 || $isfree || $torrent['free'] != 0 || $torrent['dbfl'] != 0 || ($torrent['freeslot'] !=
0))) {
$newest_time = 7 * 24 * 60 * 60;
if ($torrent['archive'] == 1 || $torrent['added'] < (TIME_NOW - $newest_time)) {
if (!$isfree2)
$updq[0] = "downloaded = downloaded + $downthis";
} else {
if (!$isfree1)
$updq[0] = "downloaded = downloaded + $downthis";
}
}
$updq[1] = "uploaded = uploaded + " . ((($torrent['doubleslot'] != 0 || $isdouble || $torrent['double'] != 0 || $torrent['dbfl'] != 0) || (in_array($torrent['category'], $browse2) && $isdouble2) || (!in_array($torrent['category'], $browse2) && $isdouble1)) ?
($upthis * 2) : $upthis);
$udq = implode(',', $updq);
mysql_query("UPDATE users SET $udq WHERE id=" . $user['id']) or err('Tracker error 3');
}
//=== abnormal upload detection
/*if ($user['highspeed'] == 'no' && $upthis > 103872) {
//=== Work out difference
$diff = (time() - $self['ts']);
$rate = ($upthis / ($diff + 1));
$last_up = $user['uploaded'];
//=== about 1 MB/s
if ($rate > 103872) {
auto_enter_cheater($user['id'], $rate, $upthis, $diff, $torrentid, $agent, $ip,
$last_up);
}
} //=== end abnormal upload detection*/
///////////////////////////////////////////////////////////////////////////////
if (portblacklisted($port)) {
err("Port $port is blacklisted.");
} elseif ($TBDEV['connectable_check']) {
$sockres = @fsockopen($ip, $port, $errno, $errstr, 5);
if (!$sockres)
$connectable = "no";
else {
$connectable = "yes";
@fclose($sockres);
}
} else {
$connectable = 'yes';
}
$updateset = array();
if (isset($self) && $event == "stopped") {
mysql_query("DELETE FROM peers WHERE $selfwhere") or err("D Err");
if (mysql_affected_rows()) {
$updateset[] = ($self["seeder"] == "yes" ? "seeders = seeders - 1" :
"leechers = leechers - 1");
mysql_query("UPDATE snatched SET ip = " . sqlesc($ip) . ", port = $port, connectable = '$connectable', uploaded = uploaded + $upthis, downloaded = downloaded + $downthis, to_go = $left, upspeed = $upspeed, downspeed = $downspeed, $announcetime, last_action = " .
time() . ", seeder = '$seeder', agent = " . sqlesc($agent) .
" WHERE torrentid = $torrentid AND userid = {$user['id']}") or err("SL Err 1");
}
} elseif (isset($self)) {
if ($event == "completed") {
$updateset[] = "times_completed = times_completed + 1";
$finished = '';
$finished1 = '';
$finished = ", finishedat = " . time() . "";
$finished1 = ", complete_date = " . time() . "";
}
mysql_query("UPDATE peers SET ip = " . sqlesc($ip) . ", port = $port, connectable = '$connectable', uploaded = $uploaded, downloaded = $downloaded, to_go = $left, last_action = " .
time() . ", seeder = '$seeder', agent = " . sqlesc($agent) . " $finished WHERE $selfwhere") or
err("PL Err 1");
if (mysql_affected_rows()) {
if ($seeder <> $self["seeder"])
$updateset[] = ($seeder == "yes" ?
"seeders = seeders + 1, leechers = leechers - 1" :
"seeders = seeders - 1, leechers = leechers + 1");
$anntime = "timesann = timesann + 1";
mysql_query("UPDATE snatched SET ip = " . sqlesc($ip) . ", port = $port, connectable = '$connectable', uploaded = uploaded + $upthis, downloaded = downloaded + $downthis, to_go = $left, upspeed = $upspeed, downspeed = $downspeed, $announcetime, last_action = " .
time() . ", seeder = '$seeder', agent = " . sqlesc($agent) . " $finished1, $anntime WHERE torrentid = $torrentid AND userid = {$user['id']}") or
err("SL Err 2");
}
} else {
//if ($user["parked"] == "yes") //== uncommet if you use parked
//err("Your account is parked! (Read the FAQ)"); //== uncommet if you use parked
//elseif ($user["downloadpos"] == "no") //== uncommet if you use downloapos
//err("Your downloading priviledges have been disabled! (Read the rules)"); //== uncommet if you use downloapos
mysql_query("INSERT INTO peers (torrent, userid, peer_id, ip, port, connectable, uploaded, downloaded, to_go, started, last_action, seeder, agent, downloadoffset, uploadoffset, passkey) VALUES ($torrentid, {$user['id']}, " .
sqlesc($peer_id) . ", " . sqlesc($ip) . ", $port, '$connectable', $uploaded, $downloaded, $left, " .
time() . ", " . time() . ", '$seeder', " . sqlesc($agent) . ", $downloaded, $uploaded, " .
sqlesc($passkey) . ")") or err("PL Err 2");
if (mysql_affected_rows()) {
$updateset[] = ($seeder == "yes" ? "seeders = seeders + 1" :
"leechers = leechers + 1");
$anntime = "timesann = timesann + 1";
mysql_query("UPDATE snatched SET ip = " . sqlesc($ip) . ", port = $port, connectable = '$connectable', to_go = $left, last_action = " .
time() . ", seeder = '$seeder', agent = " . sqlesc($agent) . ", $anntime WHERE torrentid = $torrentid AND userid = {$user['id']}") or
err("SL Err 3");
if (!mysql_affected_rows() && $seeder == "no")
mysql_query("INSERT INTO snatched (torrentid, userid, peer_id, ip, port, connectable, uploaded, downloaded, to_go, start_date, last_action, seeder, agent) VALUES ($torrentid, {$user['id']}, " .
sqlesc($peer_id) . ", " . sqlesc($ip) . ", $port, '$connectable', $uploaded, $downloaded, $left, " .
time() . ", " . time() . ", '$seeder', " . sqlesc($agent) . ")") or err("SL Err 4");
}
}
if ($seeder == "yes") {
if ($torrent["banned"] != "yes")
$updateset[] = "visible = 'yes'";
$updateset[] = "last_action = " . time();
}
if (count($updateset))
mysql_query("UPDATE torrents SET " . join(",", $updateset) . " WHERE id = $torrentid");
benc_resp_raw($resp);
?>
OBS! The tracker got 60k Peers. I'll love it to handle 100k peers.