88 lines
2.3 KiB
Nix
88 lines
2.3 KiB
Nix
{ stdenv
|
|
, pkgs
|
|
, lib
|
|
}:
|
|
|
|
with lib;
|
|
with lib.lists;
|
|
with lib.attrsets;
|
|
rec {
|
|
tmpFilesFromDirectories = user: group: d:
|
|
let
|
|
wrapTmpfiles = dir: mode: "d '${dir}' ${mode} ${user} ${group} - -";
|
|
in
|
|
mapAttrsToList wrapTmpfiles d;
|
|
|
|
systemd = {
|
|
mkService = {name, content, timer ? null}: stdenv.mkDerivation {
|
|
inherit name;
|
|
|
|
src = pkgs.writeTextDir "${name}.service" content;
|
|
timerSrc = pkgs.writeTextDir "${name}.timer" timer;
|
|
|
|
installPhase = ''
|
|
mkdir -p $out/etc/systemd/system
|
|
cp $src/*.service $out/etc/systemd/system
|
|
'' + (if timer == null then "" else ''
|
|
cp $timerSrc/*.timer $out/etc/systemd/system
|
|
'');
|
|
};
|
|
|
|
};
|
|
|
|
mkConfigFile = {dir, name, content}: stdenv.mkDerivation rec {
|
|
inherit name;
|
|
|
|
src = pkgs.writeTextDir name content;
|
|
|
|
buildCommand = ''
|
|
mkdir -p $out
|
|
cp ${src}/${name} $out/${name}
|
|
|
|
echo "${dir}" > $out/.dysnomia-targetdir
|
|
|
|
cat > $out/.dysnomia-fileset <<FILESET
|
|
symlink $out/${name}
|
|
target .
|
|
FILESET
|
|
'';
|
|
|
|
};
|
|
|
|
dnsmasqConfig = domain: subdomains:
|
|
''
|
|
${concatMapStringsSep "\n" (x: "address=/${x}.${domain}/127.0.0.1") subdomains}
|
|
domain=${domain}
|
|
'';
|
|
|
|
keyEnvironmentFile = path: "EnvironmentFile=/run/keys/${path}";
|
|
keyEnvironmentFiles = names: concatMapStrings (path: "${keyEnvironmentFile path}\n") (attrValues names);
|
|
keyServiceDependencies = names: concatMapStringsSep " " (path: "${path}-key.service") (attrValues names);
|
|
|
|
recursiveMerge = attrList:
|
|
let f = attrPath:
|
|
zipAttrsWith (n: values:
|
|
if all isList values then
|
|
concatLists values
|
|
else if all isAttrs values then
|
|
f (attrPath ++ [n]) values
|
|
else
|
|
last values
|
|
);
|
|
in f [] attrList;
|
|
|
|
getTarget = distribution: name: builtins.elemAt (builtins.getAttr name distribution) 0;
|
|
|
|
getDomain = distribution: name: (getTarget distribution name).containers.system.domain;
|
|
|
|
unitDepends = verb: dependsOn:
|
|
let
|
|
withSystemdUnitFile = filter (hasAttr "systemdUnitFile") (attrValues dependsOn);
|
|
|
|
systemdUnitFiles = map (x: x.systemdUnitFile) withSystemdUnitFile;
|
|
in
|
|
if length systemdUnitFiles == 0 then
|
|
""
|
|
else
|
|
"${verb}=${concatStringsSep " " systemdUnitFiles}";
|
|
}
|