From 14fdcc39c2ac42e0ddfcab09bbf92c9f06ac2776 Mon Sep 17 00:00:00 2001 From: Sithranduil Date: Tue, 6 Oct 2020 22:09:11 +0200 Subject: [PATCH] Ajout du support de cstrike --- index.js | 219 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 114 insertions(+), 105 deletions(-) diff --git a/index.js b/index.js index 76b83b6..78dd53f 100644 --- a/index.js +++ b/index.js @@ -62,68 +62,73 @@ function isValidResponse(response) { return !response.includes('Unknown'); } -function csgoRequest(response) { - status.set((Number(1))); - cpu.set((Number(response[0]))); - netin.set((Number(response[1]))); - netout.set((Number(response[2]))); - uptime.set((Number(response[3]))); - maps.set((Number(response[4]))); - fps.set((Number(response[5]))); - players.set((Number(response[6]))); - svms.set((Number(response[7]))); - varms.set((Number(response[8]))); - tick.set((Number(response[9]))); -} - -function gmodRequest(response) { - status.set((Number(1))); - cpu.set((Number(response[0]))); - netin.set((Number(response[1]))); - netout.set((Number(response[2]))); - uptime.set((Number(response[3]))); - maps.set((Number(response[4]))); - fps.set((Number(response[5]))); - players.set((Number(response[6]))); +function gameRequest(response, game) { + if (game === 'csgo') { + status.set((Number(1))); + cpu.set((Number(response[0]))); + netin.set((Number(response[1]))); + netout.set((Number(response[2]))); + uptime.set((Number(response[3]))); + maps.set((Number(response[4]))); + fps.set((Number(response[5]))); + players.set((Number(response[6]))); + svms.set((Number(response[7]))); + varms.set((Number(response[8]))); + tick.set((Number(response[9]))); + } else { + status.set((Number(1))); + cpu.set((Number(response[0]))); + netin.set((Number(response[1]))); + netout.set((Number(response[2]))); + uptime.set((Number(response[3]))); + maps.set((Number(response[4]))); + fps.set((Number(response[5]))); + players.set((Number(response[6]))); + } } async function getStats(client, game) { const stats = await rconCommand(client, 'stats'); - if (game === 'csgo') { - const resultArray = stats.split(/\r?\n/); - resultArray.pop(); - resultArray.shift(); - const finalArray = resultArray[0].split(/\s+/); - finalArray.shift(); - return finalArray; - } if (game === 'gmod') { - const resultArray = stats.split(/\r?\n/); - resultArray.shift(); - const finalArray = resultArray[0].split(/\s+/); - return finalArray; + let statusLine = null; + if (stats) { + statusLine = stats.split(/\r?\n/); + } else { + return null; } - return null; + if (game === 'csgo') { + statusLine = stats.split(/\r?\n/); + statusLine.pop(); + } + statusLine.shift(); + statusLine = statusLine[0].split(/\s+/); + return statusLine; } const csgoRegistry = new prometheus.Registry(); const gmodRegistry = new prometheus.Registry(); +const cstrikeRegistry = new prometheus.Registry(); // Global metrics, used accross all Source gameservers -const status = new Gauge({ name: 'srcds_status', help: "The server's status, 0 = offline/bad password, 1 = online", registers: [csgoRegistry, gmodRegistry] }); -const cpu = new Gauge({ name: 'srcds_cpu', help: 'Probably the priority level of the srcds executable from an operating system point of view (0 - No priority, 10 - biggest priority)', registers: [csgoRegistry, gmodRegistry] }); -const netin = new Gauge({ name: 'srcds_netin', help: 'Incoming bandwidth, in kbps, received by the server', registers: [csgoRegistry, gmodRegistry] }); -const netout = new Gauge({ name: 'srcds_netout', help: 'Incoming bandwidth, in kbps, sent by the server', registers: [csgoRegistry, gmodRegistry] }); -const uptime = new Gauge({ name: 'srcds_uptime', help: "The server's uptime, in minutes", registers: [csgoRegistry, gmodRegistry] }); -const maps = new Gauge({ name: 'srcds_maps', help: "The number of maps played on that server since it's start", registers: [csgoRegistry, gmodRegistry] }); -const fps = new Gauge({ name: 'srcds_fps', help: "The server's tick (10 fps on idle, 64 fps for 64 ticks server, 128 fps for 128 ticks..)", registers: [csgoRegistry, gmodRegistry] }); -const players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', registers: [csgoRegistry, gmodRegistry] }); +const status = new Gauge({ name: 'srcds_status', help: "The server's status, 0 = offline/bad password, 1 = online", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const cpu = new Gauge({ name: 'srcds_cpu', help: 'Probably the priority level of the srcds executable from an operating system point of view (0 - No priority, 10 - biggest priority)', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const netin = new Gauge({ name: 'srcds_netin', help: 'Incoming bandwidth, in kbps, received by the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const netout = new Gauge({ name: 'srcds_netout', help: 'Incoming bandwidth, in kbps, sent by the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const uptime = new Gauge({ name: 'srcds_uptime', help: "The server's uptime, in minutes", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const maps = new Gauge({ name: 'srcds_maps', help: "The number of maps played on that server since it's start", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const fps = new Gauge({ name: 'srcds_fps', help: "The server's tick (10 fps on idle, 64 fps for 64 ticks server, 128 fps for 128 ticks..)", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); +const players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] }); // CSGO metrics const svms = new Gauge({ name: 'srcds_svms', help: 'ms per sim frame', registers: [csgoRegistry] }); const varms = new Gauge({ name: 'srcds_varms', help: 'ms variance', registers: [csgoRegistry] }); const tick = new Gauge({ name: 'srcds_tick', help: 'The time in MS per tick', registers: [csgoRegistry] }); -const sourcemodEnabledGauge = new Gauge({ name: 'srcds_sourcemod_enabled', help: 'Is sourcemod enabled', registers: [csgoRegistry] }); +// Metamod metrics const metamodEnabledGauge = new Gauge({ name: 'srcds_metamod_enabled', help: 'Is metamod enabled', registers: [csgoRegistry] }); + +// Sourcemod metrics +const sourcemodEnabledGauge = new Gauge({ name: 'srcds_sourcemod_enabled', help: 'Is sourcemod enabled', registers: [csgoRegistry] }); + +// SourcePython metrics const sourcepythonEnabledGauge = new Gauge({ name: 'srcds_sourcepython_enabled', help: 'Is sourcepython enabled', registers: [csgoRegistry] }); app.get('/', (req, res) => { @@ -138,72 +143,76 @@ app.get('/metrics', async (req, res) => { const metamod = req.query.metamod || false; const sourcemod = req.query.sourcemod || false; const sourcepython = req.query.sourcepython || false; + if (ip == null || port == null || password == null || game == null) { res.send('Missing parameter, either IP, port, RCON password or game
use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game>&sm=&meta=sp= to get data'); return; } - if (game === 'csgo' || game === 'gmod') { - const client = await connect(ip, port, password, 5000); - const statsResponse = await getStats(client, game); - try { - if (game === 'csgo') { - const defaultLabels = { server: `${ip}:${port}`, game }; - csgoRegistry.setDefaultLabels(defaultLabels); - csgoRequest(statsResponse); - if (metamod) { - const metamodResponse = await getMetamod(client); - metamodRequest(metamodResponse); - } else { - metamodRequest(null); - } - - if (sourcemod) { - const sourcemodResponse = await getSourcemod(client); - sourcemodRequest(sourcemodResponse); - } else { - sourcemodRequest(null); - } - if (sourcepython) { - const sourcepythonResponse = await getSourcepython(client); - sourcepythonRequest(sourcepythonResponse); - } else { - sourcepythonRequest(null); - } - - res.end(csgoRegistry.metrics()); - } else if (game === 'gmod') { - const defaultLabels = { server: `${ip}:${port}`, game }; - gmodRegistry.setDefaultLabels(defaultLabels); - gmodRequest(statsResponse); - res.end(gmodRegistry.metrics()); - } - } catch (e) { - status.set((Number(0))); - cpu.set((Number(0))); - netin.set((Number(0))); - netout.set((Number(0))); - uptime.set((Number(0))); - maps.set((Number(0))); - fps.set((Number(0))); - players.set((Number(0))); - svms.set((Number(0))); - varms.set((Number(0))); - tick.set((Number(0))); - metamodEnabledGauge.set((Number(-1))); - sourcemodEnabledGauge.set((Number(-1))); - sourcepythonEnabledGauge.set((Number(-1))); - - if (game === 'csgo') { - res.end(csgoRegistry.metrics()); - } else if (game === 'gmod') { - res.end(gmodRegistry.metrics()); - } - } - await client.disconnect(); - } else { - res.send('Incorrect game value, currently supported games are : csgo, gmod'); + if (game !== 'csgo' && game !== 'gmod' && game !== 'cstrike') { + res.send('Incorrect game value, currently supported games are : csgo, gmod, cstrike'); + return; } + + const client = await connect(ip, port, password, 5000); + const statsResponse = await getStats(client, game); + try { + if (metamod) { + const metamodResponse = await getMetamod(client); + metamodRequest(metamodResponse); + } else { + metamodRequest(null); + } + if (sourcemod) { + const sourcemodResponse = await getSourcemod(client); + sourcemodRequest(sourcemodResponse); + } else { + sourcemodRequest(null); + } + if (sourcepython) { + const sourcepythonResponse = await getSourcepython(client); + sourcepythonRequest(sourcepythonResponse); + } else { + sourcepythonRequest(null); + } + + const defaultLabels = { server: `${ip}:${port}`, game }; + gameRequest(statsResponse, game); + if (game === 'csgo') { + csgoRegistry.setDefaultLabels(defaultLabels); + res.end(csgoRegistry.metrics()); + } else if (game === 'cstrike') { + cstrikeRegistry.setDefaultLabels(defaultLabels); + res.end(cstrikeRegistry.metrics()); + } else if (game === 'gmod') { + gmodRegistry.setDefaultLabels(defaultLabels); + res.end(gmodRegistry.metrics()); + } + } catch (e) { + status.set((Number(0))); + cpu.set((Number(0))); + netin.set((Number(0))); + netout.set((Number(0))); + uptime.set((Number(0))); + maps.set((Number(0))); + fps.set((Number(0))); + players.set((Number(0))); + svms.set((Number(0))); + varms.set((Number(0))); + tick.set((Number(0))); + metamodEnabledGauge.set((Number(-1))); + sourcemodEnabledGauge.set((Number(-1))); + sourcepythonEnabledGauge.set((Number(-1))); + + if (game === 'csgo') { + res.end(csgoRegistry.metrics()); + } else if (game === 'gmod') { + res.end(gmodRegistry.metrics()); + } else if (game === 'cstrike') { + res.end(cstrikeRegistry.metrics()); + } + } + await client.disconnect(); }); app.listen(9591);