app.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Express
  2. const express = require("express");
  3. const app = express();
  4. const session = require("express-session");
  5. const PORT = process.env.PORT || 8000;
  6. // Router
  7. const routes = require("./routes");
  8. // Functions and variables
  9. const { serverStats, containerList, containerStats, containerAction, containerLogs, hiddenContainers } = require('./functions/system');
  10. let sentList, clicked;
  11. app.locals.site_list = '';
  12. const Containers = require('./database/ContainerSettings');
  13. // Configure Session
  14. const sessionMiddleware = session({
  15. secret: "keyboard cat",
  16. resave: false,
  17. saveUninitialized: false,
  18. cookie:{
  19. secure:false, // Only set to true if you are using HTTPS.
  20. httpOnly:false, // Only set to true if you are using HTTPS.
  21. maxAge:3600000 * 8 // Session max age in milliseconds. 3600000 = 1 hour.
  22. }
  23. })
  24. // Middleware
  25. app.set('view engine', 'ejs');
  26. app.use([
  27. express.static("public"),
  28. express.json(),
  29. express.urlencoded({ extended: true }),
  30. sessionMiddleware,
  31. routes
  32. ]);
  33. // Start Express server
  34. const server = app.listen(PORT, async () => {
  35. console.log(`App listening on port ${PORT}`);
  36. });
  37. // Start Socket.io
  38. const io = require('socket.io')(server);
  39. io.engine.use(sessionMiddleware);
  40. io.on('connection', (socket) => {
  41. // Set user session
  42. const user_session = socket.request.session;
  43. console.log(`${user_session.user} connected from ${socket.handshake.headers.host} ${socket.handshake.address}`);
  44. // Check if a list of containers or an install card needs to be sent
  45. if (sentList != null) { socket.emit('cards', sentList); }
  46. if((app.locals.install != '') && (app.locals.install != null)){ socket.emit('install', app.locals.install); }
  47. // Send server metrics
  48. let ServerStats = setInterval(async () => {
  49. socket.emit('metrics', await serverStats());
  50. }, 1000);
  51. // Send list of containers
  52. let ContainerList = setInterval(async () => {
  53. let cardList = await containerList();
  54. if (sentList !== cardList) {
  55. sentList = cardList;
  56. app.locals.install = '';
  57. socket.emit('cards', cardList);
  58. }
  59. }, 1000);
  60. // Send container metrics
  61. let ContainerStats = setInterval(async () => {
  62. let stats = await containerStats();
  63. for (let i = 0; i < stats.length; i++) {
  64. socket.emit('containerStats', stats[i]);
  65. }
  66. }, 1000);
  67. // Container controls
  68. socket.on('clicked', (data) => {
  69. if (clicked == true) { return; } clicked = true;
  70. let buttonPress = {
  71. user: socket.request.session.user,
  72. role: socket.request.session.role,
  73. action: data.action,
  74. container: data.container,
  75. state: data.state
  76. }
  77. containerAction(buttonPress);
  78. clicked = false;
  79. });
  80. socket.on('hide', async (data) => {
  81. console.log(`Hide ${data.container}`);
  82. let containerExists = await Containers.findOne({ where: {name:data.container}});
  83. if(!containerExists){
  84. const container = await Containers.create({
  85. name: data.container,
  86. visibility: false
  87. });
  88. hiddenContainers();
  89. console.log(`[Created] Container ${data.container} hidden`)
  90. } else {
  91. containerExists.update({ visibility: false });
  92. console.log(`[Updated] Container ${data.container} hidden`)
  93. hiddenContainers();
  94. }
  95. });
  96. socket.on('reset', (data) => {
  97. // set visibility to true for all containers
  98. Containers.update({ visibility: true }, { where: {} });
  99. console.log('All containers visible');
  100. hiddenContainers();
  101. });
  102. // Container logs
  103. socket.on('logs', (data) => {
  104. containerLogs(data.container)
  105. .then(logs => {
  106. socket.emit('logString', logs);
  107. })
  108. .catch(err => {
  109. console.error(err);
  110. });
  111. });
  112. // On disconnect
  113. socket.on('disconnect', () => {
  114. clearInterval(ServerStats);
  115. clearInterval(ContainerList);
  116. clearInterval(ContainerStats);
  117. });
  118. });