···187187 done
188188 done
189189190190- # Symlink all units defined by systemd.units. If these are also
191191- # provided by systemd or systemd.packages, then add them as
190190+ # Symlink units defined by systemd.units where override strategy
191191+ # shall be automatically detected. If these are also provided by
192192+ # systemd or systemd.packages, then add them as
192193 # <unit-name>.d/overrides.conf, which makes them extend the
193194 # upstream unit.
194194- for i in ${toString (mapAttrsToList (n: v: v.unit) units)}; do
195195+ for i in ${toString (mapAttrsToList
196196+ (n: v: v.unit)
197197+ (lib.filterAttrs (n: v: (attrByPath [ "overrideStrategy" ] "asDropinIfExists" v) == "asDropinIfExists") units))}; do
195198 fn=$(basename $i/*)
196199 if [ -e $out/$fn ]; then
197200 if [ "$(readlink -f $i/$fn)" = /dev/null ]; then
···208211 else
209212 ln -fs $i/$fn $out/
210213 fi
214214+ done
215215+216216+ # Symlink units defined by systemd.units which shall be
217217+ # treated as drop-in file.
218218+ for i in ${toString (mapAttrsToList
219219+ (n: v: v.unit)
220220+ (lib.filterAttrs (n: v: v ? overrideStrategy && v.overrideStrategy == "asDropin") units))}; do
221221+ fn=$(basename $i/*)
222222+ mkdir -p $out/$fn.d
223223+ ln -s $i/$fn $out/$fn.d/overrides.conf
211224 done
212225213226 # Create service aliases from aliases option.
···340353 '';
341354342355 targetToUnit = name: def:
343343- { inherit (def) aliases wantedBy requiredBy enable;
356356+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
344357 text =
345358 ''
346359 [Unit]
···349362 };
350363351364 serviceToUnit = name: def:
352352- { inherit (def) aliases wantedBy requiredBy enable;
365365+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
353366 text = commonUnitText def +
354367 ''
355368 [Service]
···371384 };
372385373386 socketToUnit = name: def:
374374- { inherit (def) aliases wantedBy requiredBy enable;
387387+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
375388 text = commonUnitText def +
376389 ''
377390 [Socket]
···382395 };
383396384397 timerToUnit = name: def:
385385- { inherit (def) aliases wantedBy requiredBy enable;
398398+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
386399 text = commonUnitText def +
387400 ''
388401 [Timer]
···391404 };
392405393406 pathToUnit = name: def:
394394- { inherit (def) aliases wantedBy requiredBy enable;
407407+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
395408 text = commonUnitText def +
396409 ''
397410 [Path]
···400413 };
401414402415 mountToUnit = name: def:
403403- { inherit (def) aliases wantedBy requiredBy enable;
416416+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
404417 text = commonUnitText def +
405418 ''
406419 [Mount]
···409422 };
410423411424 automountToUnit = name: def:
412412- { inherit (def) aliases wantedBy requiredBy enable;
425425+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
413426 text = commonUnitText def +
414427 ''
415428 [Automount]
···418431 };
419432420433 sliceToUnit = name: def:
421421- { inherit (def) aliases wantedBy requiredBy enable;
434434+ { inherit (def) aliases wantedBy requiredBy enable overrideStrategy;
422435 text = commonUnitText def +
423436 ''
424437 [Slice]
+16
nixos/lib/systemd-unit-options.nix
···4848 '';
4949 };
50505151+ overrideStrategy = mkOption {
5252+ default = "asDropinIfExists";
5353+ type = types.enum [ "asDropinIfExists" "asDropin" ];
5454+ description = lib.mdDoc ''
5555+ Defines how unit configuration is provided for systemd:
5656+5757+ `asDropinIfExists` creates a unit file when no unit file is provided by the package
5858+ otherwise a drop-in file name `overrides.conf`.
5959+6060+ `asDropin` creates a drop-in file named `overrides.conf`.
6161+ Mainly needed to define instances for systemd template units (e.g. `systemd-nspawn@mycontainer.service`).
6262+6363+ See also systemd.unit(1).
6464+ '';
6565+ };
6666+5167 requiredBy = mkOption {
5268 default = [];
5369 type = types.listOf unitNameType;
+7-4
nixos/modules/services/networking/mosquitto.nix
···5656 default = null;
5757 description = mdDoc ''
5858 Specifies the hashed password for the MQTT User.
5959- To generate hashed password install `mosquitto`
6060- package and use `mosquitto_passwd`.
5959+ To generate hashed password install the `mosquitto`
6060+ package and use `mosquitto_passwd`, then extract
6161+ the second field (after the `:`) from the generated
6262+ file.
6163 '';
6264 };
6365···6870 description = mdDoc ''
6971 Specifies the path to a file containing the
7072 hashed password for the MQTT user.
7171- To generate hashed password install `mosquitto`
7272- package and use `mosquitto_passwd`.
7373+ To generate hashed password install the `mosquitto`
7474+ package and use `mosquitto_passwd`, then remove the
7575+ `username:` prefix from the generated file.
7376 '';
7477 };
7578
···3333 }: let
3434 pythonPackages = let
3535 ensurePythonModules = items: let
3636+ exceptions = [
3737+ stdenv
3838+ ];
3639 providesSetupHook = lib.attrByPath [ "provides" "setupHook"] false;
3737- notValid = value: (lib.isDerivation value) && !((pythonPackages.hasPythonModule value) || (providesSetupHook value));
3838- func = name: value: if !(notValid value) then value else throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set.";
4040+ valid = value: !((lib.isDerivation value) && !((pythonPackages.hasPythonModule value) || (providesSetupHook value))) || (lib.elem value exceptions);
4141+ func = name: value: if (valid value) then value else throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set.";
3942 in lib.mapAttrs func items;
4043 in ensurePythonModules (callPackage
4144 # Function that when called