at master 3.7 kB view raw
1{ ... }: 2 3let 4 cert = 5 pkgs: 6 pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } '' 7 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \ 8 -subj '/C=GB/CN=example.com/CN=uploads.example.com/CN=conference.example.com' -addext "subjectAltName = DNS:example.com,DNS:uploads.example.com,DNS:conference.example.com" 9 mkdir -p $out 10 cp key.pem cert.pem $out 11 ''; 12 13 # Creates and set password for the 2 xmpp test users. 14 # 15 # Doing that in a bash script instead of doing that in the test 16 # script allow us to easily provision the users when running that 17 # test interactively. 18 createUsers = 19 pkgs: 20 pkgs.writeShellScriptBin "create-prosody-users" '' 21 set -e 22 prosodyctl register cthon98 example.com nothunter2 23 prosodyctl register azurediamond example.com hunter2 24 ''; 25 # Deletes the test users. 26 delUsers = 27 pkgs: 28 pkgs.writeShellScriptBin "delete-prosody-users" '' 29 set -e 30 prosodyctl deluser cthon98@example.com 31 prosodyctl deluser azurediamond@example.com 32 ''; 33in 34{ 35 name = "prosody"; 36 nodes = { 37 client-a = 38 { nodes, pkgs, ... }: 39 { 40 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; 41 networking.extraHosts = '' 42 ${nodes.server.networking.primaryIPAddress} example.com 43 ''; 44 45 imports = [ ./go-sendxmpp-listen.nix ]; 46 }; 47 48 client-b = 49 { 50 nodes, 51 pkgs, 52 ... 53 }: 54 { 55 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; 56 networking.extraHosts = '' 57 ${nodes.server.networking.primaryIPAddress} example.com 58 ${nodes.server.networking.primaryIPAddress} conference.example.com 59 ${nodes.server.networking.primaryIPAddress} uploads.example.com 60 ''; 61 environment.systemPackages = [ 62 (pkgs.callPackage ./xmpp-sendmessage.nix { connectTo = "example.com"; }) 63 ]; 64 }; 65 66 server = 67 { config, pkgs, ... }: 68 { 69 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; 70 networking.extraHosts = '' 71 ${config.networking.primaryIPAddress} example.com 72 ${config.networking.primaryIPAddress} conference.example.com 73 ${config.networking.primaryIPAddress} uploads.example.com 74 ''; 75 networking.firewall.enable = false; 76 environment.systemPackages = [ 77 (createUsers pkgs) 78 (delUsers pkgs) 79 ]; 80 services.prosody = { 81 enable = true; 82 ssl.cert = "${cert pkgs}/cert.pem"; 83 ssl.key = "${cert pkgs}/key.pem"; 84 virtualHosts.example = { 85 domain = "example.com"; 86 enabled = true; 87 ssl.cert = "${cert pkgs}/cert.pem"; 88 ssl.key = "${cert pkgs}/key.pem"; 89 }; 90 muc = [ 91 { 92 domain = "conference.example.com"; 93 } 94 ]; 95 httpFileShare = { 96 domain = "uploads.example.com"; 97 }; 98 }; 99 }; 100 }; 101 102 testScript = _: '' 103 # Check with sqlite storage 104 start_all() 105 server.wait_for_unit("prosody.service") 106 server.succeed('prosodyctl status | grep "Prosody is running"') 107 108 server.succeed("create-prosody-users") 109 110 for machine in client_a, client_b: 111 machine.systemctl("start network-online.target") 112 machine.wait_for_unit("network-online.target") 113 114 client_a.wait_for_unit("go-sendxmpp-listen") 115 client_b.succeed("send-message") 116 117 client_a.wait_until_succeeds( 118 "journalctl -o cat -u go-sendxmpp-listen.service | grep 'cthon98@example.com: Hello, this is dog.'" 119 ) 120 121 server.succeed("delete-prosody-users") 122 ''; 123}