dockerContainersList.html 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <!-- Notes: This should be open in its original path-->
  5. <meta charset="utf-8">
  6. <link rel="stylesheet" href="../script/semantic/semantic.min.css" />
  7. <script src="../script/jquery-3.6.0.min.js"></script>
  8. <script src="../script/semantic/semantic.min.js"></script>
  9. </head>
  10. <body>
  11. <br />
  12. <div class="ui container">
  13. <div class="ui header">
  14. <div class="content">
  15. List of Docker Containers
  16. <div class="sub header">
  17. Below is a list of all detected Docker containers currently running
  18. on the system.
  19. </div>
  20. </div>
  21. </div>
  22. <div id="containersList" class="ui middle aligned divided list active">
  23. <div class="ui loader active"></div>
  24. </div>
  25. <div class="ui horizontal divider"></div>
  26. <div id="containersAddedListHeader" class="ui header" hidden>
  27. Already added containers:
  28. </div>
  29. <div
  30. id="containersAddedList"
  31. class="ui middle aligned divided list"
  32. ></div>
  33. </div>
  34. <script>
  35. const lines = {};
  36. const linesAded = [];
  37. function getDockerContainers() {
  38. const hostRequest = $.get("/api/proxy/list?type=host");
  39. const dockerRequest = $.get("/api/docker/containers");
  40. // Wait for both requests to complete
  41. Promise.all([hostRequest, dockerRequest])
  42. .then(([hostData, dockerData]) => {
  43. if (
  44. dockerData.error === undefined &&
  45. hostData.error === undefined
  46. ) {
  47. const { containers, network } = dockerData;
  48. const bridge = network.find(({ Name }) => Name === "bridge");
  49. const {
  50. IPAM: {
  51. Config: [{ Gateway: gateway }],
  52. },
  53. } = bridge;
  54. const existedDomains = hostData.map(({ Domain }) => Domain);
  55. for (const container of containers) {
  56. const {
  57. Ports,
  58. Names: [name],
  59. } = container;
  60. for (const portObject of Ports.filter(
  61. ({ IP: ip }) => ip === "::"
  62. )) {
  63. const { IP: ip, PublicPort: port } = portObject;
  64. const key = `${name}-${port}`;
  65. if (
  66. existedDomains.some((item) => item === `${gateway}:${port}`)
  67. ) {
  68. linesAded.push({
  69. name: name.replace(/^\//, ""),
  70. ip: gateway,
  71. port,
  72. });
  73. } else if (!lines[key]) {
  74. lines[key] = {
  75. name: name.replace(/^\//, ""),
  76. ip: gateway,
  77. port,
  78. };
  79. }
  80. }
  81. }
  82. for (const [key, line] of Object.entries(lines)) {
  83. $("#containersList").append(
  84. `<div class="item">
  85. <div class="right floated content">
  86. <div class="ui button" onclick="addContainerItem('${key}');">Add</div>
  87. </div>
  88. <div class="content">
  89. <div class="header">${line.name}</div>
  90. <div class="description">
  91. ${line.ip}:${line.port}
  92. </div>
  93. </div>`
  94. );
  95. }
  96. for (const line of linesAded) {
  97. $("#containersAddedList").append(
  98. `<div class="item">
  99. <div class="content">
  100. <div class="header">${line.name}</div>
  101. <div class="description">
  102. ${line.ip}:${line.port}
  103. </div>
  104. </div>`
  105. );
  106. }
  107. linesAded.length &&
  108. $("#containersAddedListHeader").removeAttr("hidden");
  109. $("#containersList .loader").removeClass("active");
  110. } else {
  111. parent.msgbox(
  112. `Error loading data: ${dockerData.error || hostData.error}`,
  113. false
  114. );
  115. $("#containersList").html(`<div class="ui basic segment"><i class="ui red times icon"></i> ${dockerData.error || hostData.error}</div>`);
  116. }
  117. })
  118. .catch((error) => {
  119. console.log(error.responseText);
  120. parent.msgbox("Error loading data: " + error.message, false);
  121. });
  122. }
  123. getDockerContainers();
  124. function addContainerItem(item) {
  125. if (lines[item]) {
  126. parent.addContainerItem(lines[item]);
  127. }
  128. }
  129. </script>
  130. </body>
  131. </html>