Add basic support for metamod/sourcemod/sourcepython

This commit is contained in:
2020-10-06 19:34:36 +02:00
parent e2437c6305
commit 1b9883b2ee

138
index.js
View File

@@ -6,7 +6,62 @@ const Gauge = prometheus.Gauge;
const app = express(); const app = express();
function csgoRequest(response, res){ async function rconCommand(client, command) {
try {
return client.command(command);
} catch (err) {
if (err instanceof TimeoutError) {
console.error('request timed out')
} else {
throw err
}
}
}
async function getMetamod(client) {
return rconCommand(client, 'meta');
}
function metamodRequest(response) {
if (response) {
isEnabled = isValidResponse(response);
metamodEnabledGauge.set(isEnabled ? Number(0) : Number(1));
} else {
metamodEnabledGauge.set((Number(-1)))
}
}
async function getSourcemod(client) {
return rconCommand(client, 'sm');
}
function sourcemodRequest(response) {
if (response) {
isEnabled = isValidResponse(response);
sourcemodEnabledGauge.set(isEnabled ? Number(0) : Number(1));
} else {
sourcemodEnabledGauge.set((Number(-1)))
}
}
async function getSourcepython(client) {
return rconCommand(client, 'sp');
}
function sourcepythonRequest(response) {
if (response) {
isEnabled = isValidResponse(response);
sourcepythonEnabledGauge.set(isEnabled ? Number(0) : Number(1));
} else {
sourcepythonEnabledGauge.set(Number(-1))
}
}
function isValidResponse(response) {
return !response.includes('Unknown');
}
function csgoRequest(response){
status.set((Number(1))); status.set((Number(1)));
cpu.set((Number(response[0]))); cpu.set((Number(response[0])));
netin.set((Number(response[1]))); netin.set((Number(response[1])));
@@ -18,10 +73,9 @@ function csgoRequest(response, res){
svms.set((Number(response[7]))); svms.set((Number(response[7])));
varms.set((Number(response[8]))); varms.set((Number(response[8])));
tick.set((Number(response[9]))); tick.set((Number(response[9])));
res.end(csgoRegistry.metrics());
} }
function gmodRequest(response, res){ function gmodRequest(response){
status.set((Number(1))); status.set((Number(1)));
cpu.set((Number(response[0]))); cpu.set((Number(response[0])));
netin.set((Number(response[1]))); netin.set((Number(response[1])));
@@ -30,32 +84,19 @@ function gmodRequest(response, res){
maps.set((Number(response[4]))); maps.set((Number(response[4])));
fps.set((Number(response[5]))); fps.set((Number(response[5])));
players.set((Number(response[6]))); players.set((Number(response[6])));
res.end(gmodRegistry.metrics());
} }
async function getStats(ip, port, password, game) { async function getStats(client, game) {
let result; const stats = await rconCommand(client, 'stats');
try {
const client = await connect(ip, port, password, 5000);
const stats = await client.command('stats');
await client.disconnect();
result = stats;
} catch (err) {
if (err instanceof TimeoutError) {
console.error('request timed out')
} else {
throw err
}
}
if (game === "csgo"){ if (game === "csgo"){
var resultArray = result.split(/\r?\n/); var resultArray = stats.split(/\r?\n/);
resultArray.pop(); resultArray.pop();
resultArray.shift(); resultArray.shift();
var finalArray = resultArray[0].split(/\s+/); var finalArray = resultArray[0].split(/\s+/);
finalArray.shift(); finalArray.shift();
return finalArray; return finalArray;
} else if (game === "gmod") { } else if (game === "gmod") {
var resultArray = result.split(/\r?\n/); var resultArray = stats.split(/\r?\n/);
resultArray.shift(); resultArray.shift();
var finalArray = resultArray[0].split(/\s+/); var finalArray = resultArray[0].split(/\s+/);
return finalArray; return finalArray;
@@ -79,31 +120,63 @@ const svms = new Gauge({name: "srcds_svms", help: "ms per sim frame", registers:
const varms = new Gauge({name: "srcds_varms", help: "ms variance", 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 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]});
const metamodEnabledGauge = new Gauge({name: "srcds_metamod_enabled", help: "Is metamod enabled", registers: [csgoRegistry]});
const sourcepythonEnabledGauge = new Gauge({name: "srcds_sourcepython_enabled", help: "Is sourcepython enabled", registers: [csgoRegistry]});
app.get('/', (req, res) => { app.get('/', (req, res) => {
res.send('use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game> to get data'); res.send('use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game>&sm=&ltboolean&gt&meta=&ltboolean&gtsp=&ltboolean&gt to get data');
}); });
app.get('/metrics', (req, res) => { app.get('/metrics', async (req, res) => {
var ip = req.query.ip; var ip = req.query.ip;
var port = req.query.port; var port = req.query.port;
var password = req.query.password; var password = req.query.password;
var game = req.query.game; var game = req.query.game;
let metamod = req.query.metamod || false;
let sourcemod = req.query.sourcemod || false;
let sourcepython = req.query.sourcepython || false;
if (ip == null || port == null || password == null || game == null){ if (ip == null || port == null || password == null || game == null){
res.send("Missing parameter, either IP, port, RCON password or game<br />use /metrics?ip=&lt;srcds ip&gt;&port=&lt;srcds port&gt;&password=&lt;rcon password&gt;&game=&lt;game&gt; to get data"); res.send("Missing parameter, either IP, port, RCON password or game<br />use /metrics?ip=&lt;srcds ip&gt;&port=&lt;srcds port&gt;&password=&lt;rcon password&gt;&game=&lt;game&gt;&sm=<boolean>&meta=<boolean>sp=<boolean> to get data");
} else { return;
}
if (game === "csgo" || game === "gmod"){ if (game === "csgo" || game === "gmod"){
getStats(ip, port, password, game, res).then(result => { const client = await connect(ip, port, password, 5000);
const statsResponse = await getStats(client, game)
try {
if (game === "csgo"){ if (game === "csgo"){
const defaultLabels = { server: ip+':'+port, game: game }; const defaultLabels = { server: ip+':'+port, game: game};
csgoRegistry.setDefaultLabels(defaultLabels); csgoRegistry.setDefaultLabels(defaultLabels);
csgoRequest(result, res);
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"){ } else if (game === "gmod"){
const defaultLabels = { server: ip+':'+port, game: game }; const defaultLabels = { server: ip+':'+port, game: game };
gmodRegistry.setDefaultLabels(defaultLabels); gmodRegistry.setDefaultLabels(defaultLabels);
gmodRequest(result, res); gmodRequest(result, res);
res.end(gmodRegistry.metrics());
} }
}).catch(e => { } catch(e) {
status.set((Number(0))); status.set((Number(0)));
cpu.set((Number(0))); cpu.set((Number(0)));
netin.set((Number(0))); netin.set((Number(0)));
@@ -115,17 +188,20 @@ app.get('/metrics', (req, res) => {
svms.set((Number(0))); svms.set((Number(0)));
varms.set((Number(0))); varms.set((Number(0)));
tick.set((Number(0))); tick.set((Number(0)));
metamodEnabledGauge.set((Number(-1)));
sourcemodEnabledGauge.set((Number(-1)));
sourcepythonEnabledGauge.set((Number(-1)));
if (game === "csgo"){ if (game === "csgo"){
res.end(csgoRegistry.metrics()); res.end(csgoRegistry.metrics());
} else if (game === "gmod"){ } else if (game === "gmod"){
res.end(gmodRegistry.metrics()); res.end(gmodRegistry.metrics());
} }
}) }
await client.disconnect();
} else { } else {
res.send("Incorrect game value, currently supported games are : csgo, gmod"); res.send("Incorrect game value, currently supported games are : csgo, gmod");
} }
}
}); });
app.listen(9591); app.listen(9591);