| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, modules, ... }: | 
					
						
							| 
									
										
										
										
											2013-07-03 13:58:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2013-07-03 13:58:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Location of the repository on the harddrive | 
					
						
							|  |  |  |   nixosPath = toString ../..; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Check if the path is from the NixOS repository | 
					
						
							|  |  |  |   isNixOSFile = path: | 
					
						
							|  |  |  |     let s = toString path; in | 
					
						
							|  |  |  |       removePrefix nixosPath s != s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Copy modules given as extra configuration files.  Unfortunately, we | 
					
						
							|  |  |  |   # cannot serialized attribute set given in the list of modules (that's why | 
					
						
							|  |  |  |   # you should use files). | 
					
						
							|  |  |  |   moduleFiles = | 
					
						
							| 
									
										
										
										
											2013-10-28 17:47:13 +01:00
										 |  |  |     # FIXME: use typeOf (Nix 1.6.1). | 
					
						
							|  |  |  |     filter (x: !isAttrs x && !builtins.isFunction x) modules; | 
					
						
							| 
									
										
										
										
											2013-07-03 13:58:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Partition module files because between NixOS and non-NixOS files.  NixOS | 
					
						
							|  |  |  |   # files may change if the repository is updated. | 
					
						
							|  |  |  |   partitionedModuleFiles = | 
					
						
							|  |  |  |     let p = partition isNixOSFile moduleFiles; in | 
					
						
							|  |  |  |     { nixos = p.right; others = p.wrong; }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Path transformed to be valid on the installation device.  Thus the | 
					
						
							|  |  |  |   # device configuration could be rebuild. | 
					
						
							|  |  |  |   relocatedModuleFiles = | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       relocateNixOS = path: | 
					
						
							| 
									
										
										
										
											2015-08-05 15:52:12 +02:00
										 |  |  |         "<nixpkgs/nixos" + removePrefix nixosPath (toString path) + ">"; | 
					
						
							| 
									
										
										
										
											2013-07-03 13:58:38 +02:00
										 |  |  |       relocateOthers = null; | 
					
						
							|  |  |  |     in | 
					
						
							|  |  |  |       { nixos = map relocateNixOS partitionedModuleFiles.nixos; | 
					
						
							|  |  |  |         others = []; # TODO: copy the modules to the install-device repository. | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # A dummy /etc/nixos/configuration.nix in the booted CD that | 
					
						
							|  |  |  |   # rebuilds the CD's configuration (and allows the configuration to | 
					
						
							|  |  |  |   # be modified, of course, providing a true live CD).  Problem is | 
					
						
							|  |  |  |   # that we don't really know how the CD was built - the Nix | 
					
						
							|  |  |  |   # expression language doesn't allow us to query the expression being | 
					
						
							|  |  |  |   # evaluated.  So we'll just hope for the best. | 
					
						
							|  |  |  |   configClone = pkgs.writeText "configuration.nix" | 
					
						
							|  |  |  |     ''
 | 
					
						
							|  |  |  |       { config, pkgs, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |         imports = [ ${toString config.installer.cloneConfigIncludes} ]; | 
					
						
							| 
									
										
										
										
											2013-07-03 13:58:38 +02:00
										 |  |  |       } | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     installer.cloneConfig = mkOption { | 
					
						
							|  |  |  |       default = true; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Try to clone the installation-device configuration by re-using it's | 
					
						
							|  |  |  |         profile from the list of imported modules. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     installer.cloneConfigIncludes = mkOption { | 
					
						
							|  |  |  |       default = []; | 
					
						
							|  |  |  |       example = [ "./nixos/modules/hardware/network/rt73.nix" ]; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         List of modules used to re-build this installation device profile. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     installer.cloneConfigIncludes = | 
					
						
							|  |  |  |       relocatedModuleFiles.nixos ++ relocatedModuleFiles.others; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boot.postBootCommands = | 
					
						
							|  |  |  |       ''
 | 
					
						
							|  |  |  |         # Provide a mount point for nixos-install. | 
					
						
							|  |  |  |         mkdir -p /mnt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ${optionalString config.installer.cloneConfig ''
 | 
					
						
							|  |  |  |           # Provide a configuration for the CD/DVD itself, to allow users | 
					
						
							|  |  |  |           # to run nixos-rebuild to change the configuration of the | 
					
						
							|  |  |  |           # running system on the CD/DVD. | 
					
						
							|  |  |  |           if ! [ -e /etc/nixos/configuration.nix ]; then | 
					
						
							|  |  |  |             cp ${configClone} /etc/nixos/configuration.nix | 
					
						
							|  |  |  |           fi | 
					
						
							|  |  |  |        ''}
 | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |