<!DOCTYPE html> <html> <head> <!-- Notes: This should be open in its original path--> <meta charset="utf-8"> <link rel="stylesheet" href="../script/semantic/semantic.min.css" /> <script src="../script/jquery-3.6.0.min.js"></script> <script src="../script/semantic/semantic.min.js"></script> </head> <body> <br /> <div class="ui container"> <div class="ui header"> <div class="content"> List of Docker Containers <div class="sub header"> Below is a list of all detected Docker containers currently running on the system. </div> </div> </div> <div id="containersList" class="ui middle aligned divided list active"> <div class="ui loader active"></div> </div> <div class="ui horizontal divider"></div> <div id="containersAddedListHeader" class="ui header" hidden> Already added containers: </div> <div id="containersAddedList" class="ui middle aligned divided list" ></div> </div> <script> const lines = {}; const linesAded = {}; function getDockerContainers() { const hostRequest = $.get("/api/proxy/list?type=host"); const dockerRequest = $.get("/api/docker/containers"); // Wait for both requests to complete Promise.all([hostRequest, dockerRequest]) .then(([hostData, dockerData]) => { if ( dockerData.error === undefined && hostData.error === undefined ) { const { containers, network } = dockerData; const bridge = network.find(({ Name }) => Name === "bridge"); const { IPAM: { Config: [{ Gateway: gateway }], }, } = bridge; const existedDomains = hostData.reduce((acc, { ActiveOrigins }) => { return acc.concat(ActiveOrigins.map(({ OriginIpOrDomain }) => OriginIpOrDomain)); }, []); for (const container of containers) { const { Ports, Names: [name], } = container; for (const portObject of Ports.filter( ({ IP: ip }) => ip === "::" || ip === '0.0.0.0' )) { const { IP: ip, PublicPort: port } = portObject; const key = `${name}-${port}`; if ( existedDomains.some((item) => item === `${gateway}:${port}`) && !linesAded[key] ) { linesAded[key] = { name: name.replace(/^\//, ""), ip: gateway, port, }; } else if (!lines[key]) { lines[key] = { name: name.replace(/^\//, ""), ip: gateway, port, }; } } } for (const [key, line] of Object.entries(lines)) { $("#containersList").append( `<div class="item"> <div class="right floated content"> <div class="ui button" onclick="addContainerItem('${key}');">Add</div> </div> <div class="content"> <div class="header">${line.name}</div> <div class="description"> ${line.ip}:${line.port} </div> </div>` ); } for (const [key, line] of Object.entries(linesAded)) { $("#containersAddedList").append( `<div class="item"> <div class="content"> <div class="header">${line.name}</div> <div class="description"> ${line.ip}:${line.port} </div> </div>` ); } Object.entries(linesAded).length && $("#containersAddedListHeader").removeAttr("hidden"); $("#containersList .loader").removeClass("active"); } else { parent.msgbox( `Error loading data: ${dockerData.error || hostData.error}`, false ); $("#containersList").html(`<div class="ui basic segment"><i class="ui red times icon"></i> ${dockerData.error || hostData.error}</div>`); } }) .catch((error) => { console.log(error.responseText); parent.msgbox("Error loading data: " + error.message, false); }); } getDockerContainers(); function addContainerItem(item) { if (lines[item]) { parent.addContainerItem(lines[item]); } } </script> </body> </html>