]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Use systemd RuntimeDirectory and StateDirectory entries to ensure runtime directory...
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 12 May 2019 12:33:46 +0000 (14:33 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 12 May 2019 12:33:46 +0000 (14:33 +0200)
modules/webapps/diaspora.nix
modules/webapps/mastodon.nix
modules/webapps/mediagoblin.nix
nixops/modules/buildbot/default.nix
nixops/modules/databases/redis.nix
nixops/modules/mpd.nix
nixops/modules/task/default.nix

index 8451c6d341da11139e3a58857b507995305a2753..226633202792a24bb08345a1d07436754a223803 100644 (file)
@@ -52,6 +52,26 @@ in
         '';
     };
     # Output variables
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Diaspora data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Diaspora sockets directory for systemd
+      '';
+      readOnly = true;
+    };
     workdir = lib.mkOption {
       type = lib.types.package;
       default = cfg.package.override {
@@ -134,6 +154,8 @@ in
         Restart = "always";
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
         StandardInput = "null";
         KillMode = "control-group";
       };
@@ -144,10 +166,8 @@ in
     system.activationScripts.diaspora = {
       deps = [ "users" ];
       text = ''
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.socketsDir}
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} \
-        ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp \
-        ${cfg.dataDir}/log
+      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir}/uploads \
+        ${cfg.dataDir}/tmp ${cfg.dataDir}/log
       install -m 0700 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir}/tmp/pids
       if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
         echo "{}" | $wrapperDir/sudo -u ${cfg.user} tee ${cfg.dataDir}/schedule.yml
index ad6d0c3aa625cdb15408dda1940a6554fed38212..f8fbcbaf4e2bec0045297d25a25d2b8c870168cd 100644 (file)
@@ -62,6 +62,26 @@ in
       '';
       readOnly = true;
     };
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Mastodon data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Mastodon sockets directory for systemd
+      '';
+      readOnly = true;
+    };
     sockets = lib.mkOption {
       type = lib.types.attrsOf lib.types.path;
       default = {
@@ -122,6 +142,9 @@ in
         TimeoutSec = 15;
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
       };
 
       unitConfig.RequiresMountsFor = cfg.dataDir;
@@ -155,6 +178,9 @@ in
         TimeoutSec = 60;
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
       };
 
       unitConfig.RequiresMountsFor = cfg.dataDir;
@@ -184,6 +210,9 @@ in
         TimeoutSec = 15;
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
       };
 
       unitConfig.RequiresMountsFor = cfg.dataDir;
@@ -192,8 +221,7 @@ in
     system.activationScripts.mastodon = {
       deps = [ "users" ];
       text = ''
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.socketsDir}
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} ${cfg.dataDir}/tmp/cache
+      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir}/tmp/cache
       '';
     };
 
index 0232aab2efa0e510ecc3c8b71ae9e5845cf979ea..575345758e1e090934d595cf14a5e2578fe45da3 100644 (file)
@@ -107,6 +107,26 @@ in
       '';
       readOnly = true;
     };
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Mediagoblin data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Mediagoblin sockets directory for systemd
+      '';
+      readOnly = true;
+    };
     sockets = lib.mkOption {
       type = lib.types.attrsOf lib.types.path;
       default = {
@@ -173,6 +193,8 @@ in
         TimeoutSec = 15;
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StateDirectory= cfg.systemdStateDirectory;
         PIDFile = cfg.pids.paster;
       };
 
@@ -200,6 +222,8 @@ in
         TimeoutSec = 60;
         Type = "simple";
         WorkingDirectory = cfg.workdir;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StateDirectory= cfg.systemdStateDirectory;
         PIDFile = cfg.pids.celery;
       };
 
@@ -209,8 +233,6 @@ in
     system.activationScripts.mediagoblin = {
       deps = [ "users" ];
       text = ''
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.socketsDir}
-      install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir}
       if [ -d ${cfg.dataDir}/plugin_static/ ]; then
         rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
         ln -sf ${cfg.workdir}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
