/htdocs/admin/index.php

https://github.com/echiu64/Bitcoin-mining-proxy · PHP · 307 lines · 258 code · 31 blank · 18 comment · 9 complexity · 9f087f39596dececff29067bf2fc20f7 MD5 · raw file

  1. <?php
  2. /*
  3. * ./htdocs/admin/index.php
  4. *
  5. * Copyright (C) 2011 Chris Howie <me@chrishowie.com>
  6. *
  7. * This program is free software: you can redistribute it and/or modify
  8. * it under the terms of the GNU Affero General Public License as
  9. * published by the Free Software Foundation, either version 3 of the
  10. * License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU Affero General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Affero General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. require_once(dirname(__FILE__) . '/../common.inc.php');
  21. require_once(dirname(__FILE__) . '/../admin/controller.inc.php');
  22. require_once(dirname(__FILE__) . '/../views/admin/dashboard.view.php');
  23. class AdminDashboardController extends AdminController
  24. {
  25. public function indexDefaultView()
  26. {
  27. global $BTC_PROXY;
  28. $viewdata = array();
  29. $interval = $_REQUEST['interval'];
  30. if (strlen($interval) > 0) {
  31. $viewdata['interval_override'] = $interval;
  32. } else {
  33. $interval = $BTC_PROXY['average_interval'];
  34. }
  35. $pdo = db_connect();
  36. $viewdata['recent-submissions'] = db_query($pdo, "
  37. SELECT
  38. w.name AS worker,
  39. p.name AS pool,
  40. sw.result AS result,
  41. sw.time AS time
  42. FROM (
  43. SELECT pool_id, worker_id, result, time
  44. FROM submitted_work
  45. ORDER BY id DESC
  46. LIMIT {$BTC_PROXY['recent_work_num']}
  47. ) sw
  48. INNER JOIN pool p
  49. ON p.id = sw.pool_id
  50. INNER JOIN worker w
  51. ON w.id = sw.worker_id
  52. ORDER BY sw.time DESC
  53. ");
  54. $viewdata['recent-failed-submissions'] = db_query($pdo, "
  55. SELECT
  56. w.name AS worker,
  57. p.name AS pool,
  58. sw.result AS result,
  59. sw.time AS time
  60. FROM (
  61. SELECT pool_id, worker_id, result, time
  62. FROM submitted_work
  63. WHERE result = 0
  64. ORDER BY id DESC
  65. LIMIT {$BTC_PROXY['recent_work_num']}
  66. ) sw
  67. INNER JOIN pool p
  68. ON p.id = sw.pool_id
  69. INNER JOIN worker w
  70. ON w.id = sw.worker_id
  71. ORDER BY sw.time DESC
  72. ");
  73. $viewdata['worker-status'] = db_query($pdo, '
  74. SELECT
  75. w.name AS worker,
  76. w.id AS worker_id,
  77. worked.pool_name AS active_pool,
  78. worked.latest AS active_time,
  79. submitted.pool_name AS last_accepted_pool,
  80. submitted.latest AS last_accepted_time,
  81. sli.shares_last_interval AS shares_last_interval,
  82. sli.accepted_last_interval,
  83. sli.rejected_last_interval,
  84. sli.shares_last_interval * 4294967296 / :average_interval / 1000000 as mhash
  85. FROM worker w
  86. LEFT OUTER JOIN (
  87. SELECT
  88. wd.worker_id AS worker_id,
  89. wd.time_requested AS latest,
  90. p.name AS pool_name
  91. FROM work_data wd
  92. INNER JOIN (
  93. SELECT
  94. worker_id,
  95. MAX(time_requested) AS latest
  96. FROM work_data
  97. GROUP BY worker_id
  98. ) wd2
  99. ON wd.worker_id = wd2.worker_id
  100. AND wd.time_requested = wd2.latest
  101. LEFT OUTER JOIN pool p
  102. ON p.id = wd.pool_id
  103. GROUP BY wd.worker_id
  104. ) worked
  105. ON worked.worker_id = w.id
  106. LEFT OUTER JOIN (
  107. SELECT
  108. sw.worker_id AS worker_id,
  109. sw.time AS latest,
  110. p.name AS pool_name
  111. FROM submitted_work sw
  112. INNER JOIN (
  113. SELECT
  114. worker_id,
  115. MAX(time) AS latest
  116. FROM submitted_work
  117. WHERE result = 1
  118. GROUP BY worker_id
  119. ) sw2
  120. ON sw.worker_id = sw2.worker_id
  121. AND sw.result = 1
  122. AND sw.time = sw2.latest
  123. LEFT OUTER JOIN pool p
  124. ON p.id = sw.pool_id
  125. GROUP BY sw.worker_id
  126. ) submitted
  127. ON submitted.worker_id = w.id
  128. LEFT OUTER JOIN (
  129. SELECT
  130. worker_id,
  131. COUNT(result) AS shares_last_interval,
  132. SUM(IF(result = 1, 1, 0)) accepted_last_interval,
  133. SUM(IF(result = 0, 1, 0)) rejected_last_interval
  134. FROM
  135. submitted_work sw
  136. WHERE
  137. time >= UTC_TIMESTAMP() - INTERVAL :average_interval_two SECOND
  138. GROUP BY
  139. sw.worker_id
  140. ) sli
  141. ON sli.worker_id = w.id
  142. ORDER BY w.name
  143. ', array(
  144. ':average_interval' => $interval,
  145. ':average_interval_two' => $interval
  146. ));
  147. $viewdata['pool-status'] = db_query($pdo, '
  148. SELECT
  149. p.id pool_id
  150. , p.name pool
  151. , w.name worker
  152. , IFNULL(sw.accepted, 0) accepted
  153. , IFNULL(sw.rejected, 0) rejected
  154. , IFNULL(sw.accepted, 0) + IFNULL(sw.rejected, 0) total
  155. , IFNULL(wd.records, 0) getworks
  156. , wd.last_request
  157. FROM
  158. pool p
  159. INNER JOIN
  160. (
  161. SELECT
  162. IFNULL(wd.pool_id, wd2.pool_id) pool_id
  163. , worker_id
  164. , records
  165. , last_request
  166. FROM
  167. (
  168. SELECT
  169. pool_id
  170. , COUNT(*) records
  171. FROM
  172. work_data
  173. WHERE
  174. time_requested >= UTC_TIMESTAMP() - INTERVAL :average_interval_1 SECOND
  175. GROUP BY
  176. pool_id
  177. ) wd
  178. RIGHT JOIN
  179. (
  180. SELECT
  181. wd4.pool_id
  182. , wd3.worker_id
  183. , wd4.last_request
  184. FROM
  185. work_data wd3
  186. INNER JOIN
  187. (
  188. SELECT
  189. pool_id
  190. , MAX(time_requested) AS last_request
  191. FROM
  192. work_data
  193. GROUP BY
  194. pool_id
  195. ) wd4
  196. ON wd3.time_requested = wd4.last_request
  197. GROUP BY
  198. wd4.pool_id
  199. ) wd2
  200. ON wd.pool_id = wd2.pool_id
  201. ) wd
  202. ON p.id = wd.pool_id
  203. LEFT OUTER JOIN
  204. (
  205. SELECT
  206. pool_id
  207. , SUM(IF(result = 1, 1, 0)) accepted
  208. , SUM(IF(result = 1, 0, 1)) rejected
  209. FROM
  210. submitted_work
  211. WHERE
  212. time >= UTC_TIMESTAMP() - INTERVAL :average_interval_2 SECOND
  213. GROUP BY
  214. pool_id
  215. ) sw
  216. ON wd.pool_id = sw.pool_id
  217. INNER JOIN worker w
  218. ON wd.worker_id = w.id
  219. WHERE
  220. p.enabled = 1
  221. ', array(
  222. ':average_interval_1' => $interval,
  223. ':average_interval_2' => $interval
  224. ));
  225. $version = db_query($pdo, "
  226. SELECT value FROM settings
  227. WHERE `key` = 'version'
  228. ");
  229. if ($version === false || count($version) == 0 || $version[0]['value'] != DB_SCHEMA_VERSION) {
  230. $viewdata['old-schema'] = true;
  231. }
  232. if (ini_get('allow_url_fopen') != 1) {
  233. $viewdata['url-fopen-disabled'] = true;
  234. }
  235. return new AdminDashboardView($viewdata);
  236. }
  237. }
  238. MvcEngine::run(new AdminDashboardController());
  239. ?>