| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2016-03-10 23:15:52 -08:00
										 |  |  |   diskSize = "30720"; | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | in | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   system.build.azureImage = | 
					
						
							|  |  |  |     pkgs.vmTools.runInLinuxVM ( | 
					
						
							|  |  |  |       pkgs.runCommand "azure-image" | 
					
						
							|  |  |  |         { preVM = | 
					
						
							|  |  |  |             ''
 | 
					
						
							|  |  |  |               mkdir $out | 
					
						
							|  |  |  |               diskImage=$out/$diskImageBase | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               cyl=$(((${diskSize}*1024*1024)/(512*63*255))) | 
					
						
							|  |  |  |               size=$(($cyl*255*63*512))               | 
					
						
							|  |  |  |               roundedsize=$((($size/(1024*1024)+1)*(1024*1024))) | 
					
						
							| 
									
										
										
										
											2016-02-18 17:30:06 -08:00
										 |  |  |               ${pkgs.vmTools.qemu-220}/bin/qemu-img create -f raw $diskImage $roundedsize | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |               mv closure xchg/ | 
					
						
							|  |  |  |             '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           postVM = | 
					
						
							|  |  |  |             ''
 | 
					
						
							|  |  |  |               mkdir -p $out | 
					
						
							| 
									
										
										
										
											2016-03-13 00:48:53 +02:00
										 |  |  |               ${pkgs.vmTools.qemu-220}/bin/qemu-img convert -f raw -O vpc $diskImage $out/disk.vhd | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |               rm $diskImage | 
					
						
							|  |  |  |             '';
 | 
					
						
							| 
									
										
										
										
											2015-09-18 16:50:48 +00:00
										 |  |  |           diskImageBase = "nixos-image-${config.system.nixosLabel}-${pkgs.stdenv.system}.raw"; | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           buildInputs = [ pkgs.utillinux pkgs.perl ]; | 
					
						
							|  |  |  |           exportReferencesGraph = | 
					
						
							|  |  |  |             [ "closure" config.system.build.toplevel ]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         ''
 | 
					
						
							|  |  |  |           # Create partition table | 
					
						
							|  |  |  |           ${pkgs.parted}/sbin/parted /dev/vda mklabel msdos | 
					
						
							|  |  |  |           ${pkgs.parted}/sbin/parted /dev/vda mkpart primary ext4 1 ${diskSize}M | 
					
						
							|  |  |  |           ${pkgs.parted}/sbin/parted /dev/vda print | 
					
						
							|  |  |  |           . /sys/class/block/vda1/uevent | 
					
						
							|  |  |  |           mknod /dev/vda1 b $MAJOR $MINOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Create an empty filesystem and mount it. | 
					
						
							|  |  |  |           ${pkgs.e2fsprogs}/sbin/mkfs.ext4 -L nixos /dev/vda1 | 
					
						
							|  |  |  |           ${pkgs.e2fsprogs}/sbin/tune2fs -c 0 -i 0 /dev/vda1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           mkdir /mnt | 
					
						
							|  |  |  |           mount /dev/vda1 /mnt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # The initrd expects these directories to exist. | 
					
						
							|  |  |  |           mkdir /mnt/dev /mnt/proc /mnt/sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           mount --bind /proc /mnt/proc | 
					
						
							|  |  |  |           mount --bind /dev /mnt/dev | 
					
						
							|  |  |  |           mount --bind /sys /mnt/sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Copy all paths in the closure to the filesystem. | 
					
						
							|  |  |  |           storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           mkdir -p /mnt/nix/store | 
					
						
							|  |  |  |           echo "copying everything (will take a while)..." | 
					
						
							|  |  |  |           cp -prd $storePaths /mnt/nix/store/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo Register the paths in the Nix database. | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \ | 
					
						
							| 
									
										
										
										
											2016-04-24 13:57:19 +03:00
										 |  |  |               chroot /mnt ${config.nix.package.out}/bin/nix-store --load-db --option build-users-group "" | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo Create the system profile to allow nixos-rebuild to work. | 
					
						
							| 
									
										
										
										
											2016-04-24 13:57:19 +03:00
										 |  |  |           chroot /mnt ${config.nix.package.out}/bin/nix-env \ | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |               -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel} --option build-users-group "" | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo nixos-rebuild requires an /etc/NIXOS. | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           mkdir -p /mnt/etc | 
					
						
							|  |  |  |           touch /mnt/etc/NIXOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo switch-to-configuration requires a /bin/sh | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           mkdir -p /mnt/bin | 
					
						
							|  |  |  |           ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo Install a configuration.nix. | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           mkdir -p /mnt/etc/nixos /mnt/boot/grub | 
					
						
							| 
									
										
										
										
											2016-03-03 03:58:51 +02:00
										 |  |  |           cp ${./azure-config-user.nix} /mnt/etc/nixos/configuration.nix | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo Generate the GRUB menu. | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           ln -s vda /dev/sda | 
					
						
							|  |  |  |           chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           echo Almost done | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  |           umount /mnt/proc /mnt/dev /mnt/sys | 
					
						
							|  |  |  |           umount /mnt | 
					
						
							|  |  |  |         ''
 | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-03 20:18:18 +03:00
										 |  |  |   imports = [ ./azure-common.nix ]; | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 21:53:10 +02:00
										 |  |  |   # Azure metadata is available as a CD-ROM drive. | 
					
						
							|  |  |  |   fileSystems."/metadata".device = "/dev/sr0"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |   systemd.services.fetch-ssh-keys = | 
					
						
							|  |  |  |     { description = "Fetch host keys and authorized_keys for root user"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-09 07:39:17 +02:00
										 |  |  |       wantedBy = [ "sshd.service" "waagent.service" ]; | 
					
						
							|  |  |  |       before = [ "sshd.service" "waagent.service" ]; | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |       after = [ "local-fs.target" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       path  = [ pkgs.coreutils ]; | 
					
						
							|  |  |  |       script = | 
					
						
							|  |  |  |         ''
 | 
					
						
							| 
									
										
										
										
											2016-01-10 11:35:44 +02:00
										 |  |  |           eval "$(cat /metadata/CustomData.bin)" | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           if ! [ -z "$ssh_host_ecdsa_key" ]; then | 
					
						
							|  |  |  |             echo "downloaded ssh_host_ecdsa_key" | 
					
						
							| 
									
										
										
										
											2015-12-09 07:39:17 +02:00
										 |  |  |             echo "$ssh_host_ecdsa_key" > /etc/ssh/ssh_host_ed25519_key | 
					
						
							|  |  |  |             chmod 600 /etc/ssh/ssh_host_ed25519_key | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if ! [ -z "$ssh_host_ecdsa_key_pub" ]; then | 
					
						
							|  |  |  |             echo "downloaded ssh_host_ecdsa_key_pub" | 
					
						
							| 
									
										
										
										
											2015-12-09 07:39:17 +02:00
										 |  |  |             echo "$ssh_host_ecdsa_key_pub" > /etc/ssh/ssh_host_ed25519_key.pub | 
					
						
							|  |  |  |             chmod 644 /etc/ssh/ssh_host_ed25519_key.pub | 
					
						
							| 
									
										
										
										
											2015-02-16 16:54:30 +02:00
										 |  |  |           fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if ! [ -z "$ssh_root_auth_key" ]; then | 
					
						
							|  |  |  |             echo "downloaded ssh_root_auth_key" | 
					
						
							|  |  |  |             mkdir -m 0700 -p /root/.ssh | 
					
						
							|  |  |  |             echo "$ssh_root_auth_key" > /root/.ssh/authorized_keys | 
					
						
							|  |  |  |             chmod 600 /root/.ssh/authorized_keys | 
					
						
							|  |  |  |           fi | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       serviceConfig.Type = "oneshot"; | 
					
						
							|  |  |  |       serviceConfig.RemainAfterExit = true; | 
					
						
							|  |  |  |       serviceConfig.StandardError = "journal+console"; | 
					
						
							|  |  |  |       serviceConfig.StandardOutput = "journal+console"; | 
					
						
							|  |  |  |      }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 21:37:46 +02:00
										 |  |  | } |