import { Readable } from 'stream'; import { Permission, Container, User } from '../database/models.js'; import { docker } from '../server.js'; import { dockerContainerStats } from 'systeminformation'; import { readFileSync } from 'fs'; import { currentLoad, mem, networkStats, fsSize } from 'systeminformation'; let hidden = ''; // The actual page export const Dashboard = (req, res) => { let name = req.session.user; let role = req.session.role; let avatar = name.charAt(0).toUpperCase(); res.render("dashboard", { name: name, avatar: avatar, role: role }); } // Server metrics (CPU, RAM, TX, RX, DISK) export const Stats = async (req, res) => { let name = req.header('hx-trigger-name'); let color = req.header('hx-trigger'); let value = 0; switch (name) { case 'CPU': await currentLoad().then(data => { value = Math.round(data.currentLoad); }); break; case 'RAM': await mem().then(data => { value = Math.round((data.active / data.total) * 100); }); break; case 'NET': let down = 0; let up = 0; let percent = 0; await networkStats().then(data => { down = Math.round(data[0].rx_bytes / (1024 * 1024)); up = Math.round(data[0].tx_bytes / (1024 * 1024)); // percent of download vs max download if max download was 1GB percent = Math.round((down / 1000) * 100); }); let net = `
${data}`) }); } export const Action = async (req, res) => { let name = req.header('hx-trigger-name'); let state = req.header('hx-trigger'); let action = req.params.action; // Start if ((action == 'start') && (state == 'stopped')) { var containerName = docker.getContainer(name); containerName.start(); res.send(status('starting')); } else if ((action == 'start') && (state == 'paused')) { var containerName = docker.getContainer(name); containerName.unpause(); res.send(status('starting')); // Stop } else if ((action == 'stop') && (state != 'stopped')) { var containerName = docker.getContainer(name); containerName.stop(); res.send(status('stopping')); // Pause } else if ((action == 'pause') && (state == 'paused')) { var containerName = docker.getContainer(name); containerName.unpause(); res.send(status('starting')); } else if ((action == 'pause') && (state == 'running')) { var containerName = docker.getContainer(name); containerName.pause(); res.send(status('pausing')); // Restart } else if (action == 'restart') { var containerName = docker.getContainer(name); containerName.restart(); res.send(status('restarting')); // Hide } else if (action == 'hide') { let exists = await Container.findOne({ where: {name: name}}); if (!exists) { const newContainer = await Container.create({ name: name, visibility: false, }); } else { exists.update({ visibility: false }); } hidden = await Container.findAll({ where: {visibility:false}}); hidden = hidden.map((container) => container.name); res.send("ok"); // Reset View } else if (action == 'reset') { await Container.update({ visibility: true }, { where: {} }); hidden = await Container.findAll({ where: {visibility:false}}); hidden = hidden.map((container) => container.name); res.send("ok"); } } export const Modals = async (req, res) => { let name = req.header('hx-trigger-name'); let id = req.header('hx-trigger'); let title = name.charAt(0).toUpperCase() + name.slice(1); if (id == 'permissions') { let permissions_list = ''; let permissions_modal = readFileSync('./views/modals/permissions.html', 'utf8'); permissions_modal = permissions_modal.replace(/PermissionsTitle/g, title); let users = await User.findAll({ attributes: ['username', 'UUID']}); for (let i = 0; i < users.length; i++) { let user_permissions = readFileSync('./views/partials/user_permissions.html', 'utf8'); let exists = await Permission.findOne({ where: {containerName: name, user: users[i].username}}); if (!exists) { const newPermission = await Permission.create({ containerName: name, user: users[i].username, userID: users[i].UUID}); } let permissions = await Permission.findOne({ where: {containerName: name, user: users[i].username}}); if (permissions.uninstall == true) { user_permissions = user_permissions.replace(/data-UninstallCheck/g, 'checked'); } if (permissions.edit == true) { user_permissions = user_permissions.replace(/data-EditCheck/g, 'checked'); } if (permissions.upgrade == true) { user_permissions = user_permissions.replace(/data-UpgradeCheck/g, 'checked'); } if (permissions.start == true) { user_permissions = user_permissions.replace(/data-StartCheck/g, 'checked'); } if (permissions.stop == true) { user_permissions = user_permissions.replace(/data-StopCheck/g, 'checked'); } if (permissions.pause == true) { user_permissions = user_permissions.replace(/data-PauseCheck/g, 'checked'); } if (permissions.restart == true) { user_permissions = user_permissions.replace(/data-RestartCheck/g, 'checked'); } if (permissions.logs == true) { user_permissions = user_permissions.replace(/data-LogsCheck/g, 'checked'); } user_permissions = user_permissions.replace(/EntryNumber/g, i); user_permissions = user_permissions.replace(/PermissionsUsername/g, users[i].username); user_permissions = user_permissions.replace(/PermissionsContainer/g, name); permissions_list += user_permissions; } permissions_modal = permissions_modal.replace(/PermissionsList/g, permissions_list); res.send(permissions_modal); return; } if (id == 'uninstall') { let modal = readFileSync('./views/modals/uninstall.html', 'utf8'); modal = modal.replace(/AppName/g, name); // let containerPermissions = await Permission.findAll({ where: {containerName: name}}); res.send(modal); return; } let modal = readFileSync('./views/modals/details.html', 'utf8'); let details = await containerInfo(name); modal = modal.replace(/AppName/g, details.name); modal = modal.replace(/AppImage/g, details.image); res.send(modal); } export const UpdatePermissions = async (req, res) => { let user = req.body.username; let container = req.body.container; let id = req.header('hx-trigger'); console.log(`${req.session.user} is updating permissions for: ${user} on ${container}`); Object.keys(req.body).forEach(async function(key) { if (key != 'username' && key != 'container') { let permissions = req.body[key]; if (permissions.includes('uninstall')){ await Permission.update({ uninstall: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ uninstall: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('edit')){ await Permission.update({ edit: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ edit: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('upgrade')){ await Permission.update({ upgrade: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ upgrade: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('start')){ await Permission.update({ start: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ start: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('stop')){ await Permission.update({ stop: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ stop: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('pause')){ await Permission.update({ pause: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ pause: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('restart')){ await Permission.update({ restart: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ restart: false }, { where: {containerName: container, user: user}}); } if (permissions.includes('logs')){ await Permission.update({ logs: true }, { where: {containerName: container, user: user}}); } else { await Permission.update({ logs: false }, { where: {containerName: container, user: user}}); } } }); let submit = ''; if (id == 'submit') { submit = ``; res.send(submit); return; } else if (id == 'confirmed') { submit = ``; res.send(submit); return; } }