index d7dd47943aac86676b582d8f08135ba3714d8417..c812af9296a4c5b69b5313cb6bf24e3c6796c7a6 100644 (file)
@@ -61,11 +61,7 @@ in
 
     system.activationScripts = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
       deps = [ "users" "wrappers" ];
-      text = ''
-      install -m 0755 -o buildbot -g buildbot -d /run/buildbot/
-      install -m 0755 -o buildbot -g buildbot -d ${varDir}
-      ${project.activationScript}
-      '';
+      text = project.activationScript;
     }) myconfig.env.buildbot.projects;
 
     secrets.keys = (
@@ -190,6 +186,9 @@ in
         Type = "forking";
         User = "buildbot";
         Group = "buildbot";
+        RuntimeDirectory = "buildbot";
+        RuntimeDirectoryPreserve = "yes";
+        StateDirectory = "buildbot";
         SupplementaryGroups = "keys";
         WorkingDirectory = "${varDir}/${project.name}";
         ExecStart = "${buildbot}/bin/buildbot start";
index a0917df618a19ae17fac9efbd474fcff482513d3..75c69a6064387a2495070bc6aea7f154f8e76316 100644 (file)
@@ -27,11 +27,9 @@ in {
         maxclients 1024
         '';
     };
-    system.activationScripts.redis = ''
-      mkdir -p $(dirname ${myconfig.env.databases.redis.socket})
-      chown redis $(dirname ${myconfig.env.databases.redis.socket})
-    '';
-
+    systemd.services.redis.serviceConfig.RuntimeDirectory =
+      assert myconfig.env.databases.redis.socket == "/run/redis/redis.sock";
+      "redis";
   };
 }
 
index bc8b8df5e4f817ba0af45a3a055ad7d5649e6568..9903bdf0d2ba1dea3701057c740f75a7644610a3 100644 (file)
@@ -19,9 +19,7 @@
     ];
     networking.firewall.allowedTCPPorts = [ 6600 ];
     users.users.mpd.extraGroups = [ "wwwrun" "keys" ];
-    system.activationScripts.mpd = ''
-      install -d -m 0755 -o mpd -g mpd /run/mpd
-      '';
+    systemd.services.mpd.serviceConfig.RuntimeDirectory = "mpd";
     services.mpd = {
       enable = true;
       network.listenAddress = "any";
index 8454c4b8008d8b4e0509c1a6b9c51040f2b6567c..83706084a741fae4cff3ff8f0bd40afda2092200 100644 (file)
@@ -245,12 +245,6 @@ in {
     system.activationScripts.taskwarrior-web = {
       deps = [ "users" ];
       text = ''
-        install -m 0755 -o ${user} -g ${group} -d ${socketsDir}
-        install -m 0750 -o ${user} -g ${group} -d ${varDir}
-        ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList
-          (k: v: "install -m 0750 -o ${user} -g ${group} -d ${varDir}/${k}")
-          env.taskwarrior-web
-        )}
         if [ ! -f ${server_vardir}/userkeys/taskwarrior-web.cert.pem ]; then
           ${taskserver-user-certs}/bin/taskserver-user-certs taskwarrior-web
           chown taskd:taskd ${server_vardir}/userkeys/taskwarrior-web.cert.pem ${server_vardir}/userkeys/taskwarrior-web.key.pem
@@ -315,6 +309,12 @@ in {
           TimeoutSec = 60;
           Type = "simple";
           WorkingDirectory = taskwarrior-web;
+          StateDirectoryMode = 0750;
+          StateDirectory = assert lib.strings.hasPrefix "/var/lib/" varDir;
+            (lib.strings.removePrefix "/var/lib/" varDir + "/${name}");
+          RuntimeDirectoryPreserve = "yes";
+          RuntimeDirectory = assert lib.strings.hasPrefix "/run/" socketsDir;
+            lib.strings.removePrefix "/run/" socketsDir;
         };
 
         unitConfig.RequiresMountsFor = varDir;