summaryrefslogtreecommitdiffstats
path: root/nixos/tests/duplicity.nix
blob: 6f5b2bdf44a7813f5f498f262c28ef3920eb4aef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{ pkgs, lib, ... }:

let
  inherit (import ./ssh-keys.nix pkgs)
    snakeOilPrivateKey
    snakeOilPublicKey
    snakeOilEd25519PrivateKey
    snakeOilEd25519PublicKey
    ;

  keepFile = "keep.txt";
  keepFileData = "This file should be backed up.";
  excludedFile = "secret.txt";
  excludedFileData = "Should not be backed up!";
in
{
  name = "duplicity";
  meta.maintainers = with lib.maintainers; [ h7x4 ];

  containers.client =
    let
      dataDir = "/data";
    in
    {
      systemd.tmpfiles.settings."10-duplicity-test" = {
        ${dataDir}.d.mode = "0600";
        "${dataDir}/${keepFile}".f = {
          mode = "0644";
          argument = keepFileData;
        };
        "${dataDir}/${excludedFile}".f = {
          mode = "0644";
          argument = excludedFileData;
        };
      };

      programs.ssh = {
        systemd-ssh-proxy.enable = false;
        knownHosts.server = {
          hostNames = [ "server" ];
          publicKey = snakeOilPublicKey;
        };
        extraConfig = ''
          Host server
            IdentityFile ${snakeOilEd25519PrivateKey}
        '';
      };

      services.duplicity = {
        enable = true;
        root = dataDir;
        exclude = [ "${dataDir}/${excludedFile}" ];
        targetUrl = "scp://root@server//root/backup";
        frequency = null; # triggered manually in the test script
        fullIfOlderThan = "always";
        extraFlags = [
          "--no-encryption"
          "--volsize"
          "1"
        ];
      };
    };

  containers.server =
    { pkgs, ... }:
    {
      environment.systemPackages = [ pkgs.duplicity ];

      systemd.tmpfiles.settings."10-duplicity-test" = {
        "/root/backup".d.mode = "0700";
        "/root/restore".d.mode = "0700";
      };

      services.openssh = {
        enable = true;
        hostKeys = [
          {
            type = "ecdsa";
            path = "${snakeOilPrivateKey}";
          }
        ];
      };

      users.users.root.openssh.authorizedKeys.keys = [ snakeOilEd25519PublicKey ];
    };

  testScript = ''
    start_all()

    client.wait_for_unit("multi-user.target")
    server.wait_for_unit("multi-user.target")
    server.wait_for_open_port(22)

    client.systemctl("start --wait duplicity.service")
    client.fail("systemctl is-failed duplicity.service")

    server.succeed(
        "duplicity --no-encryption --volsize 1 restore file:///root/backup /root/restore"
    )

    server.succeed("test -f /root/restore/${keepFile}")
    assert "${keepFileData}" in server.succeed("cat /root/restore/${keepFile}")

    server.fail("test -e /root/restore/${excludedFile}")
  '';
}