216 lines
6.3 KiB
JavaScript
216 lines
6.3 KiB
JavaScript
import Docker from 'dockerode';
|
|
import { dockerContainerStats } from 'systeminformation';
|
|
import { Container, ServerSettings } from '../database/config.js'
|
|
|
|
// export var docker1 = new Docker();
|
|
export var docker = new Docker();
|
|
var docker2;
|
|
var docker3;
|
|
var docker4;
|
|
|
|
export async function GetContainerLists(hostid) {
|
|
|
|
// key: host, value: `${tag3},${ip3},${port3}`
|
|
|
|
let host = hostid || 1;
|
|
|
|
if (host == 1 || host == 0) {
|
|
let containers = await docker.listContainers({ all: true });
|
|
return containers;
|
|
}
|
|
|
|
if (host == 2 && !docker2) {
|
|
let settings = await ServerSettings.findOne({ where: { key: 'host2' } });
|
|
let ip = settings.value.split(',')[1];
|
|
let port = settings.value.split(',')[2];
|
|
docker2 = new Docker({ host: ip, port: port });
|
|
} else if (host == 2 && docker2) {
|
|
let containers = await docker2.listContainers({ all: true });
|
|
return containers;
|
|
}
|
|
|
|
if (host == 3 && !docker3) {
|
|
let settings = await ServerSettings.findOne({ where: { key: 'host3' } });
|
|
let ip = settings.value.split(',')[1];
|
|
let port = settings.value.split(',')[2];
|
|
docker3 = new Docker({ host: ip, port: port });
|
|
} else if (host == 3 && docker3) {
|
|
let containers = await docker3.listContainers({ all: true });
|
|
return containers;
|
|
}
|
|
|
|
if (host == 4 && !docker4) {
|
|
let settings = await ServerSettings.findOne({ where: { key: 'host4' } });
|
|
let ip = settings.value.split(',')[1];
|
|
let port = settings.value.split(',')[2];
|
|
docker4 = new Docker({ host: ip, port: port });
|
|
} else if (host == 4 && docker4) {
|
|
let containers = await docker4.listContainers({ all: true });
|
|
return containers;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
export async function imageList() {
|
|
let images = await docker.listImages({ all: true });
|
|
return images;
|
|
}
|
|
|
|
export async function volumeList() {
|
|
let volumes = await docker.listVolumes();
|
|
return volumes;
|
|
}
|
|
|
|
export async function networkList() {
|
|
let networks = await docker.listNetworks();
|
|
return networks;
|
|
}
|
|
|
|
export async function GetContainer(containerID) {
|
|
let container = docker.getContainer(containerID);
|
|
return container;
|
|
}
|
|
|
|
export async function containerInfo (containerID) {
|
|
|
|
// get the container info
|
|
let info = docker.getContainer(containerID);
|
|
let container = await info.inspect();
|
|
|
|
let container_name = container.Name.slice(1);
|
|
let container_image = container.Config.Image;
|
|
let container_service = container.Config.Labels['com.docker.compose.service'];
|
|
|
|
let ports_list = [];
|
|
let external = 0;
|
|
let internal = 0;
|
|
|
|
try {
|
|
for (const [key, value] of Object.entries(container.HostConfig.PortBindings)) {
|
|
let ports = {
|
|
check: 'checked',
|
|
external: value[0].HostPort,
|
|
internal: key.split('/')[0],
|
|
protocol: key.split('/')[1]
|
|
}
|
|
ports_list.push(ports);
|
|
}
|
|
} catch {}
|
|
|
|
try { external = ports_list[0].external; internal = ports_list[0].internal; } catch { }
|
|
|
|
let container_info = {
|
|
containerName: container_name,
|
|
containerID: containerID,
|
|
containerImage: container_image,
|
|
containerService: container_service,
|
|
containerState: container.State.Status,
|
|
external_port: external,
|
|
internal_port: internal,
|
|
ports: ports_list,
|
|
volumes: container.Mounts,
|
|
env: container.Config.Env,
|
|
labels: container.Config.Labels,
|
|
link: '',
|
|
}
|
|
|
|
return container_info;
|
|
}
|
|
|
|
export async function containerLogs(containerID) {
|
|
|
|
let container = docker.getContainer(containerID);
|
|
|
|
// Fetch logs from the container
|
|
const logs = await container.logs({
|
|
stdout: true,
|
|
stderr: true,
|
|
tail: 'all', // or specify a number for the number of lines
|
|
});
|
|
|
|
const logsString = logs.toString('utf8');
|
|
|
|
return logsString;
|
|
}
|
|
|
|
|
|
async function version_check () {
|
|
// Fetch the data.
|
|
const resp = await fetch('https://registry.hub.docker.com/v2/namespaces/lllllllillllllillll/repositories/dweebui/tags/?page_size=10000');
|
|
// Parse the JSON.
|
|
let hub = await resp.json();
|
|
console.log('Checking available versions...');
|
|
// Loop through the results.
|
|
for (let i = 0; i < hub.results.length; i++) {
|
|
// Skip version tag if it includes a dash.
|
|
if (hub.results[i].name.includes('-')) { continue; }
|
|
console.log(hub.results[i].name);
|
|
}
|
|
}
|
|
version_check();
|
|
|
|
|
|
export async function trigger_docker_event () {
|
|
// Create then destroy a docker volume.
|
|
let volume = await docker.createVolume({ Name: 'test_volume' });
|
|
console.log('Manually triggered docker event.');
|
|
setTimeout(async() => {
|
|
await volume.remove();
|
|
}, 200);
|
|
}
|
|
|
|
|
|
export async function containerStats (containerID) {
|
|
|
|
const stats = await dockerContainerStats(containerID);
|
|
|
|
let info = {
|
|
containerID: containerID,
|
|
cpu: Math.round(stats[0].cpuPercent),
|
|
ram: Math.round(stats[0].memPercent)
|
|
}
|
|
|
|
return info;
|
|
}
|
|
|
|
export async function removeNetwork(networkID) {
|
|
let network = docker.getNetwork(networkID);
|
|
await network.remove();
|
|
console.log(`Network ${networkID} removed.`);
|
|
}
|
|
|
|
|
|
|
|
|
|
// Loop that runs every 5 seconds to update the container stats.
|
|
export async function containerStatsLoop () {
|
|
|
|
let containers = await GetContainerLists(1);
|
|
|
|
for (let i = 0; i < containers.length; i++) {
|
|
let containerID = containers[i].Id;
|
|
let stats = await containerStats(containerID);
|
|
|
|
let container = await Container.findOne({ where: { containerID: containerID } });
|
|
if (!container) {
|
|
container = await Container.create({
|
|
containerName: containers[i].Names[0].slice(1),
|
|
containerID: containerID,
|
|
cpu: JSON.stringify([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
|
|
ram: JSON.stringify([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
});
|
|
}
|
|
else {
|
|
let cpu = JSON.parse(container.cpu);
|
|
cpu.shift();
|
|
cpu.push(stats.cpu);
|
|
let ram = JSON.parse(container.ram);
|
|
ram.shift();
|
|
ram.push(stats.ram);
|
|
container.update({ cpu: JSON.stringify(cpu), ram: JSON.stringify(ram) });
|
|
}
|
|
}
|
|
}
|
|
setInterval(containerStatsLoop, 5000);
|
|
|