1
0

functions.core.transfer.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. <?php
  2. /* $Id: functions.core.transfer.php 3269 2007-11-11 22:48:00Z b4rt $ */
  3. /*******************************************************************************
  4. LICENSE
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License (GPL)
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. To read the license please visit http://www.gnu.org/copyleft/gpl.html
  14. *******************************************************************************/
  15. /**
  16. * getTransferPid
  17. *
  18. * @param $transfer
  19. * @return int
  20. */
  21. function getTransferPid($transfer) {
  22. global $cfg;
  23. return @rtrim(file_get_contents($cfg["transfer_file_path"].$transfer.".pid"));
  24. }
  25. /**
  26. * checks if transfer is running by checking for existence of pid-file.
  27. *
  28. * @param $transfer name of the transfer
  29. * @return boolean
  30. */
  31. function isTransferRunning($transfer) {
  32. global $cfg;
  33. return file_exists($cfg["transfer_file_path"].$transfer.'.pid');
  34. }
  35. /**
  36. * checks if transfer exists by checking for existence of meta-file.
  37. *
  38. * @param $transfer name of the transfer
  39. * @return boolean
  40. */
  41. function transferExists($transfer) {
  42. global $cfg;
  43. return file_exists($cfg["transfer_file_path"].$transfer);
  44. }
  45. /**
  46. * gets the transfer-client
  47. *
  48. * @param $transfer name of the transfer
  49. * @return string
  50. */
  51. function getTransferClient($transfer) {
  52. global $cfg, $db, $transfers;
  53. if (isset($transfers['settings'][$transfer]['client'])) {
  54. return $transfers['settings'][$transfer]['client'];
  55. } else {
  56. $client = $db->GetOne("SELECT client FROM tf_transfers WHERE transfer = ".$db->qstr($transfer));
  57. if (empty($client)) {
  58. if (substr($transfer, -8) == ".torrent") {
  59. // this is a torrent-client
  60. $client = $cfg["btclient"];
  61. } else if (substr($transfer, -5) == ".wget") {
  62. // this is wget.
  63. $client = "wget";
  64. } else if (substr($transfer, -4) == ".nzb") {
  65. // This is nzbperl.
  66. $client = "nzbperl";
  67. } else {
  68. $client = $cfg["btclient"];
  69. }
  70. }
  71. $transfers['settings'][$transfer]['client'] = $client;
  72. return $client;
  73. }
  74. }
  75. /**
  76. * getRunningTransferCount
  77. *
  78. * @return int with number of running transfers
  79. */
  80. function getRunningTransferCount() {
  81. global $cfg;
  82. // use pid-files-direct-access for now because all clients of currently
  83. // available handlers write one. then its faster and correct meanwhile.
  84. if ($dirHandle = @opendir($cfg["transfer_file_path"])) {
  85. $tCount = 0;
  86. while (false !== ($file = @readdir($dirHandle))) {
  87. if ((substr($file, -4, 4)) == ".pid")
  88. $tCount++;
  89. }
  90. @closedir($dirHandle);
  91. return $tCount;
  92. } else {
  93. return 0;
  94. }
  95. }
  96. /**
  97. * get the full size of a transfer
  98. *
  99. * @param $transfer
  100. * @return int
  101. */
  102. function getTransferSize($transfer) {
  103. global $cfg;
  104. // client-switch
  105. if (substr($transfer, -8) == ".torrent") {
  106. // this is a t-client
  107. $file = $cfg["transfer_file_path"].$transfer;
  108. if ($fd = @fopen($file, "rd")) {
  109. require_once("inc/classes/BDecode.php");
  110. $alltorrent = @fread($fd, @filesize($file));
  111. $array = @BDecode($alltorrent);
  112. @fclose($fd);
  113. }
  114. return ((isset($array["info"]["piece length"])) && (isset($array["info"]["pieces"])))
  115. ? $array["info"]["piece length"] * (strlen($array["info"]["pieces"]) / 20)
  116. : 0;
  117. } else if (substr($transfer, -5) == ".wget") {
  118. // this is wget.
  119. $ch = ClientHandler::getInstance('wget');
  120. $ch->setVarsFromFile($transfer);
  121. require_once("inc/classes/SimpleHTTP.php");
  122. return SimpleHTTP::getRemoteSize($ch->url);
  123. } else if (substr($transfer, -4) == ".nzb") {
  124. // this is nzbperl.
  125. require_once("inc/classes/NZBFile.php");
  126. $nzb = new NZBFile($transfer);
  127. return $nzb->size;
  128. }
  129. return 0;
  130. }
  131. /**
  132. * gets hash of a transfer
  133. *
  134. * @param $transfer name of the transfer
  135. * @return transfer-hash
  136. */
  137. function getTransferHash($transfer) {
  138. global $cfg, $db, $transfers;
  139. if (isset($transfers['settings'][$transfer]['hash'])) {
  140. return $transfers['settings'][$transfer]['hash'];
  141. } else {
  142. $hash = $db->GetOne("SELECT hash FROM tf_transfers WHERE transfer = ".$db->qstr($transfer));
  143. if (empty($hash)) {
  144. if (substr($transfer, -8) == ".torrent") {
  145. // this is a torrent-client
  146. $metainfo = getTorrentMetaInfo($transfer);
  147. if (empty($metainfo)) {
  148. $hash = "";
  149. } else {
  150. $resultAry = explode("\n", $metainfo);
  151. $hashAry = array();
  152. switch ($cfg["metainfoclient"]) {
  153. case "transmissioncli":
  154. case "ttools.pl":
  155. $hashAry = explode(":", trim($resultAry[0]));
  156. break;
  157. case "btshowmetainfo.py":
  158. case "torrentinfo-console.py":
  159. default:
  160. $hashAry = explode(":", trim($resultAry[3]));
  161. break;
  162. }
  163. $hash = (isset($hashAry[1])) ? trim($hashAry[1]) : "";
  164. }
  165. } else if (substr($transfer, -5) == ".wget") {
  166. // this is wget.
  167. $metacontent = @file_get_contents($cfg["transfer_file_path"].$transfer);
  168. $hash = (empty($metacontent))
  169. ? ""
  170. : sha1($metacontent);
  171. } else if (substr($transfer, -4) == ".nzb") {
  172. // This is nzbperl.
  173. $metacontent = @file_get_contents($cfg["transfer_file_path"].$transfer);
  174. $hash = (empty($metacontent))
  175. ? ""
  176. : sha1($metacontent);
  177. } else {
  178. $hash = "";
  179. }
  180. }
  181. $transfers['settings'][$transfer]['hash'] = $hash;
  182. return $hash;
  183. }
  184. }
  185. /**
  186. * gets metainfo of a torrent as string
  187. *
  188. * @param $transfer name of the torrent
  189. * @return string with torrent-meta-info
  190. */
  191. function getTorrentMetaInfo($transfer) {
  192. global $cfg;
  193. switch ($cfg["metainfoclient"]) {
  194. case "transmissioncli":
  195. return shell_exec("HOME=".tfb_shellencode($cfg["path"])."; export HOME; ".$cfg["btclient_transmission_bin"]." -i ".tfb_shellencode($cfg["transfer_file_path"].$transfer));
  196. case "ttools.pl":
  197. return shell_exec($cfg["perlCmd"].' -I '.tfb_shellencode($cfg["docroot"].'bin/ttools').' '.tfb_shellencode($cfg["docroot"].'bin/ttools/ttools.pl').' -i '.tfb_shellencode($cfg["transfer_file_path"].$transfer));
  198. case "torrentinfo-console.py":
  199. return shell_exec("cd ".tfb_shellencode($cfg["transfer_file_path"])."; ".$cfg["pythonCmd"]." -OO ".tfb_shellencode($cfg["docroot"]."bin/clients/mainline/torrentinfo-console.py")." ".tfb_shellencode($transfer));
  200. case "btshowmetainfo.py":
  201. default:
  202. return shell_exec("cd ".tfb_shellencode($cfg["transfer_file_path"])."; ".$cfg["pythonCmd"]." -OO ".tfb_shellencode($cfg["docroot"]."bin/clients/tornado/btshowmetainfo.py")." ".tfb_shellencode($transfer));
  203. }
  204. }
  205. /**
  206. * gets details of a transfer as array
  207. *
  208. * @param $transfer
  209. * @param $full
  210. * @return array with details
  211. *
  212. * array-keys :
  213. *
  214. * running
  215. * speedDown
  216. * speedUp
  217. * downCurrent
  218. * upCurrent
  219. * downTotal
  220. * upTotal
  221. * percentDone
  222. * sharing
  223. * timeLeft
  224. * seeds
  225. * peers
  226. * cons
  227. *
  228. * owner
  229. * size
  230. * maxSpeedDown
  231. * maxSpeedUp
  232. * maxcons
  233. * sharekill
  234. * port
  235. *
  236. */
  237. function getTransferDetails($transfer, $full) {
  238. global $cfg, $transfers;
  239. $details = array();
  240. // common functions
  241. require_once('inc/functions/functions.common.php');
  242. $transferowner = getOwner($transfer);
  243. // stat
  244. $sf = new StatFile($transfer, $transferowner);
  245. // settings
  246. if (isset($transfers['settings'][$transfer])) {
  247. $settingsAry = $transfers['settings'][$transfer];
  248. } else {
  249. $settingsAry = array();
  250. if (substr($transfer, -8) == ".torrent") {
  251. // this is a t-client
  252. $settingsAry['type'] = "torrent";
  253. $settingsAry['client'] = $cfg["btclient"];
  254. } else if (substr($transfer, -5) == ".wget") {
  255. // this is wget.
  256. $settingsAry['type'] = "wget";
  257. $settingsAry['client'] = "wget";
  258. } else if (substr($transfer, -4) == ".nzb") {
  259. // this is nzbperl.
  260. $settingsAry['type'] = "nzb";
  261. $settingsAry['client'] = "nzbperl";
  262. } else {
  263. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  264. @error("Invalid Transfer", "", "", array($transfer));
  265. }
  266. $settingsAry['hash'] = "";
  267. $settingsAry["savepath"] = ($cfg["enable_home_dirs"] != 0)
  268. ? $cfg["path"].$transferowner.'/'
  269. : $cfg["path"].$cfg["path_incoming"].'/';
  270. $settingsAry['datapath'] = "";
  271. }
  272. // size
  273. $size = floatval($sf->size);
  274. // totals
  275. $afu = $sf->uptotal;
  276. $afd = $sf->downtotal;
  277. $ch = ClientHandler::getInstance($settingsAry['client']);
  278. $totalsCurrent = $ch->getTransferCurrentOP($transfer, $settingsAry['hash'], $afu, $afd);
  279. $totals = $ch->getTransferTotalOP($transfer, $settingsAry['hash'], $afu, $afd);
  280. // running
  281. $running = $sf->running;
  282. $details['running'] = $running;
  283. // speed_down + speed_up + seeds + peers + cons
  284. if ($running == 1) {
  285. // pid
  286. $pid = getTransferPid($transfer);
  287. // speed_down
  288. $details['speedDown'] = (trim($sf->down_speed) != "") ? $sf->down_speed : '0.0 kB/s';
  289. // speed_up
  290. $details['speedUp'] = (trim($sf->up_speed) != "") ? $sf->up_speed : '0.0 kB/s';
  291. // down_current
  292. $details['downCurrent'] = @formatFreeSpace($totalsCurrent["downtotal"] / 1048576);
  293. // up_current
  294. $details['upCurrent'] = @formatFreeSpace($totalsCurrent["uptotal"] / 1048576);
  295. // seeds
  296. $details['seeds'] = $sf->seeds;
  297. // peers
  298. $details['peers'] = $sf->peers;
  299. // cons
  300. $details['cons'] = netstatConnectionsByPid($pid);
  301. } else {
  302. // speed_down
  303. $details['speedDown'] = "";
  304. // speed_up
  305. $details['speedUp'] = "";
  306. // down_current
  307. $details['downCurrent'] = "";
  308. // up_current
  309. $details['upCurrent'] = "";
  310. // seeds
  311. $details['seeds'] = "";
  312. // peers
  313. $details['peers'] = "";
  314. // cons
  315. $details['cons'] = "";
  316. }
  317. // down_total
  318. $details['downTotal'] = @formatFreeSpace($totals["downtotal"] / 1048576);
  319. // up_total
  320. $details['upTotal'] = @formatFreeSpace($totals["uptotal"] / 1048576);
  321. // percentage
  322. $percentage = $sf->percent_done;
  323. if ($percentage < 0) {
  324. $percentage = round(($percentage * -1) - 100, 1);
  325. $sf->time_left = $cfg['_INCOMPLETE'];
  326. } elseif ($percentage > 100) {
  327. $percentage = 100;
  328. }
  329. $details['percentDone'] = $percentage;
  330. // eta
  331. $details['eta'] = $sf->time_left;
  332. // sharing
  333. $details['sharing'] = ($totals["downtotal"] > 0) ? @number_format((($totals["uptotal"] / $totals["downtotal"]) * 100), 2) : 0;
  334. // full (including static) details
  335. if ($full) {
  336. // owner
  337. $details['owner'] = $transferowner;
  338. // size
  339. $details['size'] = @formatBytesTokBMBGBTB($size);
  340. if ($running == 1) {
  341. // max_download_rate
  342. $details['maxSpeedDown'] = number_format($cfg["max_download_rate"], 2);
  343. // max_upload_rate
  344. $details['maxSpeedUp'] = number_format($cfg["max_upload_rate"], 2);
  345. // maxcons
  346. $details['maxcons'] = $cfg["maxcons"];
  347. // sharekill
  348. $details['sharekill'] = $cfg["sharekill"];
  349. // port
  350. $details['port'] = netstatPortByPid($pid);
  351. } else {
  352. // max_download_rate
  353. $details['maxSpeedDown'] = "";
  354. // max_upload_rate
  355. $details['maxSpeedUp'] = "";
  356. // maxcons
  357. $details['maxcons'] = "";
  358. // sharekill
  359. $details['sharekill'] = "";
  360. // port
  361. $details['port'] = "";
  362. }
  363. }
  364. // return
  365. return $details;
  366. }
  367. /**
  368. * This method gets transfers from database in an array
  369. *
  370. * @return array with transfers
  371. */
  372. function getTransferArrayFromDB() {
  373. global $db;
  374. $retVal = array();
  375. $sql = "SELECT transfer FROM tf_transfers ORDER BY transfer ASC";
  376. $recordset = $db->Execute($sql);
  377. if ($db->ErrorNo() != 0) dbError($sql);
  378. while(list($transfer) = $recordset->FetchRow())
  379. array_push($retVal, $transfer);
  380. return $retVal;
  381. }
  382. /**
  383. * This method gets transfers in an array
  384. *
  385. * @param $sortOrder
  386. * @return array
  387. */
  388. function getTransferArray($sortOrder = '') {
  389. global $cfg;
  390. $retVal = array();
  391. $handle = @opendir($cfg["transfer_file_path"]);
  392. if (!$handle) {
  393. AuditAction($cfg["constants"]["error"], "error when opening transfers-dir ".$cfg["transfer_file_path"]);
  394. return $retVal;
  395. }
  396. while ($transfer = @readdir($handle)) {
  397. if ($transfer{0} != ".") {
  398. switch (substr($transfer, -4)) {
  399. case 'stat':
  400. case '.log':
  401. case '.pid':
  402. case '.cmd':
  403. case 'prio':
  404. break;
  405. default:
  406. if (tfb_isValidTransfer($transfer))
  407. $retVal[filemtime($cfg["transfer_file_path"].$transfer).md5($transfer)] = $transfer;
  408. else
  409. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  410. break;
  411. }
  412. }
  413. }
  414. @closedir($handle);
  415. // sort transfer-array
  416. $sortId = ($sortOrder != "") ? $sortOrder : $cfg["index_page_sortorder"];
  417. switch ($sortId) {
  418. case 'da': // sort by date ascending
  419. ksort($retVal);
  420. break;
  421. case 'dd': // sort by date descending
  422. krsort($retVal);
  423. break;
  424. case 'na': // sort alphabetically by name ascending
  425. natcasesort($retVal);
  426. break;
  427. case 'nd': // sort alphabetically by name descending
  428. natcasesort($retVal);
  429. $retVal = array_reverse($retVal, true);
  430. break;
  431. }
  432. return $retVal;
  433. }
  434. /**
  435. * This method gets the head of the transfer-list
  436. *
  437. * @param $settings
  438. * @return transfer-list-head array
  439. */
  440. function getTransferListHeadArray($settings = null) {
  441. global $cfg;
  442. // settings
  443. if (!(isset($settings)))
  444. $settings = convertIntegerToArray($cfg["index_page_settings"]);
  445. // retval
  446. $retVal = array();
  447. // =================================================================== owner
  448. if ($settings[0] != 0)
  449. array_push($retVal, $cfg['_USER']);
  450. // ==================================================================== size
  451. if ($settings[1] != 0)
  452. array_push($retVal, "Size");
  453. // =============================================================== downtotal
  454. if ($settings[2] != 0)
  455. array_push($retVal, "T. Down");
  456. // ================================================================= uptotal
  457. if ($settings[3] != 0)
  458. array_push($retVal, "T. Up");
  459. // ================================================================== status
  460. if ($settings[4] != 0)
  461. array_push($retVal, "Status");
  462. // ================================================================ progress
  463. if ($settings[5] != 0)
  464. array_push($retVal, "Progress");
  465. // ==================================================================== down
  466. if ($settings[6] != 0)
  467. array_push($retVal, "Down");
  468. // ====================================================================== up
  469. if ($settings[7] != 0)
  470. array_push($retVal, "Up");
  471. // =================================================================== seeds
  472. if ($settings[8] != 0)
  473. array_push($retVal, "Seeds");
  474. // =================================================================== peers
  475. if ($settings[9] != 0)
  476. array_push($retVal, "Peers");
  477. // ===================================================================== ETA
  478. if ($settings[10] != 0)
  479. array_push($retVal, "Estimated Time");
  480. // ================================================================== client
  481. if ($settings[11] != 0)
  482. array_push($retVal, "Client");
  483. // return
  484. return $retVal;
  485. }
  486. /**
  487. * This method gets the list of transfer
  488. *
  489. * @return array
  490. */
  491. function getTransferListArray() {
  492. global $cfg, $db, $transfers;
  493. $kill_id = "";
  494. $lastUser = "";
  495. $arUserTransfers = array();
  496. $arListTransfers = array();
  497. // settings
  498. $settings = convertIntegerToArray($cfg["index_page_settings"]);
  499. // sortOrder
  500. $sortOrder = tfb_getRequestVar("so");
  501. if ($sortOrder == "")
  502. $sortOrder = $cfg["index_page_sortorder"];
  503. // t-list
  504. $arList = getTransferArray($sortOrder);
  505. foreach ($arList as $transfer) {
  506. // init some vars
  507. $displayname = $transfer;
  508. $show_run = true;
  509. $transferowner = getOwner($transfer);
  510. $owner = IsOwner($cfg["user"], $transferowner);
  511. // stat
  512. $sf = new StatFile($transfer, $transferowner);
  513. // settings
  514. if (isset($transfers['settings'][$transfer])) {
  515. $settingsAry = $transfers['settings'][$transfer];
  516. } else {
  517. $settingsAry = array();
  518. if (substr($transfer, -8) == ".torrent") {
  519. // this is a t-client
  520. $settingsAry['type'] = "torrent";
  521. $settingsAry['client'] = $cfg["btclient"];
  522. } else if (substr($transfer, -5) == ".wget") {
  523. // this is wget.
  524. $settingsAry['type'] = "wget";
  525. $settingsAry['client'] = "wget";
  526. } else if (substr($transfer, -4) == ".nzb") {
  527. // this is nzbperl.
  528. $settingsAry['type'] = "nzb";
  529. $settingsAry['client'] = "nzbperl";
  530. } else {
  531. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  532. @error("Invalid Transfer", "", "", array($transfer));
  533. }
  534. $settingsAry['hash'] = "";
  535. $settingsAry["savepath"] = ($cfg["enable_home_dirs"] != 0)
  536. ? $cfg["path"].$transferowner.'/'
  537. : $cfg["path"].$cfg["path_incoming"].'/';
  538. $settingsAry['datapath'] = "";
  539. }
  540. // cache running-flag in local var. we will access that often
  541. $transferRunning = $sf->running;
  542. // cache percent-done in local var. ...
  543. $percentDone = $sf->percent_done;
  544. // ---------------------------------------------------------------------
  545. //XFER: update1: add upload/download stats to the xfer array
  546. if (($cfg['enable_xfer'] == 1) && ($cfg['xfer_realtime'] == 1))
  547. @Xfer::update1($transfer, $transferowner, $settingsAry['client'], $settingsAry['hash'], $sf->uptotal, $sf->downtotal);
  548. // ---------------------------------------------------------------------
  549. // injects
  550. if (!file_exists($cfg["transfer_file_path"].$transfer.".stat")) {
  551. $transferRunning = 2;
  552. $sf->running = "2";
  553. $sf->size = getTransferSize($transfer);
  554. injectTransfer($transfer);
  555. }
  556. // totals-preparation
  557. // if downtotal + uptotal + progress > 0
  558. if (($settings[2] + $settings[3] + $settings[5]) > 0) {
  559. $ch = ClientHandler::getInstance($settingsAry['client']);
  560. $transferTotals = $ch->getTransferTotalOP($transfer, $settingsAry['hash'], $sf->uptotal, $sf->downtotal);
  561. }
  562. // ---------------------------------------------------------------------
  563. // preprocess stat-file and get some vars
  564. $estTime = "";
  565. $statusStr = "";
  566. switch ($transferRunning) {
  567. case 2: // new
  568. $statusStr = 'New';
  569. break;
  570. case 3: // queued
  571. $statusStr = 'Queued';
  572. $estTime = 'Waiting';
  573. break;
  574. default: // running + stopped
  575. // increment the totals
  576. if (!isset($cfg["total_upload"])) $cfg["total_upload"] = 0;
  577. if (!isset($cfg["total_download"])) $cfg["total_download"] = 0;
  578. $cfg["total_upload"] = $cfg["total_upload"] + GetSpeedValue($sf->up_speed);
  579. $cfg["total_download"] = $cfg["total_download"] + GetSpeedValue($sf->down_speed);
  580. // $estTime
  581. if ($transferRunning == 0) {
  582. $estTime = $sf->time_left;
  583. } else {
  584. if ($sf->time_left != "" && $sf->time_left != "0") {
  585. if (($cfg["display_seeding_time"] == 1) && ($sf->percent_done >= 100) ) {
  586. $estTime = (($sf->seedlimit > 0) && (!empty($sf->up_speed)) && (intval(($sf->up_speed{0})) > 0))
  587. ? convertTime(((($sf->seedlimit) / 100 * $sf->size) - $sf->uptotal) / GetSpeedInBytes($sf->up_speed))
  588. : '-';
  589. } else {
  590. $estTime = $sf->time_left;
  591. }
  592. }
  593. }
  594. // $lastUser
  595. $lastUser = $transferowner;
  596. // $show_run + $statusStr
  597. if($percentDone >= 100) {
  598. $statusStr = (($transferRunning == 1) && (trim($sf->up_speed) != "")) ? 'Seeding' : 'Done';
  599. $show_run = false;
  600. } else if ($percentDone < 0) {
  601. $statusStr = 'Stopped';
  602. $show_run = true;
  603. } else {
  604. $statusStr = 'Leeching';
  605. }
  606. break;
  607. }
  608. // ---------------------------------------------------------------------
  609. // fill temp array
  610. $transferAry = array();
  611. // ================================================================ name
  612. array_push($transferAry, $transfer);
  613. // =============================================================== owner
  614. if ($settings[0] != 0)
  615. array_push($transferAry, $transferowner);
  616. // ================================================================ size
  617. if ($settings[1] != 0)
  618. array_push($transferAry, @formatBytesTokBMBGBTB($sf->size));
  619. // =========================================================== downtotal
  620. if ($settings[2] != 0)
  621. array_push($transferAry, @formatBytesTokBMBGBTB($transferTotals["downtotal"]));
  622. // ============================================================= uptotal
  623. if ($settings[3] != 0)
  624. array_push($transferAry, @formatBytesTokBMBGBTB($transferTotals["uptotal"]));
  625. // ============================================================== status
  626. if ($settings[4] != 0)
  627. array_push($transferAry, $statusStr);
  628. // ============================================================ progress
  629. if ($settings[5] != 0) {
  630. $percentage = "";
  631. if (($percentDone >= 100) && (trim($sf->up_speed) != "")) {
  632. $percentage = @number_format((($transferTotals["uptotal"] / $sf->size) * 100), 2) . '%';
  633. } else {
  634. if ($percentDone >= 1)
  635. $percentage = $percentDone . '%';
  636. else if ($percentDone < 0)
  637. $percentage = round(($percentDone*-1)-100,1) . '%';
  638. else
  639. $percentage = '0%';
  640. }
  641. array_push($transferAry, $percentage);
  642. }
  643. // ================================================================ down
  644. if ($settings[6] != 0) {
  645. $down = "";
  646. if ($transferRunning == 1)
  647. $down = (trim($sf->down_speed) != "") ? $sf->down_speed : '0.0 kB/s';
  648. array_push($transferAry, $down);
  649. }
  650. // ================================================================== up
  651. if ($settings[7] != 0) {
  652. $up = "";
  653. if ($transferRunning == 1)
  654. $up = (trim($sf->up_speed) != "") ? $sf->up_speed : '0.0 kB/s';
  655. array_push($transferAry, $up);
  656. }
  657. // =============================================================== seeds
  658. if ($settings[8] != 0) {
  659. $seeds = ($transferRunning == 1)
  660. ? $sf->seeds
  661. : "";
  662. array_push($transferAry, $seeds);
  663. }
  664. // =============================================================== peers
  665. if ($settings[9] != 0) {
  666. $peers = ($transferRunning == 1)
  667. ? $sf->peers
  668. : "";
  669. array_push($transferAry, $peers);
  670. }
  671. // ================================================================= ETA
  672. if ($settings[10] != 0)
  673. array_push($transferAry, $estTime);
  674. // ============================================================== client
  675. if ($settings[11] != 0) {
  676. switch ($settingsAry['client']) {
  677. case "tornado":
  678. array_push($transferAry, "B");
  679. break;
  680. case "transmission":
  681. array_push($transferAry, "T");
  682. break;
  683. case "mainline":
  684. array_push($transferAry, "M");
  685. break;
  686. case "azureus":
  687. array_push($transferAry, "A");
  688. break;
  689. case "wget":
  690. array_push($transferAry, "W");
  691. break;
  692. case "nzbperl":
  693. array_push($transferAry, "N");
  694. break;
  695. default:
  696. array_push($transferAry, "U");
  697. }
  698. }
  699. // ---------------------------------------------------------------------
  700. // Is this transfer for the user list or the general list?
  701. if ($owner)
  702. array_push($arUserTransfers, $transferAry);
  703. else
  704. array_push($arListTransfers, $transferAry);
  705. }
  706. //XFER: update 2
  707. if (($cfg['enable_xfer'] == 1) && ($cfg['xfer_realtime'] == 1))
  708. @Xfer::update2();
  709. // -------------------------------------------------------------------------
  710. // build output-array
  711. $retVal = array();
  712. if (sizeof($arUserTransfers) > 0) {
  713. foreach($arUserTransfers as $torrentrow)
  714. array_push($retVal, $torrentrow);
  715. }
  716. $boolCond = true;
  717. if ($cfg['enable_restrictivetview'] == 1)
  718. $boolCond = $cfg['isAdmin'];
  719. if (($boolCond) && (sizeof($arListTransfers) > 0)) {
  720. foreach($arListTransfers as $torrentrow)
  721. array_push($retVal, $torrentrow);
  722. }
  723. return $retVal;
  724. }
  725. /**
  726. * Function to load the owner for all transfers. returns ref to array
  727. *
  728. * @return array-ref
  729. */
  730. function &loadAllTransferOwner() {
  731. $ary = array();
  732. $tary = getTransferArray();
  733. foreach ($tary as $transfer)
  734. $ary[$transfer] = getOwner($transfer);
  735. return $ary;
  736. }
  737. /**
  738. * Function to load the totals for all transfers. returns ref to array
  739. *
  740. * @return array-ref
  741. */
  742. function &loadAllTransferTotals() {
  743. global $db;
  744. $recordset = $db->Execute("SELECT * FROM tf_transfer_totals");
  745. $ary = array();
  746. while ($row = $recordset->FetchRow()) {
  747. if (strlen($row["tid"]) == 40) {
  748. $ary[$row["tid"]] = array(
  749. "uptotal" => $row["uptotal"],
  750. "downtotal" => $row["downtotal"]
  751. );
  752. }
  753. }
  754. return $ary;
  755. }
  756. /**
  757. * Function to load the settings for all transfers. returns ref to array
  758. *
  759. * @return array-ref
  760. */
  761. function &loadAllTransferSettings() {
  762. global $db;
  763. $recordset = $db->Execute("SELECT * FROM tf_transfers");
  764. $ary = array();
  765. while ($row = $recordset->FetchRow()) {
  766. $ary[$row["transfer"]] = array(
  767. "type" => $row["type"],
  768. "client" => $row["client"],
  769. "hash" => $row["hash"],
  770. "datapath" => $row["datapath"],
  771. "savepath" => $row["savepath"],
  772. "running" => $row["running"],
  773. "max_upload_rate" => $row["rate"],
  774. "max_download_rate" => $row["drate"],
  775. "die_when_done" => $row["runtime"],
  776. "max_uploads" => $row["maxuploads"],
  777. "superseeder" => $row["superseeder"],
  778. "minport" => $row["minport"],
  779. "maxport" => $row["maxport"],
  780. "sharekill" => $row["sharekill"],
  781. "maxcons" => $row["maxcons"],
  782. "rerequest" => $row["rerequest"]
  783. );
  784. }
  785. return $ary;
  786. }
  787. /**
  788. * initGlobalTransfersArray
  789. */
  790. function initGlobalTransfersArray() {
  791. global $transfers;
  792. // transfers
  793. $transfers = array();
  794. // settings
  795. $transferSettings =& loadAllTransferSettings();
  796. $transfers['settings'] = $transferSettings;
  797. // totals
  798. $transferTotals =& loadAllTransferTotals();
  799. $transfers['totals'] = $transferTotals;
  800. // sum
  801. $transfers['sum'] = array(
  802. 'maxcons' => getSumMaxCons(),
  803. 'rate' => getSumMaxUpRate(),
  804. 'drate' => getSumMaxDownRate()
  805. );
  806. // owner
  807. $transferOwner =& loadAllTransferOwner();
  808. $transfers['owner'] = $transferOwner;
  809. }
  810. /**
  811. * injects a transfer
  812. *
  813. * @param $transfer
  814. * @return boolean
  815. */
  816. function injectTransfer($transfer) {
  817. global $cfg;
  818. $sf = new StatFile($transfer);
  819. $sf->running = "2"; // file is new
  820. $sf->size = getTransferSize($transfer);
  821. if ($sf->write()) {
  822. // set transfers-cache
  823. cacheTransfersSet();
  824. return true;
  825. } else {
  826. AuditAction($cfg["constants"]["error"], "stat-file cannot be written when injecting : ".$transfer);
  827. return false;
  828. }
  829. }
  830. /**
  831. * get Owner
  832. *
  833. * @param $transfer
  834. * @return string
  835. */
  836. function getOwner($transfer) {
  837. global $cfg, $db, $transfers;
  838. if (isset($transfers['owner'][$transfer])) {
  839. return $transfers['owner'][$transfer];
  840. } else {
  841. // Check log to see what user has a history with this file
  842. $transfers['owner'][$transfer] = $db->GetOne("SELECT user_id FROM tf_log WHERE file=".$db->qstr($transfer)." AND (action=".$db->qstr($cfg["constants"]["file_upload"])." OR action=".$db->qstr($cfg["constants"]["url_upload"])." OR action=".$db->qstr($cfg["constants"]["reset_owner"]).") ORDER BY time DESC");
  843. return ($transfers['owner'][$transfer] != "")
  844. ? $transfers['owner'][$transfer]
  845. : resetOwner($transfer); // try and get the owner from the stat file;
  846. }
  847. }
  848. /**
  849. * reset Owner
  850. *
  851. * @param $transfer
  852. * @return string
  853. */
  854. function resetOwner($transfer) {
  855. global $cfg, $db, $transfers;
  856. // log entry has expired so we must renew it
  857. $rtnValue = "n/a";
  858. if (file_exists($cfg["transfer_file_path"].$transfer.".stat")) {
  859. $sf = new StatFile($transfer);
  860. $rtnValue = (IsUser($sf->transferowner))
  861. ? $sf->transferowner /* We have an owner */
  862. : GetSuperAdmin(); /* no owner found, so the super admin will now own it */
  863. // add entry to the log
  864. $sql = "INSERT INTO tf_log (user_id,file,action,ip,ip_resolved,user_agent,time)"
  865. ." VALUES ("
  866. . $db->qstr($rtnValue).","
  867. . $db->qstr($transfer).","
  868. . $db->qstr($cfg["constants"]["reset_owner"]).","
  869. . $db->qstr($cfg['ip']).","
  870. . $db->qstr($cfg['ip_resolved']).","
  871. . $db->qstr($cfg['user_agent']).","
  872. . $db->qstr(time())
  873. .")";
  874. $result = $db->Execute($sql);
  875. if ($db->ErrorNo() != 0) dbError($sql);
  876. }
  877. $transfers['owner'][$transfer] = $rtnValue;
  878. return $rtnValue;
  879. }
  880. /**
  881. * IsOwner
  882. *
  883. * @param $user
  884. * @param $owner
  885. * @return boolean
  886. */
  887. function IsOwner($user, $owner) {
  888. return (($user) == ($owner));
  889. }
  890. ?>