mapcomplete/scripts/serverErrorReport.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

118 lines
3.7 KiB
TypeScript
Raw Normal View History

import { Handler, Server } from "./server"
import Script from "./Script"
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
import { mkdir } from "node:fs"
import ScriptUtils from "./ScriptUtils"
2024-07-19 20:43:46 +02:00
import { IncomingMessage } from "node:http"
class ServerErrorReport extends Script {
2024-07-19 20:43:46 +02:00
private errorReport = 0
constructor() {
super("A server which receives and logs error reports")
}
private getFilename(logDirectory: string, d: Date): string {
2024-07-21 10:52:51 +02:00
return (
logDirectory +
"/" +
d.getUTCFullYear() +
"_" +
(d.getUTCMonth() + 1) +
"_" +
d.getUTCDate() +
".lines.json"
2024-07-21 10:52:51 +02:00
)
}
2024-07-21 10:52:51 +02:00
public reportError(
path: string,
queryParams: URLSearchParams,
req: IncomingMessage,
body: string | undefined,
logDirectory: string
): string {
2024-07-19 20:43:46 +02:00
if (!body) {
2024-07-21 10:52:51 +02:00
throw '{"error": "No body; use a post request"}'
2024-07-19 20:43:46 +02:00
}
console.log(body)
const ip = <string>req.headers["x-forwarded-for"]
try {
body = JSON.parse(body)
} catch (e) {
// could not parse, we'll save it as is
}
const d = new Date()
const file = this.getFilename(logDirectory, d)
const date = d.toISOString()
2024-07-21 10:52:51 +02:00
const contents = "\n" + JSON.stringify({ ip, index: this.errorReport, date, message: body })
2024-07-19 20:43:46 +02:00
if (!existsSync(file)) {
writeFileSync(file, contents)
} else {
appendFileSync(file, contents)
}
2024-07-21 10:52:51 +02:00
this.errorReport++
2024-07-19 20:43:46 +02:00
return `{"status":"ok", "nr": ${this.errorReport}}`
}
async main(args: string[]): Promise<void> {
const logDirectory = args[0] ?? "./error_logs"
console.log("Logging to directory", logDirectory)
if (!existsSync(logDirectory)) {
mkdirSync(logDirectory)
console.log("Created this directory")
}
2024-07-21 10:52:51 +02:00
if (!existsSync(logDirectory + "/csp")) {
mkdirSync(logDirectory + "/csp")
2024-07-19 20:43:46 +02:00
console.log("Created this directory")
}
2024-06-24 13:11:35 +02:00
new Server(2348, {}, [
{
mustMatch: "status",
mimetype: "application/json",
handle: async () => {
const filename = this.getFilename(logDirectory, new Date())
let errorsToday = 0
if (existsSync(filename)) {
const contents = readFileSync(filename, "utf8")
errorsToday = contents.split("\n").length
}
return JSON.stringify({
2024-07-21 10:52:51 +02:00
online: true,
errors_today: errorsToday,
})
2024-07-19 20:43:46 +02:00
},
},
2024-07-19 20:43:46 +02:00
{
mustMatch: "report",
mimetype: "application/json",
2024-07-21 10:52:51 +02:00
handle: async (
path: string,
queryParams: URLSearchParams,
req: IncomingMessage,
body: string | undefined
) => {
2024-07-20 16:30:39 +02:00
return this.reportError(path, queryParams, req, body, logDirectory)
2024-07-19 20:43:46 +02:00
},
},
{
mustMatch: "csp",
mimetype: "application/json",
2024-07-21 10:52:51 +02:00
handle: async (
path: string,
queryParams: URLSearchParams,
req: IncomingMessage,
body: string | undefined
) => {
return this.reportError(path, queryParams, req, body, logDirectory + "/csp")
2024-07-19 20:43:46 +02:00
},
},
2024-06-24 13:11:35 +02:00
])
}
}
new ServerErrorReport().run()