server.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import express from 'express';
  2. import session from 'express-session';
  3. import memorystore from 'memorystore';
  4. import ejs from 'ejs';
  5. import { router } from './router/index.js';
  6. import { sequelize, ServerSettings } from './database/models.js';
  7. import Docker from 'dockerode';
  8. export var [ docker, docker2, docker3, docker4 ] = [ null, null, null, null ];
  9. export let [ host_list, host2_list, host3_list, host4_list ] = [ [], [], [], [] ];
  10. var docker = new Docker();
  11. // Session middleware
  12. const secure = process.env.HTTPS || false;
  13. const MemoryStore = memorystore(session);
  14. const sessionMiddleware = session({
  15. store: new MemoryStore({ checkPeriod: 86400000 }), // Prune expired entries every 24h
  16. secret: "keyboard cat",
  17. resave: false,
  18. saveUninitialized: false,
  19. cookie:{
  20. secure: secure,
  21. httpOnly: secure,
  22. maxAge: 3600000 * 8 // Session max age in milliseconds. 3600000 = 1 hour.
  23. }
  24. });
  25. // Express middleware
  26. const app = express();
  27. const PORT = process.env.PORT || 8000;
  28. app.set('view engine', 'html');
  29. app.engine('html', ejs.renderFile);
  30. app.use([
  31. express.static('public'),
  32. express.urlencoded({ extended: true }),
  33. sessionMiddleware,
  34. router
  35. ]);
  36. // Initialize server
  37. app.listen(PORT, async () => {
  38. async function init() {// I made sure the console.logs and emojis lined up
  39. try { await sequelize.authenticate().then(
  40. () => { console.log('DB Connection: ✅') }); }
  41. catch { console.log('DB Connection: ❌'); }
  42. try { await sequelize.sync().then(
  43. () => { console.log('Synced Models: ✅') }); }
  44. catch { console.log('Synced Models: ❌'); } }
  45. await init().then(() => {
  46. newEvent('host');
  47. console.log(`Listening on http://localhost:${PORT}`);
  48. });
  49. });
  50. // Configure Docker hosts.
  51. for (let i = 2; i < 5; i++) {
  52. try {
  53. if (i == 2) {
  54. let config = await ServerSettings.findOne({ where: { key: 'host2' }});
  55. if (config.value != 'off' && config.value != '') {
  56. let values = config.value.split(',');
  57. let port = values[2];
  58. let address = values[1];
  59. docker2 = new Docker({protocol:'http', host: address, port: port});
  60. console.log(`Configured ${host} on ${address}:${port}`);
  61. let test = await docker2.listContainers({ all: true });
  62. console.log(`${host}: ${test.length} containers`);
  63. }
  64. } else if (i == 3) {
  65. let config = await ServerSettings.findOne({ where: { key: 'host3' }});
  66. if (config.value != 'off' && config.value != '') {
  67. let values = config.value.split(',');
  68. let port = values[2];
  69. let address = values[1];
  70. docker3 = new Docker({protocol:'http', host: address, port: port});
  71. console.log(`Configured ${host} on ${address}:${port}`);
  72. let test = await docker3.listContainers({ all: true });
  73. console.log(`${host}: ${test.length} containers`);
  74. }
  75. } else if (i == 4) {
  76. let config = await ServerSettings.findOne({ where: { key: 'host4' }});
  77. if (config.value != 'off' && config.value != '') {
  78. let values = config.value.split(',');
  79. let port = values[2];
  80. let address = values[1];
  81. docker4 = new Docker({protocol:'http', host: address, port: port});
  82. console.log(`Configured ${host} on ${address}:${port}`);
  83. let test = await docker4.listContainers({ all: true });
  84. console.log(`${host}: ${test.length} containers`);
  85. }
  86. }
  87. } catch {
  88. console.log(`host${i}: Not configured.`);
  89. }
  90. }
  91. async function updateList(host) {
  92. if (host == 'host') {
  93. let containers = await docker.listContainers({ all: true });
  94. host_list = containers.map(container => ({ containerID: container.Id, containers: container.State }));
  95. } else if (host == 'host2') {
  96. let containers = await docker2.listContainers({ all: true });
  97. host2_list = containers.map(container => ({ containerID: container.Id, containers: container.State }));
  98. } else if (host == 'host3') {
  99. let containers = await docker3.listContainers({ all: true });
  100. host3_list = containers.map(container => ({ containerID: container.Id, containers: container.State }));
  101. } else if (host == 'host4') {
  102. let containers = await docker4.listContainers({ all: true });
  103. host4_list = containers.map(container => ({ containerID: container.Id, containers: container.State }));
  104. }
  105. }
  106. let event = false;
  107. let skipped_events = 0;
  108. // Debounce.
  109. function newEvent(host) {
  110. if (!event) {
  111. event = true;
  112. console.log(`New event from ${host}`);
  113. updateList(host);
  114. setTimeout(() => {
  115. event = false;
  116. console.log(`Skipped ${skipped_events} events`);
  117. skipped_events = 0;
  118. }, 300);
  119. } else { skipped_events++; }
  120. }
  121. docker.getEvents({}, function (err, data) {
  122. data.on('data', function () {
  123. newEvent('host');
  124. });
  125. });
  126. // if (docker2) {
  127. // docker2.getEvents({}, function (err, data) {
  128. // data.on('data', function () {
  129. // newEvent('host2');
  130. // });
  131. // });
  132. // }
  133. // if (docker3) {
  134. // docker3.getEvents({}, function (err, data) {
  135. // data.on('data', function () {
  136. // newEvent('host3');
  137. // });
  138. // });
  139. // }
  140. // if (docker4) {
  141. // docker4.getEvents({}, function (err, data) {
  142. // data.on('data', function () {
  143. // newEvent('host4');
  144. // });
  145. // });
  146. // }