]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - flakes/private/chatons/flake.nix
Squash changes containing private information
[perso/Immae/Config/Nix.git] / flakes / private / chatons / flake.nix
diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix
new file mode 100644 (file)
index 0000000..70fb02d
--- /dev/null
@@ -0,0 +1,142 @@
+{
+  inputs.environment.url = "path:../environment";
+  outputs = { self, environment }: {
+    nixosModule = self.nixosModules.chatons;
+    nixosModules.chatons = { config, lib, pkgs, nodes, ... }:
+      let
+        concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value;
+        toProperties = properties: builtins.concatStringsSep "\n" (
+          lib.collect
+            (p: !(lib.isAttrs p))
+            (lib.mapAttrsRecursive
+              (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value))
+              properties));
+        before = name: {
+          "${name}" = {
+            status.level = "OK";
+            status.description = "OK";
+            install.type = "PACKAGE";
+            registration.load = "OPEN";
+          };
+          host = {
+            name = "Hetzner";
+            server.type = "PHYSICAL";
+            provider.type = "HOSTEDSERVER";
+            server.distribution = "NixOS";
+            country.name = "Allemagne";
+            country.code = "DE";
+          };
+        };
+        after = name: {
+          file = {
+            class = name;
+            protocol = "ChatonsInfos-0.5";
+            generator = "Nix derivation";
+          };
+          "${name}" = {
+            legal.url = "https://www.immae.eu/mentions.html";
+            guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
+            contact.url = "https://www.immae.eu/contacts_fr.html";
+            contact.email = config.myEnv.tools.contact;
+            startdate = "01/01/2019";
+          };
+        };
+        organization = {
+          file = {
+            class = "organization";
+            protocol = "ChatonsInfos-0.5";
+            datetime = "2021-01-11T22:23:00";
+            generator = "Nix derivation";
+          };
+          organization = {
+            country.name = "France";
+            country.code = "FR";
+            name = "ImmaeEu";
+            description = "ImmaeEu est un CHATONS des Alpes-Maritimes";
+            website = "https://www.immae.eu";
+            logo = "https://assets.immae.eu/logo.jpg";
+            socialnetworks = {
+              diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35";
+              facebook = "https://www.facebook.com/ismael.bouya";
+              mastodon = "https://mastodon.immae.eu/@immae";
+              peertube = "https://peertube.immae.eu/accounts/immae/";
+              twitter = "https://twitter.com/_immae";
+            };
+            chatrooms = {
+              xmpp = "ismael@immae.fr";
+              irc = "immae@freenode";
+              matrix = "#support:immae.eu";
+            };
+            contact.url = "https://www.immae.eu/contacts_fr.html";
+            contact.email = config.myEnv.tools.contact;
+            legal.url = "https://www.immae.eu/mentions.html";
+            guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
+            guide.user = "https://www.immae.eu/docs";
+            status.level = "ACTIVE";
+            status.description = "En activité";
+            startdate = "01/01/2019";
+            type = "COMPANY";
+            owner = {
+              logo = "https://assets.immae.eu/logo.jpg";
+              name = "Ismaël Bouya";
+              website = "https://www.immae.eu";
+            };
+            memberof.chatons = {
+              startdate = "01/07/2019";
+              status.level = "ACTIVE";
+              status.description = "Participe au collectif";
+            };
+          };
+        };
+        subname = v: if v.published or true then "subs" else "subs-hidden";
+        toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + (
+          builtins.concatStringsSep "\n" (lib.mapAttrsToList
+            (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices
+          )) + "\n" + (
+          builtins.concatStringsSep "\n" (lib.mapAttrsToList
+            (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings
+          )));
+        toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting"))));
+        toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service"))));
+
+        cfg = config.myServices.chatonsProperties;
+        mergedServices = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.services else {}) nodes);
+        mergedHostings = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.hostings else {}) nodes);
+      in {
+        imports = [
+          environment.nixosModule
+        ];
+        options.myServices.chatonsProperties.organization = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.services = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.hostings = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.propertiesPath = lib.mkOption {
+          type = lib.types.package;
+          readOnly = true;
+          default = pkgs.runCommand "chatons" {} ''
+            mkdir -p $out
+            cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties
+            ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)}
+            ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)}
+          '';
+        };
+      };
+  };
+}