From b0e3d90c20ad1744260514466a64412a00ed4394 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 7 Jul 2026 16:26:26 +0900 Subject: [PATCH] ildkule/gatus/minecraft-checker: init --- .../services/monitoring/gatus/default.nix | 10 +++ .../monitoring/gatus/minecraft-checker.nix | 78 +++++++++++++++++++ 2 files changed, 88 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 29703b2..3704065 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; @@ -123,6 +127,12 @@ in (mkService "Gitea SSH" "ssh://git.pvv.ntnu.no:2222") (mkService "QoTD" "tcp://bekkalokk.pvv.ntnu.no:17") + (mkService "Minecraft" "http://localhost:1337" // { + conditions = [ + "[STATUS] == 200" + "[BODY].ok == true" + ]; + }) (mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587") (mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995") (mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993") 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..be278be --- /dev/null +++ b/hosts/ildkule/services/monitoring/gatus/minecraft-checker.nix @@ -0,0 +1,78 @@ +{ lib, pkgs, ... }: +{ + systemd.sockets."gatus-minecraft-checker" = { + wantedBy = [ "sockets.target" ]; + listenStreams = [ "127.0.0.1:1337" ]; + socketConfig = { + 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; + }; + }; +}