| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  | import { Handler, Server } from "./server" | 
					
						
							|  |  |  | import Script from "./Script" | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  | import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs" | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  | import { mkdir } from "node:fs" | 
					
						
							|  |  |  | import ScriptUtils from "./ScriptUtils" | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  | import { IncomingMessage } from "node:http" | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ServerErrorReport extends Script { | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private errorReport = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |     constructor() { | 
					
						
							|  |  |  |         super("A server which receives and logs error reports") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |     private getFilename(logDirectory: string, d: Date): string { | 
					
						
							|  |  |  |         return logDirectory + | 
					
						
							|  |  |  |             "/" + | 
					
						
							|  |  |  |             d.getUTCFullYear() + | 
					
						
							|  |  |  |             "_" + | 
					
						
							|  |  |  |             (d.getUTCMonth() + 1) + | 
					
						
							|  |  |  |             "_" + | 
					
						
							|  |  |  |             d.getUTCDate() + | 
					
						
							|  |  |  |             ".lines.json" | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-20 16:30:39 +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) { | 
					
						
							|  |  |  |             throw "{\"error\": \"No body; use a post request\"}" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         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() | 
					
						
							|  |  |  |         const contents = | 
					
						
							|  |  |  |             "\n" + JSON.stringify({ ip, index: this.errorReport, date, message: body }) | 
					
						
							|  |  |  |         if (!existsSync(file)) { | 
					
						
							|  |  |  |             writeFileSync(file, contents) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             appendFileSync(file, contents) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |        this. errorReport++ | 
					
						
							|  |  |  |         return `{"status":"ok", "nr": ${this.errorReport}}` | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |     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-14 03:10:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  |         if (!existsSync(logDirectory+"/csp")) { | 
					
						
							|  |  |  |             mkdirSync(logDirectory+"/csp") | 
					
						
							|  |  |  |             console.log("Created this directory") | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |         new Server(2348, {}, [ | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |                 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({ | 
					
						
							|  |  |  |                         "online": true, | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  |                         "errors_today": errorsToday, | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |                     }) | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                 mustMatch: "report", | 
					
						
							|  |  |  |                 mimetype: "application/json", | 
					
						
							| 
									
										
										
										
											2024-07-20 16:30:39 +02:00
										 |  |  |                 handle: async (path: string, queryParams: URLSearchParams, req: IncomingMessage, body: string | undefined) => { | 
					
						
							|  |  |  |                     return this.reportError(path, queryParams, req, body, logDirectory) | 
					
						
							| 
									
										
										
										
											2024-07-19 20:43:46 +02:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 mustMatch: "csp", | 
					
						
							|  |  |  |                 mimetype: "application/json", | 
					
						
							| 
									
										
										
										
											2024-07-20 16:30:39 +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
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | new ServerErrorReport().run() |