summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-10-14 18:05:50 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-10-14 18:18:47 +0200
commit5f077e229625583072ebf63ea48b11170771b0ed (patch)
treefcd1a6ee296febd5d0ba956dcff2f0176c9661b0
parent7b001ed68a6cc0dd4c2982fdf72c9c26d0595eee (diff)
Factor out option renaming
Option aliases/deprecations can now be declared in any NixOS module, not just in nixos/modules/rename.nix. This is more modular (since it allows for example grub-related aliases to be declared in the grub module), and allows aliases outside of NixOS (e.g. in NixOps modules). The syntax is a bit funky. Ideally we'd have something like: options = { foo.bar.newOption = mkOption { ... }; foo.bar.oldOption = mkAliasOption [ "foo" "bar" "newOption" ]; }; but that's not possible because options cannot define values in *other* options - you need to have a "config" for that. So instead we have functions that return a *module*: mkRemovedOptionModule, mkRenamedOptionModule and mkAliasOptionModule. These can be used via "imports", e.g. imports = [ (mkAliasOptionModule [ "foo" "bar" "oldOption" ] [ "foo" "bar" "newOption" ]); ]; As an added bonus, deprecation warnings now show the file name of the offending module. Fixes #10385.
-rw-r--r--lib/modules.nix65
-rw-r--r--nixos/modules/config/users-groups.nix4
-rw-r--r--nixos/modules/rename.nix252
-rw-r--r--nixos/modules/system/boot/loader/grub/grub.nix11
-rw-r--r--nixos/modules/system/boot/systemd.nix7
5 files changed, 172 insertions, 167 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 3e4d0547ecc5..12ec7004d1ee 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -469,6 +469,7 @@ rec {
mkBefore = mkOrder 500;
mkAfter = mkOrder 1500;
+
# Convenient property used to transfer all definitions and their
# properties from one option to another. This property is useful for
# renaming options, and also for including properties from another module
@@ -498,4 +499,68 @@ rec {
/* Compatibility. */
fixMergeModules = modules: args: evalModules { inherit modules args; check = false; };
+
+ /* Return a module that causes a warning to be shown if the
+ specified option is defined. For example,
+
+ mkRemovedOptionModule [ "boot" "loader" "grub" "bootDevice" ]
+
+ causes a warning if the user defines boot.loader.grub.bootDevice.
+ */
+ mkRemovedOptionModule = optionName:
+ { options, ... }:
+ { options = setAttrByPath optionName (mkOption {
+ visible = false;
+ });
+ config.warnings =
+ let opt = getAttrFromPath optionName options; in
+ optional opt.isDefined
+ "The option definition `${showOption optionName}' in ${showFiles opt.files} no longer has any effect; please remove it.";
+ };
+
+ /* Return a module that causes a warning to be shown if the
+ specified "from" option is defined; the defined value is however
+ forwarded to the "to" option. This can be used to rename options
+ while providing backward compatibility. For example,
+
+ mkRenamedOptionModule [ "boot" "copyKernels" ] [ "boot" "loader" "grub" "copyKernels" ]
+
+ forwards any definitions of boot.copyKernels to
+ boot.loader.grub.copyKernels while printing a warning.
+ */
+ mkRenamedOptionModule = from: to: doRename {
+ inherit from to;
+ visible = false;
+ warn = true;
+ use = builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'.";
+ };
+
+ /* Like ‘mkRenamedOptionModule’, but doesn't show a warning. */
+ mkAliasOptionModule = from: to: doRename {
+ inherit from to;
+ visible = true;
+ warn = false;
+ use = id;
+ };
+
+ doRename = { from, to, visible, warn, use }:
+ let
+ toOf = attrByPath to
+ (abort "Renaming error: option `${showOption to}' does not exists.");
+ in
+ { config, options, ... }:
+ { options = setAttrByPath from (mkOption {
+ description = "Alias of <option>${showOption to}</option>.";
+ apply = x: use (toOf config);
+ });
+ config = {
+ /*
+ warnings =
+ let opt = getAttrFromPath from options; in
+ optional (warn && opt.isDefined)
+ "The option `${showOption from}' defined in ${showFiles opt.files} has been renamed to `${showOption to}'.";
+ */
+ } // setAttrByPath to (mkAliasDefinitions (getAttrFromPath from options));
+ };
+
}
diff --git a/nixos/modules/config/users-groups.nix b/nixos/modules/config/users-groups.nix
index adc014eed415..485926fb1dd0 100644
--- a/nixos/modules/config/users-groups.nix
+++ b/nixos/modules/config/users-groups.nix
@@ -550,4 +550,8 @@ in {
};
+ imports =
+ [ (mkAliasOptionModule [ "users" "extraUsers" ] [ "users" "users" ])
+ (mkAliasOptionModule [ "users" "extraGroups" ] [ "users" "groups" ])
+ ];
}
diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index 62be7dc6cae2..28ac1c3e888a 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -1,170 +1,88 @@
-{ config, lib, options, ... }:
+{ lib, ... }:
with lib;
-let
-
- alias = from: to: rename {
- inherit from to;
- name = "Alias";
- use = id;
- define = id;
- visible = true;
- };
-
- # warn option was renamed
- obsolete = from: to: rename {
- inherit from to;
- name = "Obsolete name";
- use = x: builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'." x;
- define = x: builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'." x;
- };
-
- # abort if deprecated option is used
- deprecated = from: to: rename {
- inherit from to;
- name = "Deprecated name";
- use = x: abort "Deprecated option `${showOption from}' is used. It was renamed to `${showOption to}'.";
- define = x: abort "Deprecated option `${showOption from}' is used. It was renamed to `${showOption to}'.";
- };
-
- showOption = concatStringsSep ".";
-
- zipModules = list:
- zipAttrsWith (n: v:
- if tail v != [] then
- if all (o: isAttrs o && o ? _type) v then mkMerge v
- else if n == "_type" then head v
- else if n == "warnings" then concatLists v
- else if n == "description" || n == "apply" then
- abort "Cannot rename an option to multiple options."
- else zipModules v
- else head v
- ) list;
-
- rename = { from, to, name, use, define, visible ? false }:
- let
- setTo = setAttrByPath to;
- setFrom = setAttrByPath from;
- toOf = attrByPath to
- (abort "Renaming error: option `${showOption to}' does not exists.");
- fromOf = attrByPath from
- (abort "Internal error: option `${showOption from}' should be declared.");
- in
- [ { options = setFrom (mkOption {
- description = "${name} of <option>${showOption to}</option>.";
- apply = x: use (toOf config);
- inherit visible;
- });
-
- config = setTo (mkAliasAndWrapDefinitions define (fromOf options));
- }
- ];
-
- obsolete' = option: singleton
- { options = setAttrByPath option (mkOption {
- default = null;
- visible = false;
- });
- config.warnings = optional (getAttrFromPath option config != null)
- "The option `${showOption option}' defined in your configuration no longer has any effect; please remove it.";
- };
-
-in zipModules ([]
-
-++ obsolete [ "environment" "x11Packages" ] [ "environment" "systemPackages" ]
-++ obsolete [ "environment" "enableBashCompletion" ] [ "programs" "bash" "enableCompletion" ]
-++ obsolete [ "environment" "nix" ] [ "nix" "package" ]
-++ obsolete [ "fonts" "enableFontConfig" ] [ "fonts" "fontconfig" "enable" ]
-++ obsolete [ "fonts" "extraFonts" ] [ "fonts" "fonts" ]
-++ alias [ "users" "extraUsers" ] [ "users" "users" ]
-++ alias [ "users" "extraGroups" ] [ "users" "groups" ]
-
-++ obsolete [ "security" "extraSetuidPrograms" ] [ "security" "setuidPrograms" ]
-++ obsolete [ "networking" "enableWLAN" ] [ "networking" "wireless" "enable" ]
-++ obsolete [ "networking" "enableRT73Firmware" ] [ "networking" "enableRalinkFirmware" ]
-
-# FIXME: Remove these eventually.
-++ obsolete [ "boot" "systemd" "sockets" ] [ "systemd" "sockets" ]
-++ obsolete [ "boot" "systemd" "targets" ] [ "systemd" "targets" ]
-++ obsolete [ "boot" "systemd" "services" ] [ "systemd" "services" ]
-
-# Old Grub-related options.
-++ obsolete [ "boot" "copyKernels" ] [ "boot" "loader" "grub" "copyKernels" ]
-++ obsolete [ "boot" "extraGrubEntries" ] [ "boot" "loader" "grub" "extraEntries" ]
-++ obsolete [ "boot" "extraGrubEntriesBeforeNixos" ] [ "boot" "loader" "grub" "extraEntriesBeforeNixOS" ]
-++ obsolete [ "boot" "grubDevice" ] [ "boot" "loader" "grub" "device" ]
-++ obsolete [ "boot" "bootMount" ] [ "boot" "loader" "grub" "bootDevice" ]
-++ obsolete [ "boot" "grubSplashImage" ] [ "boot" "loader" "grub" "splashImage" ]
-
-++ obsolete [ "boot" "initrd" "extraKernelModules" ] [ "boot" "initrd" "kernelModules" ]
-++ obsolete [ "boot" "extraKernelParams" ] [ "boot" "kernelParams" ]
-
-# smartd
-++ obsolete [ "services" "smartd" "deviceOpts" ] [ "services" "smartd" "defaults" "monitored" ]
-
-# OpenSSH
-++ obsolete [ "services" "sshd" "ports" ] [ "services" "openssh" "ports" ]
-++ alias [ "services" "sshd" "enable" ] [ "services" "openssh" "enable" ]
-++ obsolete [ "services" "sshd" "allowSFTP" ] [ "services" "openssh" "allowSFTP" ]
-++ obsolete [ "services" "sshd" "forwardX11" ] [ "services" "openssh" "forwardX11" ]
-++ obsolete [ "services" "sshd" "gatewayPorts" ] [ "services" "openssh" "gatewayPorts" ]
-++ obsolete [ "services" "sshd" "permitRootLogin" ] [ "services" "openssh" "permitRootLogin" ]
-++ obsolete [ "services" "xserver" "startSSHAgent" ] [ "services" "xserver" "startOpenSSHAgent" ]
-++ obsolete [ "services" "xserver" "startOpenSSHAgent" ] [ "programs" "ssh" "startAgent" ]
-++ alias [ "services" "openssh" "knownHosts" ] [ "programs" "ssh" "knownHosts" ]
-
-# VirtualBox
-++ obsolete [ "services" "virtualbox" "enable" ] [ "virtualisation" "virtualbox" "guest" "enable" ]
-++ obsolete [ "services" "virtualboxGuest" "enable" ] [ "virtualisation" "virtualbox" "guest" "enable" ]
-++ obsolete [ "programs" "virtualbox" "enable" ] [ "virtualisation" "virtualbox" "host" "enable" ]
-++ obsolete [ "programs" "virtualbox" "addNetworkInterface" ] [ "virtualisation" "virtualbox" "host" "addNetworkInterface" ]
-++ obsolete [ "programs" "virtualbox" "enableHardening" ] [ "virtualisation" "virtualbox" "host" "enableHardening" ]
-++ obsolete [ "services" "virtualboxHost" "enable" ] [ "virtualisation" "virtualbox" "host" "enable" ]
-++ obsolete [ "services" "virtualboxHost" "addNetworkInterface" ] [ "virtualisation" "virtualbox" "host" "addNetworkInterface" ]
-++ obsolete [ "services" "virtualboxHost" "enableHardening" ] [ "virtualisation" "virtualbox" "host" "enableHardening" ]
-
-# Tarsnap
-++ obsolete [ "services" "tarsnap" "config" ] [ "services" "tarsnap" "archives" ]
-
-# proxy
-++ obsolete [ "nix" "proxy" ] [ "networking" "proxy" "default" ]
-
-# KDE
-++ deprecated [ "kde" "extraPackages" ] [ "environment" "systemPackages" ]
-++ obsolete [ "environment" "kdePackages" ] [ "environment" "systemPackages" ]
-
-# Multiple efi bootloaders now
-++ obsolete [ "boot" "loader" "efi" "efibootmgr" "enable" ] [ "boot" "loader" "efi" "canTouchEfiVariables" ]
-
-# NixOS environment changes
-# !!! this hardcodes bash, could we detect from config which shell is actually used?
-++ obsolete [ "environment" "promptInit" ] [ "programs" "bash" "promptInit" ]
-
-++ obsolete [ "services" "xserver" "driSupport" ] [ "hardware" "opengl" "driSupport" ]
-++ obsolete [ "services" "xserver" "driSupport32Bit" ] [ "hardware" "opengl" "driSupport32Bit" ]
-++ obsolete [ "services" "xserver" "s3tcSupport" ] [ "hardware" "opengl" "s3tcSupport" ]
-++ obsolete [ "hardware" "opengl" "videoDrivers" ] [ "services" "xserver" "videoDrivers" ]
-
-++ obsolete [ "services" "mysql55" ] [ "services" "mysql" ]
-
-++ alias [ "environment" "checkConfigurationOptions" ] [ "_module" "check" ]
-
-# XBMC
-++ obsolete [ "services" "xserver" "windowManager" "xbmc" ] [ "services" "xserver" "desktopManager" "kodi" ]
-++ obsolete [ "services" "xserver" "desktopManager" "xbmc" ] [ "services" "xserver" "desktopManager" "kodi" ]
-
-# DNSCrypt-proxy
-++ obsolete [ "services" "dnscrypt-proxy" "port" ] [ "services" "dnscrypt-proxy" "localPort" ]
-
-# Options that are obsolete and have no replacement.
-++ obsolete' [ "boot" "loader" "grub" "bootDevice" ]
-++ obsolete' [ "boot" "initrd" "luks" "enable" ]
-++ obsolete' [ "programs" "bash" "enable" ]
-++ obsolete' [ "services" "samba" "defaultShare" ]
-++ obsolete' [ "services" "syslog-ng" "serviceName" ]
-++ obsolete' [ "services" "syslog-ng" "listenToJournal" ]
-++ obsolete' [ "ec2" "metadata" ]
-++ obsolete' [ "services" "openvpn" "enable" ]
-
-)
+{
+ imports = [
+ (mkRenamedOptionModule [ "environment" "x11Packages" ] [ "environment" "systemPackages" ])
+ (mkRenamedOptionModule [ "environment" "enableBashCompletion" ] [ "programs" "bash" "enableCompletion" ])
+ (mkRenamedOptionModule [ "environment" "nix" ] [ "nix" "package" ])
+ (mkRenamedOptionModule [ "fonts" "enableFontConfig" ] [ "fonts" "fontconfig" "enable" ])
+ (mkRenamedOptionModule [ "fonts" "extraFonts" ] [ "fonts" "fonts" ])
+
+ (mkRenamedOptionModule [ "security" "extraSetuidPrograms" ] [ "security" "setuidPrograms" ])
+ (mkRenamedOptionModule [ "networking" "enableWLAN" ] [ "networking" "wireless" "enable" ])
+ (mkRenamedOptionModule [ "networking" "enableRT73Firmware" ] [ "networking" "enableRalinkFirmware" ])
+
+ # Old Grub-related options.
+ (mkRenamedOptionModule [ "boot" "initrd" "extraKernelModules" ] [ "boot" "initrd" "kernelModules" ])
+ (mkRenamedOptionModule [ "boot" "extraKernelParams" ] [ "boot" "kernelParams" ])
+
+ # smartd
+ (mkRenamedOptionModule [ "services" "smartd" "deviceOpts" ] [ "services" "smartd" "defaults" "monitored" ])
+
+ # OpenSSH
+ (mkRenamedOptionModule [ "services" "sshd" "ports" ] [ "services" "openssh" "ports" ])
+ (mkAliasOptionModule [ "services" "sshd" "enable" ] [ "services" "openssh" "enable" ])
+ (mkRenamedOptionModule [ "services" "sshd" "allowSFTP" ] [ "services" "openssh" "allowSFTP" ])
+ (mkRenamedOptionModule [ "services" "sshd" "forwardX11" ] [ "services" "openssh" "forwardX11" ])
+ (mkRenamedOptionModule [ "services" "sshd" "gatewayPorts" ] [ "services" "openssh" "gatewayPorts" ])
+ (mkRenamedOptionModule [ "services" "sshd" "permitRootLogin" ] [ "services" "openssh" "permitRootLogin" ])
+ (mkRenamedOptionModule [ "services" "xserver" "startSSHAgent" ] [ "services" "xserver" "startOpenSSHAgent" ])
+ (mkRenamedOptionModule [ "services" "xserver" "startOpenSSHAgent" ] [ "programs" "ssh" "startAgent" ])
+ (mkAliasOptionModule [ "services" "openssh" "knownHosts" ] [ "programs" "ssh" "knownHosts" ])
+
+ # VirtualBox
+ (mkRenamedOptionModule [ "services" "virtualbox" "enable" ] [ "virtualisation" "virtualbox" "guest" "enable" ])
+ (mkRenamedOptionModule [ "services" "virtualboxGuest" "enable" ] [ "virtualisation" "virtualbox" "guest" "enable" ])
+ (mkRenamedOptionModule [ "programs" "virtualbox" "enable" ] [ "virtualisation" "virtualbox" "host" "enable" ])
+ (mkRenamedOptionModule [ "programs" "virtualbox" "addNetworkInterface" ] [ "virtualisation" "virtualbox" "host" "addNetworkInterface" ])
+ (mkRenamedOptionModule [ "programs" "virtualbox" "enableHardening" ] [ "virtualisation" "virtualbox" "host" "enableHardening" ])
+ (mkRenamedOptionModule [ "services" "virtualboxHost" "enable" ] [ "virtualisation" "virtualbox" "host" "enable" ])
+ (mkRenamedOptionModule [ "services" "virtualboxHost" "addNetworkInterface" ] [ "virtualisation" "virtualbox" "host" "addNetworkInterface" ])
+ (mkRenamedOptionModule [ "services" "virtualboxHost" "enableHardening" ] [ "virtualisation" "virtualbox" "host" "enableHardening" ])
+
+ # Tarsnap
+ (mkRenamedOptionModule [ "services" "tarsnap" "config" ] [ "services" "tarsnap" "archives" ])
+
+ # proxy
+ (mkRenamedOptionModule [ "nix" "proxy" ] [ "networking" "proxy" "default" ])
+
+ # KDE
+ (mkRenamedOptionModule [ "kde" "extraPackages" ] [ "environment" "systemPackages" ])
+ (mkRenamedOptionModule [ "environment" "kdePackages" ] [ "environment" "systemPackages" ])
+
+ # Multiple efi bootloaders now
+ (mkRenamedOptionModule [ "boot" "loader" "efi" "efibootmgr" "enable" ] [ "boot" "loader" "efi" "canTouchEfiVariables" ])
+
+ # NixOS environment changes
+ # !!! this hardcodes bash, could we detect from config which shell is actually used?
+ (mkRenamedOptionModule [ "environment" "promptInit" ] [ "programs" "bash" "promptInit" ])
+
+ (mkRenamedOptionModule [ "services" "xserver" "driSupport" ] [ "hardware" "opengl" "driSupport" ])
+ (mkRenamedOptionModule [ "services" "xserver" "driSupport32Bit" ] [ "hardware" "opengl" "driSupport32Bit" ])
+ (mkRenamedOptionModule [ "services" "xserver" "s3tcSupport" ] [ "hardware" "opengl" "s3tcSupport" ])
+ (mkRenamedOptionModule [ "hardware" "opengl" "videoDrivers" ] [ "services" "xserver" "videoDrivers" ])
+
+ (mkRenamedOptionModule [ "services" "mysql55" ] [ "services" "mysql" ])
+
+ (mkAliasOptionModule [ "environment" "checkConfigurationOptions" ] [ "_module" "check" ])
+
+ # XBMC
+ (mkRenamedOptionModule [ "services" "xserver" "windowManager" "xbmc" ] [ "services" "xserver" "desktopManager" "kodi" ])
+ (mkRenamedOptionModule [ "services" "xserver" "desktopManager" "xbmc" ] [ "services" "xserver" "desktopManager" "kodi" ])
+
+ # DNSCrypt-proxy
+ (mkRenamedOptionModule [ "services" "dnscrypt-proxy" "port" ] [ "services" "dnscrypt-proxy" "localPort" ])
+
+ # Options that are obsolete and have no replacement.
+ (mkRemovedOptionModule [ "boot" "initrd" "luks" "enable" ])
+ (mkRemovedOptionModule [ "programs" "bash" "enable" ])
+ (mkRemovedOptionModule [ "services" "samba" "defaultShare" ])
+ (mkRemovedOptionModule [ "services" "syslog-ng" "serviceName" ])
+ (mkRemovedOptionModule [ "services" "syslog-ng" "listenToJournal" ])
+ (mkRemovedOptionModule [ "ec2" "metadata" ])
+ (mkRemovedOptionModule [ "services" "openvpn" "enable" ])
+
+ ];
+}
diff --git a/nixos/modules/system/boot/loader/grub/grub.nix b/nixos/modules/system/boot/loader/grub/grub.nix
index ce3efc3cd7cd..5f09e937537f 100644
--- a/nixos/modules/system/boot/loader/grub/grub.nix
+++ b/nixos/modules/system/boot/loader/grub/grub.nix
@@ -488,4 +488,15 @@ in
];
+
+ imports =
+ [ (mkRemovedOptionModule [ "boot" "loader" "grub" "bootDevice" ])
+ (mkRenamedOptionModule [ "boot" "copyKernels" ] [ "boot" "loader" "grub" "copyKernels" ])
+ (mkRenamedOptionModule [ "boot" "extraGrubEntries" ] [ "boot" "loader" "grub" "extraEntries" ])
+ (mkRenamedOptionModule [ "boot" "extraGrubEntriesBeforeNixos" ] [ "boot" "loader" "grub" "extraEntriesBeforeNixOS" ])
+ (mkRenamedOptionModule [ "boot" "grubDevice" ] [ "boot" "loader" "grub" "device" ])
+ (mkRenamedOptionModule [ "boot" "bootMount" ] [ "boot" "loader" "grub" "bootDevice" ])
+ (mkRenamedOptionModule [ "boot" "grubSplashImage" ] [ "boot" "loader" "grub" "splashImage" ])
+ ];
+
}
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index 13c44e0930a3..4704b3981e46 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -772,4 +772,11 @@ in
};
+ # FIXME: Remove these eventually.
+ imports =
+ [ (mkRenamedOptionModule [ "boot" "systemd" "sockets" ] [ "systemd" "sockets" ])
+ (mkRenamedOptionModule [ "boot" "systemd" "targets" ] [ "systemd" "targets" ])
+ (mkRenamedOptionModule [ "boot" "systemd" "services" ] [ "systemd" "services" ])
+ ];
+
}