goto-host-from-alarm.html 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <!DOCTYPE html>
  2. <!-- SPDX-License-Identifier: GPL-3.0-or-later -->
  3. <html lang="en">
  4. <head>
  5. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  6. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  7. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  8. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  9. })(window,document,'script','dataLayer','GTM-N6CBMJD');
  10. dataLayer.push({"anonymous_statistics" : "false"});
  11. </script>
  12. <title>Goto a host you know...</title>
  13. <meta name="application-name" content="netdata">
  14. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  15. <meta charset="utf-8">
  16. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  17. <meta name="viewport" content="width=device-width, initial-scale=1">
  18. <meta name="apple-mobile-web-app-capable" content="yes">
  19. <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  20. </head>
  21. <script>
  22. var netdataRegistry = true;
  23. var netdataRegistryAfterMs = 0;
  24. var netdataTheme = 'slate';
  25. var netdataShowHelp = true;
  26. </script>
  27. <script type="text/javascript" src="dashboard.js?v20190902-0"></script>
  28. <script>
  29. function escapeUserInputHTML(s) {
  30. return s.toString()
  31. .replace(/&/g, '&amp;')
  32. .replace(/</g, '&lt;')
  33. .replace(/>/g, '&gt;')
  34. .replace(/"/g, '&quot;')
  35. .replace(/#/g, '&#35;')
  36. .replace(/'/g, '&#39;')
  37. .replace(/\(/g,'&#40;')
  38. .replace(/\)/g,'&#41;')
  39. .replace(/\//g,'&#47;');
  40. }
  41. // if string.startsWith is not defined, define it
  42. if(typeof String.prototype.startsWith !== 'function') {
  43. String.prototype.startsWith = function(s) {
  44. if(s.length > this.length) return false;
  45. return this.slice(s.length) === s;
  46. };
  47. }
  48. function verifyURL(s) {
  49. if(typeof(s) === 'string' && (s.startsWith('http://') || s.startsWith('https://')))
  50. return s
  51. .replace(/'/g, '%22')
  52. .replace(/"/g, '%27')
  53. .replace(/\)/g, '%28')
  54. .replace(/\(/g, '%29');
  55. console.log('invalid URL detected:');
  56. console.log(s);
  57. return 'javascript:alert("invalid url");';
  58. }
  59. var urlOptions = {
  60. host: null,
  61. chart: null,
  62. family: null,
  63. alarm: null,
  64. alarm_unique_id: 0,
  65. alarm_id: 0,
  66. alarm_event_id: 0,
  67. alarm_when: 0,
  68. hasProperty: function(property) {
  69. return typeof this[property] !== 'undefined';
  70. }
  71. };
  72. function netdataQueryParse() {
  73. var query = document.location.search.split('?');
  74. var variables = query[1].split('&');
  75. var len = variables.length;
  76. while(len--) {
  77. var p = variables[len].split('=');
  78. if(urlOptions.hasProperty(p[0]) && typeof p[1] !== 'undefined')
  79. urlOptions[p[0]] = decodeURIComponent(p[1]);
  80. }
  81. if(typeof urlOptions.family !== 'string')
  82. urlOptions.family = '';
  83. if(typeof urlOptions.chart !== 'string')
  84. urlOptions.chart = '';
  85. }
  86. function netdataURL(url) {
  87. return url + '#top'
  88. + ';nowelcome=1'
  89. // + ';show_alarms=1'
  90. + ';chart=' + encodeURIComponent(urlOptions.chart)
  91. + ';family=' + encodeURIComponent(urlOptions.family)
  92. + ';alarm=' + encodeURIComponent(urlOptions.alarm)
  93. + ';alarm_unique_id=' + urlOptions.alarm_unique_id.toString()
  94. + ';alarm_id=' + urlOptions.alarm_id.toString()
  95. + ';alarm_event_id=' + urlOptions.alarm_event_id.toString()
  96. + ';alarm_when=' + urlOptions.alarm_when.toString()
  97. ;
  98. }
  99. var gotoServerValidateRemaining = 0;
  100. var gotoServerMiddleClick = false;
  101. var gotoServerStop = false;
  102. var thisIsHttps = false;
  103. var urlsInHttp = 0;
  104. function gotoServerValidateUrl(id, guid, url) {
  105. var penaldy = 0;
  106. var error = 'failed';
  107. if(thisIsHttps === false && url.toString().startsWith('https://'))
  108. // we penalize https only if the current url is http
  109. // to allow the user walk through all its servers.
  110. penaldy = 500;
  111. else if(thisIsHttps === true && url.toString().startsWith('http://')) {
  112. error = 'can\'t check';
  113. urlsInHttp++;
  114. }
  115. var finalURL = netdataURL(url);
  116. setTimeout(function() {
  117. document.getElementById('gotoServerList').innerHTML += '<tr><td style="padding-left: 20px;"><a href="' + verifyURL(finalURL) + '" target="_blank">' + escapeUserInputHTML(url) + '</a></td><td style="padding-left: 30px;"><code id="' + guid + '-' + id + '-status">checking...</code></td></tr>';
  118. NETDATA.registry.hello(url, function(data) {
  119. if(typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid === guid) {
  120. // console.log('OK ' + id + ' URL: ' + url);
  121. document.getElementById(guid + '-' + id + '-status').innerHTML = "OK";
  122. if(!gotoServerStop) {
  123. gotoServerStop = true;
  124. if(gotoServerMiddleClick) {
  125. window.open(finalURL);
  126. gotoServerMiddleClick = false;
  127. document.getElementById('gotoServerResponse').innerHTML = '<b>Opening new window to ' + NETDATA.registry.machines[guid].name + '<br/><a href="' + verifyURL(finalURL) + '">' + escapeUserInputHTML(url) + '</a></b><br/>(check your pop-up blocker if it fails)';
  128. }
  129. else {
  130. document.getElementById('gotoServerResponse').innerHTML += 'found it! It is at:<br/><small>' + escapeUserInputHTML(url) + '</small>';
  131. document.location = verifyURL(finalURL);
  132. }
  133. }
  134. }
  135. else {
  136. if(typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid !== guid)
  137. error = 'wrong machine';
  138. document.getElementById(guid + '-' + id + '-status').innerHTML = error;
  139. gotoServerValidateRemaining--;
  140. if(gotoServerValidateRemaining <= 0) {
  141. gotoServerMiddleClick = false;
  142. document.getElementById('gotoServerResponse').innerHTML = '<b>Sorry! I cannot find any operational URL for this server</b>';
  143. if(thisIsHttps === true && urlsInHttp > 0) {
  144. document.getElementById('gotoServerResponse').innerHTML += '<br/>redirecting myself to HTTP to allow checking';
  145. document.location = verifyURL(document.location.toString().replace('https://', 'http://'));
  146. }
  147. }
  148. }
  149. });
  150. }, (id * 50) + penaldy);
  151. }
  152. var netdataRegistryCallback = function(machines_array) {
  153. if(typeof urlOptions.host !== 'string') {
  154. document.getElementById('bodylog').innerHTML = "Sorry... bad request.";
  155. return;
  156. }
  157. document.getElementById('message').innerHTML = 'These are the URLs this machine is known:';
  158. if(document.location.toString().startsWith('https://'))
  159. thisIsHttps = true;
  160. if(machines_array) {
  161. var guids = {};
  162. var checked = {};
  163. var len = machines_array.length;
  164. var count = 0;
  165. while(len--) {
  166. if(machines_array[len].name === urlOptions.host) {
  167. var ulen = machines_array[len].alternate_urls.length;
  168. var guid = machines_array[len].guid;
  169. guids[guid] = true;
  170. gotoServerValidateRemaining = ulen;
  171. while(ulen--) {
  172. var url = machines_array[len].alternate_urls[ulen];
  173. checked[url] = true;
  174. gotoServerValidateUrl(count++, guid, url);
  175. }
  176. setTimeout(function() {
  177. if(gotoServerStop === false) {
  178. document.getElementById('gotoServerResponse').innerHTML = '<b>Added all the known URLs for this machine.</b>';
  179. var guid;
  180. for(guid in guids) {
  181. NETDATA.registry.search(guid, function(data) {
  182. // console.log(data);
  183. len = data.urls.length;
  184. while(len--) {
  185. var url = data.urls[len][1];
  186. // console.log(url);
  187. if(typeof checked[url] === 'undefined') {
  188. gotoServerValidateRemaining++;
  189. checked[url] = true;
  190. gotoServerValidateUrl(count++, guid, url);
  191. }
  192. }
  193. });
  194. }
  195. }
  196. }, 2000);
  197. return false;
  198. }
  199. }
  200. }
  201. document.getElementById('bodylog').innerHTML = "Sorry... your account is not linked to a netdata server named: <b>" + escapeUserInputHTML(urlOptions.host) + '</b>';
  202. };
  203. netdataQueryParse();
  204. </script>
  205. <body>
  206. <div class="container">
  207. <div id="bodylog" style="padding-top: 8vmax; font-size: 2.0vmax;">
  208. <span id="message">Please wait...</span>
  209. <div style="padding-top: 20px;">
  210. <table id="gotoServerList" class="table">
  211. </table>
  212. </div>
  213. <p style="padding-top: 10px;"><small>
  214. This page can only find netdata URLs you have already visited and are linked to your account on this netdata registry.
  215. </small></p>
  216. <div id="gotoServerResponse" style="display: block; width: 100%; text-align: center; padding-top: 20px;"></div>
  217. </div>
  218. </div>
  219. </body>
  220. </html>