improve audit

This commit is contained in:
marlon-erler
2024-07-07 18:05:31 +02:00
parent bd49f31d75
commit 4962919de7
2 changed files with 36 additions and 24 deletions
+18 -8
View File
@@ -4,7 +4,7 @@ import {
addConnection, addConnection,
connectServers, connectServers,
forgetConnection, forgetConnection,
getStats, getWebSocketStats,
processMessage, processMessage,
} from "./websocket-handler"; } from "./websocket-handler";
import { writeInfo, writeStat, writeSuccess } from "./utility"; import { writeInfo, writeStat, writeSuccess } from "./utility";
@@ -41,15 +41,15 @@ async function main() {
case "/": case "/":
return createFileResponse(defaultPage); return createFileResponse(defaultPage);
case "/stats": case "/stats":
return new Response(JSON.stringify(getStats())); return new Response(JSON.stringify(getAllStats()));
default: default:
return createFileResponse(requestPath); return createFileResponse(requestPath);
} }
}, },
websocket: { websocket: {
open() { open(ws) {
addConnection(); addConnection(ws);
}, },
message(ws, message) { message(ws, message) {
processMessage(ws, message.toString(), config); processMessage(ws, message.toString(), config);
@@ -68,6 +68,18 @@ async function main() {
// OTHER SERVERS // OTHER SERVERS
connectServers(config); connectServers(config);
// AUDIT
function getServerStats(): [string, string][] {
return [
["server url", server.url.toString()],
["server ip address", IP.address()],
];
}
function getAllStats(): [string, string | number][] {
return [...getServerStats(), ...getWebSocketStats()];
}
// CLI // CLI
writeSuccess(`###\nstarted up ${new Date().toLocaleString()}`); writeSuccess(`###\nstarted up ${new Date().toLocaleString()}`);
console.log("relevant output available in the 'logs' file"); console.log("relevant output available in the 'logs' file");
@@ -80,11 +92,9 @@ async function main() {
console.log(new Date().toLocaleString()); console.log(new Date().toLocaleString());
console.log(); console.log();
writeInfo("server url", Colors.bold.green(server.url.toString())); getServerStats().forEach((entry) => writeInfo(...entry));
writeInfo("server ip address", Colors.bold.green(IP.address()));
console.log(); console.log();
getWebSocketStats().forEach((entry) => writeStat(...entry));
getStats().forEach((entry) => writeStat(...entry));
} }
setInterval(updateCLI, 5000); setInterval(updateCLI, 5000);
+18 -16
View File
@@ -30,13 +30,17 @@ export interface WebSocketMessage {
// TRACKING // TRACKING
const knownMessageIds = new Set<string>(); const knownMessageIds = new Set<string>();
export let connectedClientCount = 0;
export let disconnectedServerCount = 0;
export const subscriptions = new SubscriptionMap(); export const subscriptions = new SubscriptionMap();
export const connectedServers = new Set<WebSocket>(); export const clientsConnected = new Set<WS>();
export const serversConnectedAsClient = new Set<WS>();
export const serversConnected = new Set<WebSocket>();
export function addConnection() { export function getServerCount() {
connectedClientCount++; return serversConnected.size + serversConnectedAsClient.size;
}
export function addConnection(ws: WS) {
clientsConnected.add(ws);
} }
export function trackSubscription(ws: WS, channel: string): void { export function trackSubscription(ws: WS, channel: string): void {
@@ -50,7 +54,7 @@ export function removeSubscription(ws: WS, channel: string): void {
} }
export function forgetConnection(ws: WS): void { export function forgetConnection(ws: WS): void {
connectedClientCount--; clientsConnected.delete(ws);
const channels = subscriptions.getChannelList(ws); const channels = subscriptions.getChannelList(ws);
channels?.forEach((channel) => { channels?.forEach((channel) => {
subscriptions.delete(ws, channel); subscriptions.delete(ws, channel);
@@ -60,7 +64,7 @@ export function forgetConnection(ws: WS): void {
// OTHER SERVERS // OTHER SERVERS
export function connectServers(config: typeof defaultConfig): void { export function connectServers(config: typeof defaultConfig): void {
config.connectedServers.forEach((serverAddress) => { config.connectedServers.forEach((serverAddress) => {
const ws = connectServer(serverAddress, config); connectServer(serverAddress, config);
}); });
} }
@@ -70,7 +74,7 @@ export function connectServer(
): void { ): void {
try { try {
const ws = new WebSocket(address); const ws = new WebSocket(address);
connectedServers.add(ws); serversConnected.add(ws);
ws.addEventListener("open", () => { ws.addEventListener("open", () => {
writeSuccess(`connected to server at "${address}".`); writeSuccess(`connected to server at "${address}".`);
@@ -84,12 +88,10 @@ export function connectServer(
}); });
ws.addEventListener("close", () => { ws.addEventListener("close", () => {
connectedServers.delete(ws); serversConnected.delete(ws);
disconnectedServerCount++;
writeError(`server at "${address}" disconnected`); writeError(`server at "${address}" disconnected`);
}); });
} catch (error) { } catch (error) {
disconnectedServerCount++;
writeError(`failed to connect to server at "${address}": ${error}`); writeError(`failed to connect to server at "${address}": ${error}`);
} }
} }
@@ -109,13 +111,11 @@ export function subscribeChannel(server: WS, channel: string): void {
} }
// AUDIT // AUDIT
export function getStats(): [string, number][] { export function getWebSocketStats(): [string, number][] {
return [ return [
["channels", subscriptions.clientsPerChannel.size], ["channels", subscriptions.clientsPerChannel.size],
["clients connected", connectedClientCount], ["clients connected", clientsConnected.size],
["clients subscribing", subscriptions.channelsPerClient.size], ["servers connected", getServerCount()],
["servers connected", connectedServers.size],
["servers disconnected", disconnectedServerCount],
]; ];
} }
@@ -147,6 +147,8 @@ export function processMessage(
sendMessage(messageChannel, messageObject.messageBody, messageObject.uuid!); sendMessage(messageChannel, messageObject.messageBody, messageObject.uuid!);
}); });
if (messageObject.requestingServerConnection == true) { if (messageObject.requestingServerConnection == true) {
clientsConnected.delete(ws);
serversConnectedAsClient.add(ws);
subscribeChannels(ws, config); subscribeChannels(ws, config);
} }
} }