1let
2 cert =
3 pkgs:
4 pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
5 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \
6 -subj '/C=GB/CN=example.com' -addext "subjectAltName = DNS:example.com,DNS:uploads.example.com,DNS:conference.example.com"
7 mkdir -p $out
8 cp key.pem cert.pem $out
9 '';
10 # Creates and set password for the 2 xmpp test users.
11 #
12 # Doing that in a bash script instead of doing that in the test
13 # script allow us to easily provision the users when running that
14 # test interactively.
15 createUsers =
16 pkgs:
17 pkgs.writeShellScriptBin "create-prosody-users" ''
18 set -e
19 prosodyctl register cthon98 example.com nothunter2
20 prosodyctl register azurediamond example.com hunter2
21 '';
22 # Deletes the test users.
23 delUsers =
24 pkgs:
25 pkgs.writeShellScriptBin "delete-prosody-users" ''
26 set -e
27 prosodyctl deluser cthon98@example.com
28 prosodyctl deluser azurediamond@example.com
29 '';
30in
31import ../make-test-python.nix {
32 name = "prosody-mysql";
33 nodes = {
34 client =
35 {
36 nodes,
37 pkgs,
38 config,
39 ...
40 }:
41 {
42 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
43 networking.extraHosts = ''
44 ${nodes.server.networking.primaryIPAddress} example.com
45 ${nodes.server.networking.primaryIPAddress} conference.example.com
46 ${nodes.server.networking.primaryIPAddress} uploads.example.com
47 '';
48 environment.systemPackages = [
49 (pkgs.callPackage ./xmpp-sendmessage.nix {
50 connectTo = nodes.server.networking.primaryIPAddress;
51 })
52 ];
53 };
54
55 server =
56 { nodes, pkgs, ... }:
57 {
58 nixpkgs.overlays = [
59 (self: super: {
60 prosody = super.prosody.override {
61 withExtraLuaPackages = p: [ p.luadbi-mysql ];
62 };
63 })
64 ];
65 security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
66 networking.extraHosts = ''
67 ${nodes.server.networking.primaryIPAddress} example.com
68 ${nodes.server.networking.primaryIPAddress} conference.example.com
69 ${nodes.server.networking.primaryIPAddress} uploads.example.com
70 '';
71 networking.firewall.enable = false;
72 environment.systemPackages = [
73 (createUsers pkgs)
74 (delUsers pkgs)
75 ];
76 services.prosody = {
77 enable = true;
78 ssl.cert = "${cert pkgs}/cert.pem";
79 ssl.key = "${cert pkgs}/key.pem";
80 virtualHosts.example = {
81 domain = "example.com";
82 enabled = true;
83 ssl.cert = "${cert pkgs}/cert.pem";
84 ssl.key = "${cert pkgs}/key.pem";
85 };
86 muc = [
87 {
88 domain = "conference.example.com";
89 }
90 ];
91 httpFileShare = {
92 domain = "uploads.example.com";
93 };
94 extraConfig = ''
95 storage = "sql"
96 sql = {
97 driver = "MySQL";
98 database = "prosody";
99 host = "mysql";
100 port = 3306;
101 username = "prosody";
102 password = "password123";
103 };
104 '';
105 };
106 };
107 mysql =
108 { config, pkgs, ... }:
109 {
110 networking.firewall.enable = false;
111 services.mysql = {
112 enable = true;
113 initialScript = pkgs.writeText "mysql_init.sql" ''
114 CREATE DATABASE prosody;
115 CREATE USER 'prosody'@'server' IDENTIFIED BY 'password123';
116 GRANT ALL PRIVILEGES ON prosody.* TO 'prosody'@'server';
117 FLUSH PRIVILEGES;
118 '';
119 package = pkgs.mariadb;
120 };
121 };
122 };
123
124 testScript = _: ''
125 # Check with mysql storage
126 start_all()
127 mysql.wait_for_unit("mysql.service")
128 server.wait_for_unit("prosody.service")
129 server.succeed('prosodyctl status | grep "Prosody is running"')
130
131 server.succeed("create-prosody-users")
132 client.succeed("send-message")
133 server.succeed("delete-prosody-users")
134 '';
135}