1import ./make-test-python.nix (
2 { pkgs, ... }:
3
4 let
5 privateKey = ''
6 -----BEGIN OPENSSH PRIVATE KEY-----
7 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
8 QyNTUxOQAAACBx8UB04Q6Q/fwDFjakHq904PYFzG9pU2TJ9KXpaPMcrwAAAJB+cF5HfnBe
9 RwAAAAtzc2gtZWQyNTUxOQAAACBx8UB04Q6Q/fwDFjakHq904PYFzG9pU2TJ9KXpaPMcrw
10 AAAEBN75NsJZSpt63faCuaD75Unko0JjlSDxMhYHAPJk2/xXHxQHThDpD9/AMWNqQer3Tg
11 9gXMb2lTZMn0pelo8xyvAAAADXJzY2h1ZXR6QGt1cnQ=
12 -----END OPENSSH PRIVATE KEY-----
13 '';
14 publicKey = ''
15 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHHxQHThDpD9/AMWNqQer3Tg9gXMb2lTZMn0pelo8xyv
16 '';
17 in
18 {
19 name = "btrbk";
20 meta = with pkgs.lib; {
21 maintainers = with maintainers; [ symphorien ];
22 };
23
24 nodes = {
25 archive =
26 { ... }:
27 {
28 environment.systemPackages = with pkgs; [ btrfs-progs ];
29 # note: this makes the privateKey world readable.
30 # don't do it with real ssh keys.
31 environment.etc."btrbk_key".text = privateKey;
32 services.btrbk = {
33 instances = {
34 remote = {
35 onCalendar = "minutely";
36 settings = {
37 ssh_identity = "/etc/btrbk_key";
38 ssh_user = "btrbk";
39 stream_compress = "lz4";
40 volume = {
41 "ssh://main/mnt" = {
42 target = "/mnt";
43 snapshot_dir = "btrbk/remote";
44 subvolume = "to_backup";
45 };
46 };
47 };
48 };
49 };
50 };
51 };
52
53 main =
54 { ... }:
55 {
56 environment.systemPackages = with pkgs; [ btrfs-progs ];
57 services.openssh = {
58 enable = true;
59 settings = {
60 KbdInteractiveAuthentication = false;
61 PasswordAuthentication = false;
62 };
63 };
64 services.btrbk = {
65 extraPackages = [ pkgs.lz4 ];
66 sshAccess = [
67 {
68 key = publicKey;
69 roles = [
70 "source"
71 "send"
72 "info"
73 "delete"
74 ];
75 }
76 ];
77 instances = {
78 local = {
79 onCalendar = "minutely";
80 settings = {
81 volume = {
82 "/mnt" = {
83 snapshot_dir = "btrbk/local";
84 subvolume = "to_backup";
85 };
86 };
87 };
88 };
89 };
90 };
91 };
92 };
93
94 testScript = ''
95 start_all()
96
97 # create btrfs partition at /mnt
98 for machine in (archive, main):
99 machine.succeed("dd if=/dev/zero of=/data_fs bs=120M count=1")
100 machine.succeed("mkfs.btrfs /data_fs")
101 machine.succeed("mkdir /mnt")
102 machine.succeed("mount /data_fs /mnt")
103
104 # what to backup and where
105 main.succeed("btrfs subvolume create /mnt/to_backup")
106 main.succeed("mkdir -p /mnt/btrbk/{local,remote}")
107
108 # check that local snapshots work
109 with subtest("local"):
110 main.succeed("echo foo > /mnt/to_backup/bar")
111 main.wait_until_succeeds("cat /mnt/btrbk/local/*/bar | grep foo")
112 main.succeed("echo bar > /mnt/to_backup/bar")
113 main.succeed("cat /mnt/btrbk/local/*/bar | grep foo")
114
115 # check that btrfs send/receive works and ssh access works
116 with subtest("remote"):
117 archive.wait_until_succeeds("cat /mnt/*/bar | grep bar")
118 main.succeed("echo baz > /mnt/to_backup/bar")
119 archive.succeed("cat /mnt/*/bar | grep bar")
120 '';
121 }
122)