diff --git a/modules/installer/tools/nixos-option.sh b/modules/installer/tools/nixos-option.sh index 5195ed8cf69..962546ebb6e 100644 --- a/modules/installer/tools/nixos-option.sh +++ b/modules/installer/tools/nixos-option.sh @@ -2,15 +2,17 @@ # Allow the location of NixOS sources and the system configuration # file to be overridden. + +: ${mountPoint=/mnt} : ${NIXOS_PATH=/etc/nixos/nixos} -: ${NIXOS=/etc/nixos/nixos} -: ${NIXPKGS=/etc/nixos/nixpkgs} : ${NIXOS_CONFIG=/etc/nixos/configuration.nix} +: ${NIXPKGS=/etc/nixos/nixpkgs} export NIXOS_PATH usage () { echo 1>&2 " -Usage: $0 OPTION_NAME [-v] [-d] [-l] +Usage: $0 [--install] [-v] [-d] [-l] OPTION_NAME + $0 [--install] This program is used to explore NixOS options by looking at their values or by looking at their description. It is helpful for understanding the how @@ -18,6 +20,11 @@ your configuration is working. Options: + -i | --install Use the configuration on + ${mountPoint:+$mountPoint/}$NIXOS_CONFIG instead of + the current system configuration. Generate a + template configuration if no option name is + specified. -v | --value Display the current value, based on your configuration. -d | --default Display the default value, the example and the @@ -26,8 +33,9 @@ Options: is declared. --help Show this message. -Environment variables affecting nixos-option: +Environment variables affecting $0: + \$mountPoint Path to the target file system. \$NIXOS_PATH Path where the NixOS repository is located. \$NIXOS_CONFIG Path to your configuration file. \$NIXPKGS Path to Nix packages. @@ -44,6 +52,7 @@ Environment variables affecting nixos-option: desc=false defs=false value=false +install=false verbose=false option="" @@ -52,18 +61,39 @@ argfun="" for arg; do if test -z "$argfun"; then case $arg in - -d|--description) desc=true;; - -v|--value) value=true;; - -l|--lookup) defs=true;; - --verbose) verbose=true;; - --help) usage;; - -*) usage;; - *) if test -z "$option"; then - option="$arg" - else - usage - fi;; + -*) + longarg="" + sarg="$arg" + while test "$sarg" != "-"; do + case $sarg in + --*) longarg=$arg;; + -d*) longarg="$longarg --description";; + -v*) longarg="$longarg --value";; + -l*) longarg="$longarg --lookup";; + -i*) longarg="$longarg --install";; + -*) usage;; + esac + sarg="-${sarg#??}" + done + ;; + *) longarg=$arg;; esac + for larg in $longarg; do + case $larg in + --description) desc=true;; + --value) value=true;; + --lookup) defs=true;; + --install) install=true;; + --verbose) verbose=true;; + --help) usage;; + -*) usage;; + *) if test -z "$option"; then + option="$larg" + else + usage + fi;; + esac + done else case $argfun in set_*) @@ -75,6 +105,16 @@ for arg; do fi done +# --install cannot be used with -d -v -l without option name. +if $value || $desc || $defs && $install && test -z "$option"; then + usage +fi + +generate=false +if ! $defs && ! $desc && ! $value && $install && test -z "$option"; then + generate=true +fi + if ! $defs && ! $desc; then value=true fi @@ -111,7 +151,130 @@ findSources(){ nix-instantiate - --eval-only --strict } +if $install; then + if test -e "$mountPoint$NIXOS_PATH"; then + export NIXOS_PATH="$mountPoint$NIXOS_PATH" + fi + if test -e "$mountPoint$NIXPKGS"; then + export NIXPKGS="$mountPoint$NIXPKGS" + fi + export NIXOS_CONFIG="$mountPoint$NIXOS_CONFIG" +fi +if $generate; then + mkdir -p $(dirname "$NIXOS_CONFIG") + + # Scan the hardware and add the result to /etc/nixos/hardware-scan.nix. + hardware_config="${NIXOS_CONFIG%/configuration.nix}/hardware-configuration.nix" + if test -e "$hardware_config"; then + echo "A hardware configuration file exists, generation skipped." + else + echo "Scan your hardware to generate a hardware configuration file." + nixos-hardware-scan > "$hardware_config" + fi + + if test -e "$NIXOS_CONFIG"; then + echo 1>&2 "error: Cannot generate a template configuration because a configuration file exists." + exit 1 + fi + + echo "Generate a template configuration that you should edit." + + # Generate a template configuration file where the user has to + # fill the gaps. + echo > "$NIXOS_CONFIG" \ +'# Edit this configuration file which defines what would be installed on the +# system. To Help while choosing option value, you can watch at the manual +# page of configuration.nix or at the last chapter of the manual available +# on the virtual console 8 (Alt+F8). + +{config, pkgs, ...}: + +{ + require = [ + # Include the configuration for part of your system which have been + # detected automatically. In addition, it includes the same + # configuration as the installation device that you used. + ./hardware-configuration.nix + ]; + + boot.initrd.kernelModules = [ + # Specify all kernel modules that are necessary for mounting the root + # file system. + # + # "ext4" "ata_piix" + ]; + + boot.loader.grub = { + # Use grub 2 as boot loader. + enable = true; + version = 2; + + # Define on which hard drive you want to install Grub. + # device = "/dev/sda"; + }; + + networking = { + # hostName = "nixos"; # Define your hostname. + interfaceMonitor.enable = true; # Watch for plugged cable. + enableWLAN = true; # Enables Wireless. + }; + + # Add file system entries for each partition that you want to see mounted + # at boot time. You can add filesystems which are not mounted at boot by + # adding the noauto option. + fileSystems = [ + # Mount the root file system + # + # { mountPoint = "/"; + # device = "/dev/sda2"; + # } + + # Copy & Paste & Uncomment & Modify to add any other file system. + # + # { mountPoint = "/data"; # where you want to mount the device + # device = "/dev/sdb"; # the device or the label of the device + # # label = "data"; + # fsType = "ext3"; # the type of the partition. + # options = "data=journal"; + # } + ]; + + swapDevices = [ + # List swap partitions that are mounted at boot time. + # + # { device = "/dev/sda1"; } + ]; + + # Select internationalisation properties. + # i18n = { + # consoleFont = "lat9w-16"; + # consoleKeyMap = "us"; + # defaultLocale = "en_US.UTF-8"; + # }; + + # List services that you want to enable: + + # Add an OpenSSH daemon. + # services.openssh.enable = true; + + # Add CUPS to print documents. + # services.printing.enable = true; + + # Add XServer (default if you have used a graphical iso) + # service.xserver = { + # enable = true; + # layout = "us"; + # xkbOptions = "eurosign:e"; + # }; + + # Add the NixOS Manual on virtual console 8 + services.nixosManual.showManual = true; +} +' + + exit 0 +fi; if test "$(evalOpt "_type" 2> /dev/null)" = '"option"'; then $value && evalCfg;