diff --git a/config.json b/config.json index 52e08ef..2a25cd3 100644 --- a/config.json +++ b/config.json @@ -1 +1,11 @@ -{"developerMode":false} \ No newline at end of file +{ + "serverPort": 8080, + "databaseHost": "localhost", + "databaseUser": "root", + "databasePassword": "", + "database": "test", + "databasePort": 3306, + "developerMode": true, + "developerLogin": true, + "forceDevLogin": true +} \ No newline at end of file diff --git a/db/connection.js b/db/connection.js new file mode 100644 index 0000000..f9408df --- /dev/null +++ b/db/connection.js @@ -0,0 +1,18 @@ +const mysql = require('mysql2'); + +const db = mysql.createConnection({ + host: 'localhost', + user: 'root', + password: '1234', + database: 'app' +}); + +db.connect((err) => { + if (err) { + console.error('Error connecting to database:', err); + return; + } + console.log('Connected to MySQL database'); +}); + +module.exports = db; diff --git a/routes/config.js b/routes/config.js new file mode 100644 index 0000000..782ec28 --- /dev/null +++ b/routes/config.js @@ -0,0 +1,71 @@ +const express = require('express'); +const fs = require('fs'); +const db = require('../db/connection'); +const { setuid } = require('process'); +const router = express.Router(); + + +router.use('/', (req, res) => { + const result = req.headers['x-username']; + + console.log(req.headers['x-username']); + if (!result) { + return res.status(400).json({ error: "x-username header is required" }); + } + const pre_username = JSON.parse(result); + const username = pre_username.token; + // Check if user exists and has permissions + console.log(username); + const query = 'SELECT perms FROM users WHERE username = ?'; + db.query(query, [username], (err, results) => { + if (err) { + console.error('Database error:', err); + return res.status(500).json({ error: "Internal server error" }); + } + + if (results.length === 0) { + return res.status(401).json({ error: "Unauthorized" }); + } + + const perms = results[0].perms; + if (perms !== 'admin') { + return res.status(403).json({ error: "Insufficient permissions" }); + } + + // Handle config updates + if (req.method === 'POST') { + try { + const newConfig = req.body; + console.log(newConfig); + const existingConfig = JSON.parse(fs.readFileSync('config.json', 'utf8')); + const updatedConfig = { ...existingConfig, ...newConfig }; + fs.writeFileSync('config.json', JSON.stringify(updatedConfig, null, 2)); + res.json({ message: "Config updated successfully" }); + } catch (error) { + console.error('Error writing config:', error); + res.status(500).json({ error: "Failed to update config" }); + } + } + + // Handle config reads + else if (req.method === 'GET') { + try { + const configData = fs.readFileSync('config.json', 'utf8'); + if (!configData) { + return res.status(500).json({ error: "Config file is empty" }); + } + const config = JSON.parse(configData); + res.json(config); + } catch (error) { + console.error('Error reading config:', error); + res.status(500).json({ error: "Failed to read config" }); + } + } + + else { + res.status(405).json({ error: "Method not allowed" }); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000..627b09d --- /dev/null +++ b/routes/login.js @@ -0,0 +1,33 @@ +const express = require('express'); +const db = require('../db/connection'); +const router = express.Router(); + +router.post('/', (req, res) => { + const username = req.body.username; + const password = req.body.password; + console.log(req.body.username, req.body.password); + + const query = 'SELECT * FROM users WHERE username = ?'; + db.query(query, [username], (err, results) => { + if (err) { + console.error('Database error:', err); + return res.status(500).json({ error: "Internal server error" }); + } + + if (results.length === 0) { + return res.status(401).json({ error: "Invalid username or password" }); + } + + const user = results[0]; + + if (password !== user.password_hash) { + return res.status(401).json({ error: "Invalid username or password" }); + } + + res.json({ + token: username, + }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/systemStats.js b/routes/systemStats.js new file mode 100644 index 0000000..f448dd9 --- /dev/null +++ b/routes/systemStats.js @@ -0,0 +1,44 @@ +const express = require('express'); +const os = require('os'); +const router = express.Router(); + +router.get('/', (req, res) => { + // Get CPU usage + const cpus = os.cpus(); + let totalIdle = 0; + let totalTick = 0; + + cpus.forEach(cpu => { + // Calculate idle time and total time for each CPU core + const idle = cpu.times.idle; + const user = cpu.times.user; + const nice = cpu.times.nice; + const sys = cpu.times.sys; + const irq = cpu.times.irq; + + // Calculate total time by summing all CPU states + const total = user + nice + sys + idle + irq; + + // Add to running totals to get average across all cores + totalTick += total; + totalIdle += idle; + }); + + const cpuUsage = 100 - (totalIdle / totalTick * 100); + + // Get memory usage + const totalMemory = os.totalmem() / 1024 / 1024 / 1024; + + const freeMemory = os.freemem() / 1024 / 1024 / 1024; + const usedMemory = totalMemory - freeMemory; + const memoryUsage = (usedMemory / totalMemory * 100); + + res.json({ + cpu: Math.round(cpuUsage * 100) / 100, + memory: Math.round(memoryUsage * 100) / 100, + totalMemory: totalMemory.toFixed(2), + freeMemory: freeMemory.toFixed(2) + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server.js b/server.js index 350d2a9..bfc88b5 100644 --- a/server.js +++ b/server.js @@ -1,180 +1,22 @@ const express = require('express'); const cors = require('cors'); +const db = require('./db/connection'); +const config = require('./config.json'); +const port = config.serverPort; + +const systemStatsRouter = require('./routes/systemStats'); +const loginRouter = require('./routes/login'); +const configRouter = require('./routes/config'); + const app = express(); -const os = require('os'); -const fs = require('fs'); app.use(cors()); -app.use(express.json()) +app.use(express.json()); +app.use('/system-stats', systemStatsRouter); +app.use('/login', loginRouter); +app.use('/config', configRouter); -const mysql = require('mysql2'); - -const db = mysql.createConnection({ - host: 'localhost', - user: 'root', - password: '1234', - database: 'app' -}); - -db.connect((err) => { - if (err) { - console.error('Error connecting to database:', err); - return; - } - console.log('Connected to MySQL database'); -}); - -app.get('/system-stats', (req, res) => { - // Get CPU usage - const cpus = os.cpus(); - let totalIdle = 0; - let totalTick = 0; - - cpus.forEach(cpu => { - // Calculate idle time and total time for each CPU core - const idle = cpu.times.idle; - const user = cpu.times.user; - const nice = cpu.times.nice; - const sys = cpu.times.sys; - const irq = cpu.times.irq; - - // Calculate total time by summing all CPU states - const total = user + nice + sys + idle + irq; - - // Add to running totals to get average across all cores - totalTick += total; - totalIdle += idle; - }); - - const cpuUsage = 100 - (totalIdle / totalTick * 100); - - // Get memory usage - const totalMemory = os.totalmem() / 1024 / 1024 / 1024; - - const freeMemory = os.freemem() / 1024 / 1024 / 1024; - const usedMemory = totalMemory - freeMemory; - const memoryUsage = (usedMemory / totalMemory * 100); - - res.json({ - cpu: Math.round(cpuUsage * 100) / 100, - memory: Math.round(memoryUsage * 100) / 100, - totalMemory: totalMemory.toFixed(2), - freeMemory: freeMemory.toFixed(2) - }); -}); - -app.use('/login', (req, res) => { - const username = req.body.username; - const password = req.body.password; - console.log(req.body.username, req.body.password); - - const query = 'SELECT * FROM users WHERE username = ?'; - db.query(query, [username], (err, results) => { - if (err) { - console.error('Database error:', err); - return res.status(500).json({ error: "Internal server error" }); - } - - if (results.length === 0) { - return res.status(401).json({ error: "Invalid username or password" }); - } - - const user = results[0]; - - if (password !== user.password_hash) { - return res.status(401).json({ error: "Invalid username or password" }); - } - - res.json({ - token: username, - }); - }); -}) - -app.use('/check-perms', (req, res) => { - const username = req.body.username; - console.log(req.body); - const query = 'SELECT perms FROM users WHERE username = ?'; - db.query(query, [username], (err, results) => { - if (err) { - console.error('Database error:', err); - return res.status(500).json({ error: "Internal server error" }); - } - - if (results.length === 0) { - return res.status(404).json({ error: "User not found" }); - } - - res.json({ - permissions: results[0].perms - }); - }); -}); - -app.use('/config', (req, res) => { - const result = req.headers['x-username']; - - console.log(req.headers['x-username']); - if (!result) { - return res.status(400).json({ error: "x-username header is required" }); - } - const pre_username = JSON.parse(result); - const username = pre_username.token; - // Check if user exists and has permissions - console.log(username); - const query = 'SELECT perms FROM users WHERE username = ?'; - db.query(query, [username], (err, results) => { - if (err) { - console.error('Database error:', err); - return res.status(500).json({ error: "Internal server error" }); - } - - if (results.length === 0) { - return res.status(401).json({ error: "Unauthorized" }); - } - - const perms = results[0].perms; - if (perms !== 'admin') { - return res.status(403).json({ error: "Insufficient permissions" }); - } - - // Handle config updates - if (req.method === 'POST') { - try { - const newConfig = req.body; - console.log(newConfig); - fs.writeFileSync('config.json', JSON.stringify(newConfig)); - res.json({ message: "Config updated successfully" }); - } catch (error) { - console.error('Error writing config:', error); - res.status(500).json({ error: "Failed to update config" }); - } - } - - // Handle config reads - else if (req.method === 'GET') { - try { - const configData = fs.readFileSync('config.json', 'utf8'); - if (!configData) { - return res.status(500).json({ error: "Config file is empty" }); - } - const config = JSON.parse(configData); - res.json(config); - } catch (error) { - console.error('Error reading config:', error); - res.status(500).json({ error: "Failed to read config" }); - } - } - - else { - res.status(405).json({ error: "Method not allowed" }); - } - }); -}); - - - - - -app.listen(8080, () => console.log('API Running on localhost:8080')) \ No newline at end of file + app.listen(port, () => { + console.log(`Server is running on port ${port}`); +}); \ No newline at end of file