dashboard.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { currentLoad, mem, networkStats, fsSize } from 'systeminformation';
  2. import { containerList, containerInspect } from '../utils/docker.js';
  3. import { readFileSync } from 'fs';
  4. import { User } from '../database/config.js';
  5. import { Alert, getLanguage, Navbar } from '../utils/system.js';
  6. export const Dashboard = async function(req,res){
  7. let container_list = '';
  8. let containers = await containerList();
  9. for (let container of containers) {
  10. let details = await containerInspect(container.containerID);
  11. let container_card = readFileSync('./views/partials/container_card.html', 'utf8');
  12. if (details.name.length > 17) {
  13. details.name = details.name.substring(0, 17) + '...';
  14. }
  15. // Capitalize the first letter of the name
  16. details.name = details.name.charAt(0).toUpperCase() + details.name.slice(1);
  17. let state = details.state;
  18. let state_color = '';
  19. switch (state) {
  20. case 'running':
  21. state_color = 'green';
  22. break;
  23. case 'exited':
  24. state = 'stopped';
  25. state_color = 'red';
  26. break;
  27. case 'paused':
  28. state_color = 'orange';
  29. break;
  30. case 'installing':
  31. state_color = 'blue';
  32. break;
  33. }
  34. container_card = container_card.replace(/AppName/g, details.name);
  35. container_card = container_card.replace(/AppService/g, details.service);
  36. container_card = container_card.replace(/AppState/g, state);
  37. container_card = container_card.replace(/StateColor/g, state_color);
  38. if (details.external_port == 0 && details.internal_port == 0) {
  39. container_card = container_card.replace(/AppPorts/g, ``);
  40. } else {
  41. container_card = container_card.replace(/AppPorts/g, `${details.external_port}:${details.internal_port}`);
  42. }
  43. container_list += container_card;
  44. }
  45. res.render("dashboard",{
  46. alert: '',
  47. username: req.session.username,
  48. role: req.session.role,
  49. container_list: container_list,
  50. navbar: await Navbar(req),
  51. });
  52. }
  53. // Server metrics (CPU, RAM, TX, RX, DISK)
  54. export const ServerMetrics = async (req, res) => {
  55. let name = req.header('hx-trigger-name');
  56. let color = req.header('hx-trigger');
  57. let value = 0;
  58. switch (name) {
  59. case 'CPU':
  60. await currentLoad().then(data => { value = Math.round(data.currentLoad); });
  61. break;
  62. case 'RAM':
  63. await mem().then(data => { value = Math.round((data.active / data.total) * 100); });
  64. break;
  65. case 'NET':
  66. let [down, up, percent] = [0, 0, 0];
  67. await networkStats().then(data => { down = Math.round(data[0].rx_bytes / (1024 * 1024)); up = Math.round(data[0].tx_bytes / (1024 * 1024)); percent = Math.round((down / 1000) * 100); });
  68. let net = `<div class="font-weight-medium"><label class="cpu-text mb-1">Down:${down}MB Up:${up}MB</label></div>
  69. <div class="cpu-bar meter animate ${color}"><span style="width:20%"><span></span></span></div>`;
  70. res.send(net);
  71. return;
  72. case 'DISK':
  73. await fsSize().then(data => { value = data[0].use; });
  74. break;
  75. }
  76. let info = `<div class="font-weight-medium"> <label class="cpu-text mb-1">${name} ${value}%</label></div>
  77. <div class="cpu-bar meter animate ${color}"><span style="width:${value}%"><span></span></span></div>`;
  78. res.send(info);
  79. }
  80. export const submitDashboard = async function(req,res){
  81. console.log(req.body);
  82. res.send('ok');
  83. return;
  84. }