diff options
author | Léo Gaspard <leo@gaspard.io> | 2018-06-21 13:04:24 +0200 |
---|---|---|
committer | Léo Gaspard <leo@gaspard.io> | 2018-06-21 13:04:24 +0200 |
commit | b6eeeb111c6704c9f0f15f072351330c5af261b1 (patch) | |
tree | 094acdd4120cbc5705891eb151cd4a27e302abc4 /nixos/tests/opensmtpd.nix | |
parent | ea145b68a019f6fff89e772e9a6c5f0584acc02c (diff) | |
download | nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar.gz nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar.bz2 nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar.lz nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar.xz nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.tar.zst nixpkgs-b6eeeb111c6704c9f0f15f072351330c5af261b1.zip |
opensmtpd package and module: add nixos test
Diffstat (limited to 'nixos/tests/opensmtpd.nix')
-rw-r--r-- | nixos/tests/opensmtpd.nix | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/nixos/tests/opensmtpd.nix b/nixos/tests/opensmtpd.nix new file mode 100644 index 00000000000..5079779f35b --- /dev/null +++ b/nixos/tests/opensmtpd.nix @@ -0,0 +1,115 @@ +import ./make-test.nix { + name = "opensmtpd"; + + nodes = { + smtp1 = { pkgs, ... }: { + imports = [ common/user-account.nix ]; + networking = { + firewall.allowedTCPPorts = [ 25 ]; + useDHCP = false; + interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [ + { address = "192.168.1.1"; prefixLength = 24; } + ]; + }; + environment.systemPackages = [ pkgs.opensmtpd ]; + services.opensmtpd = { + enable = true; + extraServerArgs = [ "-v" ]; + serverConfiguration = '' + listen on 0.0.0.0 + # DO NOT DO THIS IN PRODUCTION! + # Setting up authentication requires a certificate which is painful in + # a test environment, but THIS WOULD BE DANGEROUS OUTSIDE OF A + # WELL-CONTROLLED ENVIRONMENT! + accept from any for any relay + ''; + }; + }; + + smtp2 = { pkgs, ... }: { + imports = [ common/user-account.nix ]; + networking = { + firewall.allowedTCPPorts = [ 25 143 ]; + useDHCP = false; + interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [ + { address = "192.168.1.2"; prefixLength = 24; } + ]; + }; + environment.systemPackages = [ pkgs.opensmtpd ]; + services.opensmtpd = { + enable = true; + extraServerArgs = [ "-v" ]; + serverConfiguration = '' + listen on 0.0.0.0 + accept from any for local deliver to mda \ + "${pkgs.dovecot}/libexec/dovecot/deliver -d %{user.username}" + ''; + }; + services.dovecot2 = { + enable = true; + enableImap = true; + mailLocation = "maildir:~/mail"; + protocols = [ "imap" ]; + }; + }; + + client = { pkgs, ... }: { + networking = { + useDHCP = false; + interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [ + { address = "192.168.1.3"; prefixLength = 24; } + ]; + }; + environment.systemPackages = let + sendTestMail = pkgs.writeScriptBin "send-a-test-mail" '' + #!${pkgs.python3.interpreter} + import smtplib, sys + + with smtplib.SMTP('192.168.1.1') as smtp: + smtp.sendmail('alice@[192.168.1.1]', 'bob@[192.168.1.2]', """ + From: alice@smtp1 + To: bob@smtp2 + Subject: Test + + Hello World + """) + ''; + + checkMailLanded = pkgs.writeScriptBin "check-mail-landed" '' + #!${pkgs.python3.interpreter} + import imaplib + + with imaplib.IMAP4('192.168.1.2', 143) as imap: + imap.login('bob', 'foobar') + imap.select() + status, refs = imap.search(None, 'ALL') + assert status == 'OK' + assert len(refs) == 1 + status, msg = imap.fetch(refs[0], 'BODY[TEXT]') + assert status == 'OK' + content = msg[0][1] + print("===> content:", content) + split = content.split(b'\r\n') + print("===> split:", split) + lastline = split[-3] + print("===> lastline:", lastline) + assert lastline.strip() == b'Hello World' + ''; + in [ sendTestMail checkMailLanded ]; + }; + }; + + testScript = '' + startAll; + + $client->waitForUnit("network.target"); + $smtp1->waitForUnit('opensmtpd'); + $smtp2->waitForUnit('opensmtpd'); + $smtp2->waitForUnit('dovecot2'); + + $client->succeed('send-a-test-mail'); + $smtp1->waitUntilFails('smtpctl show queue | egrep .'); + $smtp2->waitUntilFails('smtpctl show queue | egrep .'); + $client->succeed('check-mail-landed >&2'); + ''; +} |