log api
This commit is contained in:
parent
b91ad7e015
commit
ea21a1c96d
6 changed files with 165 additions and 11 deletions
|
@ -17,7 +17,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepublish": "tsc",
|
"prepublish": "tsc",
|
||||||
"main": "tsc && node . -c config.juml",
|
"main": "tsc && node . -c config.juml",
|
||||||
"debug": "tsc && node . -c config.juml -d",
|
"debug": "tsc && node . -c config.juml -d -l 256",
|
||||||
"setup": "tsc && node . -c config.juml -s",
|
"setup": "tsc && node . -c config.juml -s",
|
||||||
"bundleRelease": "mkdir build/bundle & esbuild src/main.ts --platform=node --bundle --minify --outfile=build/bundle/main.js",
|
"bundleRelease": "mkdir build/bundle & esbuild src/main.ts --platform=node --bundle --minify --outfile=build/bundle/main.js",
|
||||||
"build-linux-x64": "mkdir build/bin & pkg -t node18-linux-x64 -o build/bin/outbag-linux-x64 build/bundle/main.js",
|
"build-linux-x64": "mkdir build/bin & pkg -t node18-linux-x64 -o build/bin/outbag-linux-x64 build/bundle/main.js",
|
||||||
|
|
|
@ -106,7 +106,7 @@ export const joinRoom: Act = {
|
||||||
await remove(roomOTAs)
|
await remove(roomOTAs)
|
||||||
.where(eq(roomOTAs.usesLeft, 0))
|
.where(eq(roomOTAs.usesLeft, 0))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req[1].affectedRows == 0) {
|
if (req.affectedRows == 0) {
|
||||||
return void aws("error", "ota");
|
return void aws("error", "ota");
|
||||||
}
|
}
|
||||||
let queryx = await insert(
|
let queryx = await insert(
|
||||||
|
|
|
@ -3,8 +3,9 @@ import express, { Request, Response } from "express";
|
||||||
import { suspectRequest } from "../sys/bruteforce.js";
|
import { suspectRequest } from "../sys/bruteforce.js";
|
||||||
import { oConf } from "../sys/config.js";
|
import { oConf } from "../sys/config.js";
|
||||||
import { accounts, db, rooms } from "../sys/db.js";
|
import { accounts, db, rooms } from "../sys/db.js";
|
||||||
import { error } from "../sys/log.js";
|
import { error, logList } from "../sys/log.js";
|
||||||
import { getSettings, SETTINGS } from "../sys/settings.js";
|
import { getSettings, SETTINGS } from "../sys/settings.js";
|
||||||
|
import logHTML from "../html/log.js";
|
||||||
|
|
||||||
var Methods: ([string, (req: Request, res: Response) => Promise<void>])[] = [
|
var Methods: ([string, (req: Request, res: Response) => Promise<void>])[] = [
|
||||||
["users", async (req: Request, res: Response) => {
|
["users", async (req: Request, res: Response) => {
|
||||||
|
@ -50,7 +51,32 @@ var Methods: ([string, (req: Request, res: Response) => Promise<void>])[] = [
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
res.json(out.filter(d => d != null));
|
res.json(out.filter(d => d != null));
|
||||||
}]
|
}],
|
||||||
|
["log/json", async (req: Request, res: Response) => {
|
||||||
|
if (global.provideLog == 0) return void res.status(500).send("disabled");
|
||||||
|
res.json(logList);
|
||||||
|
}],
|
||||||
|
["log/ansi", async (req: Request, res: Response) => {
|
||||||
|
if (global.provideLog == 0) return void res.status(500).send("disabled");
|
||||||
|
res.send(logList.map(([id, type, date, name, args]) => {
|
||||||
|
let out = `\x1b[33m${date}\x1b[0m\x1b[1m`;
|
||||||
|
if (type == "debug") {
|
||||||
|
out += `\x1b[1m\x1b[32m [${name}]: \x1b[0m`;
|
||||||
|
} else if (type == "log") {
|
||||||
|
out += `\x1b[1m\x1b[36m [${name}]: \x1b[0m`;
|
||||||
|
} else if (type == "warn") {
|
||||||
|
out += `\x1b[1m\x1b[36m [${name}]: \x1b[0m`;
|
||||||
|
} else {
|
||||||
|
out += ` \x1b[1m\x1b[41m[${name}]: \x1b[0m\x1b[41m`;
|
||||||
|
}
|
||||||
|
out += args.map(a => `${typeof a == 'object' ? JSON.stringify(a) : a}`).join(" ");
|
||||||
|
out += "\x1b[0m";
|
||||||
|
return out;
|
||||||
|
}).join("\x1b[0m\n"));
|
||||||
|
}],
|
||||||
|
["log/html", async (req: Request, res: Response) => {
|
||||||
|
res.send(logHTML);
|
||||||
|
}],
|
||||||
];
|
];
|
||||||
|
|
||||||
export const addGetMethods = (server: express.Express) => {
|
export const addGetMethods = (server: express.Express) => {
|
||||||
|
|
103
src/html/log.ts
Normal file
103
src/html/log.ts
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
export default /*html*/ `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Outbag log</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
color: white;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
color: rgb(187, 187, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
.log {
|
||||||
|
font-weight: bold;
|
||||||
|
color: rgb(0, 187, 187)
|
||||||
|
}
|
||||||
|
|
||||||
|
.warn {
|
||||||
|
font-weight: bold;
|
||||||
|
color: rgb(0, 187, 187)
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug {
|
||||||
|
font-weight: bold;
|
||||||
|
color: rgb(0, 187, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: rgb(187, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
.errorText {
|
||||||
|
background-color: rgb(187, 0, 0)
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<pre></pre>
|
||||||
|
<script>
|
||||||
|
let pre = document.querySelector("pre");
|
||||||
|
|
||||||
|
let loaded = [];
|
||||||
|
|
||||||
|
function parse([id, type, date, name, args ]){
|
||||||
|
let dateSpan = document.createElement("span");
|
||||||
|
dateSpan.className = "date";
|
||||||
|
dateSpan.innerText = date+" ";
|
||||||
|
pre.appendChild(dateSpan);
|
||||||
|
|
||||||
|
let nameSpan = document.createElement("span");
|
||||||
|
nameSpan.className = type;
|
||||||
|
nameSpan.innerText = "["+name+"]: ";
|
||||||
|
pre.appendChild(nameSpan);
|
||||||
|
|
||||||
|
let argsSpan = document.createElement("span");
|
||||||
|
if(type=="error") argsSpan.className = "errorText";
|
||||||
|
argsSpan.innerText = args.map(a => typeof a == 'object' ? JSON.stringify(a, null, 2) : a).join(" ");
|
||||||
|
pre.appendChild(argsSpan);
|
||||||
|
|
||||||
|
pre.appendChild(document.createElement("br"));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function refresh(){
|
||||||
|
let resp = await fetch("json");
|
||||||
|
if(resp.status != 200){
|
||||||
|
pre.innerText = "Outbag Log Api is disabled";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let json = await resp.json();
|
||||||
|
|
||||||
|
let scrollPosition = document.documentElement.getBoundingClientRect().bottom;
|
||||||
|
let heigth = window.innerHeight;
|
||||||
|
|
||||||
|
let scroll = heigth + 50 >= scrollPosition;
|
||||||
|
json.forEach(d=>{
|
||||||
|
if(loaded.includes(d[0])) return;
|
||||||
|
loaded.push(d[0]);
|
||||||
|
parse(d);
|
||||||
|
});
|
||||||
|
if(scroll) document.documentElement.scrollIntoView(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval(refresh, 1000);
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
`;
|
|
@ -1,5 +1,6 @@
|
||||||
declare global {
|
declare global {
|
||||||
var debug: boolean;
|
var debug: boolean;
|
||||||
|
var provideLog: number;
|
||||||
}
|
}
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import https from "https";
|
import https from "https";
|
||||||
|
@ -20,6 +21,7 @@ import { activateWS, wsOnConnection } from "./api/ws.js";
|
||||||
import { startUpdateCert } from "./server/serverCerts.js";
|
import { startUpdateCert } from "./server/serverCerts.js";
|
||||||
import { wait } from "./sys/tools.js";
|
import { wait } from "./sys/tools.js";
|
||||||
|
|
||||||
|
global.provideLog = 10;
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
|
@ -34,10 +36,12 @@ program
|
||||||
program
|
program
|
||||||
.option("-c, --config <path>", "Start the Outbag server with a config file.")
|
.option("-c, --config <path>", "Start the Outbag server with a config file.")
|
||||||
.option("-d, --debug", "Start the Outbag server with more log output.")
|
.option("-d, --debug", "Start the Outbag server with more log output.")
|
||||||
|
.option("-l, --log <number>", "Amount of log entires provided in get api! -1 = inifinity")
|
||||||
.option("-s, --setup", "Start the Server Setup Tool")
|
.option("-s, --setup", "Start the Server Setup Tool")
|
||||||
.action(({ config, debug, setup }) => {
|
.action(({ config, debug, log: provideLog, setup }) => {
|
||||||
let dofullSetup = false;
|
let dofullSetup = false;
|
||||||
global.debug = debug != null;
|
global.debug = debug != null;
|
||||||
|
global.provideLog = provideLog != null ? provideLog : 0;
|
||||||
if (global.debug) {
|
if (global.debug) {
|
||||||
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";
|
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,69 @@
|
||||||
|
import { addShutdownTask } from "nman";
|
||||||
|
|
||||||
|
export const logList: ([number, "debug" | "log" | "warn" | "error", string, string, any[]])[] = [
|
||||||
|
//[id, "type", "Date", "Titel", ...data]
|
||||||
|
];
|
||||||
|
let logID = 0;
|
||||||
|
|
||||||
export const debug = (name: string, ...args: any[]) => {
|
export const debug = (name: string, ...args: any[]) => {
|
||||||
if (!global.debug) return;
|
if (!global.debug) return;
|
||||||
args = consorArgs(args);
|
args = consorArgs(args);
|
||||||
|
let dateString = (new Date()).toLocaleString();
|
||||||
console.log(
|
console.log(
|
||||||
"\x1b[33m%s\x1b[0m" +
|
"\x1b[33m%s\x1b[0m" +
|
||||||
"\x1b[1m\x1b[32m%s\x1b[0m",
|
"\x1b[1m\x1b[32m%s\x1b[0m",
|
||||||
(new Date()).toLocaleString(),
|
dateString,
|
||||||
` [${name}]:`,
|
` [${name}]:`,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
|
if (global.provideLog != 0) logList.push([logID++, "debug", dateString, name, args]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const log = (name: string, ...args: string[]) => {
|
export const log = (name: string, ...args: string[]) => {
|
||||||
args = consorArgs(args);
|
args = consorArgs(args);
|
||||||
|
let dateString = (new Date()).toLocaleString();
|
||||||
console.log(
|
console.log(
|
||||||
"\x1b[33m%s\x1b[0m" +
|
"\x1b[33m%s\x1b[0m" +
|
||||||
"\x1b[1m\x1b[36m%s\x1b[0m",
|
"\x1b[1m\x1b[36m%s\x1b[0m",
|
||||||
(new Date()).toLocaleString(),
|
dateString,
|
||||||
` [${name}]:`,
|
` [${name}]:`,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
|
if (global.provideLog != 0) logList.push([logID++, "log", dateString, name, args]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const warn = (name: string, ...args: any[]) => {
|
export const warn = (name: string, ...args: any[]) => {
|
||||||
args = consorArgs(args);
|
args = consorArgs(args);
|
||||||
|
let dateString = (new Date()).toLocaleString();
|
||||||
console.warn(
|
console.warn(
|
||||||
"\x1b[33m%s\x1b[0m" +
|
"\x1b[33m%s\x1b[0m" +
|
||||||
"\x1b[1m\x1b[36m%s\x1b[0m",
|
"\x1b[1m\x1b[36m%s\x1b[0m",
|
||||||
(new Date()).toLocaleString(),
|
dateString,
|
||||||
` [${name}]:`,
|
` [${name}]:`,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
|
if (global.provideLog != 0) logList.push([logID++, "warn", dateString, name, args]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const error = (name: string, ...args: any[]) => {
|
export const error = (name: string, ...args: any[]) => {
|
||||||
|
let dateString = (new Date()).toLocaleString();
|
||||||
console.error(
|
console.error(
|
||||||
"\x1b[33m%s\x1b[0m" +
|
"\x1b[33m%s\x1b[0m" +
|
||||||
"\x1b[1m\x1b[41m%s\x1b[0m\x1b[41m",
|
"\x1b[1m\x1b[41m%s\x1b[0m\x1b[41m",
|
||||||
(new Date()).toLocaleString() + " ",
|
dateString + " ",
|
||||||
`[${name}]:`,
|
`[${name}]:`,
|
||||||
...args,
|
...args,
|
||||||
"\x1b[0m"
|
"\x1b[0m"
|
||||||
);
|
);
|
||||||
|
if (global.provideLog != 0) logList.push([logID++, "error", dateString, name, args]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let clearLogID = setInterval(() => {
|
||||||
|
if (global.provideLog >= -1)
|
||||||
|
logList.splice(0, logList.length - global.provideLog)
|
||||||
|
}, 60000);
|
||||||
|
addShutdownTask(()=>clearInterval(clearLogID));
|
||||||
|
|
||||||
const consorArgs = (args: any[]) => {
|
const consorArgs = (args: any[]) => {
|
||||||
let out = [];
|
let out = [];
|
||||||
for (let i = 0; i < args.length; i++) {
|
for (let i = 0; i < args.length; i++) {
|
||||||
|
@ -52,10 +73,10 @@ const consorArgs = (args: any[]) => {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
const censorLogArg = (arg: any) => {
|
const censorLogArg = (arg: any) => {
|
||||||
if (typeof arg != "object" || arg == null) return arg;
|
if (typeof arg != "object" || arg == null || arg instanceof Error) return arg;
|
||||||
let out: any = {};
|
let out: any = {};
|
||||||
for (let key in arg) {
|
for (let key in arg) {
|
||||||
if (key == "accountKey") out[key] = new Array(arg[key].length).fill("*").join("");
|
if ((["accountKey", "sign", "publicKey", "token"]).includes(key)) out[key] = new Array(Math.min(arg[key].length, 50)).fill("*").join("");
|
||||||
else out[key] = censorLogArg(arg[key]);
|
else out[key] = censorLogArg(arg[key]);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
|
|
Loading…
Reference in a new issue