1
0

mdns.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="zoraxy.csrf.Token" content="{{.csrfToken}}">
  5. <meta name="apple-mobile-web-app-capable" content="yes" />
  6. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  7. <meta charset="UTF-8">
  8. <meta name="theme-color" content="#4b75ff">
  9. <link rel="icon" type="image/png" href="./favicon.png" />
  10. <title>mDNS Discovery | Zoraxy</title>
  11. <link rel="stylesheet" href="../script/semantic/semantic.min.css">
  12. <script src="../script/jquery-3.6.0.min.js"></script>
  13. <script src="../../script/ao_module.js"></script>
  14. <script src="../script/semantic/semantic.min.js"></script>
  15. <script src="../script/tablesort.js"></script>
  16. <link rel="stylesheet" href="../main.css">
  17. <script src="../script/utils.js"></script>
  18. <style>
  19. body{
  20. overflow-x: auto;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <link rel="stylesheet" href="../darktheme.css">
  26. <script src="../script/darktheme.js"></script>
  27. <div id="mdns-hosts">
  28. <span><i class="ui loading spinner icon"></i> Loading</span>
  29. </div>
  30. <br>
  31. <div class="ui container">
  32. <h4>Scan with custom domain filter</h4>
  33. <div class="ui form">
  34. <div class="field">
  35. <label for="domain">Domain</label>
  36. <input type="text" id="domain" name="domain" placeholder="domain.example.com"/>
  37. </div>
  38. <button id="discover" class="ui basic button">Discover</button>
  39. <small><span id="countdownTimer"></span></small>
  40. </div>
  41. <br>
  42. </div>
  43. <div style="float: right;">
  44. <button class="ui basic button" onclick="initMDNSScan()"><i class="ui green refresh icon"></i> Refresh</button>
  45. <button class="ui basic button" style="margin-right: 1em;" onclick="window.open('', '_self', ''); window.close();"><i class="ui red remove icon"></i> Close</button>
  46. </div>
  47. <br><br><br>
  48. <script>
  49. function initMDNSScan(){
  50. $.get("/api/mdns/list", function(data){
  51. renderMDNSHosts(data);
  52. });
  53. }
  54. initMDNSScan();
  55. $("#discover").on("click", function() {
  56. var domain = $("#domain").val();
  57. $("#discover").addClass("loading").addClass('disabled');
  58. setCountdown();
  59. $.cjax({
  60. type: "POST",
  61. url: "/api/mdns/discover",
  62. data: { domain: domain },
  63. success: function(data) {
  64. $("#discover").removeClass("loading").removeClass('disabled');
  65. renderMDNSHosts(data);
  66. },
  67. error: function(xhr, status, error) {
  68. console.error(error);
  69. // Handle error response here
  70. }
  71. });
  72. });
  73. function setCountdown() {
  74. var timeLeft = 29;
  75. var countdownTimer = document.getElementById("countdownTimer");
  76. // Update the timer every second
  77. var countdownInterval = setInterval(function() {
  78. if (timeLeft <= 0) {
  79. clearInterval(countdownInterval);
  80. countdownTimer.innerHTML = "Scan Completed";
  81. } else {
  82. countdownTimer.innerHTML = "Estimated Remaining Time: " + timeLeft + " seconds";
  83. timeLeft--;
  84. }
  85. }, 1000);
  86. }
  87. function renderMDNSHosts(data) {
  88. // Create table header
  89. var tableHeader = $('<thead>').append(
  90. $('<tr>').append(
  91. $('<th>').text('Host Name'),
  92. $('<th>').text('IP Address'),
  93. $('<th>').text('MAC Address'),
  94. $('<th>').text('Model'),
  95. $('<th>').text('Vendor')
  96. )
  97. );
  98. if (data.error != undefined){
  99. $('#mdns-hosts').html(`<table class="ui celled unstackable table"><tbody></tbody></table>`);
  100. $('#mdns-hosts').find("tbody").append(`<tr><td colspan="5"><i class="ui red circle times icon"></i> ${data.error}</td></tr>`);
  101. $("#discover").addClass("disabled");
  102. return;
  103. }
  104. // Create table body
  105. var tableBody = $('<tbody>');
  106. for (var i = 0; i < data.length; i++) {
  107. var host = data[i];
  108. var ipAddresses = host.IPv4.join('<br> ');
  109. var macAddresses = host.MacAddr.join('<br> ');
  110. if (macAddresses.trim() == ""){
  111. macAddresses = '<i class="ui red remove icon"></i> Not Supported'
  112. }
  113. var row = $('<tr>').append(
  114. $('<td>').html(`<a target="_blank" href="//${host.HostName}:${host.Port}">${host.HostName}</a>`),
  115. $('<td>').html(ipAddresses),
  116. $('<td>').html(macAddresses),
  117. $('<td>').text(host.Model),
  118. $('<td>').text(host.Vendor)
  119. );
  120. tableBody.append(row);
  121. }
  122. // Create table with header and body
  123. var table = $('<table>').addClass('ui celled unstackable table').append(tableHeader, tableBody);
  124. // Render table in HTML element with ID 'mdns-hosts'
  125. $('#mdns-hosts').html(table);
  126. if (data.length == 0){
  127. $('#mdns-hosts').find("tbody").append(`<tr><td colspan="5"><i class="ui green circle check icon"></i> No scan results</td></tr>`);
  128. }
  129. }
  130. </script>
  131. </body>
  132. </html>