at master 2.1 kB view raw
1{ pkgs, ... }: 2 3let 4 testString = "NixOS Gemini test successful"; 5in 6{ 7 8 name = "molly-brown"; 9 10 nodes = { 11 12 geminiServer = 13 { config, pkgs, ... }: 14 let 15 inherit (config.networking) hostName; 16 cfg = config.services.molly-brown; 17 in 18 { 19 20 environment.systemPackages = [ 21 (pkgs.writeScriptBin "test-gemini" '' 22 #!${pkgs.python3}/bin/python 23 24 import socket 25 import ssl 26 import tempfile 27 import textwrap 28 import urllib.parse 29 30 url = "gemini://geminiServer/init.gmi" 31 parsed_url = urllib.parse.urlparse(url) 32 33 s = socket.create_connection((parsed_url.netloc, 1965)) 34 context = ssl.SSLContext() 35 context.check_hostname = False 36 context.verify_mode = ssl.CERT_NONE 37 s = context.wrap_socket(s, server_hostname=parsed_url.netloc) 38 s.sendall((url + "\r\n").encode("UTF-8")) 39 fp = s.makefile("rb") 40 print(fp.readline().strip()) 41 print(fp.readline().strip()) 42 print(fp.readline().strip()) 43 '') 44 ]; 45 46 networking.firewall.allowedTCPPorts = [ cfg.settings.Port ]; 47 48 services.molly-brown = { 49 enable = true; 50 docBase = "/tmp/docs"; 51 certPath = "/tmp/cert.pem"; 52 keyPath = "/tmp/key.pem"; 53 }; 54 55 systemd.services.molly-brown.preStart = '' 56 ${pkgs.openssl}/bin/openssl genrsa -out "/tmp/key.pem" 57 ${pkgs.openssl}/bin/openssl req -new \ 58 -subj "/CN=${config.networking.hostName}" \ 59 -key "/tmp/key.pem" -out /tmp/request.pem 60 ${pkgs.openssl}/bin/openssl x509 -req -days 3650 \ 61 -in /tmp/request.pem -signkey "/tmp/key.pem" -out "/tmp/cert.pem" 62 63 mkdir -p "${cfg.settings.DocBase}" 64 echo "${testString}" > "${cfg.settings.DocBase}/test.gmi" 65 ''; 66 }; 67 }; 68 testScript = '' 69 geminiServer.wait_for_unit("molly-brown") 70 geminiServer.wait_for_open_port(1965) 71 geminiServer.succeed("test-gemini") 72 ''; 73 74}