This commit is contained in:
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user