sigil/nixos-modules/systemd.nix

73 lines
2.0 KiB
Nix

{ config, pkgs, lib, ... }:
with lib; {
options.systemd.services = lib.mkOption {
type = types.attrsOf (types.submodule ({ name, config, ... }: {
options.genode = {
enable = lib.mkOption {
type = types.bool;
default = false;
description = "Translate this systemd unit to a Genode subsystem.";
};
interface = lib.mkOption {
type = with types; nullOr str;
default = null;
example = "eth0";
description = ''
Grant access to an IP stack for this interface.
Only UDP and TCP are supported. No raw device access.
'';
};
};
}));
};
config = {
services.klogd.enable = false;
# The default is determined by checking the Linux version
# which cannot be evaluated here.
genode.init.children = mapAttrs' (name: service:
let name' = "services." + name;
in {
name = name';
value = {
inputs = with pkgs;
with genodePackages; [
bash
cached_fs_rom
libc
posix
vfs
vfs_pipe
];
configFile = let
args = lib.strings.splitString " "
(toString service.serviceConfig.ExecStart);
binary = builtins.head args;
args' = ''[ "${concatStringsSep ''", "'' (builtins.tail args)}" ]'';
# TODO: service.environment;
interface = if service.genode.interface == null then
"None Text"
else
''Some "${service.genode.interface}"'';
in pkgs.writeText "${name'}.dhall" ''
${./systemd-runner.dhall} {
, args = ${args'}
, binary = "${binary}"
, coreutils = "${pkgs.coreutils}"
, interface = ${interface}
}
'';
};
}) (filterAttrs (name: service: service.genode.enable)
config.systemd.services);
};
}