ildkule/gatus/minecraft-checker: init
Eval nix flake / evals (push) Successful in 9m22s

This commit is contained in:
2026-07-06 05:32:53 +09:00
parent cb4fbe4361
commit 32fc4805fa
2 changed files with 90 additions and 0 deletions
@@ -3,6 +3,10 @@ let
cfg = config.services.gatus;
in
{
imports = [
./minecraft-checker.nix
];
services.gatus = {
enable = true;
@@ -121,6 +125,12 @@ in
(mkService "Gitea SSH" "ssh://git.pvv.ntnu.no:2222")
(mkService "QoTD" "tcp://bekkalokk.pvv.ntnu.no:17")
(mkService "Minecraft" "http://localhost:25565" // {
conditions = [
"[STATUS] == 200"
"[BODY].ok == true"
];
})
(mkService "Email (SMTP)" "tcp://mail.pvv.ntnu.no:587")
(mkService "Email (POP3)" "tcp://mail.pvv.ntnu.no:995")
(mkService "Email (IMAP)" "tcp://mail.pvv.ntnu.no:993")
@@ -128,6 +138,7 @@ in
method = "GET";
conditions = [
"[STATUS] == 200"
"[BODY].ok == true"
];
})
];
@@ -0,0 +1,79 @@
{ lib, pkgs, ... }:
{
systemd.sockets."gatus-minecraft-checker" = {
wantedBy = [ "sockets.target" ];
listenStreams = [ "25565" ];
socketConfig = {
SocketMode = "0666";
Accept = false;
};
};
systemd.services."gatus-minecraft-checker" = {
serviceConfig = {
ExecStart = lib.getExe (pkgs.writers.writePython3Bin "gatus-minecraft-checker" {
libraries = with pkgs.python3Packages; [
# sdnotify
mcstatus
];
flakeIgnore = [ "E501" "E704" ];
} ''
import socket
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from mcstatus import JavaServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
try:
mcserver = JavaServer.lookup("minecraft.pvv.ntnu.no")
status = mcserver.status()
body = {
"ok": True,
"players": status.players.online,
"version": status.version.name,
"latency": status.latency,
}
data = json.dumps(body).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(data)))
self.end_headers()
self.wfile.write(data)
except Exception as e:
data = json.dumps({"ok": False, "error": str(e)}).encode()
self.send_response(500)
self.end_headers()
self.wfile.write(data)
class NoBindHTTPServer(HTTPServer):
def server_bind(): pass
def server_activate(): pass
def main():
httpd = NoBindHTTPServer(
("", 0),
Handler,
bind_and_activate=False,
)
httpd.socket = socket.fromfd(3, socket.AF_INET, socket.SOCK_STREAM)
httpd.serve_forever()
if __name__ == '__main__':
main()
'');
NoNewPrivileges = true;
PrivateTmp = true;
};
};
}