at 25.11-pre 3.8 kB view raw
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)