mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-12-30 07:59:52 -08:00
Merge pull request #2566 from WhyKickAmooCow/master
Add GameDig monitor
This commit is contained in:
commit
3eab6e8238
5
db/patch-add-gamedig-monitor.sql
Normal file
5
db/patch-add-gamedig-monitor.sql
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD game VARCHAR(255);
|
||||||
|
COMMIT
|
756
package-lock.json
generated
756
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -88,6 +88,7 @@
|
||||||
"express-basic-auth": "~1.2.1",
|
"express-basic-auth": "~1.2.1",
|
||||||
"express-static-gzip": "~2.1.7",
|
"express-static-gzip": "~2.1.7",
|
||||||
"form-data": "~4.0.0",
|
"form-data": "~4.0.0",
|
||||||
|
"gamedig": "^4.0.5",
|
||||||
"http-graceful-shutdown": "~3.1.7",
|
"http-graceful-shutdown": "~3.1.7",
|
||||||
"http-proxy-agent": "~5.0.0",
|
"http-proxy-agent": "~5.0.0",
|
||||||
"https-proxy-agent": "~5.0.1",
|
"https-proxy-agent": "~5.0.1",
|
||||||
|
|
|
@ -66,6 +66,7 @@ class Database {
|
||||||
"patch-add-radius-monitor.sql": true,
|
"patch-add-radius-monitor.sql": true,
|
||||||
"patch-monitor-add-resend-interval.sql": true,
|
"patch-monitor-add-resend-interval.sql": true,
|
||||||
"patch-maintenance-table2.sql": true,
|
"patch-maintenance-table2.sql": true,
|
||||||
|
"patch-add-gamedig-monitor.sql": true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,6 +18,7 @@ const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
|
||||||
const { DockerHost } = require("../docker");
|
const { DockerHost } = require("../docker");
|
||||||
const Maintenance = require("./maintenance");
|
const Maintenance = require("./maintenance");
|
||||||
const { UptimeCacheList } = require("../uptime-cache-list");
|
const { UptimeCacheList } = require("../uptime-cache-list");
|
||||||
|
const Gamedig = require("gamedig");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* status:
|
* status:
|
||||||
|
@ -108,6 +109,7 @@ class Monitor extends BeanModel {
|
||||||
grpcEnableTls: this.getGrpcEnableTls(),
|
grpcEnableTls: this.getGrpcEnableTls(),
|
||||||
radiusCalledStationId: this.radiusCalledStationId,
|
radiusCalledStationId: this.radiusCalledStationId,
|
||||||
radiusCallingStationId: this.radiusCallingStationId,
|
radiusCallingStationId: this.radiusCallingStationId,
|
||||||
|
game: this.game,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (includeSensitiveData) {
|
if (includeSensitiveData) {
|
||||||
|
@ -488,6 +490,20 @@ class Monitor extends BeanModel {
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Server not found on Steam");
|
throw new Error("Server not found on Steam");
|
||||||
}
|
}
|
||||||
|
} else if (this.type === "gamedig") {
|
||||||
|
try {
|
||||||
|
const state = await Gamedig.query({
|
||||||
|
type: this.game,
|
||||||
|
host: this.hostname,
|
||||||
|
port: this.port
|
||||||
|
});
|
||||||
|
|
||||||
|
bean.msg = state.name;
|
||||||
|
bean.status = UP;
|
||||||
|
bean.ping = state.ping;
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(e.message);
|
||||||
|
}
|
||||||
} else if (this.type === "docker") {
|
} else if (this.type === "docker") {
|
||||||
log.debug(`[${this.name}] Prepare Options for Axios`);
|
log.debug(`[${this.name}] Prepare Options for Axios`);
|
||||||
|
|
||||||
|
|
|
@ -689,6 +689,7 @@ let needSetup = false;
|
||||||
bean.retryInterval = monitor.retryInterval;
|
bean.retryInterval = monitor.retryInterval;
|
||||||
bean.resendInterval = monitor.resendInterval;
|
bean.resendInterval = monitor.resendInterval;
|
||||||
bean.hostname = monitor.hostname;
|
bean.hostname = monitor.hostname;
|
||||||
|
bean.game = monitor.game;
|
||||||
bean.maxretries = monitor.maxretries;
|
bean.maxretries = monitor.maxretries;
|
||||||
bean.port = parseInt(monitor.port);
|
bean.port = parseInt(monitor.port);
|
||||||
bean.keyword = monitor.keyword;
|
bean.keyword = monitor.keyword;
|
||||||
|
|
|
@ -2,6 +2,30 @@ const { log } = require("../../src/util");
|
||||||
const { Settings } = require("../settings");
|
const { Settings } = require("../settings");
|
||||||
const { sendInfo } = require("../client");
|
const { sendInfo } = require("../client");
|
||||||
const { checkLogin } = require("../util-server");
|
const { checkLogin } = require("../util-server");
|
||||||
|
const GameResolver = require("gamedig/lib/GameResolver");
|
||||||
|
|
||||||
|
let gameResolver = new GameResolver();
|
||||||
|
let gameList = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a game list via GameDig
|
||||||
|
* @returns {any[]}
|
||||||
|
*/
|
||||||
|
function getGameList() {
|
||||||
|
if (!gameList) {
|
||||||
|
gameList = gameResolver._readGames().games.sort((a, b) => {
|
||||||
|
if ( a.pretty < b.pretty ) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if ( a.pretty > b.pretty ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return gameList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports.generalSocketHandler = (socket, server) => {
|
module.exports.generalSocketHandler = (socket, server) => {
|
||||||
|
|
||||||
|
@ -17,4 +41,11 @@ module.exports.generalSocketHandler = (socket, server) => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
socket.on("getGameList", async (callback) => {
|
||||||
|
callback({
|
||||||
|
ok: true,
|
||||||
|
gameList: getGameList(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -681,5 +681,6 @@
|
||||||
"dataRetentionTimeError": "Retention period must be 0 or greater",
|
"dataRetentionTimeError": "Retention period must be 0 or greater",
|
||||||
"infiniteRetention": "Set to 0 for infinite retention.",
|
"infiniteRetention": "Set to 0 for infinite retention.",
|
||||||
"confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
|
"confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
|
||||||
"Help": "Help"
|
"Help": "Help",
|
||||||
|
"Game": "Game"
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,9 @@
|
||||||
<option value="steam">
|
<option value="steam">
|
||||||
{{ $t("Steam Game Server") }}
|
{{ $t("Steam Game Server") }}
|
||||||
</option>
|
</option>
|
||||||
|
<option value="gamedig">
|
||||||
|
GameDig
|
||||||
|
</option>
|
||||||
<option value="mqtt">
|
<option value="mqtt">
|
||||||
MQTT
|
MQTT
|
||||||
</option>
|
</option>
|
||||||
|
@ -107,16 +110,27 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Game -->
|
||||||
|
<!-- GameDig only -->
|
||||||
|
<div v-if="monitor.type === 'gamedig'" class="my-3">
|
||||||
|
<label for="game" class="form-label"> {{ $t("Game") }} </label>
|
||||||
|
<select id="game" v-model="monitor.game" class="form-select" required>
|
||||||
|
<option v-for="game in gameList" :key="game.keys[0]" :value="game.keys[0]">
|
||||||
|
{{ game.pretty }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Hostname -->
|
<!-- Hostname -->
|
||||||
<!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
|
<!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
|
||||||
<div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
|
<div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'gamedig' ||monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
|
||||||
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
|
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
|
||||||
<input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${monitor.type === 'mqtt' ? mqttIpOrHostnameRegexPattern : ipOrHostnameRegexPattern}`" required>
|
<input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${monitor.type === 'mqtt' ? mqttIpOrHostnameRegexPattern : ipOrHostnameRegexPattern}`" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Port -->
|
<!-- Port -->
|
||||||
<!-- For TCP Port / Steam / MQTT / Radius Type -->
|
<!-- For TCP Port / Steam / MQTT / Radius Type -->
|
||||||
<div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
|
<div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'gamedig' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
|
||||||
<label for="port" class="form-label">{{ $t("Port") }}</label>
|
<label for="port" class="form-label">{{ $t("Port") }}</label>
|
||||||
<input id="port" v-model="monitor.port" type="number" class="form-control" required min="0" max="65535" step="1">
|
<input id="port" v-model="monitor.port" type="number" class="form-control" required min="0" max="65535" step="1">
|
||||||
</div>
|
</div>
|
||||||
|
@ -626,7 +640,8 @@ export default {
|
||||||
acceptedStatusCodeOptions: [],
|
acceptedStatusCodeOptions: [],
|
||||||
dnsresolvetypeOptions: [],
|
dnsresolvetypeOptions: [],
|
||||||
ipOrHostnameRegexPattern: hostNameRegexPattern(),
|
ipOrHostnameRegexPattern: hostNameRegexPattern(),
|
||||||
mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true)
|
mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true),
|
||||||
|
gameList: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -703,7 +718,18 @@ message HealthCheckResponse {
|
||||||
{
|
{
|
||||||
"HeaderName": "HeaderValue"
|
"HeaderName": "HeaderValue"
|
||||||
}` ]);
|
}` ]);
|
||||||
}
|
},
|
||||||
|
|
||||||
|
currentGameObject() {
|
||||||
|
if (this.gameList) {
|
||||||
|
for (let game of this.gameList) {
|
||||||
|
if (game.keys[0] === this.monitor.game) {
|
||||||
|
return game;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -747,6 +773,24 @@ message HealthCheckResponse {
|
||||||
this.monitor.port = undefined;
|
this.monitor.port = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the game list from server
|
||||||
|
if (this.monitor.type === "gamedig") {
|
||||||
|
this.$root.getSocket().emit("getGameList", (res) => {
|
||||||
|
if (res.ok) {
|
||||||
|
this.gameList = res.gameList;
|
||||||
|
} else {
|
||||||
|
toast.error(res.msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
currentGameObject(newGameObject, previousGameObject) {
|
||||||
|
if (!this.monitor.port || (previousGameObject && previousGameObject.options.port === this.monitor.port)) {
|
||||||
|
this.monitor.port = newGameObject.options.port;
|
||||||
|
}
|
||||||
|
this.monitor.game = newGameObject.keys[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -937,7 +981,7 @@ message HealthCheckResponse {
|
||||||
// Enable it if the Docker Host is added in EditMonitor.vue
|
// Enable it if the Docker Host is added in EditMonitor.vue
|
||||||
addedDockerHost(id) {
|
addedDockerHost(id) {
|
||||||
this.monitor.docker_host = id;
|
this.monitor.docker_host = id;
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue