From 32fc4805fa9d21d5ea0a97aa07d2a8e88373d34d Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 6 Jul 2026 05:32:53 +0900 Subject: [PATCH] ildkule/gatus/minecraft-checker: init --- .../services/monitoring/gatus/default.nix | 11 +++ .../monitoring/gatus/minecraft-checker.nix | 79 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 hosts/ildkule/services/monitoring/gatus/minecraft-checker.nix diff --git a/hosts/ildkule/services/monitoring/gatus/default.nix b/hosts/ildkule/services/monitoring/gatus/default.nix index 1375c1d..05feabe 100644 --- a/hosts/ildkule/services/monitoring/gatus/default.nix +++ b/hosts/ildkule/services/monitoring/gatus/default.nix @@ -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" ]; }) ]; diff --git a/hosts/ildkule/services/monitoring/gatus/minecraft-checker.nix b/hosts/ildkule/services/monitoring/gatus/minecraft-checker.nix new file mode 100644 index 0000000..a5248e8 --- /dev/null +++ b/hosts/ildkule/services/monitoring/gatus/minecraft-checker.nix @@ -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; + }; + }; +}