You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
11 KiB
Nix
216 lines
11 KiB
Nix
{ 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!";
|
|
}
|
|
];
|
|
};
|
|
}
|