1{ pkgs, ... }: 2 3let 4 adminPrivateKey = pkgs.writeText "id_ed25519" '' 5 -----BEGIN OPENSSH PRIVATE KEY----- 6 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 7 QyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3gAAAJBJiYxDSYmM 8 QwAAAAtzc2gtZWQyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3g 9 AAAEDE1W6vMwSEUcF1r7Hyypm/+sCOoDmKZgPxi3WOa1mD2u7urFhAA90BTpGuEHeWWTY3 10 W/g9PBxXNxfWhfbrm4LeAAAACGJmb0BtaW5pAQIDBAU= 11 -----END OPENSSH PRIVATE KEY----- 12 ''; 13 14 adminPublicKey = '' 15 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO7urFhAA90BTpGuEHeWWTY3W/g9PBxXNxfWhfbrm4Le root@client 16 ''; 17 18 alicePrivateKey = pkgs.writeText "id_ed25519" '' 19 -----BEGIN OPENSSH PRIVATE KEY----- 20 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 21 QyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQAAAJAwVQ5VMFUO 22 VQAAAAtzc2gtZWQyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQ 23 AAAEB7lbfkkdkJoE+4TKHPdPQWBKLSx+J54Eg8DaTr+3KoSlt5a8eH8BYZYjoQhzXGVKKH 24 Je1pw1D0p7O2Vb9VTLzBAAAACGJmb0BtaW5pAQIDBAU= 25 -----END OPENSSH PRIVATE KEY----- 26 ''; 27 28 alicePublicKey = pkgs.writeText "id_ed25519.pub" '' 29 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFt5a8eH8BYZYjoQhzXGVKKHJe1pw1D0p7O2Vb9VTLzB alice@client 30 ''; 31 32 bobPrivateKey = pkgs.writeText "id_ed25519" '' 33 -----BEGIN OPENSSH PRIVATE KEY----- 34 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 35 QyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMAAAAJDQBmNV0AZj 36 VQAAAAtzc2gtZWQyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMA 37 AAAEDM1IYYFUwk/IVxauha9kuR6bbRtT3gZ6ZA0GLb9txb/pZNonUP1ePHLrvn0W9D2hdN 38 6zWWZYFyJc+QR6pOKQEwAAAACGJmb0BtaW5pAQIDBAU= 39 -----END OPENSSH PRIVATE KEY----- 40 ''; 41 42 bobPublicKey = pkgs.writeText "id_ed25519.pub" '' 43 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJZNonUP1ePHLrvn0W9D2hdN6zWWZYFyJc+QR6pOKQEw bob@client 44 ''; 45 46 gitoliteAdminConfSnippet = pkgs.writeText "gitolite-admin-conf-snippet" '' 47 repo alice-project 48 RW+ = alice 49 ''; 50in 51{ 52 name = "gitolite"; 53 54 meta = with pkgs.lib.maintainers; { 55 maintainers = [ bjornfor ]; 56 }; 57 58 nodes = { 59 60 server = 61 { ... }: 62 { 63 services.gitolite = { 64 enable = true; 65 adminPubkey = adminPublicKey; 66 }; 67 services.openssh.enable = true; 68 }; 69 70 client = 71 { pkgs, ... }: 72 { 73 environment.systemPackages = [ pkgs.git ]; 74 programs.ssh.extraConfig = '' 75 Host * 76 UserKnownHostsFile /dev/null 77 StrictHostKeyChecking no 78 # there's nobody around that can input password 79 PreferredAuthentications publickey 80 ''; 81 users.users.alice = { 82 isNormalUser = true; 83 }; 84 users.users.bob = { 85 isNormalUser = true; 86 }; 87 }; 88 89 }; 90 91 testScript = '' 92 start_all() 93 94 with subtest("can setup ssh keys on system"): 95 client.succeed( 96 "mkdir -p ~root/.ssh", 97 "cp ${adminPrivateKey} ~root/.ssh/id_ed25519", 98 "chmod 600 ~root/.ssh/id_ed25519", 99 ) 100 client.succeed( 101 "sudo -u alice mkdir -p ~alice/.ssh", 102 "sudo -u alice cp ${alicePrivateKey} ~alice/.ssh/id_ed25519", 103 "sudo -u alice chmod 600 ~alice/.ssh/id_ed25519", 104 ) 105 client.succeed( 106 "sudo -u bob mkdir -p ~bob/.ssh", 107 "sudo -u bob cp ${bobPrivateKey} ~bob/.ssh/id_ed25519", 108 "sudo -u bob chmod 600 ~bob/.ssh/id_ed25519", 109 ) 110 111 with subtest("gitolite server starts"): 112 server.wait_for_unit("gitolite-init.service") 113 server.wait_for_unit("sshd.service") 114 client.succeed("ssh -n gitolite@server info") 115 116 with subtest("admin can clone and configure gitolite-admin.git"): 117 client.succeed( 118 "git clone gitolite@server:gitolite-admin.git", 119 "git config --global user.name 'System Administrator'", 120 "git config --global user.email root\@domain.example", 121 "cp ${alicePublicKey} gitolite-admin/keydir/alice.pub", 122 "cp ${bobPublicKey} gitolite-admin/keydir/bob.pub", 123 "(cd gitolite-admin && git add . && git commit -m 'Add keys for alice, bob' && git push)", 124 "cat ${gitoliteAdminConfSnippet} >> gitolite-admin/conf/gitolite.conf", 125 "(cd gitolite-admin && git add . && git commit -m 'Add repo for alice' && git push)", 126 ) 127 128 with subtest("non-admins cannot clone gitolite-admin.git"): 129 client.fail("sudo -i -u alice git clone gitolite@server:gitolite-admin.git") 130 client.fail("sudo -i -u bob git clone gitolite@server:gitolite-admin.git") 131 132 with subtest("non-admins can clone testing.git"): 133 client.succeed("sudo -i -u alice git clone gitolite@server:testing.git") 134 client.succeed("sudo -i -u bob git clone gitolite@server:testing.git") 135 136 with subtest("alice can clone alice-project.git"): 137 client.succeed("sudo -i -u alice git clone gitolite@server:alice-project.git") 138 139 with subtest("bob cannot clone alice-project.git"): 140 client.fail("sudo -i -u bob git clone gitolite@server:alice-project.git") 141 ''; 142}