serverstatus.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. var shstr = '<div class="col-lg-4 col-md-4 col-sm-4">'+
  66. ' <div class="panel panel-block panel-block-sm panel-location">'+
  67. '<div class="location-header">'+
  68. ' <h3 class="h4"><img src="img/clients/@location.png"> @name <small>@type</small></h3>'+
  69. ' <i class="zmdi zmdi-check-circle @online"></i>'+
  70. ' </div>'+
  71. ' <div class="location-progress">'+
  72. ' <div class="progress progress-sm">'+
  73. ' <div class="progress-bar" style="width: @load%;"></div>'+
  74. ' </div>'+
  75. ' </div>'+
  76. ' <ul class="location-info list-styled">'+
  77. ' <li><span class="list-label">Network @network_rxandnetwork_tx</li>'+
  78. ' <li><span class="list-label">负载状态:</span> @load%</li>'+
  79. ' </ul>'+
  80. ' </div>'+
  81. ' </div>';
  82. var shinnerhtml='';
  83. $("#loading-notice").remove();
  84. if(result.reload)
  85. setTimeout(function() { location.reload(true) }, 1000);
  86. for (var i = 0; i < result.servers.length; i++) {
  87. //----kaishi
  88. // Network
  89. var newnetstr = "";
  90. if(result.servers[i].network_rx < 1000)
  91. newnetstr += result.servers[i].network_rx.toFixed(0) + "B";
  92. else if(result.servers[i].network_rx < 1000*1000)
  93. newnetstr += (result.servers[i].network_rx/1000).toFixed(0) + "K";
  94. else
  95. newnetstr += (result.servers[i].network_rx/1000/1000).toFixed(1) + "M";
  96. newnetstr += " | "
  97. if(result.servers[i].network_tx < 1000)
  98. newnetstr += result.servers[i].network_tx.toFixed(0) + "B";
  99. else if(result.servers[i].network_tx < 1000*1000)
  100. newnetstr += (result.servers[i].network_tx/1000).toFixed(0) + "K";
  101. else
  102. newnetstr += (result.servers[i].network_tx/1000/1000).toFixed(1) + "M";
  103. shinnerhtml+=shstr.replace("@name",result.servers[i].name).replace("@network_rxandnetwork_tx",newnetstr).replace("@type",result.servers[i].type).replace("@online",result.servers[i].online4?'text-success':'text-error').replace("@location",result.servers[i].location).replace("@load",result.servers[i].load).replace("@load",result.servers[i].load);
  104. //----jieshu
  105. var TableRow = $("#servers tr#r" + i);
  106. var ExpandRow = $("#servers #rt" + i);
  107. var hack; // fuck CSS for making me do this
  108. if(i%2) hack="odd"; else hack="even";
  109. if (!TableRow.length) {
  110. $("#servers").append(
  111. "<tr id=\"r" + i + "\" data-toggle=\"collapse\" data-target=\"#rt" + i + "\" class=\"accordion-toggle " + hack + "\">" +
  112. "<td id=\"online4\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  113. "<td id=\"name\">加载中</td>" +
  114. "<td id=\"type\">加载中</td>" +
  115. "<!-- td id=\"host\">加载中</td -->" +
  116. "<td id=\"location\">加载中</td>" +
  117. "<td id=\"uptime\">加载中</td>" +
  118. "<td id=\"load\">加载中</td>" +
  119. "<td id=\"network\">加载中</td>" +
  120. "<td id=\"traffic\">加载中</td>" +
  121. "<td id=\"cpu\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  122. "<td id=\"memory\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  123. "<td id=\"hdd\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
  124. "</tr>" +
  125. "<tr class=\"expandRow " + hack + "\"><td colspan=\"12\"><div class=\"accordian-body collapse\" id=\"rt" + i + "\">" +
  126. "<div id=\"expand_mem\">加载中</div>" +
  127. "<div id=\"expand_swap\">加载中</div>" +
  128. "<div id=\"expand_hdd\">加载中</div>" +
  129. "<div id=\"expand_custom\">加载中</div>" +
  130. "</div></td></tr>"
  131. );
  132. TableRow = $("#servers tr#r" + i);
  133. ExpandRow = $("#servers #rt" + i);
  134. server_status[i] = true;
  135. }
  136. TableRow = TableRow[0];
  137. if(error) {
  138. TableRow.setAttribute("data-target", "#rt" + i);
  139. server_status[i] = true;
  140. }
  141. // Online4
  142. if (result.servers[i].online4) {
  143. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-success";
  144. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>运行中</small>";
  145. } else {
  146. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-danger";
  147. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>维护中</small>";
  148. }
  149. // Online6
  150. //if (result.servers[i].online6) {
  151. // TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-success";
  152. // TableRow.children["online6"].children[0].children[0].innerHTML = "<small>开启</small>";
  153. //} else {
  154. // TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-danger";
  155. // TableRow.children["online6"].children[0].children[0].innerHTML = "<small>关闭</small>";
  156. //}
  157. // Name
  158. TableRow.children["name"].innerHTML = result.servers[i].name;
  159. // Type
  160. TableRow.children["type"].innerHTML = result.servers[i].type;
  161. // Host
  162. //TableRow.children["host"].innerHTML = result.servers[i].host;
  163. // Location
  164. TableRow.children["location"].innerHTML = result.servers[i].location;
  165. if (!result.servers[i].online4 && !result.servers[i].online6) {
  166. if (server_status[i]) {
  167. TableRow.children["uptime"].innerHTML = "–";
  168. TableRow.children["load"].innerHTML = "–";
  169. TableRow.children["network"].innerHTML = "–";
  170. TableRow.children["traffic"].innerHTML = "–";
  171. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
  172. TableRow.children["cpu"].children[0].children[0].style.width = "100%";
  173. TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>维护中</small>";
  174. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
  175. TableRow.children["memory"].children[0].children[0].style.width = "100%";
  176. TableRow.children["memory"].children[0].children[0].innerHTML = "<small>维护中</small>";
  177. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
  178. TableRow.children["hdd"].children[0].children[0].style.width = "100%";
  179. TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>维护中</small>";
  180. if(ExpandRow.hasClass("in")) {
  181. ExpandRow.collapse("hide");
  182. }
  183. TableRow.setAttribute("data-target", "");
  184. server_status[i] = false;
  185. }
  186. } else {
  187. if (!server_status[i]) {
  188. TableRow.setAttribute("data-target", "#rt" + i);
  189. server_status[i] = true;
  190. }
  191. // Uptime
  192. TableRow.children["uptime"].innerHTML = result.servers[i].uptime;
  193. // Load
  194. if(result.servers[i].load == -1) {
  195. TableRow.children["load"].innerHTML = "–";
  196. } else {
  197. TableRow.children["load"].innerHTML = result.servers[i].load;
  198. }
  199. // Network
  200. var netstr = "";
  201. if(result.servers[i].network_rx < 1000)
  202. netstr += result.servers[i].network_rx.toFixed(0) + "B";
  203. else if(result.servers[i].network_rx < 1000*1000)
  204. netstr += (result.servers[i].network_rx/1000).toFixed(0) + "K";
  205. else
  206. netstr += (result.servers[i].network_rx/1000/1000).toFixed(1) + "M";
  207. netstr += " | "
  208. if(result.servers[i].network_tx < 1000)
  209. netstr += result.servers[i].network_tx.toFixed(0) + "B";
  210. else if(result.servers[i].network_tx < 1000*1000)
  211. netstr += (result.servers[i].network_tx/1000).toFixed(0) + "K";
  212. else
  213. netstr += (result.servers[i].network_tx/1000/1000).toFixed(1) + "M";
  214. TableRow.children["network"].innerHTML = netstr;
  215. //Traffic
  216. var trafficstr = "";
  217. if(result.servers[i].network_in < 1024)
  218. trafficstr += result.servers[i].network_in.toFixed(0) + "B";
  219. else if(result.servers[i].network_in < 1024*1024)
  220. trafficstr += (result.servers[i].network_in/1024).toFixed(0) + "K";
  221. else if(result.servers[i].network_in < 1024*1024*1024)
  222. trafficstr += (result.servers[i].network_in/1024/1024).toFixed(1) + "M";
  223. else if(result.servers[i].network_in < 1024*1024*1024*1024)
  224. trafficstr += (result.servers[i].network_in/1024/1024/1024).toFixed(2) + "G";
  225. else
  226. trafficstr += (result.servers[i].network_in/1024/1024/1024/1024).toFixed(2) + "T";
  227. trafficstr += " | "
  228. if(result.servers[i].network_out < 1024)
  229. trafficstr += result.servers[i].network_out.toFixed(0) + "B";
  230. else if(result.servers[i].network_out < 1024*1024)
  231. trafficstr += (result.servers[i].network_out/1024).toFixed(0) + "K";
  232. else if(result.servers[i].network_out < 1024*1024*1024)
  233. trafficstr += (result.servers[i].network_out/1024/1024).toFixed(1) + "M";
  234. else if(result.servers[i].network_out < 1024*1024*1024*1024)
  235. trafficstr += (result.servers[i].network_out/1024/1024/1024).toFixed(2) + "G";
  236. else
  237. trafficstr += (result.servers[i].network_out/1024/1024/1024/1024).toFixed(2) + "T";
  238. TableRow.children["traffic"].innerHTML = trafficstr;
  239. // CPU
  240. if (result.servers[i].cpu >= 90)
  241. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
  242. else if (result.servers[i].cpu >= 80)
  243. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-warning";
  244. else
  245. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-success";
  246. TableRow.children["cpu"].children[0].children[0].style.width = result.servers[i].cpu + "%";
  247. TableRow.children["cpu"].children[0].children[0].innerHTML = result.servers[i].cpu + "%";
  248. // Memory
  249. var Mem = ((result.servers[i].memory_used/result.servers[i].memory_total)*100.0).toFixed(0);
  250. if (Mem >= 90)
  251. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
  252. else if (Mem >= 80)
  253. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-warning";
  254. else
  255. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-success";
  256. TableRow.children["memory"].children[0].children[0].style.width = Mem + "%";
  257. TableRow.children["memory"].children[0].children[0].innerHTML = Mem + "%";
  258. ExpandRow[0].children["expand_mem"].innerHTML = "内存信息: " + bytesToSize(result.servers[i].memory_used*1024, 2) + " / " + bytesToSize(result.servers[i].memory_total*1024, 2);
  259. // Swap
  260. ExpandRow[0].children["expand_swap"].innerHTML = "交换分区: " + bytesToSize(result.servers[i].swap_used*1024, 2) + " / " + bytesToSize(result.servers[i].swap_total*1024, 2);
  261. // HDD
  262. var HDD = ((result.servers[i].hdd_used/result.servers[i].hdd_total)*100.0).toFixed(0);
  263. if (HDD >= 90)
  264. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
  265. else if (HDD >= 80)
  266. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-warning";
  267. else
  268. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-success";
  269. TableRow.children["hdd"].children[0].children[0].style.width = HDD + "%";
  270. TableRow.children["hdd"].children[0].children[0].innerHTML = HDD + "%";
  271. ExpandRow[0].children["expand_hdd"].innerHTML = "硬盘信息: " + bytesToSize(result.servers[i].hdd_used*1024*1024, 2) + " / " + bytesToSize(result.servers[i].hdd_total*1024*1024, 2);
  272. // Custom
  273. if (result.servers[i].custom) {
  274. ExpandRow[0].children["expand_custom"].innerHTML = result.servers[i].custom
  275. } else {
  276. ExpandRow[0].children["expand_custom"].innerHTML = ""
  277. }
  278. }
  279. };
  280. console.log(shinnerhtml);
  281. $('#cards').html(shinnerhtml);
  282. d = new Date(result.updated*1000);
  283. error = 0;
  284. }).fail(function(update_error) {
  285. if (!error) {
  286. $("#servers > tr.accordion-toggle").each(function(i) {
  287. var TableRow = $("#servers tr#r" + i)[0];
  288. var ExpandRow = $("#servers #rt" + i);
  289. TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-error";
  290. TableRow.children["online4"].children[0].children[0].innerHTML = "<small>错误</small>";
  291. //TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-error";
  292. //TableRow.children["online6"].children[0].children[0].innerHTML = "<small>错误</small>";
  293. TableRow.children["uptime"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
  294. TableRow.children["load"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
  295. TableRow.children["network"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
  296. TableRow.children["traffic"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
  297. TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-error";
  298. TableRow.children["cpu"].children[0].children[0].style.width = "100%";
  299. TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>错误</small>";
  300. TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-error";
  301. TableRow.children["memory"].children[0].children[0].style.width = "100%";
  302. TableRow.children["memory"].children[0].children[0].innerHTML = "<small>错误</small>";
  303. TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-error";
  304. TableRow.children["hdd"].children[0].children[0].style.width = "100%";
  305. TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>错误</small>";
  306. if(ExpandRow.hasClass("in")) {
  307. ExpandRow.collapse("hide");
  308. }
  309. TableRow.setAttribute("data-target", "");
  310. server_status[i] = false;
  311. });
  312. }
  313. error = 1;
  314. $("#updated").html("更新错误.");
  315. });
  316. }
  317. function updateTime() {
  318. if (!error)
  319. $("#updated").html("最后更新: " + timeSince(d));
  320. }
  321. uptime();
  322. updateTime();
  323. setInterval(uptime, 2000);
  324. setInterval(updateTime, 500);
  325. // styleswitcher.js
  326. function setActiveStyleSheet(title) {
  327. var i, a, main;
  328. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  329. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
  330. a.disabled = true;
  331. if(a.getAttribute("title") == title) a.disabled = false;
  332. }
  333. }
  334. }
  335. function getActiveStyleSheet() {
  336. var i, a;
  337. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  338. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled)
  339. return a.getAttribute("title");
  340. }
  341. return null;
  342. }
  343. function getPreferredStyleSheet() {
  344. var i, a;
  345. for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
  346. if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title"))
  347. return a.getAttribute("title");
  348. }
  349. return null;
  350. }
  351. function createCookie(name,value,days) {
  352. if (days) {
  353. var date = new Date();
  354. date.setTime(date.getTime()+(days*24*60*60*1000));
  355. var expires = "; expires="+date.toGMTString();
  356. }
  357. else expires = "";
  358. document.cookie = name+"="+value+expires+"; path=/";
  359. }
  360. function readCookie(name) {
  361. var nameEQ = name + "=";
  362. var ca = document.cookie.split(';');
  363. for(var i=0;i < ca.length;i++) {
  364. var c = ca[i];
  365. while (c.charAt(0)==' ')
  366. c = c.substring(1,c.length);
  367. if (c.indexOf(nameEQ) == 0)
  368. return c.substring(nameEQ.length,c.length);
  369. }
  370. return null;
  371. }
  372. window.onload = function(e) {
  373. var cookie = readCookie("style");
  374. var title = cookie ? cookie : getPreferredStyleSheet();
  375. setActiveStyleSheet(title);
  376. }
  377. window.onunload = function(e) {
  378. var title = getActiveStyleSheet();
  379. createCookie("style", title, 365);
  380. }
  381. var cookie = readCookie("style");
  382. var title = cookie ? cookie : getPreferredStyleSheet();
  383. setActiveStyleSheet(title);