ipscan.html 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="apple-mobile-web-app-capable" content="yes" />
  5. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  6. <meta charset="UTF-8">
  7. <meta name="theme-color" content="#4b75ff">
  8. <link rel="icon" type="image/png" href="./favicon.png" />
  9. <title>IP Scanner | Zoraxy</title>
  10. <link rel="stylesheet" href="../script/semantic/semantic.min.css">
  11. <script src="../script/jquery-3.6.0.min.js"></script>
  12. <script src="../../script/ao_module.js"></script>
  13. <script src="../script/semantic/semantic.min.js"></script>
  14. <script src="../script/tablesort.js"></script>
  15. <link rel="stylesheet" href="../main.css">
  16. <style>
  17. .offlinehost{
  18. display: none;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="ui container">
  24. <br>
  25. <div class="ui segment">
  26. <div style="padding: 1em;">
  27. <div class="ui stackable grid">
  28. <div class="eight wide column">
  29. <h4 class="ui dividing header">Scan IP Range</h4>
  30. <div class="ui form">
  31. <div class="field">
  32. <label>Start IP</label>
  33. <input type="text" id="start-ip" name="start-ip">
  34. </div>
  35. <div class="field">
  36. <label>End IP</label>
  37. <input type="text" id="end-ip" name="end-ip">
  38. </div>
  39. <button class="ui basic button scanbtn" id="ip-scan-btn"><i class="blue search icon"></i> Scan</button>
  40. </div>
  41. <br>
  42. </div>
  43. <div class="eight wide column">
  44. <h4 class="ui dividing header">Scan CIDR Range</h4>
  45. <div class="ui form">
  46. <div class="field">
  47. <label>CIDR</label>
  48. <input type="text" id="cidr" name="cidr">
  49. </div>
  50. <button class="ui basic button scanbtn" id="cidr-scan-btn"><i class="blue search icon"></i> Scan</button>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. <button class="ui basic button" onclick="toggleOfflineHost();"><i class="grey eye icon"></i>View Offline Hosts</button>
  57. <div class="ui divider"></div>
  58. <br>
  59. <div id="scan-results">
  60. </div>
  61. <br>
  62. <div style="float: right;">
  63. <button class="ui basic button" style="margin-right: 1em;" onclick="window.open('', '_self', ''); window.close();"><i class="ui red remove icon"></i> Close</button>
  64. </div>
  65. <br><br><br>
  66. </div>
  67. <script>
  68. $(document).ready(function() {
  69. $('#ip-scan-btn').click(function(event) {
  70. event.preventDefault();
  71. var start = $('#start-ip').val().trim();
  72. var end = $('#end-ip').val().trim();
  73. if (start === '' || end === '') {
  74. alert('Please enter start and end IP range');
  75. return;
  76. }
  77. if (!isValidIPv4(start) || !isValidIPv4(end)){
  78. alert('Invalid start or end ip address');
  79. return;
  80. }
  81. $(".scanbtn").addClass("disabled");
  82. $("#scan-results").html(`
  83. <div class="ui basic segment" align="center">
  84. <i class="loading spinner icon"></i> Scanning
  85. </div>`);
  86. $.post("/api/tools/ipscan", {start: start, end: end}, function(data) {
  87. displayResults(data);
  88. $(".scanbtn").removeClass("disabled");
  89. });
  90. });
  91. $('#cidr-scan-btn').click(function(event) {
  92. event.preventDefault();
  93. var cidr = $('#cidr').val().trim();
  94. if (cidr === '') {
  95. alert('Please enter CIDR notation');
  96. return;
  97. }
  98. if (!isValidCIDR(cidr)){
  99. alert("Invalid CIDR notation string given");
  100. return;
  101. }
  102. $(".scanbtn").addClass("disabled");
  103. $("#scan-results").html(`
  104. <div class="ui basic segment" align="center">
  105. <i class="loading spinner icon"></i> Scanning
  106. </div>`);
  107. $.post("/api/tools/ipscan", {cidr: cidr}, function(data) {
  108. displayResults(data);
  109. $(".scanbtn").removeClass("disabled");
  110. });
  111. });
  112. function isValidCIDR(str) {
  113. const cidrRegex = /^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$/;
  114. return cidrRegex.test(str);
  115. }
  116. function isValidIPv4(ip) {
  117. var regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
  118. if (!regex.test(ip)) {
  119. return false;
  120. }
  121. var parts = ip.split(".");
  122. for (var i = 0; i < parts.length; i++) {
  123. if (parseInt(parts[i], 10) > 255) {
  124. return false;
  125. }
  126. }
  127. return true;
  128. }
  129. function displayResults(data) {
  130. var table = $('<table class="ui celled table"></table>');
  131. var header = $('<thead><tr><th>IP Address</th><th>Ping</th><th>Hostname</th><th>HTTP Detected</th><th>HTTPS Detected</th></tr></thead>');
  132. table.append(header);
  133. var body = $('<tbody></tbody>');
  134. var offlineHostCounter = 0;
  135. for (var i = 0; i < data.length; i++) {
  136. var classname = "offlinehost";
  137. if (data[i].Ping>=0){
  138. classname = "onlinehost";
  139. }else{
  140. offlineHostCounter++;
  141. }
  142. var row = $('<tr class="' + classname + '"></tr>');
  143. var status = data[i].Ping >= 0 ? '<i class="green circle icon"></i>' : '<i class="grey circle icon"></i>';
  144. row.append($('<td>' + status + data[i].IP + '</td>'));
  145. row.append($('<td>' + ((data[i].Ping>=0)?data[i].Ping+"ms":"Host Unreachable") + '</td>'));
  146. row.append($('<td>' + data[i].Hostname + '</td>'));
  147. row.append($('<td>' + (data[i].HttpPortDetected ? '<i class="green check icon"></i>' : '') + '</td>'));
  148. row.append($('<td>' + (data[i].HttpsPortDetected ? '<i class="green check icon"></i>' : '') + '</td>'));
  149. body.append(row);
  150. }
  151. if (data.length == 0){
  152. var body = $(`<tbody>
  153. <tr>
  154. <td colspan="5">
  155. <i class="green circle check icon"></i> Discover no devices in given IP range
  156. </td>
  157. </tr>
  158. </tbody>`);
  159. }
  160. if (offlineHostCounter == data.length){
  161. //All offline
  162. var body = $(`<tbody>
  163. <tr>
  164. <td colspan="5">
  165. <i class="green circle check icon"></i> All hosts in given IP range are offline
  166. </td>
  167. </tr>
  168. </tbody>`);
  169. }
  170. table.append(body);
  171. $('#scan-results').empty().append(table);
  172. }
  173. });
  174. function toggleOfflineHost(){
  175. $(".offlinehost").toggle();
  176. }
  177. </script>
  178. </body>
  179. </html>