1
0
mirror of https://github.com/nix-community/home-manager synced 2024-06-26 16:38:34 +02:00
home-manager/modules/systemd.nix

126 lines
3.1 KiB
Nix
Raw Normal View History

2017-01-07 19:16:26 +01:00
{ config, lib, pkgs, ... }:
with lib;
with import ./lib/dag.nix { inherit lib; };
2017-01-07 19:16:26 +01:00
let
cfg = config.systemd.user;
2017-06-29 01:06:08 +02:00
enabled = cfg.services != {}
|| cfg.sockets != {}
|| cfg.targets != {}
|| cfg.timers != {};
2017-09-21 13:18:33 +02:00
toSystemdIni = generators.toINI {
2017-01-07 19:16:26 +01:00
mkKeyValue = key: value:
let
value' =
if isBool value then (if value then "true" else "false")
else toString value;
in
"${key}=${value'}";
};
buildService = style: name: serviceCfg:
let
source = pkgs.writeText "${name}.${style}" (toSystemdIni serviceCfg);
2017-01-07 19:16:26 +01:00
wantedBy = target:
{
name = "systemd/user/${target}.wants/${name}.${style}";
value = { inherit source; };
2017-01-07 19:16:26 +01:00
};
in
singleton {
name = "systemd/user/${name}.${style}";
value = { inherit source; };
2017-01-07 19:16:26 +01:00
}
++
map wantedBy (serviceCfg.Install.WantedBy or []);
buildServices = style: serviceCfgs:
concatLists (mapAttrsToList (buildService style) serviceCfgs);
in
{
meta.maintainers = [ maintainers.rycee ];
2017-01-07 19:16:26 +01:00
options = {
systemd.user = {
systemctlPath = mkOption {
default = "${pkgs.systemd}/bin/systemctl";
defaultText = "\${pkgs.systemd}/bin/systemctl";
type = types.str;
description = ''
Absolute path to the <command>systemctl</command> tool. This
option may need to be set if running Home Manager on a
non-NixOS distribution.
'';
};
2017-01-07 19:16:26 +01:00
services = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user service units.";
};
2017-06-29 01:06:08 +02:00
sockets = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user sockets";
};
targets = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user targets";
};
2017-01-07 19:16:26 +01:00
timers = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user timers";
};
};
};
config = mkMerge [
{
assertions = [
{
assertion = enabled -> pkgs.stdenv.isLinux;
message =
let
names = concatStringsSep ", " (
2017-06-29 01:06:08 +02:00
attrNames (
cfg.services // cfg.sockets // cfg.targets // cfg.timers
)
);
in
"Must use Linux for modules that require systemd: " + names;
}
];
}
# If we run under a Linux system we assume that systemd is
# available, in particular we assume that systemctl is in PATH.
(mkIf pkgs.stdenv.isLinux {
xdg.configFile =
listToAttrs (
(buildServices "service" cfg.services)
++
2017-06-29 01:06:08 +02:00
(buildServices "socket" cfg.sockets)
++
(buildServices "target" cfg.targets)
++
(buildServices "timer" cfg.timers)
);
home.activation.reloadSystemD = dagEntryAfter ["linkGeneration"]
(import ./systemd-activate.nix cfg.systemctlPath);
})
];
2017-01-07 19:16:26 +01:00
}