2024-12-18 17:13:52 +00:00
|
|
|
import * as net from "net";
|
|
|
|
import * as sq from "sqlite3";
|
|
|
|
import * as pp from "proxy-protocol-js";
|
|
|
|
|
2024-12-16 20:57:37 +00:00
|
|
|
if (process.argv[2] == null) {
|
|
|
|
console.log("No IP specified");
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
if (process.argv[3] == null) {
|
|
|
|
console.log("No port specified");
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
const ip = process.argv[2];
|
|
|
|
const port = Number(process.argv[3]);
|
|
|
|
|
2024-12-18 16:38:24 +00:00
|
|
|
function msgToString(time: Date, address: string, msg: string) {
|
|
|
|
return "[" + time.getDate() + "." + (time.getMonth() + 1) + "." + time.getFullYear() +
|
|
|
|
" " + time.getHours() + ":" + time.getMinutes() +
|
|
|
|
"] {" + address + "} "
|
|
|
|
+ msg;
|
2024-12-16 20:57:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-12-18 16:38:24 +00:00
|
|
|
const db = new sq.Database("data.db");
|
|
|
|
db.run("CREATE TABLE IF NOT EXISTS messages (time INTEGER PRIMARY KEY, address TEXT NOT NULL, msg TEXT NOT NULL) STRICT");
|
|
|
|
|
|
|
|
|
|
|
|
let msize = 0;
|
|
|
|
db.each("SELECT time, address, msg FROM messages", (err: Error, m: {time: number; address: string; msg: string}) => {
|
|
|
|
msize += textEncoder.encode(msgToString(new Date(m.time), m.address, m.msg)).length
|
|
|
|
});
|
|
|
|
|
2024-12-17 18:39:56 +00:00
|
|
|
const textEncoder = new TextEncoder();
|
2024-12-16 20:57:37 +00:00
|
|
|
let srv = net.createServer(function(socket: net.Socket) {
|
2024-12-18 17:13:52 +00:00
|
|
|
let a = socket.address() as net.AddressInfo;
|
|
|
|
if (!a.hasOwnProperty('address')) {
|
2024-12-16 20:57:37 +00:00
|
|
|
console.log("?!?!?!");
|
|
|
|
socket.end();
|
|
|
|
return;
|
|
|
|
}
|
2024-12-18 17:13:52 +00:00
|
|
|
let addr = a.address;
|
2024-12-16 20:57:37 +00:00
|
|
|
socket.on('data', function(data: Buffer | string) {
|
2024-12-18 17:25:11 +00:00
|
|
|
if (data[0] === 'P'.charCodeAt(0)) {
|
|
|
|
if (addr == "127.0.0.1") {
|
2024-12-18 17:32:35 +00:00
|
|
|
let s = String(data);
|
|
|
|
let p = pp.V1ProxyProtocol.parse(s);
|
2024-12-18 17:25:11 +00:00
|
|
|
addr = p.source.ipAddress;
|
2024-12-18 17:28:53 +00:00
|
|
|
if (typeof p.data === 'undefined') {
|
|
|
|
return;
|
|
|
|
} else {
|
2024-12-18 17:35:51 +00:00
|
|
|
data = data.slice(s.search("\r") + 2);
|
2024-12-18 17:25:11 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.log("Address " + addr + " tried to use proxy protocol.");
|
|
|
|
}
|
|
|
|
}
|
2024-12-16 20:57:37 +00:00
|
|
|
switch (data[0]) {
|
|
|
|
case 0x30:
|
2024-12-18 16:38:24 +00:00
|
|
|
const store = db.prepare("INSERT INTO messages VALUES (?,?,?)");
|
|
|
|
let t = new Date;
|
2024-12-18 17:13:52 +00:00
|
|
|
let a = addr;
|
2024-12-20 14:25:07 +00:00
|
|
|
let s = data.slice(1);
|
|
|
|
if (s.slice(-1) != "\n") {
|
|
|
|
s += "\n";
|
|
|
|
}
|
|
|
|
let m = String(s).replace("/\n/g", "\\n").replace("/\x1b/g", "\\x1b");
|
2024-12-18 16:38:24 +00:00
|
|
|
msize += textEncoder.encode(msgToString(t, a, m)).length
|
|
|
|
store.run(Number(t),a,m);
|
|
|
|
store.finalize();
|
2024-12-16 20:57:37 +00:00
|
|
|
socket.end()
|
|
|
|
return;
|
|
|
|
case 0x31:
|
|
|
|
socket.write(String(msize));
|
|
|
|
socket.end();
|
|
|
|
return;
|
|
|
|
case 0x32:
|
|
|
|
let str = "";
|
2024-12-18 16:38:24 +00:00
|
|
|
db.each("SELECT time, address, msg FROM messages", (err: Error, m: {time: number; address: string; msg: string}) => {
|
|
|
|
str += msgToString(new Date(m.time), m.address, m.msg);
|
|
|
|
}, () => {
|
|
|
|
socket.write(str);
|
|
|
|
});
|
2024-12-16 20:57:37 +00:00
|
|
|
return;
|
|
|
|
}
|
2024-12-18 17:13:52 +00:00
|
|
|
console.log(addr + "???" + data[0]);
|
2024-12-16 20:57:37 +00:00
|
|
|
});
|
|
|
|
socket.on('error', function(e: Error) {
|
|
|
|
console.log(e.stack);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
|
|
|
|
console.log("Starting.");
|
|
|
|
srv.listen(port, ip);
|