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