PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/trafic/update.php

https://gitlab.com/billyprice1/ruTorrent
PHP | 196 lines | 191 code | 5 blank | 0 comment | 39 complexity | 6edd8e60f5fd99472aedb632b6733924 MD5 | raw file
  1. <?php
  2. $path = dirname(realpath($argv[0]));
  3. if(chdir($path))
  4. {
  5. if( count( $argv ) > 1 )
  6. $_SERVER['REMOTE_USER'] = $argv[1];
  7. require_once( dirname(__FILE__).'/../../php/xmlrpc.php' );
  8. require_once( 'stat.php' );
  9. eval(getPluginConf('trafic'));
  10. $req = new rXMLRPCRequest( array(
  11. new rXMLRPCCommand("get_up_total"),
  12. new rXMLRPCCommand("get_down_total"),
  13. new rXMLRPCCommand("d.multicall", array("main",getCmd("d.get_hash="),getCmd("d.get_up_total="),getCmd("d.get_down_total=")))));
  14. $req->setParseByTypes();
  15. if($req->run() && !$req->fault)
  16. {
  17. $dir = getSettingsPath().'/trafic/';
  18. $was = array(0,0,0);
  19. $wasTorrents = array();
  20. if($file=@fopen($dir.'last.csv',"r"))
  21. {
  22. $was = fgetcsv($file,100);
  23. while(($data = fgetcsv($file, 1000)) !== false)
  24. $wasTorrents[$data[0]] = array_slice($data,1);
  25. fclose($file);
  26. }
  27. $tm = time();
  28. $needUpdate = ($was[2]+3600>=$tm);
  29. $now = array_slice($req->i8s,0,2);
  30. $now[2] = $tm;
  31. $nowTorrents = array();
  32. for($i = 0; $i<count($req->strings); $i++)
  33. $nowTorrents[$req->strings[$i]] = array_slice($req->i8s,($i+1)*2,2);
  34. ksort($nowTorrents);
  35. $randName = uniqid(getTempDirectory()."rutorrent-trafic-");
  36. if($file=@fopen($randName,"w"))
  37. {
  38. if( ($ok = fputcsv($file,$now))!==false )
  39. {
  40. foreach($nowTorrents as $key=>$data)
  41. {
  42. $tmp = $data;
  43. array_unshift($tmp, $key);
  44. if( ($ok = fputcsv($file,$tmp))===false )
  45. break;
  46. }
  47. }
  48. if($ok !== false)
  49. {
  50. if( fclose($file) !== false )
  51. {
  52. rename($randName,$dir.'last.csv');
  53. @chmod($dir.'last.csv',$profileMask & 0666);
  54. }
  55. else
  56. unlink($randName);
  57. }
  58. else
  59. unlink($randName);
  60. }
  61. if($needUpdate)
  62. {
  63. $needTorrents = array();
  64. foreach($nowTorrents as $key=>$data)
  65. {
  66. if(array_key_exists($key,$wasTorrents))
  67. {
  68. $delta_up = floatval($data[0])-floatval($wasTorrents[$key][0]);
  69. $delta_down = floatval($data[1])-floatval($wasTorrents[$key][1]);
  70. if(($delta_up<0) || ($delta_down<0))
  71. {
  72. $delta_up = 0;
  73. $delta_down = 0;
  74. }
  75. if($delta_down!=0 || $delta_up!=0)
  76. {
  77. $needTorrents[$key] = array($delta_up,$delta_down);
  78. if($collectStatForTorrents)
  79. {
  80. $st = new rStat("torrents/".$key.".csv");
  81. $st->correct($delta_up,$delta_down);
  82. $st->flush();
  83. }
  84. }
  85. }
  86. else
  87. $needTorrents[$key] = $data;
  88. }
  89. $trackers = array();
  90. foreach($needTorrents as $key=>$data)
  91. {
  92. $req = new rXMLRPCRequest( array(
  93. new rXMLRPCCommand("t.multicall",
  94. array($key,"",getCmd("t.is_enabled="),getCmd("t.get_type="),getCmd("t.get_group="),getCmd("t.get_url=")))));
  95. $req->setParseByTypes();
  96. if($req->run() && !$req->fault)
  97. {
  98. $checkedDomains = array();
  99. $lastGroup = 65535;
  100. for($i = 0; $i<count($req->strings); $i++)
  101. {
  102. if($req->i8s[$i*3+2]>$lastGroup)
  103. break;
  104. if(($req->i8s[$i*3]!=0) && ($req->i8s[$i*3+1]<3))
  105. {
  106. $lastGroup = $req->i8s[$i*3+2];
  107. $domain = parse_url($req->strings[$i],PHP_URL_HOST);
  108. if(preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$domain)!=1)
  109. {
  110. $pos = strpos($domain,'.');
  111. if($pos!==false)
  112. {
  113. $tmp = substr($domain,$pos+1);
  114. if(strpos($tmp,'.')!==false)
  115. $domain = $tmp;
  116. }
  117. }
  118. if(!array_key_exists($domain,$checkedDomains))
  119. {
  120. if(array_key_exists($domain,$trackers))
  121. {
  122. $trackers[$domain][0]+=$needTorrents[$key][0];
  123. $trackers[$domain][1]+=$needTorrents[$key][1];
  124. }
  125. else
  126. $trackers[$domain] = $needTorrents[$key];
  127. $checkedDomains[$domain] = true;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. $delta_up = floatval($now[0])-floatval($was[0]);
  134. $delta_down = floatval($now[1])-floatval($was[1]);
  135. if(($delta_up<0) || ($delta_down<0))
  136. {
  137. $delta_up = 0;
  138. $delta_down = 0;
  139. }
  140. $st = new rStat('global.csv');
  141. $st->correct($delta_up,$delta_down);
  142. $st->flush();
  143. $dh = @opendir($dir."trackers");
  144. if($dh)
  145. {
  146. while(false !== ($file = readdir($dh)))
  147. {
  148. if(is_file($dir."trackers/".$file))
  149. {
  150. $file = basename($file, ".csv");
  151. if(!array_key_exists($file,$trackers))
  152. $trackers[$file] = array(0,0);
  153. }
  154. }
  155. closedir($dh);
  156. }
  157. foreach($trackers as $key=>$data)
  158. {
  159. if(!empty($key))
  160. {
  161. $st = new rStat("trackers/".$key.".csv");
  162. $st->correct($data[0],$data[1]);
  163. $st->flush();
  164. }
  165. }
  166. if($collectStatForTorrents)
  167. {
  168. $existingStats = array();
  169. $dh = @opendir($dir."torrents");
  170. if($dh)
  171. {
  172. while(false !== ($file = readdir($dh)))
  173. {
  174. if(is_file($dir."torrents/".$file))
  175. {
  176. $hash = basename($file, ".csv");
  177. $existingStats[$hash] = filemtime($dir."torrents/".$file);
  178. }
  179. }
  180. }
  181. closedir($dh);
  182. $deletedTorrents = array_diff_key( $existingStats, $nowTorrents );
  183. foreach($deletedTorrents as $hash=>$time)
  184. {
  185. if($tm - $time > $storeDeletedTorrentsStatsDuring)
  186. @unlink($dir."torrents/".$hash.".csv");
  187. }
  188. }
  189. }
  190. }
  191. }