{ config, lib, pkgs, ... }: let inherit (lib) mkEnableOption mkIf mkMerge mkOption singleton types; cfg = config.r6d.config-generator; pfl = config.r6d.profiles; comp = config.r6d.computers; host = config.networking.hostName; annuaire = config.r6d.machines; currentMachine = annuaire."${config.networking.hostName}"; in { # TODO camel case partout # TODO everything in english # TODO sortir ce qui est privé # TODO portage du système d'annuaire de machines de capgemini ###### interface options = { #* Utilisé pour afecter des capacités aux machines r6d.profiles = { # Domaine isDubronetwork = mkEnableOption "Pour distinguer les machines dubronetwork."; isPrunetwork = mkEnableOption "Pour distinguer les machines prunetwork."; # 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."; }; #* Utilisé dans les fichiers .nix r6d.config-generator = { #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."; murmur = mkEnableOption "Profil pour activer un serveur Mumble (murmur)"; nix-serve-client = mkEnableOption "Profil pour que la machine soit un client de cache nix."; 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."; radicale = mkEnableOption "Profil pour activer le service d'hébergement de calendrier + tâches & contacts."; 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."; tincAddress = mkOption { default = ""; example = "192.168.1.1"; description = "Adresse du noeud tinc local"; type = lib.types.string; }; tincExtraConfig = mkOption { default = ""; example = '' Mode = router ConnecTo = bar ''; description = "Configuration supplémentaire pour tinc"; type = lib.types.string; }; }; #* Utilisé pour avoir des raccourcis de machine r6d.computers = { isHydra = mkEnableOption "Identification du nom de machine."; isLatitude = mkEnableOption "Identification du nom de machine."; isMonstre = mkEnableOption "Identification du nom de machine."; isNeoNomade = mkEnableOption "Identification du nom de machine."; isNomade = mkEnableOption "Identification du nom de machine."; isOcean = mkEnableOption "Identification du nom de machine."; isPedro = mkEnableOption "Identification du nom de machine."; isPhenom = mkEnableOption "Identification du nom de machine."; isRadx = mkEnableOption "Identification du nom de machine."; isRollo = mkEnableOption "Identification du nom de machine."; }; }; ###### implementation # https://nixos.org/releases/nixos/14.12-small/nixos-14.12.374.61adf9e/manual/sec-writing-modules.html # https://nixos.org/wiki/NixOS:extend_NixOS config = mkMerge [ ## Définition des profils génériques (mkIf pfl.isDesktopEnvironment { r6d.config-generator = { awesome = true; internetSuite = true; multimediaSuite = true; officeSuite = true; pulseaudio = true; securitySuite = true; }; }) (mkIf (pfl.isServer && !comp.isMonstre) { r6d.config-generator = { #database_postgres = true; dns_autorite = true; #dns_resolveur = true; # inutile d'exposer la conf complète du serveur par le store tant qu'il n'y a pas de protection complémentaire - utilisation SSH ? #nix-serve-server = true; smokeping = true; #rabbitmq = true; }; }) # /!\ PAS un serveur (mkIf (!pfl.isServer || comp.isMonstre) { r6d.config-generator = { dns_resolveur = true; }; }) (mkIf pfl.isWorkstation { r6d.profiles.isDesktopEnvironment = true; r6d.config-generator = { docker = true; graphical = true; }; }) ## Profils liés à Dubronetwork (mkIf pfl.isDubronetwork { r6d.config-generator = { auto-upgrade = true; locate = true; print = true; }; }) (mkIf (pfl.isDubronetwork && pfl.isWorkstation) { r6d.config-generator = { cartographie = true; conception-assistee = true; docker = true; developpement = true; developpement-elm = true; developpement-haskell = true; developpement-java = true; developpement-rust = true; edition-musique = true; edition-photo = true; edition-video = true; scanner = true; virtualbox = true; xmonad = true; }; }) ## Profils liés à Prunetwork (mkIf pfl.isPrunetwork { r6d.config-generator = { auto-upgrade = true; docker = true; locate = true; fail2ban = true; smokeping = true; swap = true; }; }) (mkIf (pfl.isPrunetwork && pfl.isWorkstation) { r6d.config-generator = { cartographie = true; conception-assistee = true; docker = true; developpement = true; #developpement-elm = true; developpement-haskell = true; developpement-java = true; developpement-rust = true; edition-musique = true; edition-photo = true; edition-video = true; hydra-core = false; # DO NOT ENABLE ON WORKSTATION, YOU CAN CRASH YOUR SYSTEM print = true; scanner = true; #virtualbox = true; #xmonad = true; }; }) ## Affectation des profils aux machines (mkIf comp.isHydra { networking.hostName = "hydra.prunetwork.fr"; # Define your hostname. r6d.profiles = { isPrunetwork = true; isServer = true; }; r6d.config-generator = { docker = true; hydra-builder = true; hydra-core = true; nix-serve-server = true; tincAddress = "192.168.12.9/24"; tincExtraConfig = '' ConnectTo = rollo_dubronetwork_fr ConnectTo = ocean_prunetwork_fr ''; }; }) (mkIf comp.isOcean { networking.hostName = "ocean.prunetwork.fr"; # Define your hostname. r6d.profiles = { isPrunetwork = true; isServer = true; }; r6d.config-generator = { docker = true; hydra-builder = true; radicale = true; nix-serve-client = true; nix-serve-server = true; tincAddress = "192.168.12.6/24"; tincExtraConfig = '' ConnectTo = hydra_prunetwork_fr ConnectTo = rollo_dubronetwork_fr ''; }; }) (mkIf comp.isRadx { networking.hostName = "radx.prunetwork.fr"; # Define your hostname. r6d.profiles = { isPrunetwork = true; isWorkstation = true; }; r6d.config-generator = { database_postgres = true; elasticsearch = true; #hydra-core = false; # DO NOT ENABLE ON WORKSTATION kibana = true; nix-serve-client = true; nix-serve-server = true; #rabbitmq = true; tincAddress = "192.168.12.3/24"; tincExtraConfig = '' ConnectTo = monstre_dubronetwork_fr ConnectTo = rollo_dubronetwork_fr ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; virtualbox = true; }; }) (mkIf comp.isLatitude { networking.hostName = "latitude.dubronetwork.fr"; # Define your hostname. r6d.profiles = { isDubronetwork = true; isWorkstation = true; }; r6d.config-generator = { jetbrains-licensed = true; laptop = true; nix-serve-client = true; nix-serve-server = true; tincAddress = "192.168.12.2/24"; tincExtraConfig = '' ConnectTo = monstre_dubronetwork_fr ConnectTo = rollo_dubronetwork_fr ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; }; }) (mkIf comp.isMonstre { networking.hostName = "monstre.dubronetwork.fr"; # Define your hostname. r6d.profiles = { isDubronetwork = true; isServer = true; }; r6d.config-generator = { fail2ban = true; murmur = true; nix-serve-client = true; nix-serve-server = true; nixStoreProxyCache = true; tincAddress = "192.168.12.4/24"; tincExtraConfig = '' ConnectTo = rollo_dubronetwork_fr ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; }; }) (mkIf comp.isNeoNomade{ networking.hostName = "neo-nomade.dubronetwork.fr"; # Define your hostname. r6d.profiles = { isDubronetwork = true; isDesktopEnvironment = true; }; r6d.config-generator = { laptop = true; graphical = true; scanner = true; tincAddress = "192.168.12.7/24"; tincExtraConfig = '' ConnectTo = monstre_dubronetwork_fr ConnectTo = rollo_dubronetwork_fr ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; }; }) # Dubro Vivo - St Malo #tincAddress = "192.168.12.8/24"; (mkIf comp.isNomade{ networking.hostName = "nomade.dubronetwork.fr"; # Define your hostname. r6d.profiles.isDubronetwork = true; r6d.config-generator = { laptop = true; }; }) (mkIf comp.isPedro { r6d.profiles = { isDubronetwork = true; isServer = true; }; r6d.config-generator = { fail2ban = true; }; }) (mkIf comp.isPhenom { networking.hostName = "phenom.dubronetwork.fr"; # Define your hostname. r6d.profiles = { isDubronetwork = true; isWorkstation = true; }; r6d.config-generator = { jetbrains-licensed = true; #hydra-core = true; nix-serve-client = true; nix-serve-server = true; edition-photo = true; tincAddress = "192.168.12.1/24"; tincExtraConfig = '' ConnectTo = monstre_dubronetwork_fr ConnectTo = rollo_dubronetwork_fr ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; }; }) (mkIf comp.isRollo { networking.hostName = "rollo.dubronetwork.fr"; # Define your hostname. r6d.profiles = { isDubronetwork = true; isServer = true; }; r6d.config-generator = { dovecot = true; fail2ban = true; mailboxes = true; murmur = true; nix-serve-client = true; nix-serve-server = true; tincAddress = "192.168.12.5/24"; tincExtraConfig = '' ConnectTo = hydra_prunetwork_fr ConnectTo = ocean_prunetwork_fr ''; virtualbox = true; znc = true; }; }) ]; }