diff --git a/package-lock.json b/package-lock.json index e5bfc66..697fe7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "express": "^4.18.1", "express-session": "^1.17.3", "mysql": "^2.18.1", - "ping": "^0.4.2" + "ping": "^0.4.2", + "surrealdb.js": "^0.3.1" }, "devDependencies": { "@types/bcrypt": "^5.0.0", @@ -529,6 +530,19 @@ "node": ">=8" } }, + "node_modules/bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1820,6 +1834,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/nanoid": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", + "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1858,6 +1883,17 @@ } } }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -2466,6 +2502,19 @@ "node": ">=8" } }, + "node_modules/surrealdb.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/surrealdb.js/-/surrealdb.js-0.3.1.tgz", + "integrity": "sha512-qVd3xIaZ120KClGBe5WKDswwI2y7ZYjXfhI2F2eRvr1Uv9t/tz8tF0heqdDXXfPqqZA4S2GadEwjBkGSIRNBCw==", + "dependencies": { + "nanoid": "^4.0.0", + "ws": "^8.8.1" + }, + "optionalDependencies": { + "bufferutil": "^4.0.6", + "utf-8-validate": "^5.0.9" + } + }, "node_modules/tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -2595,6 +2644,19 @@ "punycode": "^2.1.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2673,6 +2735,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3104,6 +3186,15 @@ "fill-range": "^7.0.1" } }, + "bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4086,6 +4177,11 @@ } } }, + "nanoid": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", + "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4110,6 +4206,12 @@ "whatwg-url": "^5.0.0" } }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -4530,6 +4632,17 @@ "has-flag": "^4.0.0" } }, + "surrealdb.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/surrealdb.js/-/surrealdb.js-0.3.1.tgz", + "integrity": "sha512-qVd3xIaZ120KClGBe5WKDswwI2y7ZYjXfhI2F2eRvr1Uv9t/tz8tF0heqdDXXfPqqZA4S2GadEwjBkGSIRNBCw==", + "requires": { + "bufferutil": "^4.0.6", + "nanoid": "^4.0.0", + "utf-8-validate": "^5.0.9", + "ws": "^8.8.1" + } + }, "tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -4625,6 +4738,15 @@ "punycode": "^2.1.0" } }, + "utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4688,6 +4810,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index f5f953a..ded5bef 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "express": "^4.18.1", "express-session": "^1.17.3", "mysql": "^2.18.1", - "ping": "^0.4.2" + "ping": "^0.4.2", + "surrealdb.js": "^0.3.1" }, "devDependencies": { "@types/bcrypt": "^5.0.0", diff --git a/src/index.ts b/src/index.ts index 600ca8c..3c3b32a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,10 @@ -import express from 'express'; +import express, { NextFunction } from 'express'; import Ping from 'ping'; import { readdirSync } from 'fs'; import sessions from "express-session" import cookieParser from "cookie-parser" -import mysql from 'mysql' +//@ts-ignore +import Surreal from 'surrealdb.js' import bcrypt from 'bcrypt' import url from 'url'; @@ -19,23 +20,29 @@ const ping = async (host: string) => { const getIP = () : Promise => { return new Promise((resolve, reject) => { - connection.query("SELECT * FROM ips", async (err, results, fields) => { + connection.query("SELECT * FROM ips").then((data : any) => { + const addresses = [...data[0].result.slice()].map(a => a.ip); + resolve(addresses); + }).catch((err : any) => { + reject(err); + }); + /*connection.query("SELECT * FROM ips", async (err, results, fields) => { if(err) reject(err); const addresses = [...results.slice()].map(a => a.ip); resolve(addresses); - }); + });*/ }); } -const connection = mysql.createConnection({ - host: "mysql", +const connection = new Surreal("http://127.0.0.1:8000/rpc"); + +await connection.signin({ user: "root", - password: "root", - database: "sshmon" + pass: "root" }); -connection.connect(); +await connection.use("sshmon", "sshmon"); const app = express(); @@ -67,6 +74,11 @@ routes.forEach(async route => { } }); +app.all("*", (req, res, next) => { + console.log(`${req.method} ${req.httpVersion} ${req.path}`); + next(); +}); + app.listen(8080, () => console.log('rdy')); export interface Data { diff --git a/src/routes/addIP.ts b/src/routes/addIP.ts index e1dcf3e..3ad84aa 100644 --- a/src/routes/addIP.ts +++ b/src/routes/addIP.ts @@ -5,19 +5,25 @@ export default { method: "GET", url: "/addIP/:ip", callback: async (data: any, req: Request, res: Response) => { - connection.query("SELECT * FROM ips WHERE ip = ?", req.params.ip, (err, results, fields) => { - if(err) throw err; - - if(results.length > 0) { + connection.query("SELECT * FROM ips WHERE ip=$ip", { + ip: req.params.ip + }).then((result: any) => { + if(result[0].result.length > 0) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ status: "OK" })); } else { - connection.query("INSERT INTO ips VALUES (NULL, ?)", [req.params.ip], (errr, resultss, fieldss) => { - if(errr) throw errr + connection.query("CREATE ips SET ip=$ip", { + ip: req.params.ip + }).then((resultt: any) => { + data.pings.set(req.params.ip, `${Date.now()}_1`); res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ status: "OK" })); + }).catch((err: any) => { + throw err; }); } - }); + }).catch((err: any) => { + throw err; + }); } } \ No newline at end of file diff --git a/src/routes/loginUser.ts b/src/routes/loginUser.ts index 9dcd09b..d11fb4e 100644 --- a/src/routes/loginUser.ts +++ b/src/routes/loginUser.ts @@ -5,12 +5,12 @@ export default { method: "POST", url: "/loginUser", callback: async (data: any, req: Request, res: Response) => { - - connection.query("SELECT * FROM users WHERE username = ?", req.body.username, async (err, results, fields) => { - if(err) throw err; - if(results.length === 0) res.render("pages/login.ejs", { invalid: "baduserorpass" }); + connection.query(`SELECT * FROM users WHERE username=$user`, { + user: req.body.username + }).then(async (result: any) => { + if(result[0].result.length === 0) res.render("pages/login.ejs", { invalid: "baduserorpass" }); else { - const compare = await bcrypt.compare(req.body.password, results[0].password); + const compare = await bcrypt.compare(req.body.password, result[0].result[0].password); if(compare) { const session = req.session; //@ts-ignore @@ -23,6 +23,8 @@ export default { res.redirect("/"); } else res.render("pages/login.ejs", { invalid: "baduserorpass" }); } - }) + }).catch((err: any) => { + throw err; + }); } } \ No newline at end of file diff --git a/src/routes/ping.ts b/src/routes/ping.ts index 466cdc9..234f306 100644 --- a/src/routes/ping.ts +++ b/src/routes/ping.ts @@ -8,20 +8,39 @@ export default { const ip = req.params.ip; const r = await data.ping(ip); if((Number(data.pings.get(ip).split("_")[0]) + (1000 * 60 * 5)) < Date.now()) { - if(!r.alive) connection.query("SELECT * FROM downtime WHERE ip=? AND date=? AND status=?", [ip, new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), "DOWN"], (err, results, fields) => { - if(err) throw err; - if(results.length === 0) connection.query("INSERT INTO downtime VALUES (NULL, ?, ?, ?)", [ip, new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), "DOWN"], (errr, resultss, fieldss) => { - if(errr) throw errr; + if(!r.alive) { + connection.query("SELECT * FROM downtime WHERE ip=$ip AND date=$date AND status=$status", { + ip: ip, + date: new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), + status: "DOWN" + }).then((result: any) => { + if(result[0].result.length === 0) connection.query("CREATE downtime SET ip=$ip, date=$date, status=$status", { + ip: ip, + date: new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), + status: "DOWN" + }); + + }).catch((err: any) => { + throw err; }); - }); - - else connection.query("SELECT * FROM downtime WHERE ip=? AND date=? AND status=?", [ip, new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), "UP"], (err, results, fields) => { - if(err) throw err; - if(results.length === 0) connection.query("INSERT INTO downtime VALUES (NULL, ?, ?, ?)", [ip, new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), "UP"], (errr, resultss, fieldss) => { - if(errr) throw errr; + } else { + connection.query("SELECT * FROM downtime WHERE ip=$ip AND date=$date AND status=$status", { + ip: ip, + date: new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), + status: "UP" + }).then((result: any) => { + if(result[0].result.length === 0) connection.query("CREATE downtime SET ip=$ip, date=$date, status=$status", { + ip: ip, + date: new Date(Number(data.pings.get(ip).split("_")[0])).toISOString().slice(0, 19).replace('T', ' '), + status: "UP" + }); + + }).catch((err: any) => { + throw err; }); - }); + } } + if(!r.alive && data.pings.get(ip).split("_")[1] === "1") data.pings.set(ip, `${Date.now()}_0`); else if(r.alive) data.pings.set(ip, `${Date.now()}_1`); res.setHeader('Content-Type', 'application/json'); diff --git a/src/routes/registerUser.ts b/src/routes/registerUser.ts index 102463e..59842e9 100644 --- a/src/routes/registerUser.ts +++ b/src/routes/registerUser.ts @@ -17,16 +17,23 @@ export default { const encryptedPassword = await bcrypt.hash(req.body.password, 10); - connection.query("SELECT * FROM users WHERE username = ?", req.body.username, (err, results, fields) => { - if(err) throw err; - - if(results.length > 0) res.render("pages/register.ejs", { invalid: "exists" }); + connection.query(`SELECT * FROM users WHERE username=$user`, { + user: req.body.username + }) + .then((result: any) => { + if(result[0].result.length > 0) res.render("pages/register.ejs", { invalid: "exists" }); else { - connection.query("INSERT INTO users VALUES (NULL, ?, ?)", [req.body.username, encryptedPassword], (errr, resultss, fieldss) => { - if(errr) throw errr + connection.query("CREATE users SET username=$user, password=$pass", { + user: req.body.username, + pass: encryptedPassword + }).then((resultt: any) => { res.render("pages/register.ejs", { invalid: "created" }); + }).catch((err: any) => { + throw err; }); } + }).catch((err: any) => { + throw err; }); } } \ No newline at end of file diff --git a/src/routes/removeIP.ts b/src/routes/removeIP.ts index 94ace76..1493026 100644 --- a/src/routes/removeIP.ts +++ b/src/routes/removeIP.ts @@ -5,19 +5,25 @@ export default { method: "GET", url: "/removeIP/:ip", callback: async (data: any, req: Request, res: Response) => { - connection.query("SELECT * FROM ips WHERE ip = ?", req.params.ip, (err, results, fields) => { - if(err) throw err; - - if(results.length == 0) { + connection.query("SELECT * FROM ips WHERE ip=$ip", { + ip: req.params.ip + }) + .then((result: any) => { + if(result[0].result.length == 0) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ status: "OK" })); } else { - connection.query("DELETE FROM ips WHERE ip = ?", req.params.ip, (errr, resultss, fieldss) => { - if(errr) throw errr + connection.query("DELETE ips WHERE ip=$ip", { + ip: req.params.ip + }).then((resultt: any) => { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ status: "OK" })); + }).catch((err: any) => { + throw err; }); } + }).catch((err: any) => { + throw err; }); } } \ No newline at end of file diff --git a/views/pages/index.ejs b/views/pages/index.ejs index feb6552..fe8b623 100644 --- a/views/pages/index.ejs +++ b/views/pages/index.ejs @@ -21,6 +21,7 @@ await fetch('http://localhost:8080/removeIP/' + ip) const a = document.getElementById(ip + "_main"); a.remove(); + window.location.reload(true); } async function aaa() {