removed extra if statements and sqlite queries.

added list.js for sorting tables.
removed Caddy Proxy Manager from docker-compose.yaml
This commit is contained in:
lllllllillllllillll 2023-12-17 17:22:15 -08:00
parent 837c21fdb8
commit e99dc8470b
20 changed files with 2445 additions and 463 deletions

View file

@ -21,7 +21,6 @@ v0.09
* [ ] Manage your Docker networks, images, and volumes (planned). * [ ] Manage your Docker networks, images, and volumes (planned).
* [x] Light/Dark Mode. * [x] Light/Dark Mode.
* [x] Easy to install app templates. * [x] Easy to install app templates.
* [x] Proxy manager for Caddy (Optional).
* [x] Multi-User built-in. * [x] Multi-User built-in.
* [ ] User pages (planned). * [ ] User pages (planned).
* [x] Support for Windows, Linux, and MacOS. * [x] Support for Windows, Linux, and MacOS.
@ -29,7 +28,7 @@ v0.09
* [x] Templates.json maintains compatability with Portainer, allowing you to use the template without needing to use DweebUI. * [x] Templates.json maintains compatability with Portainer, allowing you to use the template without needing to use DweebUI.
* [x] Automatically persists data in docker volumes if bind mount isn't used. * [x] Automatically persists data in docker volumes if bind mount isn't used.
* [ ] Preset variables (planned). * [ ] Preset variables (planned).
* [ ] Offline/Local Icons (planned). * [ ] Proxy manager for Caddy (Disabled).
## Setup ## Setup
@ -48,7 +47,6 @@ services:
NODE_ENV: production NODE_ENV: production
PORT: 8000 PORT: 8000
SECRET: MrWiskers SECRET: MrWiskers
#Proxy_Manager: enabled
restart: unless-stopped restart: unless-stopped
ports: ports:
- 8000:8000 - 8000:8000

12
app.js
View file

