diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 09f01fe2646f..e8794f0cd502 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1250,7 +1250,7 @@ in privoxy = runTest ./privoxy.nix; prometheus = import ./prometheus { inherit runTest; }; prometheus-exporters = handleTest ./prometheus-exporters.nix { }; - prosody = handleTest ./xmpp/prosody.nix { }; + prosody = runTest ./xmpp/prosody.nix; prosody-mysql = handleTest ./xmpp/prosody-mysql.nix { }; proxy = runTest ./proxy.nix; prowlarr = runTest ./prowlarr.nix; diff --git a/nixos/tests/xmpp/ejabberd.nix b/nixos/tests/xmpp/ejabberd.nix index 2172ae54bc91..10b52bdf28a2 100644 --- a/nixos/tests/xmpp/ejabberd.nix +++ b/nixos/tests/xmpp/ejabberd.nix @@ -2,7 +2,7 @@ let cert = pkgs: pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } '' - openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -subj '/CN=example.com/CN=muc.example.com/CN=matrix.example.com' -days 36500 + openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -subj '/CN=example.com/CN=muc.example.com/CN=matrix.example.com' -addext "subjectAltName = DNS:example.com,DNS:muc.example.com,DNS:matrix.example.com" -days 36500 mkdir -p $out cp key.pem cert.pem $out ''; @@ -14,7 +14,18 @@ in maintainers = [ ]; }; nodes = { - client = + client-a = + { nodes, pkgs, ... }: + { + security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; + networking.extraHosts = '' + ${nodes.server.networking.primaryIPAddress} example.com + ''; + + imports = [ ./go-sendxmpp-listen.nix ]; + }; + + client-b = { nodes, pkgs, ... }: { security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; @@ -28,6 +39,7 @@ in }) ]; }; + server = { config, pkgs, ... }: { @@ -310,7 +322,18 @@ in ejabberd_prefix + "register cthon98 example.com nothunter2", ) server.fail(ejabberd_prefix + "register asdf wrong.domain") - client.succeed("send-message") + + for machine in client_a, client_b: + machine.systemctl("start network-online.target") + machine.wait_for_unit("network-online.target") + + client_a.wait_for_unit("go-sendxmpp-listen") + client_b.succeed("send-message") + + client_a.wait_until_succeeds( + "journalctl -o cat -u go-sendxmpp-listen.service | grep 'cthon98@example.com: Hello, this is dog.'" + ) + server.succeed( ejabberd_prefix + "unregister cthon98 example.com", ejabberd_prefix + "unregister azurediamond example.com", diff --git a/nixos/tests/xmpp/go-sendxmpp-listen.nix b/nixos/tests/xmpp/go-sendxmpp-listen.nix new file mode 100644 index 000000000000..96ca71ba8159 --- /dev/null +++ b/nixos/tests/xmpp/go-sendxmpp-listen.nix @@ -0,0 +1,22 @@ +{ lib, pkgs, ... }: + +{ + systemd.services.go-sendxmpp-listen = { + after = [ "network-online.target" ]; + requires = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + ExecStart = '' + ${lib.getExe pkgs.go-sendxmpp} --username azurediamond@example.com --password hunter2 --listen + ''; + Environment = [ + "HOME=/var/lib/go-sendxmpp/" + ]; + DynamicUser = true; + Restart = "on-failure"; + RestartSec = "5s"; + StateDirectory = "go-sendxmpp"; + }; + }; +} diff --git a/nixos/tests/xmpp/prosody.nix b/nixos/tests/xmpp/prosody.nix index 50df32f49601..3b7e028de4fc 100644 --- a/nixos/tests/xmpp/prosody.nix +++ b/nixos/tests/xmpp/prosody.nix @@ -1,9 +1,11 @@ +{ ... }: + let cert = pkgs: pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } '' openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \ - -subj '/C=GB/CN=example.com' -addext "subjectAltName = DNS:example.com,DNS:uploads.example.com,DNS:conference.example.com" + -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" mkdir -p $out cp key.pem cert.pem $out ''; @@ -29,10 +31,21 @@ let prosodyctl deluser azurediamond@example.com ''; in -import ../make-test-python.nix { +{ name = "prosody"; nodes = { - client = + client-a = + { nodes, pkgs, ... }: + { + security.pki.certificateFiles = [ "${cert pkgs}/cert.pem" ]; + networking.extraHosts = '' + ${nodes.server.networking.primaryIPAddress} example.com + ''; + + imports = [ ./go-sendxmpp-listen.nix ]; + }; + + client-b = { nodes, pkgs, @@ -93,7 +106,18 @@ import ../make-test-python.nix { server.succeed('prosodyctl status | grep "Prosody is running"') server.succeed("create-prosody-users") - client.succeed("send-message") + + for machine in client_a, client_b: + machine.systemctl("start network-online.target") + machine.wait_for_unit("network-online.target") + + client_a.wait_for_unit("go-sendxmpp-listen") + client_b.succeed("send-message") + + client_a.wait_until_succeeds( + "journalctl -o cat -u go-sendxmpp-listen.service | grep 'cthon98@example.com: Hello, this is dog.'" + ) + server.succeed("delete-prosody-users") ''; } diff --git a/pkgs/by-name/go/go-sendxmpp/package.nix b/pkgs/by-name/go/go-sendxmpp/package.nix new file mode 100644 index 000000000000..44a1310a345d --- /dev/null +++ b/pkgs/by-name/go/go-sendxmpp/package.nix @@ -0,0 +1,39 @@ +{ + buildGoModule, + fetchFromGitLab, + lib, + nix-update-script, + testers, +}: + +buildGoModule (finalAttrs: { + pname = "go-sendxmpp"; + version = "0.14.1"; + + src = fetchFromGitLab { + domain = "salsa.debian.org"; + owner = "mdosch"; + repo = "go-sendxmpp"; + tag = "v${finalAttrs.version}"; + hash = "sha256-nQ2URhkOp0mb4u4IG3wzGIdhP6svDVMctbu2CHQXj2Y="; + }; + + vendorHash = "sha256-aMhUsYsQvnhEVkWbjbh84bbStQ4b/0ZHEvzEhXSlFyw="; + + passthru = { + tests.version = testers.testVersion { + package = finalAttrs.finalPackage; + }; + updateScript = nix-update-script { }; + }; + + meta = { + description = "Tool to send messages or files to an XMPP contact or MUC"; + homepage = "https://salsa.debian.org/mdosch/go-sendxmpp"; + license = lib.licenses.bsd2; + maintainers = with lib.maintainers; [ + jpds + ]; + mainProgram = "go-sendxmpp"; + }; +})