import { currentLoad, mem, networkStats, fsSize } from 'systeminformation'; import { docker, getContainer, containerInspect } from '../utils/docker.js'; import { readFileSync } from 'fs'; import { User, Permission } from '../database/config.js'; import { Alert, Navbar, Capitalize } from '../utils/system.js'; import { Op } from 'sequelize'; let [ hidden, alert, newCards, stats ] = [ '', '', '', {} ]; let logString = ''; // Dashboard export const Dashboard = async function (req, res) { res.render("dashboard",{ alert: '', username: req.session.username, role: req.session.role, navbar: await Navbar(req), }); } // Dashboard search export const submitDashboard = async function (req, res) { console.log('[SubmitDashboard]'); console.log(req.body); res.send('ok'); return; } export const CardList = async function (req, res) { res.send(newCards); newCards = ''; return; } 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: 'localhost', } return container_info; } async function userCards (session) { session.container_list = []; // check what containers the user wants hidden let hidden = await Permission.findAll({ where: {userID: session.userID, hide: true}}, { attributes: ['containerID'] }); hidden = hidden.map((container) => container.containerID); // check what containers the user has permission to view let visable = await Permission.findAll({ where: { userID: session.userID, [Op.or]: [{ uninstall: true }, { edit: true }, { upgrade: true }, { start: true }, { stop: true }, { pause: true }, { restart: true }, { logs: true }, { view: true }] }, attributes: ['containerID'] }); visable = visable.map((container) => container.containerID); // get all containers let containers = await docker.listContainers({ all: true }); // loop through containers for (let i = 0; i < containers.length; i++) { let container_name = containers[i].Names[0].split('/').pop(); // skip hidden containers if (hidden.includes(containers[i].Id)) { continue; } // admin can see all containers that they don't have hidden if (session.role == 'admin') { session.container_list.push({ containerName: container_name, containerID: containers[i].Id, containerState: containers[i].State }); } // user can see any containers that they have any permissions for else if (visable.includes(containers[i].Id)){ session.container_list.push({ containerName: container_name, containerID: containers[i].Id, containerState: containers[i].State }); } } // Create the lists if they don't exist if (!session.sent_list) { session.sent_list = []; } if (!session.update_list) { session.update_list = []; } if (!session.new_cards) { session.new_cards = []; } } async function updateDashboard (session) { let container_list = session.container_list; let sent_list = session.sent_list; session.new_cards = []; session.update_list = []; // loop through the containers list container_list.forEach(container => { let { containerName, containerID, containerState } = container; let sent = sent_list.find(c => c.containerID === containerID); if (!sent) { session.new_cards.push(containerID);} else if (sent.containerState !== containerState) { session.update_list.push(containerID); } }); // loop through the sent list to see if any containers have been removed sent_list.forEach(container => { let { containerName, containerID, containerState } = container; let exists = container_list.find(c => c.containerID === containerID); if (!exists) { session.update_list.push(containerID); } }); } // Container actions (start, stop, pause, restart, hide) export const ContainerAction = async (req, res) => { // let trigger_id = req.header('hx-trigger'); let container_name = req.header('hx-trigger-name'); let containerID = req.params.containerid; let action = req.params.action; console.log(`Container: ${container_name} ID: ${containerID} Action: ${action}`); // Reset the view if (action == 'reset') { console.log('Resetting view'); await Permission.update({ hide: false }, { where: { userID: req.session.userID } }); res.redirect('/dashboard'); return; } if (action == 'update') { await userCards(req.session); if (!req.session.container_list.find(c => c.containerID === containerID)) { res.send(''); return; } else { let details = await containerInfo(containerID); let card = await createCard(details); res.send(card); return; } } // Inspect the container let info = docker.getContainer(containerID); let container = await info.inspect(); let containerState = container.State.Status; // Displays container state (starting, stopping, restarting, pausing) function status (state) { return(`