@ -59,9 +59,15 @@ io.on('connection', (socket) => {
if((app.locals.install != '') && (app.locals.install != null)){ socket.emit('install', app.locals.install); } if((app.locals.install != '') && (app.locals.install != null)){ socket.emit('install', app.locals.install); }
console.log(`Imags: ${dockerImages()}`); async function dockerStuff(){
console.log(`Volumes: ${dockerVolumes()}`); let i = await dockerImages();
console.log(`Networks: ${dockerNetworks()}`); let v = await dockerVolumes();
let n = await dockerNetworks();
// console.log(i, v, n);
}
dockerStuff();
// Send server metrics // Send server metrics
let ServerStats = setInterval(async () => { let ServerStats = setInterval(async () => {

View file

@ -1,4 +1,3 @@
const User = require('../database/UserModel');
const { appCard } = require('../components/appCard') const { appCard } = require('../components/appCard')
const { dashCard } = require('../components/dashCard'); const { dashCard } = require('../components/dashCard');
const { install, uninstall } = require('../functions/package_manager'); const { install, uninstall } = require('../functions/package_manager');
@ -16,11 +15,6 @@ templates = templates.sort((a, b) => {
exports.Apps = async function(req, res) { exports.Apps = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let page = Number(req.params.page) || 1; let page = Number(req.params.page) || 1;
let list_start = (page - 1) * 28; let list_start = (page - 1) * 28;
let list_end = (page * 28); let list_end = (page * 28);
@ -44,9 +38,9 @@ exports.Apps = async function(req, res) {
// Render the home page // Render the home page
res.render("pages/apps", { res.render("pages/apps", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
list_start: list_start + 1, list_start: list_start + 1,
list_end: list_end, list_end: list_end,
@ -55,19 +49,12 @@ exports.Apps = async function(req, res) {
next: next, next: next,
apps_list: apps_list apps_list: apps_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }
exports.searchApps = async function(req, res) { exports.searchApps = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let page = Number(req.query.page) || 1; let page = Number(req.query.page) || 1;
let list_start = (page - 1) * 28; let list_start = (page - 1) * 28;
@ -113,9 +100,9 @@ exports.searchApps = async function(req, res) {
// Render the home page // Render the home page
res.render("pages/apps", { res.render("pages/apps", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
list_start: list_start + 1, list_start: list_start + 1,
list_end: list_end, list_end: list_end,
@ -124,10 +111,7 @@ exports.searchApps = async function(req, res) {
next: next, next: next,
apps_list: apps_list apps_list: apps_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -34,6 +34,7 @@ exports.processLogin = async function(req,res){
req.session.user = existingUser.username; req.session.user = existingUser.username;
req.session.UUID = existingUser.UUID; req.session.UUID = existingUser.UUID;
req.session.role = existingUser.role; req.session.role = existingUser.role;
req.session.avatar = existingUser.avatar;
// Redirect to the home page. // Redirect to the home page.
@ -128,6 +129,7 @@ exports.processRegister = async function(req,res){
req.session.user = newUser.username; req.session.user = newUser.username;
req.session.UUID = newUser.UUID; req.session.UUID = newUser.UUID;
req.session.role = newUser.role; req.session.role = newUser.role;
req.session.avatar = newUser.avatar;
} }
// Redirect to the home page. // Redirect to the home page.

View file

@ -1,6 +1,3 @@
const User = require('../database/UserModel');
const Containers = require('../database/ContainerSettings');
const { readFileSync, writeFileSync, appendFileSync, readdirSync } = require('fs'); const { readFileSync, writeFileSync, appendFileSync, readdirSync } = require('fs');
const { execSync } = require("child_process"); const { execSync } = require("child_process");
const { siteCard } = require('../components/siteCard'); const { siteCard } = require('../components/siteCard');
@ -10,11 +7,6 @@ const { containerExec } = require('../functions/system')
exports.Dashboard = async function (req, res) { exports.Dashboard = async function (req, res) {
if (req.session.role == "admin") {
// get user data with matching UUID from sqlite database
let user = await User.findOne({ where: { UUID: req.session.UUID } });
let caddy = 'd-none'; let caddy = 'd-none';
if (process.env.Proxy_Manager == 'enabled') { if (process.env.Proxy_Manager == 'enabled') {
@ -23,17 +15,14 @@ exports.Dashboard = async function (req, res) {
// Render the home page // Render the home page
res.render("pages/dashboard", { res.render("pages/dashboard", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
site_list: req.app.locals.site_list, site_list: req.app.locals.site_list,
caddy: caddy caddy: caddy
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }
@ -42,7 +31,7 @@ exports.AddSite = async function (req, res) {
let { domain, type, host, port } = req.body; let { domain, type, host, port } = req.body;
if ((req.session.role == "admin") && ( domain && type && host && port)) { if ( domain && type && host && port) {
let { domain, type, host, port } = req.body; let { domain, type, host, port } = req.body;
@ -107,7 +96,7 @@ exports.AddSite = async function (req, res) {
res.redirect("/"); res.redirect("/");
} else { } else {
// Redirect // Redirect
console.log('not admin or missing info') console.log('missing info')
res.redirect("/"); res.redirect("/");
} }
} }
@ -115,9 +104,6 @@ exports.AddSite = async function (req, res) {
exports.RemoveSite = async function (req, res) { exports.RemoveSite = async function (req, res) {
if (req.session.role == "admin") {
for (const [key, value] of Object.entries(req.body)) { for (const [key, value] of Object.entries(req.body)) {
execSync(`rm ./caddyfiles/sites/${value}.Caddyfile`, (err, stdout, stderr) => { execSync(`rm ./caddyfiles/sites/${value}.Caddyfile`, (err, stdout, stderr) => {
@ -138,9 +124,7 @@ exports.RemoveSite = async function (req, res) {
console.log('Removed Site(s)') console.log('Removed Site(s)')
res.redirect("/refreshsites"); res.redirect("/refreshsites");
} else {
res.redirect("/");
}
} }
@ -150,9 +134,6 @@ exports.RefreshSites = async function (req, res) {
let domain, type, host, port; let domain, type, host, port;
let id = 1; let id = 1;
if (req.session.role == "admin") {
// Clear site_list.ejs // Clear site_list.ejs
req.app.locals.site_list = ""; req.app.locals.site_list = "";
@ -209,41 +190,26 @@ exports.RefreshSites = async function (req, res) {
res.redirect("/"); res.redirect("/");
} else {
// Redirect to the login page
res.redirect("/");
}
} }
exports.DisableSite = async function (req, res) { exports.DisableSite = async function (req, res) {
if (req.session.role == "admin") {
console.log(req.body) console.log(req.body)
console.log('Disable Site') console.log('Disable Site')
res.redirect("/"); res.redirect("/");
} else {
// Redirect to the login page
res.redirect("/login");
}
} }
exports.EnableSite = async function (req, res) { exports.EnableSite = async function (req, res) {
if (req.session.role == "admin") {
console.log(req.body) console.log(req.body)
console.log('Enable Site') console.log('Enable Site')
res.redirect("/"); res.redirect("/");
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -1,10 +1,7 @@
const User = require('../database/UserModel'); const User = require('../database/UserModel');
exports.Images = async function(req, res) { exports.Images = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let user_list = ` let user_list = `
<tr> <tr>
<th><input class="form-check-input" type="checkbox"></th> <th><input class="form-check-input" type="checkbox"></th>
@ -41,14 +38,11 @@ exports.Images = async function(req, res) {
// Render the home page // Render the home page
res.render("pages/images", { res.render("pages/images", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
user_list: user_list user_list: user_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -1,10 +1,7 @@
const User = require('../database/UserModel'); const User = require('../database/UserModel');
exports.Users = async function(req, res) { exports.Networks = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let user_list = ` let user_list = `
<tr> <tr>
<th><input class="form-check-input" type="checkbox"></th> <th><input class="form-check-input" type="checkbox"></th>
@ -41,14 +38,11 @@ exports.Users = async function(req, res) {
// Render the home page // Render the home page
res.render("pages/users", { res.render("pages/users", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
user_list: user_list user_list: user_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -2,21 +2,13 @@ const User = require('../database/UserModel.js');
const Server = require('../database/ServerSettings.js'); const Server = require('../database/ServerSettings.js');
exports.Settings = async function(req, res) { exports.Settings = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
// Render the home page // Render the home page
res.render("pages/settings", { res.render("pages/settings", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true isLoggedIn: true
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -1,10 +1,7 @@
const User = require('../database/UserModel'); const User = require('../database/UserModel');
exports.Users = async function(req, res) { exports.Users = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let user_list = ` let user_list = `
<tr> <tr>
<th><input class="form-check-input" type="checkbox"></th> <th><input class="form-check-input" type="checkbox"></th>
@ -41,14 +38,11 @@ exports.Users = async function(req, res) {
// Render the home page // Render the home page
res.render("pages/users", { res.render("pages/users", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
user_list: user_list user_list: user_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -1,10 +1,8 @@
const User = require('../database/UserModel'); const User = require('../database/UserModel');
exports.Users = async function(req, res) { exports.Volumes = async function(req, res) {
if (req.session.role == "admin") {
// Get the user.
let user = await User.findOne({ where: { UUID: req.session.UUID }});
let user_list = ` let user_list = `
<tr> <tr>
<th><input class="form-check-input" type="checkbox"></th> <th><input class="form-check-input" type="checkbox"></th>
@ -40,15 +38,12 @@ exports.Users = async function(req, res) {
}); });
// Render the home page // Render the home page
res.render("pages/users", { res.render("pages/volumes", {
name: user.first_name + ' ' + user.last_name, name: req.session.user,
role: user.role, role: req.session.role,
avatar: user.avatar, avatar: req.session.avatar,
isLoggedIn: true, isLoggedIn: true,
user_list: user_list user_list: user_list
}); });
} else {
// Redirect to the login page
res.redirect("/login");
}
} }

View file

@ -9,7 +9,6 @@ services:
NODE_ENV: production NODE_ENV: production
PORT: 8000 PORT: 8000
SECRET: MrWiskers SECRET: MrWiskers
#Proxy_Manager: enabled
restart: unless-stopped restart: unless-stopped
ports: ports:
- 8000:8000 - 8000:8000

View file

@ -1,4 +1,4 @@
const { currentLoad, mem, networkStats, fsSize, dockerContainerStats, networkInterfaces } = require('systeminformation'); const { currentLoad, mem, networkStats, fsSize, dockerContainerStats, dockerImages, networkInterfaces } = require('systeminformation');
var Docker = require('dockerode'); var Docker = require('dockerode');
var docker = new Docker({ socketPath: '/var/run/docker.sock' }); var docker = new Docker({ socketPath: '/var/run/docker.sock' });
const { dashCard } = require('../components/dashCard'); const { dashCard } = require('../components/dashCard');
@ -317,31 +317,16 @@ module.exports.containerLogs = function (data) {
module.exports.dockerImages = async function () { module.exports.dockerImages = async function () {
let image_list = '';
const data = await docker.listImages(); const data = await dockerImages({ all: true });
return data; for ( i = 0; i < data.length; i++) {
console.log(`Image ${i}:`)
console.log(`repoTags: ${data[i].repoTags}`)
// console.log(`repoDigest: ${data[i].repoDigests}`)
}
// for (const image of data) {
// let imageVersion = image.RepoTags[0].split('/');
// let service = imageVersion[imageVersion.length - 1].split(':')[0];
// let image_info = {
// name: image.RepoTags[0],
// service: service,
// id: image.Id,
// size: image.Size,
// style: "Compact"
// }
// let dockerCard = dashCard(image_info);
// image_list += dockerCard;
// }
// return image_list;
} }

2020
public/libs/list.js/dist/list.js vendored Normal file

File diff suppressed because it is too large Load diff

1
public/libs/list.js/dist/list.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/libs/list.js/dist/list.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"version":3,"file":"list.min.js","sources":["webpack://List/list.min.js"],"mappings":"AAAA","sourceRoot":""}

View file

@ -15,10 +15,11 @@ const { Settings } = require("../controllers/settings");
// Authentication middleware // Authentication middleware
const authenticate = (req, res, next) => { const authenticate = (req, res, next) => {
if (req.session && req.session.user) { if (req.session && req.session.role == "admin") {
console.log(`User ${req.session.user} [${req.session.role} : ${req.session.UUID}] accessed ${req.originalUrl}`) console.log(`User ${req.session.user} [${req.session.role}] accessed ${req.originalUrl}`)
next(); next();
} else { } else {
console.log('Not admin')
res.redirect("/login"); res.redirect("/login");
} }
}; };

View file

@ -31,7 +31,7 @@
<div class="row g-2 align-items-center"> <div class="row g-2 align-items-center">
<div class="col"> <div class="col">
<h2 class="page-title"> <h2 class="page-title">
Users Images
</h2> </h2>
</div> </div>
</div> </div>
@ -359,8 +359,24 @@
</div> </div>
</div> </div>
<!-- Libs JS --> <!-- Libs JS -->
<script src="/libs/list.js/dist/list.min.js?1692870487" defer></script>
<!-- Tabler Core --> <!-- Tabler Core -->
<script src="/js/tabler.min.js?1685973381" defer></script> <script src="/js/tabler.min.js?1685973381" defer></script>
<script src="/js/demo.min.js?1685973381" defer></script> <script src="/js/demo.min.js?1685973381" defer></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const list = new List('table-default', {
sortClass: 'table-sort',
listClass: 'table-tbody',
valueNames: [ 'sort-name', 'sort-type', 'sort-city', 'sort-score',
{ attr: 'data-date', name: 'sort-date' },
{ attr: 'data-progress', name: 'sort-progress' },
'sort-quantity'
]
});
})
</script>
</body> </body>
</html> </html>

View file

@ -4,7 +4,7 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/> <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<title>Users</title> <title>Networks</title>
<link href="/css/tabler.min.css?1685973381" rel="stylesheet"/> <link href="/css/tabler.min.css?1685973381" rel="stylesheet"/>
<link href="/css/demo.min.css?1685973381" rel="stylesheet"/> <link href="/css/demo.min.css?1685973381" rel="stylesheet"/>
<style> <style>
@ -31,7 +31,7 @@
<div class="row g-2 align-items-center"> <div class="row g-2 align-items-center">
<div class="col"> <div class="col">
<h2 class="page-title"> <h2 class="page-title">
Users Networks
</h2> </h2>
</div> </div>
</div> </div>
@ -64,8 +64,24 @@
</div> </div>
</div> </div>
<!-- Libs JS --> <!-- Libs JS -->
<script src="/libs/list.js/dist/list.min.js?1692870487" defer></script>
<!-- Tabler Core --> <!-- Tabler Core -->
<script src="/js/tabler.min.js?1685973381" defer></script> <script src="/js/tabler.min.js?1685973381" defer></script>
<script src="/js/demo.min.js?1685973381" defer></script> <script src="/js/demo.min.js?1685973381" defer></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const list = new List('table-default', {
sortClass: 'table-sort',
listClass: 'table-tbody',
valueNames: [ 'sort-name', 'sort-type', 'sort-city', 'sort-score',
{ attr: 'data-date', name: 'sort-date' },
{ attr: 'data-progress', name: 'sort-progress' },
'sort-quantity'
]
});
})
</script>
</body> </body>
</html> </html>

View file

@ -4,7 +4,7 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/> <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<title>Users</title> <title>Volumes</title>
<link href="/css/tabler.min.css?1685973381" rel="stylesheet"/> <link href="/css/tabler.min.css?1685973381" rel="stylesheet"/>
<link href="/css/demo.min.css?1685973381" rel="stylesheet"/> <link href="/css/demo.min.css?1685973381" rel="stylesheet"/>
<style> <style>
@ -31,7 +31,7 @@
<div class="row g-2 align-items-center"> <div class="row g-2 align-items-center">
<div class="col"> <div class="col">
<h2 class="page-title"> <h2 class="page-title">
Users Volumes
</h2> </h2>
</div> </div>
</div> </div>
@ -64,8 +64,24 @@
</div> </div>
</div> </div>
<!-- Libs JS --> <!-- Libs JS -->
<script src="/libs/list.js/dist/list.min.js?1692870487" defer></script>
<!-- Tabler Core --> <!-- Tabler Core -->
<script src="/js/tabler.min.js?1685973381" defer></script> <script src="/js/tabler.min.js?1685973381" defer></script>
<script src="/js/demo.min.js?1685973381" defer></script> <script src="/js/demo.min.js?1685973381" defer></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const list = new List('table-default', {
sortClass: 'table-sort',
listClass: 'table-tbody',
valueNames: [ 'sort-name', 'sort-type', 'sort-city', 'sort-score',
{ attr: 'data-date', name: 'sort-date' },
{ attr: 'data-progress', name: 'sort-progress' },
'sort-quantity'
]
});
})
</script>
</body> </body>
</html> </html>