| 
									
										
										
										
											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" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ServerErrorReport extends Script { | 
					
						
							|  |  |  |     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-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-06-20 14:22:33 +02:00
										 |  |  |         let errorReport = 0 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  |                         "errors_today": errorsToday | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |             <Handler>{ | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                 mustMatch: "report", | 
					
						
							|  |  |  |                 mimetype: "application/json", | 
					
						
							|  |  |  |                 handle: async (_, queryParams, req, body) => { | 
					
						
							|  |  |  |                     if (!body) { | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |                         throw "{\"error\": \"No body; use a post request\"}" | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     console.log(body) | 
					
						
							|  |  |  |                     const ip = <string>req.headers["x-forwarded-for"] | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |                     try { | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                         body = JSON.parse(body) | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |                     } catch (e) { | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                         // could not parse, we'll save it as is
 | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |                     const d = new Date() | 
					
						
							|  |  |  |                     const file = this.getFilename(logDirectory, d) | 
					
						
							|  |  |  |                     const date = d.toISOString() | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |                     const contents = | 
					
						
							|  |  |  |                         "\n" + JSON.stringify({ ip, index: errorReport, date, message: body }) | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |                     if (!existsSync(file)) { | 
					
						
							|  |  |  |                         writeFileSync(file, contents) | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         appendFileSync(file, contents) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     errorReport++ | 
					
						
							|  |  |  |                     return `{"status":"ok", "nr": ${errorReport}}` | 
					
						
							| 
									
										
										
										
											2024-07-14 03:10:10 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-06-24 13:11:35 +02:00
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2024-06-20 14:22:33 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | new ServerErrorReport().run() |