From 0ee8760f8df0fcaa2a2ee4bb0077749c1d086c5a Mon Sep 17 00:00:00 2001 From: sinavir Date: Tue, 3 Oct 2023 01:03:42 +0200 Subject: [PATCH] feat(linkal): Put calendars of metis in a linkal instance --- machines/web01/linkal/default.nix | 28 ++++++++++++++++++++++++++-- machines/web01/linkal/module.nix | 18 ++++++++++++------ machines/web01/metis/default.nix | 20 +++++++++----------- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/machines/web01/linkal/default.nix b/machines/web01/linkal/default.nix index e67fb89..dbd9364 100644 --- a/machines/web01/linkal/default.nix +++ b/machines/web01/linkal/default.nix @@ -1,6 +1,26 @@ -_: - +{ lib, pkgs, sources, metisProviders, ...}: let + metisConf = pkgs.runCommandLocal "linkal-metis.json" {} '' + # jq dark magic + cat << EOF > script.jq + .sources | + ${lib.concatStringsSep " |\n" + (lib.mapAttrsToList (name: value: + ".\"${name}\" |= ( + to_entries | + map({(\"https://${value}/remote.php/dav/public-calendars/\" + .key): .value}) | + add + )" + ) metisProviders) + } | + to_entries | + map(.value) | + add | + { calendars: . } + EOF + + ${pkgs.jq}/bin/jq -f script.jq > $out < ${sources.metis}/data/calendars.json + ''; host = "cal.dgnum.eu"; calendarGroups = { @@ -19,6 +39,10 @@ let }; }; }; + ens = { + port = 8445; + config = metisConf; + }; }; in { imports = [ ./module.nix ]; diff --git a/machines/web01/linkal/module.nix b/machines/web01/linkal/module.nix index 63da24a..e35e6ee 100644 --- a/machines/web01/linkal/module.nix +++ b/machines/web01/linkal/module.nix @@ -1,7 +1,7 @@ { config, lib, pkgs, sources, ... }: let - inherit (lib) mapAttrs' mkEnableOption mkIf mkOption nameValuePair types; + inherit (lib) mapAttrs mapAttrs' mkEnableOption mkIf mkOption nameValuePair types; package = import sources.linkal { inherit pkgs; }; @@ -20,20 +20,26 @@ in { domain = mkOption { type = types.str; }; calendarGroups = mkOption { - type = let inherit (types) attrsOf port submodule; - in attrsOf (submodule { + type = let inherit (types) attrsOf port submodule path; + in attrsOf (submodule ({ config, ... }: { options = { port = mkOption { type = port; }; calendars = mkOption { inherit (jsonFormat) type; }; + config = mkOption { + type = path; + default = jsonFormat.generate "linkal-config.json" { inherit (config) calendars; }; + internal = true; + }; }; - }); + })); default = { }; }; }; config = mkIf cfg.enable { + systemd.services = mapAttrs' (name: - { port, calendars }: + { port, config, ... }: nameValuePair "linkal-${name}" { description = "Linkal - ${name}"; wantedBy = [ "multi-user.target" ]; @@ -42,7 +48,7 @@ in { ExecStart = "${cfg.package}/bin/linkal --port ${ builtins.toString port } --calendar-file ${ - jsonFormat.generate "linkal-${name}.json" { inherit calendars; } + config }"; }; }) cfg.calendarGroups; diff --git a/machines/web01/metis/default.nix b/machines/web01/metis/default.nix index 5ccdd77..dbe523c 100644 --- a/machines/web01/metis/default.nix +++ b/machines/web01/metis/default.nix @@ -1,30 +1,23 @@ -{ lib, pkgs, sources, ... }: +{ lib, pkgs, sources, metisProviders, ... }: let package = (import sources.metis { inherit pkgs; }).production; - providers = { - klub-reseau = "nuage.beta.rz.ens.wtf"; - eleves-ens = "cloud.eleves.ens.fr"; - frama-agenda = "framagenda.org"; - }; nginxConf = { enableACME = true; forceSSL = true; root = package; - locations = lib.mapAttrs' (name: attrs: + locations = lib.mapAttrs' (name: value: lib.nameValuePair "/cal/${name}/" { extraConfig = '' proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass https://${ - providers.${name} - }/remote.php/dav/public-calendars/; + proxy_pass https://${value}/remote.php/dav/public-calendars/; ''; - }) providers; + }) metisProviders; extraConfig = '' rewrite ^/calendrier(.*)$ $1 permanent; @@ -32,6 +25,11 @@ let }; in { + _module.args.metisProviders = { + klub-reseau = "nuage.beta.rz.ens.wtf"; + eleves-ens = "cloud.eleves.ens.fr"; + frama-agenda = "framagenda.org"; + }; services.nginx.virtualHosts = { "calendrier.eleves.ens.fr" = nginxConf; "calendrier.dgnum.eu" = nginxConf;