From 72a510c26badf4d5c421673b21c859d7c9d2c2c4 Mon Sep 17 00:00:00 2001 From: Sander van der Burg Date: Wed, 3 Mar 2021 21:49:38 +0100 Subject: [PATCH] Initial version of a declarative fcron --- example-deployments/services/processes.nix | 8 +++++- services-agnostic/constructors.nix | 7 ++++- services-agnostic/fcron/declarative.nix | 32 ++++++++++++++++++++++ services-agnostic/fcron/default.nix | 18 +++++++++--- 4 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 services-agnostic/fcron/declarative.nix diff --git a/example-deployments/services/processes.nix b/example-deployments/services/processes.nix index 543b1ae..7a3d1fd 100644 --- a/example-deployments/services/processes.nix +++ b/example-deployments/services/processes.nix @@ -123,7 +123,13 @@ rec { }; fcron = { - pkg = constructors.fcron {}; + pkg = constructors.declarativeFcron { + fcrontabPerUser = { + systab = '' + @ 1 echo hello >> /tmp/hello + ''; + }; + }; requiresUniqueIdsFor = [ "uids" "gids" ]; }; diff --git a/services-agnostic/constructors.nix b/services-agnostic/constructors.nix index e96ff9e..d7a5776 100644 --- a/services-agnostic/constructors.nix +++ b/services-agnostic/constructors.nix @@ -63,7 +63,12 @@ in fcron = import ./fcron { inherit createManagedProcess stateDir spoolDir runtimeDir tmpDir forceDisableUserChange; - inherit (pkgs) writeTextFile fcron; + inherit (pkgs) lib writeTextFile fcron; + }; + + declarativeFcron = import ./fcron/declarative.nix { + inherit createManagedProcess stateDir spoolDir runtimeDir tmpDir forceDisableUserChange; + inherit (pkgs) lib writeTextFile fcron; }; hydra-evaluator = import ./hydra/hydra-evaluator.nix { diff --git a/services-agnostic/fcron/declarative.nix b/services-agnostic/fcron/declarative.nix new file mode 100644 index 0000000..a1045a9 --- /dev/null +++ b/services-agnostic/fcron/declarative.nix @@ -0,0 +1,32 @@ +{createManagedProcess, writeTextFile, lib, fcron, stateDir, runtimeDir, tmpDir, spoolDir, forceDisableUserChange}: + +{ instanceSuffix ? "" +, instanceName ? "fcron${instanceSuffix}" +, initialize ? "" +, fcrontabPerUser +}: + +let + fcronSpoolDir = "${spoolDir}/${instanceName}"; +in +import ./default.nix { + inherit createManagedProcess writeTextFile lib fcron stateDir runtimeDir tmpDir spoolDir forceDisableUserChange; +} { + inherit instanceSuffix instanceName; + + initialize = '' + ${lib.concatMapStrings (user: + let + fcrontab = builtins.getAttr user fcrontabPerUser; + fcrontabFile = writeTextFile { + name = "fcrontab-${user}"; + text = fcrontab; + }; + in + '' + cp ${fcrontabFile} ${fcronSpoolDir}/${user}.orig + '' + ) (builtins.attrNames fcrontabPerUser)} + ${initialize} + ''; +} diff --git a/services-agnostic/fcron/default.nix b/services-agnostic/fcron/default.nix index 92e374c..41585fc 100644 --- a/services-agnostic/fcron/default.nix +++ b/services-agnostic/fcron/default.nix @@ -1,5 +1,5 @@ -{createManagedProcess, writeTextFile, fcron, stateDir, runtimeDir, tmpDir, spoolDir, forceDisableUserChange}: -{instanceSuffix ? "", instanceName ? "fcron${instanceSuffix}"}: +{createManagedProcess, writeTextFile, lib, fcron, stateDir, runtimeDir, tmpDir, spoolDir, forceDisableUserChange}: +{instanceSuffix ? "", instanceName ? "fcron${instanceSuffix}", initialize ? ""}: let fcronSpoolDir = "${spoolDir}/${instanceName}"; @@ -24,11 +24,19 @@ in createManagedProcess { name = instanceName; inherit instanceName; + initialize = '' - mkdir -p ${fcronSpoolDir} + mkdir -p ${fcronEtcDir} + cp ${configFile} ${fcronEtcDir}/fcron.conf + chmod 644 ${fcronEtcDir}/fcron.conf + ${lib.optionalString (!forceDisableUserChange) '' + chown root:${group} ${fcronEtcDir}/fcron.conf + ''} + ${initialize} ''; + process = "${fcron}/bin/fcron"; - args = [ "--configfile" configFile ]; + args = [ "--configfile" "${fcronEtcDir}/fcron.conf" ]; foregroundProcessExtraArgs = [ "--foreground" "--nosyslog" ]; daemonExtraArgs = [ "--background" ]; @@ -39,6 +47,8 @@ createManagedProcess { users = { "${user}" = { inherit group; + homeDir = fcronSpoolDir; + createHomeDir = true; description = "Fcron user"; }; };