52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, pkgs, modulesPath, ... }:
 | |
| 
 | |
| # This attempts to pull a nix expression from this EC2 instance's user-data.
 | |
| 
 | |
| let
 | |
|   bootScript = pkgs.writeScript "bootscript.sh" ''
 | |
|     #!${pkgs.stdenv.shell} -eux
 | |
| 
 | |
|     echo "attempting to fetch configuration from user-data..."
 | |
| 
 | |
|     export PATH=${config.nix.package}/bin:${pkgs.wget}/bin:${pkgs.systemd}/bin:${pkgs.gnugrep}/bin:${pkgs.gnused}/bin:${config.system.build.nixos-rebuild}/bin:$PATH
 | |
|     export NIX_PATH=/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels
 | |
| 
 | |
|     userData="$(mktemp)"
 | |
|     wget -q --wait=1 --tries=0 --retry-connrefused -O - http://169.254.169.254/2011-01-01/user-data > "$userData"
 | |
| 
 | |
|     if [[ $? -eq 0 ]]; then
 | |
|       echo "user-data fetched"
 | |
|       # If the user-data looks like it could be a nix expression,
 | |
|       # copy it over. Also, look for a magic three-hash comment and set
 | |
|       # that as the channel.
 | |
|       if sed '/^\(#\|SSH_HOST_.*\)/d' < "$userData" | grep -q '\S'; then
 | |
|         channels="$(grep '^###' "$userData" | sed 's|###\s*||')"
 | |
|         printf "%s" "$channels" | while read channel; do
 | |
|           echo "writing channel: $channel"
 | |
|         done
 | |
| 
 | |
|         if [[ -n "$channels" ]]; then
 | |
|           printf "%s" "$channels" > /root/.nix-channels
 | |
|           nix-channel --update
 | |
|         fi
 | |
| 
 | |
|         echo "setting configuration"
 | |
|         cp "$userData" /etc/nixos/configuration.nix
 | |
|       else
 | |
|         echo "user-data does not appear to be a nix expression; ignoring"
 | |
|       fi
 | |
|     else
 | |
|       echo "failed to fetch user-data"
 | |
|     fi
 | |
| 
 | |
|     type -f nixos-rebuild
 | |
| 
 | |
|     nixos-rebuild switch
 | |
|   '';
 | |
| in {
 | |
|   imports = [ "${modulesPath}/virtualisation/amazon-image.nix" ];
 | |
|   boot.postBootCommands = ''
 | |
|     ${bootScript} &
 | |
|   '';
 | |
| }
 | 
