{ config, lib, pkgs, r6d, ... }: let inherit (lib) mkEnableOption mkTextOption mkIf mkMerge mkOption singleton types; # TODO: Anglish :) machineOptions = types.submodule { options = { configurationFlags = { #enable = mkEnableOption "Génération de la configuration d'une machine."; awesome = mkEnableOption "Profil pour activer le gestionnaire de fenêtre awesome."; auto-upgrade = mkEnableOption "Profil pour activer les mises à jour automatiques."; cartographie = mkEnableOption "Profil pour activer les outils de gestion de données géographiques."; conception-assistee = mkEnableOption "Profil pour activer les outils de conception électronique & modélisation 3D"; database_postgres = mkEnableOption "Profil pour activer le SGBD PostgreSQL."; developpement = mkEnableOption "Profil pour activer les outils de développement"; developpement-elm = mkEnableOption "Profil pour activer les outils de développement Elm"; developpement-haskell = mkEnableOption "Profil pour activer les outils de développement Haskell"; developpement-java = mkEnableOption "Profil pour activer les outils de développement Java"; developpement-rust = mkEnableOption "Profil pour activer les outils de développement Rust"; docker = mkEnableOption "Profil pour l'utilisation de Docker."; dovecot = mkEnableOption "Profil pour activer le serveur Dovecot."; dns_autorite = mkEnableOption "Profil pour servir les fichiers de zone DNS."; dns_resolveur = mkEnableOption "Profil pour activer un résolveur DNS local."; edition-musique = mkEnableOption "Profil pour la création/édition de musique."; edition-photo = mkEnableOption "Profil pour la création/édition de photos."; edition-video = mkEnableOption "Profil pour la création/édition de video."; elasticsearch = mkEnableOption "Profil pour activer le service elasticsearch."; fail2ban = mkEnableOption "Profil pour activer Fail2ban."; graphical = mkEnableOption "Profil pour activer les applications graphgiques."; hydra-builder = mkEnableOption "Profil pour une machine qui compile pour hydra."; hydra-core = mkEnableOption "Profil pour un serveur hydra."; kibana = mkEnableOption "Profil pour activer le service kibana."; internetSuite = mkEnableOption "Profil pour la suite de logiciels pour Internet."; jetbrains-licensed = mkEnableOption "Profil pour la suite de développement Jetbrains payante (sous-ensemble)."; jeux = mkEnableOption "Profil pour les jeux vidéos."; laptop = mkEnableOption "Profil pour les outils spécifiques aux ordinateurs portables."; locate = mkEnableOption "Profil pour activer la fonction locate."; mailboxes = mkEnableOption "Profil pour stocker les mails dans des boîtes aux lettres."; multimediaSuite = mkEnableOption "Profil pour la suite multimédia."; munin = mkEnableOption "Profil pour activer la supervision par Munin"; murmur = mkEnableOption "Profil pour activer un serveur Mumble (murmur)"; nixos-manual = mkEnableOption "Profil pour activer la documentation nixos en local sur un TTY"; nix-serve-server = mkEnableOption "Profil pour que la machine soit un serveur de cache nix."; nixStoreProxyCache = mkEnableOption "Profil pour activer le proxy cahce nginx pour le nix store"; officeSuite = mkEnableOption "Profil pour la suite bureautique"; print = mkEnableOption "Profil pour activer cups & pouvoir imprimer."; pulseaudio = mkEnableOption "Profil pour activer pulseaudio."; rabbitmq = mkEnableOption "Profil pour activer le service de messagerie AMQP."; radio = mkEnableOption "Profil pour activer les outils pour faire de radio numérique - SDR."; radicale = mkEnableOption "Profil pour activer le service d'hébergement de calendrier + tâches & contacts."; rmilter = mkEnableOption "Profil pour activer le filtrage de mails par postfix."; scanner = mkEnableOption "Profil pour que les scanners soient utilisable."; securitySuite = mkEnableOption "Profil pour la suite de logiciels de sécurité."; smokeping = mkEnableOption "Profil pour activer le monitoring réseau par smokeping."; swap = mkEnableOption "Profil pour que le swap soit activé."; virtualbox = mkEnableOption "Profil pour l'utilisation de VirtualBox."; xmonad = mkEnableOption "Profil pour activer le gestionnaire de fenêtres xmonad."; znc = mkEnableOption "Profil pour activer le relais IRC ZNC."; }; configurationOptions = { ipAddress = mkOption { description = "Adresse IP."; type = lib.types.str; }; nix-serve-server = mkEnableOption "nix-serve server."; nix-serve-client = { enable = mkEnableOption "nix-serve client"; servers = mkOption { default = [ https://cache.nixos.org/ ]; description = "List of nix-serve servers providing binary caches."; type = types.listOf types.str; }; }; tinc = { enable = mkEnableOption "Enable tinc service."; dnsFQDN = mkOption { example = "device.example.net."; description = "DNS name of host pointing to tunnel IP."; type = lib.types.str; }; connectToAddress = mkOption { default = ""; example = "192.168.1.1"; description = "External address to connect from another node."; type = lib.types.str; }; vpnAddress = mkOption { example = "192.168.69.69/24"; description = "VPN local node IP address."; type = lib.types.str; }; vpnCidrLength = mkOption { default = 24; example = 24; description = "VPN netmask length."; type = lib.types.int; }; extraConfig = mkOption { default = ""; example = '' Mode = router ConnecTo = bar ''; description = "Configuration supplémentaire pour tinc."; type = lib.types.str; }; }; quagga = { enable = mkEnableOption "Enable Quagga + BGP service"; bgpConfig = mkOption { type = types.lines; default = ""; example ='' router bgp 65001 neighbor 10.0.0.1 remote-as 65001 ''; description = '' BGP configuration statements. ''; }; }; windowsBoot = { enable = mkEnableOption "Activation du démarrage de Windows par Grub"; drive = mkOption { description = "Lecteur sur lequel est présent le système Windows (au format GRUB)"; type = lib.types.str; default = "hd0,1"; }; }; windowsMount ={ enable = mkEnableOption "Montage de la partition data Windows"; device = mkOption { description = "Lecteur sur lequel est présent le disque de data Windows"; type = lib.types.str; default = "/dev/sda2"; }; }; }; profiles = { # Domaine isDubronetwork = mkEnableOption "Pour distinguer les machines dubronetwork."; isDubronetworkServer = mkEnableOption "Pour distinguer les machines dubronetwork avec Server."; isDubronetworkWorkstation = mkEnableOption "Pour distinguer les machines dubronetwork avec Workstation."; isPrunetwork = mkEnableOption "Pour distinguer les machines prunetwork."; isPrunetworkServer = mkEnableOption "Pour distinguer les machines prunetwork avec Server."; isPrunetworkWorkstation = mkEnableOption "Pour distinguer les machines prunetwork avec Workstation."; # Utilisation machine isDesktopEnvironment = mkEnableOption "Pour indiquer une machine avec interface graphique."; isServer = mkEnableOption "Pour indiquer qu'il s'agit d'un serveur."; isWorkstation = mkEnableOption "Pour indiquer que la machine sert à travailler."; }; }; }; annuaire = config.r6d.machines; currentMachine = annuaire."${config.networking.fqdn}"; flags = currentMachine.configurationFlags; in { options = { r6d.machines = mkOption { type = types.attrsOf machineOptions; description = '' Machines directory. ''; }; }; config = { /** prototype : (expression A ) && tests || !(expression A) -> réalise le test si A est satisfait, et continue sinon = pas de politique */ assertions = [ { assertion = (currentMachine.profiles.isWorkstation && (currentMachine.configurationFlags.graphical == true)) || (!currentMachine.profiles.isWorkstation); message = "A workstation requires a graphical environement."; } { assertion = (currentMachine.profiles.isDesktopEnvironment && (currentMachine.configurationFlags.graphical == true)) || (!currentMachine.profiles.isDesktopEnvironment); message = "A desktop station requires a graphical environement."; } { assertion = (currentMachine.profiles.isDesktopEnvironment && (config.services.xserver.enable == true)) || (!currentMachine.profiles.isDesktopEnvironment); message = "You need to enable xserver manually."; } { assertion = (currentMachine.profiles.isServer && (currentMachine.profiles.isDesktopEnvironment == false)) || (!currentMachine.profiles.isServer); message = "A graphical environment is not required for a server."; } { /* At least one (authorité or resolveur) */ assertion = flags.dns_autorite || flags.dns_resolveur; message = "DNS service is disabled. You must enable a dns recursor or autoritative."; } { /* authorité xor resolveur */ assertion = (flags.dns_autorite && ! flags.dns_resolveur) || (!flags.dns_autorite && flags.dns_resolveur); message = "Both authoritative and recursor DNS services can't be live simultaneously. Choose only one!"; } ]; }; }