uptime.html 5.6 KB

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