uptime.html 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <h3><i class="clock green icon"></i> Uptime Monitor</h3>
  2. <p>Check the online state of proxied targets</p>
  3. <!--
  4. <div class="ui toggle checkbox" id="utmEnable">
  5. <input type="checkbox" name="utmEnable">
  6. <label>Enable External Access</label>
  7. </div>
  8. <div class="ui message">
  9. You can expose the uptime monitor interface to public by adding: <br>
  10. <code>%uptime_monitor%</code>
  11. <br>as a subdomain or virtual directory target URL in the "Create Proxy Rules" tab.
  12. </div>
  13. -->
  14. <div class="ui divider"></div>
  15. <div id="utmrender" class="ui basic segment">
  16. <div class="ui basic segment">
  17. <h4 class="ui header">
  18. <i class="red remove icon"></i>
  19. <div class="content">
  20. Uptime Monitoring service is currently unavailable
  21. <div class="sub header">This might cause by an error in cluster communication within the host servers. Please wait for administrator to resolve the issue.</div>
  22. </div>
  23. </h4>
  24. </div>
  25. </div>
  26. <div align="center">
  27. <button class="ui basic circular green icon button" onclick="reloadUptimeList();"><i class="refresh icon"></i></button>
  28. </div>
  29. <script>
  30. $('#utmEnable').checkbox({
  31. onChange: function() {
  32. var utmEnable = $('input[name="utmEnable"]').is(":checked");
  33. $.post({
  34. url: '/api/toggle-utm',
  35. data: {utmEnable: utmEnable},
  36. success: function(response) {
  37. console.log(response);
  38. },
  39. error: function(error) {
  40. console.log(error);
  41. }
  42. });
  43. }
  44. });
  45. function initUptimeTable(){
  46. $.get("/api/utm/list", function(data){
  47. let records = data;
  48. renderRecords(records);
  49. })
  50. }
  51. initUptimeTable();
  52. function reloadUptimeList(){
  53. $("#utmrender").html(`<div class="ui segment">
  54. <div class="ui active inverted dimmer" style="z-index: 2;">
  55. <div class="ui text loader">Loading</div>
  56. </div>
  57. <br><br><br><br>
  58. </div>`);
  59. setTimeout(initUptimeTable, 300);
  60. }
  61. //For every 5 minutes
  62. setInterval(function(){
  63. $.get("/api/utm/list", function(data){
  64. console.log("Status Updated");
  65. records = data;
  66. renderRecords(records);
  67. });
  68. }, (300 * 1000));
  69. function renderRecords(records){
  70. $("#utmrender").html("");
  71. for (let [key, value] of Object.entries(records)) {
  72. renderUptimeData(key, value);
  73. }
  74. }
  75. function format_time(s) {
  76. const date = new Date(s * 1e3);
  77. return(date.toLocaleString());
  78. }
  79. function renderUptimeData(key, value){
  80. if (value.length == 0){
  81. return
  82. }
  83. let id = value[0].ID;
  84. let name = value[0].Name;
  85. let url = value[0].URL;
  86. let protocol = value[0].Protocol;
  87. //Generate the status dot
  88. let statusDotList = ``;
  89. for(var i = 0; i < (288 - value.length); i++){
  90. //Padding
  91. statusDotList += `<div class="padding statusDot"></div>`
  92. }
  93. let ontimeRate = 0;
  94. for (var i = 0; i < value.length; i++){
  95. //Render status to html
  96. let thisStatus = value[i];
  97. let dotType = "";
  98. if (thisStatus.Online){
  99. if (thisStatus.StatusCode < 200 || thisStatus.StatusCode >= 300){
  100. dotType = "error";
  101. }else{
  102. dotType = "online";
  103. }
  104. ontimeRate++;
  105. }else{
  106. dotType = "offline";
  107. }
  108. let datetime = format_time(thisStatus.Timestamp);
  109. statusDotList += `<div title="${datetime}" class="${dotType} statusDot"></div>`
  110. }
  111. ontimeRate = ontimeRate / value.length * 100;
  112. let ontimeColor = "#df484a"
  113. if (ontimeRate > 0.8){
  114. ontimeColor = "#3bd671";
  115. }else if(ontimeRate > 0.5) {
  116. ontimeColor = "#f29030";
  117. }
  118. //Check of online status now
  119. let currentOnlineStatus = "Unknown";
  120. let onlineStatusCss = ``;
  121. if (value[value.length - 1].Online){
  122. currentOnlineStatus = `<i class="circle icon"></i> Online`;
  123. onlineStatusCss = `color: #3bd671;`;
  124. }else{
  125. currentOnlineStatus = `<i class="circle icon"></i> Offline`;
  126. onlineStatusCss = `color: #df484a;`;
  127. }
  128. //Generate the html
  129. $("#utmrender").append(`<div class="ui basic segment statusbar">
  130. <div class="domain">
  131. <div style="position: absolute; top: 0; right: 0.4em;">
  132. <p class="onlineStatus" style="display: inline-block; font-size: 1.3em; padding-right: 0.5em; padding-left: 0.3em; ${onlineStatusCss}">${currentOnlineStatus}</p>
  133. </div>
  134. <div>
  135. <h3 class="ui header" style="margin-bottom: 0.2em;">${name}</h3>
  136. <a href="${url}" target="_blank">${url}</a> | <span style="color: ${ontimeColor};">${(ontimeRate).toFixed(2)}%<span>
  137. </div>
  138. <div class="ui basic label protocol" style="position: absolute; bottom: 0; right: 0.2em; margin-bottom: -0.6em;">
  139. proto: ${protocol}
  140. </div>
  141. </div>
  142. <div class="status" style="marign-top: 1em;">
  143. ${statusDotList}
  144. </div>
  145. <div class="ui divider"></div>
  146. </div>`);
  147. }
  148. </script>