From 589aeb9297f6f2a99b98c07cb9a834bb5e25b9f0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Isma=C3=ABl=20Bouya?= Date: Sat, 1 Jun 2019 12:51:51 +0200 Subject: [PATCH] Refactor websites options --- modules/websites/default.nix | 229 ++++++++++++++------------- modules/websites/php-application.nix | 4 +- 2 files changed, 124 insertions(+), 109 deletions(-) diff --git a/modules/websites/default.nix b/modules/websites/default.nix index 2e1d23a4..ef79cb3c 100644 --- a/modules/websites/default.nix +++ b/modules/websites/default.nix @@ -1,119 +1,131 @@ { lib, config, ... }: with lib; let - cfg = { - certs = config.services.websitesCerts; - webappDirs = config.services.websitesWebappDirs; - env = config.services.websites; - }; + cfg = config.services.websites; in { - options.services.websitesCerts = mkOption { - description = "Default websites configuration for certificates as accepted by acme"; - }; - options.services.websitesWebappDirs = mkOption { - description = '' - Defines a symlink between /run/current-system/webapps and a store - app directory to be used in http configuration. Permits to avoid - restarting httpd when only the folder name changes. - ''; - type = types.attrsOf types.path; - default = {}; - }; - # TODO: ajouter /run/current-system/webapps (RO) et webapps (RW) - options.services.websites = with types; mkOption { - default = {}; - description = "Each type of website to enable will target a distinct httpd server"; - type = attrsOf (submodule { - options = { - enable = mkEnableOption "Enable websites of this type"; - adminAddr = mkOption { - type = str; - description = "Admin e-mail address of the instance"; - }; - httpdName = mkOption { - type = str; - description = "Name of the httpd instance to assign this type to"; - }; - ips = mkOption { - type = listOf string; - default = []; - description = "ips to listen to"; - }; - modules = mkOption { - type = listOf str; - default = []; - description = "Additional modules to load in Apache"; - }; - extraConfig = mkOption { - type = listOf lines; - default = []; - description = "Additional configuration to append to Apache"; - }; - nosslVhost = mkOption { - description = "A default nossl vhost for captive portals"; - default = {}; - type = submodule { - options = { - enable = mkEnableOption "Add default no-ssl vhost for this instance"; - host = mkOption { - type = string; - description = "The hostname to use for this vhost"; - }; - root = mkOption { - type = path; - default = ./nosslVhost; - description = "The root folder to serve"; - }; - indexFile = mkOption { - type = string; - default = "index.html"; - description = "The index file to show."; + options.services.websites = with types; { + certs = mkOption { + description = "Default websites configuration for certificates as accepted by acme"; + }; + webappDirs = mkOption { + description = '' + Defines a symlink between /run/current-system/webapps and a store + app directory to be used in http configuration. Permits to avoid + restarting httpd when only the folder name changes. + ''; + type = types.attrsOf types.path; + default = {}; + }; + webappDirsName = mkOption { + type = str; + default = "webapps"; + description = '' + Name of the webapp dir to create in /run/current-system + ''; + }; + webappDirsPath = mkOption { + type = str; + readOnly = true; + description = '' + Full path of the webapp dir + ''; + default = "/run/current-system/${cfg.webappDirsName}"; + }; + env = mkOption { + default = {}; + description = "Each type of website to enable will target a distinct httpd server"; + type = attrsOf (submodule { + options = { + enable = mkEnableOption "Enable websites of this type"; + adminAddr = mkOption { + type = str; + description = "Admin e-mail address of the instance"; + }; + httpdName = mkOption { + type = str; + description = "Name of the httpd instance to assign this type to"; + }; + ips = mkOption { + type = listOf string; + default = []; + description = "ips to listen to"; + }; + modules = mkOption { + type = listOf str; + default = []; + description = "Additional modules to load in Apache"; + }; + extraConfig = mkOption { + type = listOf lines; + default = []; + description = "Additional configuration to append to Apache"; + }; + nosslVhost = mkOption { + description = "A default nossl vhost for captive portals"; + default = {}; + type = submodule { + options = { + enable = mkEnableOption "Add default no-ssl vhost for this instance"; + host = mkOption { + type = string; + description = "The hostname to use for this vhost"; + }; + root = mkOption { + type = path; + default = ./nosslVhost; + description = "The root folder to serve"; + }; + indexFile = mkOption { + type = string; + default = "index.html"; + description = "The index file to show."; + }; }; }; }; - }; - fallbackVhost = mkOption { - description = "The fallback vhost that will be defined as first vhost in Apache"; - type = submodule { - options = { - certName = mkOption { type = string; }; - hosts = mkOption { type = listOf string; }; - root = mkOption { type = nullOr path; }; - extraConfig = mkOption { type = listOf lines; default = []; }; + fallbackVhost = mkOption { + description = "The fallback vhost that will be defined as first vhost in Apache"; + type = submodule { + options = { + certName = mkOption { type = string; }; + hosts = mkOption { type = listOf string; }; + root = mkOption { type = nullOr path; }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; }; }; - }; - vhostConfs = mkOption { - default = {}; - description = "List of vhosts to define for Apache"; - type = attrsOf (submodule { - options = { - certName = mkOption { type = string; }; - addToCerts = mkOption { - type = bool; - default = false; - description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null"; - }; - certMainHost = mkOption { - type = nullOr string; - description = "Use that host as 'main host' for acme certs"; - default = null; + vhostConfs = mkOption { + default = {}; + description = "List of vhosts to define for Apache"; + type = attrsOf (submodule { + options = { + certName = mkOption { type = string; }; + addToCerts = mkOption { + type = bool; + default = false; + description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null"; + }; + certMainHost = mkOption { + type = nullOr string; + description = "Use that host as 'main host' for acme certs"; + default = null; + }; + hosts = mkOption { type = listOf string; }; + root = mkOption { type = nullOr path; }; + extraConfig = mkOption { type = listOf lines; default = []; }; }; - hosts = mkOption { type = listOf string; }; - root = mkOption { type = nullOr path; }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }); - }; - watchPaths = mkOption { - type = listOf string; - default = []; - description = '' - Paths to watch that should trigger a reload of httpd - ''; + }); + }; + watchPaths = mkOption { + type = listOf string; + default = []; + description = '' + Paths to watch that should trigger a reload of httpd + ''; + }; }; - }; - }); + }); + }; }; config.services.httpd = let @@ -226,7 +238,10 @@ in ) groupedCerts; config.system.extraSystemBuilderCmds = lib.mkIf (builtins.length (builtins.attrValues cfg.webappDirs) > 0) '' - mkdir -p $out/webapps - ${builtins.concatStringsSep "\n" (attrsets.mapAttrsToList (name: path: "ln -s ${path} $out/webapps/${name}") cfg.webappDirs)} + mkdir -p $out/${cfg.webappDirsName} + ${builtins.concatStringsSep "\n" + (attrsets.mapAttrsToList + (name: path: "ln -s ${path} $out/${cfg.webappDirsName}/${name}") cfg.webappDirs) + } ''; } diff --git a/modules/websites/php-application.nix b/modules/websites/php-application.nix index 7bbae50a..765d4067 100644 --- a/modules/websites/php-application.nix +++ b/modules/websites/php-application.nix @@ -97,14 +97,14 @@ in }; config = { - services.websites = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair + services.websites.env = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair name { modules = [ "proxy_fcgi" ]; watchPaths = builtins.concatLists (map (c: c.watchFiles) cfgs); } ) cfgByEnv; - services.websitesWebappDirs = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + services.websites.webappDirs = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair icfg.webappName icfg.webRoot ) (attrsets.filterAttrs (n: v: !isNull v.webappName && !isNull v.webRoot) cfg); -- 2.41.0