serverstatus.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. // serverstatus.js
  2. var error = 0;
  3. var d = 0;
  4. var server_status = new Array();
  5. function timeSince(date) {
  6. if(date == 0)
  7. return "从未.";
  8. var seconds = Math.floor((new Date() - date) / 1000);
  9. var interval = Math.floor(seconds / 31536000);
  10. if (interval > 1)
  11. return interval + " 年前.";
  12. interval = Math.floor(seconds / 2592000);
  13. if (interval > 1)
  14. return interval + " 月前.";
  15. interval = Math.floor(seconds / 86400);
  16. if (interval > 1)
  17. return interval + " 日前.";
  18. interval = Math.floor(seconds / 3600);
  19. if (interval > 1)
  20. return interval + " 小时前.";
  21. interval = Math.floor(seconds / 60);
  22. if (interval > 1)
  23. return interval + " 分钟前.";
  24. /*if(Math.floor(seconds) >= 5)
  25. return Math.floor(seconds) + " seconds";*/
  26. else
  27. return "几秒前.";
  28. }
  29. function bytesToSize(bytes, precision, si)
  30. {
  31. var ret;
  32. si = typeof si !== 'undefined' ? si : 0;
  33. if(si != 0) {
  34. var kilobyte = 1000;
  35. var megabyte = kilobyte * 1000;
  36. var gigabyte = megabyte * 1000;
  37. var terabyte = gigabyte * 1000;
  38. } else {
  39. var kilobyte = 1024;
  40. var megabyte = kilobyte * 1024;
  41. var gigabyte = megabyte * 1024;
  42. var terabyte = gigabyte * 1024;
  43. }
  44. if ((bytes >= 0) && (bytes < kilobyte)) {
  45. return bytes + ' B';
  46. } else if ((bytes >= kilobyte) && (bytes < megabyte)) {
  47. ret = (bytes / kilobyte).toFixed(precision) + ' K';
  48. } else if ((bytes >= megabyte) && (bytes < gigabyte)) {
  49. ret = (bytes / megabyte).toFixed(precision) + ' M';
  50. } else if ((bytes >= gigabyte) && (bytes < terabyte)) {
  51. ret = (bytes / gigabyte).toFixed(precision) + ' G';
  52. } else if (bytes >= terabyte) {
  53. ret = (bytes / terabyte).toFixed(precision) + ' T';
  54. } else {
  55. return bytes + ' B';
  56. }
  57. if(si != 0) {
  58. return ret + 'B';
  59. } else {
  60. return ret + 'iB';
  61. }
  62. }
  63. function uptime() {
  64. $.getJSON("json/stats.json", function(result) {
  65. $("#loading-notice").remove();
  66. if(result.reload)
  67. setTimeout(function() { location.reload(true) }, 1000);
  68. for (var i = 0, rlen=result.servers.length; i < rlen; i++) {
  69. var TableRow = $("#servers tr#r" + i);
  70. var ExpandRow = $("#servers #rt" + i);
  71. var hack; // fuck CSS for making me do this
  72. if(i%2) hack="odd"; else hack="even";
  73. if (!TableRow.length) {
  74. $("#servers").append(
  75. "<tr id=\"r" + i + "\" data-toggle=\"collapse\" data-target=\"#rt" + i + "\" class=\"accordion-toggle " + hack + "\">" +
  76. "<td id=\"online4\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  77. "<td id=\"ip_status\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  78. "<td id=\"name\">加载中</td>" +
  79. "<td id=\"type\">加载中</td>" +
  80. "<td id=\"location\">加载中</td>" +
  81. "<td id=\"uptime\">加载中</td>" +
  82. "<td id=\"load\">加载中</td>" +
  83. "<td id=\"network\">加载中</td>" +
  84. "<td id=\"traffic\">加载中</td>" +
  85. "<td id=\"cpu\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  86. "<td id=\"memory\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  87. "<td id=\"hdd\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  88. "<td id=\"ping\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  89. "</tr>" +
  90. "<tr class=\"expandRow " + hack + "\"><td colspan=\"16\"><div class=\"accordian-body collapse\" id=\"rt" + i + "\">" +
  91. "<div id=\"expand_mem\">加载中</div>" +
  92. "<div id=\"expand_swap\">加载中</div>" +
  93. "<div id=\"expand_hdd\">加载中</div>" +
  94. "<div id=\"expand_tupd\">加载中</div>" +
  95. "<div id=\"expand_custom\">加载中</div>" +
  96. "</div></td></tr>"
  97. );
  98. TableRow = $("#servers tr#r" + i);
  99. ExpandRow = $("#servers #rt" + i);
  100. server_status[i] = true;
  101. }
  102. TableRow = TableRow[0];
  103. if(error) {
  104. TableRow.setAttribute("data-target", "#rt" + i);
  105. server_status[i] = true;
  106. }
  107. // Online4
  108. if (result.servers[i].online4) {
  109. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-success";
  110. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>开启</small>";
  111. } else {
  112. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-danger";
  113. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>关闭</small>";
  114. }
  115. // Online6
  116. //if (result.servers[i].online6) {
  117. // TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-success";
  118. // TableRow.children["online6"].children[0].children[0].innerHTML = "<small>开启</small>";
  119. //} else {
  120. // TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-danger";
  121. // TableRow.children["online6"].children[0].children[0].innerHTML = "<small>关闭</small>";
  122. //}
  123. // Ipstatus
  124. if (result.servers[i].ip_status) {
  125. TableRow.children["ip_status"].children[0].children[0].className = "progress-bar progress-bar-success";
  126. TableRow.children["ip_status"].children[0].children[0].innerHTML = "<small>MH361</small>";
  127. } else {
  128. TableRow.children["ip_status"].children[0].children[0].className = "progress-bar progress-bar-danger";
  129. TableRow.children["ip_status"].children[0].children[0].innerHTML = "<small>MH370</small>";
  130. }
  131. // Name
  132. TableRow.children["name"].innerHTML = result.servers[i].name;
  133. // Type
  134. TableRow.children["type"].innerHTML = result.servers[i].type;
  135. // Location
  136. TableRow.children["location"].innerHTML = result.servers[i].location;
  137. if (!result.servers[i].online4 && !result.servers[i].online6) {
  138. if (server_status[i]) {
  139. TableRow.children["uptime"].innerHTML = "–";
  140. TableRow.children["load"].innerHTML = "–";
  141. TableRow.children["network"].innerHTML = "–";
  142. TableRow.children["traffic"].innerHTML = "–";
  143. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
  144. TableRow.children["cpu"].children[0].children[0].style.width = "100%";
  145. TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>关闭</small>";
  146. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
  147. TableRow.children["memory"].children[0].children[0].style.width = "100%";
  148. TableRow.children["memory"].children[0].children[0].innerHTML = "<small>关闭</small>";
  149. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
  150. TableRow.children["hdd"].children[0].children[0].style.width = "100%";
  151. TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>关闭</small>";
  152. TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-danger";
  153. TableRow.children["ping"].children[0].children[0].style.width = "100%";
  154. TableRow.children["ping"].children[0].children[0].innerHTML = "<small>关闭</small>";
  155. if(ExpandRow.hasClass("in")) {
  156. ExpandRow.collapse("hide");
  157. }
  158. TableRow.setAttribute("data-target", "");
  159. server_status[i] = false;
  160. }
  161. } else {
  162. if (!server_status[i]) {
  163. TableRow.setAttribute("data-target", "#rt" + i);
  164. server_status[i] = true;
  165. }
  166. // Uptime
  167. TableRow.children["uptime"].innerHTML = result.servers[i].uptime;
  168. // Load: default load_1, you can change show: load_1, load_5, load_15
  169. if(result.servers[i].load == -1) {
  170. TableRow.children["load"].innerHTML = "–";
  171. } else {
  172. TableRow.children["load"].innerHTML = result.servers[i].load_1.toFixed(2);
  173. }
  174. // Network
  175. var netstr = "";
  176. if(result.servers[i].network_rx < 1024)
  177. netstr += result.servers[i].network_rx.toFixed(0) + "B";
  178. else if(result.servers[i].network_rx < 1024*1024)
  179. netstr += (result.servers[i].network_rx/1024).toFixed(0) + "K";
  180. else
  181. netstr += (result.servers[i].network_rx/1024/1024).toFixed(1) + "M";
  182. netstr += " | "
  183. if(result.servers[i].network_tx < 1024)
  184. netstr += result.servers[i].network_tx.toFixed(0) + "B";
  185. else if(result.servers[i].network_tx < 1024*1024)
  186. netstr += (result.servers[i].network_tx/1024).toFixed(0) + "K";
  187. else
  188. netstr += (result.servers[i].network_tx/1024/1024).toFixed(1) + "M";
  189. TableRow.children["network"].innerHTML = netstr;
  190. //Traffic
  191. var trafficstr = "";
  192. if(result.servers[i].network_in < 1024)
  193. trafficstr += result.servers[i].network_in.toFixed(0) + "B";
  194. else if(result.servers[i].network_in < 1024*1024)
  195. trafficstr += (result.servers[i].network_in/1024).toFixed(0) + "K";
  196. else if(result.servers[i].network_in < 1024*1024*1024)
  197. trafficstr += (result.servers[i].network_in/1024/1024).toFixed(1) + "M";
  198. else if(result.servers[i].network_in < 1024*1024*1024*1024)
  199. trafficstr += (result.servers[i].network_in/1024/1024/1024).toFixed(2) + "G";
  200. else
  201. trafficstr += (result.servers[i].network_in/1024/1024/1024/1024).toFixed(2) + "T";
  202. trafficstr += " | "
  203. if(result.servers[i].network_out < 1024)
  204. trafficstr += result.servers[i].network_out.toFixed(0) + "B";
  205. else if(result.servers[i].network_out < 1024*1024)
  206. trafficstr += (result.servers[i].network_out/1024).toFixed(0) + "K";
  207. else if(result.servers[i].network_out < 1024*1024*1024)
  208. trafficstr += (result.servers[i].network_out/1024/1024).toFixed(1) + "M";
  209. else if(result.servers[i].network_out < 1024*1024*1024*1024)
  210. trafficstr += (result.servers[i].network_out/1024/1024/1024).toFixed(2) + "G";
  211. else
  212. trafficstr += (result.servers[i].network_out/1024/1024/1024/1024).toFixed(2) + "T";
  213. TableRow.children["traffic"].innerHTML = trafficstr;
  214. // CPU
  215. if (result.servers[i].cpu >= 90)
  216. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
  217. else if (result.servers[i].cpu >= 80)
  218. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-warning";
  219. else
  220. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-success";
  221. TableRow.children["cpu"].children[0].children[0].style.width = result.servers[i].cpu + "%";
  222. TableRow.children["cpu"].children[0].children[0].innerHTML = result.servers[i].cpu + "%";
  223. // Memory
  224. var Mem = ((result.servers[i].memory_used/result.servers[i].memory_total)*100.0).toFixed(0);
  225. if (Mem >= 90)
  226. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
  227. else if (Mem >= 80)
  228. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-warning";
  229. else
  230. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-success";
  231. TableRow.children["memory"].children[0].children[0].style.width = Mem + "%";
  232. TableRow.children["memory"].children[0].children[0].innerHTML = Mem + "%";
  233. ExpandRow[0].children["expand_mem"].innerHTML = "内存: " + bytesToSize(result.servers[i].memory_used*1024, 2) + " / " + bytesToSize(result.servers[i].memory_total*1024, 2);
  234. // Swap
  235. ExpandRow[0].children["expand_swap"].innerHTML = "交换分区: " + bytesToSize(result.servers[i].swap_used*1024, 2) + " / " + bytesToSize(result.servers[i].swap_total*1024, 2);
  236. // HDD
  237. var HDD = ((result.servers[i].hdd_used/result.servers[i].hdd_total)*100.0).toFixed(0);
  238. if (HDD >= 90)
  239. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
  240. else if (HDD >= 80)
  241. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-warning";
  242. else
  243. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-success";
  244. TableRow.children["hdd"].children[0].children[0].style.width = HDD + "%";
  245. TableRow.children["hdd"].children[0].children[0].innerHTML = HDD + "%";
  246. ExpandRow[0].children["expand_hdd"].innerHTML = "硬盘: " + bytesToSize(result.servers[i].hdd_used*1024*1024, 2) + " / " + bytesToSize(result.servers[i].hdd_total*1024*1024, 2);
  247. // delay time
  248. // tcp, udp, process, thread count
  249. ExpandRow[0].children["expand_tupd"].innerHTML = "TCP/UDP/进/线: " + result.servers[i].tcp_count + " / " + result.servers[i].udp_count + " / " + result.servers[i].process_count+ " / " + result.servers[i].thread_count;
  250. // ping
  251. var PING_10010 = result.servers[i].ping_10010.toFixed(0);
  252. var PING_189 = result.servers[i].ping_189.toFixed(0);
  253. var PING_10086 = result.servers[i].ping_10086.toFixed(0);
  254. var pingTime = result.servers[i].time_10010 + "ms💻" + result.servers[i].time_189 + "ms💻" + result.servers[i].time_10086 + "ms"
  255. if (PING_10010 >= 10 || PING_189 >= 10 || PING_10086 >= 10)
  256. TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-danger";
  257. else
  258. TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-success";
  259. TableRow.children["ping"].children[0].children[0].setAttribute("data-toggle", "tooltip");
  260. TableRow.children["ping"].children[0].children[0].setAttribute("data-placement", "right");
  261. TableRow.children["ping"].children[0].children[0].setAttribute("title", pingTime);
  262. TableRow.children["ping"].children[0].children[0].innerHTML = PING_10010 + "%💻" + PING_189 + "%💻" + PING_10086 + "%";
  263. // Custom
  264. if (result.servers[i].custom) {
  265. ExpandRow[0].children["expand_custom"].innerHTML = result.servers[i].custom
  266. } else {
  267. ExpandRow[0].children["expand_custom"].innerHTML = ""
  268. }
  269. }
  270. };
  271. d = new Date(result.updated*1000);
  272. error = 0;
  273. }).fail(function(update_error) {
  274. if (!error) {
  275. $("#servers > tr.accordion-toggle").each(function(i) {
  276. var TableRow = $("#servers tr#r" + i)[0];
  277. var ExpandRow = $("#servers #rt" + i);
  278. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-error";
  279. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>错误</small>";
  280. //TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-error";
  281. //TableRow.children["online6"].children[0].children[0].innerHTML = "<small>错误</small>";
  282. TableRow.children["ip_status"].children[0].children[0].className = "progress-bar progress-bar-error";
  283. TableRow.children["ip_status"].children[0].children[0].innerHTML = "<small>错误</small>";
  284. TableRow.children["uptime"].children[0].children[0].className = "progress-bar progress-bar-error";
  285. TableRow.children["uptime"].children[0].children[0].innerHTML = "<small>错误</small>";
  286. TableRow.children["load"].children[0].children[0].className = "progress-bar progress-bar-error";
  287. TableRow.children["load"].children[0].children[0].innerHTML = "<small>错误</small>";
  288. TableRow.children["network"].children[0].children[0].className = "progress-bar progress-bar-error";
  289. TableRow.children["network"].children[0].children[0].innerHTML = "<small>错误</small>";
  290. TableRow.children["traffic"].children[0].children[0].className = "progress-bar progress-bar-error";
  291. TableRow.children["traffic"].children[0].children[0].innerHTML = "<small>错误</small>";
  292. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-error";
  293. TableRow.children["cpu"].children[0].children[0].style.width = "100%";
  294. TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>错误</small>";
  295. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-error";
  296. TableRow.children["memory"].children[0].children[0].style.width = "100%";
  297. TableRow.children["memory"].children[0].children[0].innerHTML = "<small>错误</small>";
  298. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-error";
  299. TableRow.children["hdd"].children[0].children[0].style.width = "100%";
  300. TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>错误</small>";
  301. TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-error";
  302. TableRow.children["ping"].children[0].children[0].style.width = "100%";
  303. TableRow.children["ping"].children[0].children[0].innerHTML = "<small>错误</small>";
  304. if(ExpandRow.hasClass("in")) {
  305. ExpandRow.collapse("hide");
  306. }
  307. TableRow.setAttribute("data-target", "");
  308. server_status[i] = false;
  309. });
  310. }
  311. error = 1;
  312. $("#updated").html("更新错误.");
  313. });
  314. }
  315. function updateTime() {
  316. if (!error)
  317. $("#updated").html("最后更新: " + timeSince(d));
  318. }
  319. uptime();
  320. updateTime();
  321. setInterval(uptime, 2000);
  322. setInterval(updateTime, 2000);
  323. // styleswitcher.js
  324. function setActiveStyleSheet(title) {
  325. var i, a, main;
  326. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  327. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
  328. a.disabled = true;
  329. if(a.getAttribute("title") == title) a.disabled = false;
  330. }
  331. }
  332. }
  333. function getActiveStyleSheet() {
  334. var i, a;
  335. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  336. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled)
  337. return a.getAttribute("title");
  338. }
  339. return null;
  340. }
  341. function getPreferredStyleSheet() {
  342. var i, a;
  343. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  344. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title"))
  345. return a.getAttribute("title");
  346. }
  347. return null;
  348. }
  349. function createCookie(name,value,days) {
  350. if (days) {
  351. var date = new Date();
  352. date.setTime(date.getTime()+(days*24*60*60*1000));
  353. var expires = "; expires="+date.toGMTString();
  354. }
  355. else expires = "";
  356. document.cookie = name+"="+value+expires+"; path=/";
  357. }
  358. function readCookie(name) {
  359. var nameEQ = name + "=";
  360. var ca = document.cookie.split(';');
  361. for(var i=0;i < ca.length;i++) {
  362. var c = ca[i];
  363. while (c.charAt(0)==' ')
  364. c = c.substring(1,c.length);
  365. if (c.indexOf(nameEQ) == 0)
  366. return c.substring(nameEQ.length,c.length);
  367. }
  368. return null;
  369. }
  370. window.onload = function(e) {
  371. var cookie = readCookie("style");
  372. var title = cookie ? cookie : getPreferredStyleSheet();
  373. setActiveStyleSheet(title);
  374. }
  375. window.onunload = function(e) {
  376. var title = getActiveStyleSheet();
  377. createCookie("style", title, 365);
  378. }
  379. var cookie = readCookie("style");
  380. var title = cookie ? cookie : getPreferredStyleSheet();
  381. setActiveStyleSheet(title);