Browse Source

Tweaks to event trigger. Improved Uninstall.

lllllllillllllillll 1 year ago
parent
commit
04cc1c1df3
6 changed files with 83 additions and 105 deletions
  1. 1 1
      components/containerCard.js
  2. 0 2
      functions/install.js
  3. 5 2
      functions/uninstall.js
  4. 63 94
      server.js
  5. 13 5
      views/dashboard.html
  6. 1 1
      views/footer.html

+ 1 - 1
components/containerCard.js

@@ -111,7 +111,7 @@ export const containerCard = (data) => {
           </script>
           </script>
 
 
           <div class="chart-sm">
           <div class="chart-sm">
-            <div id="${chartName}_chart" data-hx-trigger="load, every 3s" data-hx-get="/chart" name="${chartName}">
+            <div id="${chartName}_chart" data-hx-trigger="load, every 2s" data-hx-get="/chart" name="${chartName}">
               <script>
               <script>
                 ${chartName}chart.render();
                 ${chartName}chart.render();
               </script>
               </script>

+ 0 - 2
functions/install.js

@@ -9,8 +9,6 @@ import { containerCard } from "../components/containerCard.js";
 // This entire page hurts to look at. 
 // This entire page hurts to look at. 
 export const Install = async (req, res) => {
 export const Install = async (req, res) => {
 
 
-        console.log(req.app.locals.installCard);
-
         let data = req.body;
         let data = req.body;
 
 
         let { service_name, name, image, command_check, command, net_mode, restart_policy } = data;        
         let { service_name, name, image, command_check, command, net_mode, restart_policy } = data;        

+ 5 - 2
functions/uninstall.js

@@ -6,17 +6,20 @@ export const Uninstall = async (req, res) => {
 
 
     let { confirm, service_name } = req.body;
     let { confirm, service_name } = req.body;
 
 
+    console.log(`Uninstalling ${service_name}...`);
+
     if (confirm == 'Yes') {
     if (confirm == 'Yes') {
+
         var containerName = docker.getContainer(`${service_name}`);
         var containerName = docker.getContainer(`${service_name}`);
         try {
         try {
             await containerName.stop();
             await containerName.stop();
         } catch {
         } catch {
             console.log(`Error stopping ${service_name} container`);
             console.log(`Error stopping ${service_name} container`);
         }
         }
+
         try {
         try {
-            await containerName.remove();
+            containerName.remove();
             
             
-
             const syslog = await Syslog.create({
             const syslog = await Syslog.create({
                 user: req.session.user,
                 user: req.session.user,
                 email: null,
                 email: null,

+ 63 - 94
server.js

@@ -15,11 +15,6 @@ export var docker = new Docker();
 const app = express();
 const app = express();
 const MemoryStore = memorystore(session);
 const MemoryStore = memorystore(session);
 const port = process.env.PORT || 8000;
 const port = process.env.PORT || 8000;
-let [ hidden, activeEvent, cardList, clicked ] = ['', '', '', false];
-let sentList = '';
-let SSE = false;
-app.locals.installCard = '';
-let thanks = 0;
 
 
 // Session middleware
 // Session middleware
 const sessionMiddleware = session({
 const sessionMiddleware = session({
@@ -59,14 +54,15 @@ app.listen(port, async () => {
     });
     });
 });
 });
 
 
-// Get hidden containers
-async function getHidden() {
-    hidden = await Container.findAll({ where: {visibility:false}});
-    hidden = hidden.map((container) => container.name);
-}
+let [ cpu, ram, tx, rx, disk ] = [0, 0, 0, 0, 0];
+let [ hidden, cardList, sentList ] = ['', '', ''];
+let thanks = 0;
+
+let event = false;
+let sse = false;
+let eventInfo = '';
 
 
 // Server metrics
 // Server metrics
-let [ cpu, ram, tx, rx, disk ] = [0, 0, 0, 0, 0];
 let serverMetrics = async () => {
 let serverMetrics = async () => {
     currentLoad().then(data => { 
     currentLoad().then(data => { 
         cpu = Math.round(data.currentLoad); 
         cpu = Math.round(data.currentLoad); 
@@ -84,7 +80,45 @@ let serverMetrics = async () => {
 }
 }
 setInterval(serverMetrics, 1000);
 setInterval(serverMetrics, 1000);
 
 
-// Docker containers
+
+router.get('/stats', async (req, res) => {
+    let name = req.header('hx-trigger-name');
+    let color = req.header('hx-trigger');
+    let value = 0;
+
+    switch (name) {
+        case 'CPU':
+            value = cpu;
+            break;
+        case 'RAM':
+            value = ram;
+            break;
+        case 'TX':
+            value = tx;
+            break;
+        case 'RX':
+            value = rx;
+            break;
+        case 'DISK':
+            value = disk;
+            break;
+    }
+    let info = `<div class="font-weight-medium">
+                    <label class="cpu-text mb-1">${name} ${value}%</label>
+                </div>
+                <div class="cpu-bar meter animate ${color}">
+                    <span style="width:${value}%"><span></span></span>
+                </div>`;
+    res.send(info);
+});
+
+// Get hidden containers
+async function getHidden() {
+    hidden = await Container.findAll({ where: {visibility:false}});
+    hidden = hidden.map((container) => container.name);
+}
+
+// Create list of docker containers cards
 let containerCards = async () => {
 let containerCards = async () => {
     let list = '';
     let list = '';
     const allContainers = await docker.listContainers({ all: true });
     const allContainers = await docker.listContainers({ all: true });
@@ -129,93 +163,41 @@ let containerCards = async () => {
     cardList = list;
     cardList = list;
 }
 }
 
 
-
-// Store docker events 
+// Docker events
 docker.getEvents((err, stream) => {
 docker.getEvents((err, stream) => {
     if (err) throw err;
     if (err) throw err;
     stream.on('data', (chunk) => {
     stream.on('data', (chunk) => {
-        activeEvent += chunk.toString('utf8');
+        event = true;
+        eventInfo = 'docker';
     });
     });
 });
 });
 
 
 // Check if the container cards need to be updated
 // Check if the container cards need to be updated
 setInterval(async () => {
 setInterval(async () => {
-    if (activeEvent == '') { return; }
-    activeEvent = '';
+    if (event == false) { return; }
     await getHidden();
     await getHidden();
     await containerCards();
     await containerCards();
     if (cardList != sentList) {
     if (cardList != sentList) {
         cardList = sentList;
         cardList = sentList;
-        SSE = true;
+        sse = true;
     }
     }
+    event = false;
 }, 1000);
 }, 1000);
 
 
-
-
-/////////////////// HTMX routes //////////////////////////
-
-
-router.get('/stats', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
-
-    switch (req.header('HX-Trigger')) {
-        case 'cpu': 
-        let info = '<div class="font-weight-medium">';
-            info += '<label class="cpu-text mb-1" for="cpu">CPU ' + cpu + '%</label>';
-            info += '</div>';
-            info += '<div class="cpu-bar meter animate">';
-            info += '<span style="width:' + cpu + '%"><span></span></span>';
-            info += '</div>';
-            res.send(info);
-            break;
-        case 'ram':
-        let info2 = '<div class="font-weight-medium">';
-            info2 += '<label class="ram-text mb-1" for="ram">RAM ' + ram + '%</label>';
-            info2 += '</div>';
-            info2 += '<div class="ram-bar meter animate orange">';
-            info2 += '<span style="width:' + ram + '%"><span></span></span>';
-            info2 += '</div>';
-            res.send(info2);
-            break;
-        case 'tx':
-            res.send('TX ' + tx.toFixed(2) + ' MB');
-            break;
-        case 'rx':
-            res.send('RX ' + rx.toFixed(2) + ' MB');
-            break;
-        case 'disk':
-        let info5 = '<div class="font-weight-medium">';
-            info5 += '<label class="disk-text mb-1" for="disk">Disk ' + disk + '%</label>';
-            info5 += '</div>';
-            info5 += '<div class="disk-bar meter animate red">';
-            info5 += '<span style="width:' + disk + '%"><span></span></span>';
-            info5 += '</div>';
-            res.send(info5);
-            break;
-        default:
-            console.log('Unknown trigger');
-            break;
-    }
-});
-
+// Gets called at load and after server-side events
 router.get('/containers', async (req, res) => {
 router.get('/containers', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
-
     await getHidden();
     await getHidden();
     await containerCards();
     await containerCards();
     sentList = cardList;
     sentList = cardList;
     res.send(cardList);
     res.send(cardList);
 });
 });
 
 
+// Dashboard controls
 router.get('/action', async (req, res) => {
 router.get('/action', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
-
     let name = req.header('hx-trigger-name');
     let name = req.header('hx-trigger-name');
     let id = req.header('hx-trigger');
     let id = req.header('hx-trigger');
     let value = req.query[name];
     let value = req.query[name];
-
     var containerName = docker.getContainer(name);
     var containerName = docker.getContainer(name);
-
     if ((id == 'start') && (value == 'stopped')) {
     if ((id == 'start') && (value == 'stopped')) {
         containerName.start();
         containerName.start();
     } else if ((id == 'start') && (value == 'paused')) {
     } else if ((id == 'start') && (value == 'paused')) {
@@ -232,34 +214,23 @@ router.get('/action', async (req, res) => {
 });
 });
 
 
 router.get('/hide', async (req, res) => {
 router.get('/hide', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
-
     let name = req.header('hx-trigger-name');
     let name = req.header('hx-trigger-name');
     let id = req.header('hx-trigger');
     let id = req.header('hx-trigger');
-
     if (id == 'hide') {
     if (id == 'hide') {
         let exists = await Container.findOne({ where: {name: name}});
         let exists = await Container.findOne({ where: {name: name}});
         if (!exists) {
         if (!exists) {
             const newContainer = await Container.create({ name: name, visibility: false, });
             const newContainer = await Container.create({ name: name, visibility: false, });
-            SSE = true;
-            return;
         } else {
         } else {
             exists.update({ visibility: false });
             exists.update({ visibility: false });
-            SSE = true;
-            return;
         }
         }
-    }
-
-    if (id == 'reset') {
+    } else if (id == 'reset') {
         Container.update({ visibility: true }, { where: {} });
         Container.update({ visibility: true }, { where: {} });
-        SSE = true;
     }
     }
+    event = true;
+    eventInfo = 'docker';
 });
 });
 
 
-
-
 router.get('/logs', async (req, res) => {
 router.get('/logs', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
     
     
     let name = req.header('hx-trigger-name');
     let name = req.header('hx-trigger-name');
     
     
@@ -291,24 +262,23 @@ router.get('/logs', async (req, res) => {
 });
 });
 
 
 
 
+
 router.get('/sse_event', (req, res) => {
 router.get('/sse_event', (req, res) => {
     res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', });
     res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', });
     let eventCheck = setInterval(async () => {
     let eventCheck = setInterval(async () => {
-        if (SSE == true) {
-            SSE = false;
-            res.write(`event: docker\n`);
-            res.write(`data: there was a docker event!\n\n`);
+        if (sse == true) {
+            res.write(`event: ${eventInfo}\n`);
+            res.write(`data: there was an event!\n\n`);
+            sse = false;
         }
         }
     }, 1000);
     }, 1000);
     req.on('close', () => {
     req.on('close', () => {
         clearInterval(eventCheck);
         clearInterval(eventCheck);
     });
     });
+    return;
 });
 });
 
 
-
-
 router.get('/modal', async (req, res) => {
 router.get('/modal', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
 
 
     let name = req.header('hx-trigger-name');
     let name = req.header('hx-trigger-name');
     let id = req.header('hx-trigger');
     let id = req.header('hx-trigger');
@@ -358,7 +328,6 @@ router.get('/modal', async (req, res) => {
 
 
 let stats = {};
 let stats = {};
 router.get('/chart', async (req, res) => {
 router.get('/chart', async (req, res) => {
-    if (req.session.UUID == undefined) { return; }
 
 
     let name = req.header('hx-trigger-name');
     let name = req.header('hx-trigger-name');
     // create an empty array if it doesn't exist
     // create an empty array if it doesn't exist

+ 13 - 5
views/dashboard.html

@@ -46,11 +46,11 @@
                         </div>
                         </div>
 
 
                         <!-- HTMX -->
                         <!-- HTMX -->
-                        <div class="col" id="cpu" data-hx-get="/stats" data-hx-trigger="load, every 1s" data-hx-target="#cpu">
+                        <div class="col" name="CPU" id="green" data-hx-get="/stats" data-hx-trigger="load, every 1s">
                           <div class="font-weight-medium">
                           <div class="font-weight-medium">
                             <label class="cpu-text mb-1" for="cpu">CPU 0%</label>
                             <label class="cpu-text mb-1" for="cpu">CPU 0%</label>
                           </div>
                           </div>
-                          <div class="cpu-bar meter animate">
+                          <div class="cpu-bar meter animate green">
                             <span style="width:20%"><span></span></span>
                             <span style="width:20%"><span></span></span>
                           </div>
                           </div>
                         </div>
                         </div>
@@ -71,7 +71,7 @@
                         </div>
                         </div>
 
 
                         <!-- HTMX -->
                         <!-- HTMX -->
-                        <div class="col" id="ram" data-hx-get="/stats" data-hx-trigger="load, every 2s">
+                        <div class="col" name="RAM" id="orange" data-hx-get="/stats" data-hx-trigger="load, every 2s">
                           <div class="font-weight-medium">
                           <div class="font-weight-medium">
                             <label class="ram-text mb-1" for="ram">RAM 0%</label>
                             <label class="ram-text mb-1" for="ram">RAM 0%</label>
                           </div>
                           </div>
@@ -118,7 +118,7 @@
                         </div>
                         </div>
 
 
                         <!-- HTMX -->
                         <!-- HTMX -->
-                        <div class="col" id="disk" data-hx-get="/stats" data-hx-trigger="load, every 2s">
+                        <div class="col" name="DISK" id="red" data-hx-get="/stats" data-hx-trigger="load, every 2s">
                           <div class="font-weight-medium">
                           <div class="font-weight-medium">
                             <label class="disk-text mb-1" for="disk">DISK 0%</label>
                             <label class="disk-text mb-1" for="disk">DISK 0%</label>
                           </div>
                           </div>
@@ -143,6 +143,14 @@
               </div>
               </div>
             </div>
             </div>
 
 
+            <!-- HTMX -->
+            <div class="col-12" hx-ext="sse" sse-connect="/sse_event">
+              <div class="row row-cards" data-hx-get="/installing" data-hx-trigger="load, sse:install" data-hx-swap="innerHTML">
+
+              </div>
+            </div>
+
+            <!-- HTMX Target-->
             <div id="modals-here" class="modal modal-blur fade" style="display: none" aria-hidden="false" tabindex="-1">
             <div id="modals-here" class="modal modal-blur fade" style="display: none" aria-hidden="false" tabindex="-1">
               <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
               <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
                 <div class="modal-content">
                 <div class="modal-content">
@@ -237,7 +245,7 @@
         },
         },
         yaxis: {
         yaxis: {
           min: 0,
           min: 0,
-          max: 150,
+          max: 100,
           labels: {
           labels: {
             padding: 4
             padding: 4
           }
           }

+ 1 - 1
views/footer.html

@@ -24,7 +24,7 @@
           </li>
           </li>
           <li class="list-inline-item">
           <li class="list-inline-item">
             <a href="https://github.com/lllllllillllllillll/DweebUI/releases" class="link-secondary" rel="noopener">
             <a href="https://github.com/lllllllillllllillll/DweebUI/releases" class="link-secondary" rel="noopener">
-              v0.21
+              v0.30
             </a>
             </a>
           </li>
           </li>
         </ul>
         </ul>