3
0
Fork 0
forked from mirrors/nixpkgs

Merge pull request #85998 from helsinki-systems/make-nsswitch-more-flexible

nixos/nsswitch: Make databases more configurable
This commit is contained in:
Florian Klink 2020-04-29 01:28:33 +02:00 committed by GitHub
commit c01ac3ed12
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 104 additions and 37 deletions

View file

@ -10,35 +10,36 @@ let
canLoadExternalModules = config.services.nscd.enable; canLoadExternalModules = config.services.nscd.enable;
myhostname = canLoadExternalModules; myhostname = canLoadExternalModules;
mymachines = canLoadExternalModules; mymachines = canLoadExternalModules;
# XXX Move these to their respective modules
nssmdns = canLoadExternalModules && config.services.avahi.nssmdns; nssmdns = canLoadExternalModules && config.services.avahi.nssmdns;
nsswins = canLoadExternalModules && config.services.samba.nsswins; nsswins = canLoadExternalModules && config.services.samba.nsswins;
ldap = canLoadExternalModules && (config.users.ldap.enable && config.users.ldap.nsswitch); ldap = canLoadExternalModules && (config.users.ldap.enable && config.users.ldap.nsswitch);
sssd = canLoadExternalModules && config.services.sssd.enable;
resolved = canLoadExternalModules && config.services.resolved.enable; resolved = canLoadExternalModules && config.services.resolved.enable;
googleOsLogin = canLoadExternalModules && config.security.googleOsLogin.enable; googleOsLogin = canLoadExternalModules && config.security.googleOsLogin.enable;
hostArray = [ "files" ] hostArray = mkMerge [
++ optional mymachines "mymachines" (mkBefore [ "files" ])
++ optional nssmdns "mdns_minimal [NOTFOUND=return]" (mkIf mymachines [ "mymachines" ])
++ optional nsswins "wins" (mkIf nssmdns [ "mdns_minimal [NOTFOUND=return]" ])
++ optional resolved "resolve [!UNAVAIL=return]" (mkIf nsswins [ "wins" ])
++ [ "dns" ] (mkIf resolved [ "resolve [!UNAVAIL=return]" ])
++ optional nssmdns "mdns" (mkAfter [ "dns" ])
++ optional myhostname "myhostname"; (mkIf nssmdns (mkOrder 1501 [ "mdns" ])) # 1501 to ensure it's after dns
(mkIf myhostname (mkOrder 1600 [ "myhostname" ])) # 1600 to ensure it's always the last
];
passwdArray = [ "files" ] passwdArray = mkMerge [
++ optional sssd "sss" (mkBefore [ "files" ])
++ optional ldap "ldap" (mkIf ldap [ "ldap" ])
++ optional mymachines "mymachines" (mkIf mymachines [ "mymachines" ])
++ optional googleOsLogin "cache_oslogin oslogin" (mkIf googleOsLogin [ "cache_oslogin oslogin" ])
++ [ "systemd" ]; (mkIf canLoadExternalModules (mkAfter [ "systemd" ]))
];
shadowArray = [ "files" ] shadowArray = mkMerge [
++ optional sssd "sss" (mkBefore [ "files" ])
++ optional ldap "ldap"; (mkIf ldap [ "ldap" ])
];
servicesArray = [ "files" ]
++ optional sssd "sss";
in { in {
options = { options = {
@ -61,17 +62,73 @@ in {
}; };
}; };
system.nssHosts = mkOption { system.nssDatabases = {
type = types.listOf types.str; passwd = mkOption {
default = []; type = types.listOf types.str;
example = [ "mdns" ]; description = ''
description = '' List of passwd entries to configure in <filename>/etc/nsswitch.conf</filename>.
List of host entries to configure in <filename>/etc/nsswitch.conf</filename>.
'';
};
Note that "files" is always prepended while "systemd" is appended if nscd is enabled.
This option only takes effect if nscd is enabled.
'';
default = [];
};
group = mkOption {
type = types.listOf types.str;
description = ''
List of group entries to configure in <filename>/etc/nsswitch.conf</filename>.
Note that "files" is always prepended while "systemd" is appended if nscd is enabled.
This option only takes effect if nscd is enabled.
'';
default = [];
};
shadow = mkOption {
type = types.listOf types.str;
description = ''
List of shadow entries to configure in <filename>/etc/nsswitch.conf</filename>.
Note that "files" is always prepended.
This option only takes effect if nscd is enabled.
'';
default = [];
};
hosts = mkOption {
type = types.listOf types.str;
description = ''
List of hosts entries to configure in <filename>/etc/nsswitch.conf</filename>.
Note that "files" is always prepended, and "dns" and "myhostname" are always appended.
This option only takes effect if nscd is enabled.
'';
default = [];
};
services = mkOption {
type = types.listOf types.str;
description = ''
List of services entries to configure in <filename>/etc/nsswitch.conf</filename>.
Note that "files" is always prepended.
This option only takes effect if nscd is enabled.
'';
default = [];
};
};
}; };
imports = [
(mkRenamedOptionModule [ "system" "nssHosts" ] [ "system" "nssDatabases" "hosts" ])
];
config = { config = {
assertions = [ assertions = [
{ {
@ -87,23 +144,28 @@ in {
]; ];
# Name Service Switch configuration file. Required by the C # Name Service Switch configuration file. Required by the C
# library. !!! Factor out the mdns stuff. The avahi module # library.
# should define an option used by this module.
environment.etc."nsswitch.conf".text = '' environment.etc."nsswitch.conf".text = ''
passwd: ${concatStringsSep " " passwdArray} passwd: ${concatStringsSep " " config.system.nssDatabases.passwd}
group: ${concatStringsSep " " passwdArray} group: ${concatStringsSep " " config.system.nssDatabases.group}
shadow: ${concatStringsSep " " shadowArray} shadow: ${concatStringsSep " " config.system.nssDatabases.shadow}
hosts: ${concatStringsSep " " config.system.nssHosts} hosts: ${concatStringsSep " " config.system.nssDatabases.hosts}
networks: files networks: files
ethers: files ethers: files
services: ${concatStringsSep " " servicesArray} services: ${concatStringsSep " " config.system.nssDatabases.services}
protocols: files protocols: files
rpc: files rpc: files
''; '';
system.nssHosts = hostArray; system.nssDatabases = {
passwd = passwdArray;
group = passwdArray;
shadow = shadowArray;
hosts = hostArray;
services = mkBefore [ "files" ];
};
# Systemd provides nss-myhostname to ensure that our hostname # Systemd provides nss-myhostname to ensure that our hostname
# always resolves to a valid IP address. It returns all locally # always resolves to a valid IP address. It returns all locally

View file

@ -75,6 +75,11 @@ in {
}; };
system.nssModules = optional cfg.enable pkgs.sssd; system.nssModules = optional cfg.enable pkgs.sssd;
system.nssDatabases = {
passwd = [ "sss" ];
shadow = [ "sss" ];
services = [ "sss" ];
};
services.dbus.packages = [ pkgs.sssd ]; services.dbus.packages = [ pkgs.sssd ];
}) })