Compare commits
	
		
			527 Commits 
		
	
	
		
			2016-08-10
			...
			nixos-unst
		
	
	| @ -1,48 +1,118 @@ | |||||||
|  | GSF=git submodule foreach | ||||||
|  | TIME=time | ||||||
|  | 
 | ||||||
|  | CHRONY_STATUS=chronyc tracking | ||||||
|  | CHRONY_STATS=chronyc sources -v | ||||||
|  | CHRONY_STATS_SOURCES=chronyc sourcestats | ||||||
|  | 
 | ||||||
| all: rebuild-switch | all: rebuild-switch | ||||||
| 	date | 	date | ||||||
|  | ##--------- Commandes spécifiques pour NixOS
 | ||||||
| 
 | 
 | ||||||
| clean: | clean: | ||||||
| 	nix-collect-garbage -d --delete-older-than 15d | 	$(TIME) nix-collect-garbage -d --delete-older-than 15d | ||||||
| 
 | 
 | ||||||
| clean-aggressive: | clean-aggressive: | ||||||
| 	nix-collect-garbage -d --delete-older-than 1d | 	$(TIME) nix-collect-garbage -d --delete-older-than 1d | ||||||
| 
 | 
 | ||||||
| clean-total: | clean-total: | ||||||
| 	nix-collect-garbage -d | 	$(TIME) nix-collect-garbage -d | ||||||
| 
 | 
 | ||||||
| clean-log: | clean-log: | ||||||
|  | 	journalctl --flush --rotate | ||||||
| 	journalctl --vacuum-size=1G | 	journalctl --vacuum-size=1G | ||||||
| 
 | 
 | ||||||
| full-auto: submodules-update upgrade clean optimise | full-auto: submodules-update upgrade clean optimise | ||||||
|  | 	@date | ||||||
|  | 
 | ||||||
|  | list-installed-packages: | ||||||
|  | 	@# source : https://functor.tokyo/blog/2018-02-20-show-packages-installed-on-nixos | ||||||
|  | 	@# https://www.domenkozar.com/2014/01/02/getting-started-with-nix-package-manager/ | ||||||
|  | 	@#nixos-option environment.systemPackages | ||||||
|  | 	nixos-option environment.systemPackages | head -2 | tail -1 | sed -e 's/ /\n/g' | cut -d- -f2- | sort | uniq| sed -e 's/"$$//' | ||||||
| 
 | 
 | ||||||
| optimise: | optimise: | ||||||
| 	nix-store --optimise | 	$(TIME) nix store optimise | ||||||
| 
 | 
 | ||||||
| push: submodules-push | rebuild-build: | ||||||
| 	git push --all | 	nix-channel --add https://nixos.org/channels/nixos-unstable nixos | ||||||
| 	git push --tags | 	$(TIME) time nixos-rebuild build --fallback  --show-trace | ||||||
| 
 | 
 | ||||||
| rebuild-switch: | rebuild-switch: | ||||||
| 	nixos-rebuild switch --fallback  --show-trace | 	$(TIME) time nixos-rebuild switch --fallback  --show-trace | ||||||
|  | 
 | ||||||
|  | show-blackholed: | ||||||
|  | 	-@ip route |grep blackhole |wc -l| awk '{print "Il y a "$$1" route(s) en blackhole sur";system("hostname ")}' |cowsay | ||||||
|  | 
 | ||||||
|  | show-diff-with-current: | ||||||
|  | 	-diff /run/current-system/configuration.nix /etc/nixos/configuration.nix | ||||||
|  | 
 | ||||||
|  | show-roots: | ||||||
|  | 	nix-store --gc --print-roots | ||||||
|  | 
 | ||||||
|  | show-time: | ||||||
|  | 	-@$(CHRONY_STATUS) && $(CHRONY_STATS) | ||||||
|  | 	-@watch -d -n 2 "$(CHRONY_STATUS) && echo "-- Statistiques générales :" && $(CHRONY_STATS) && echo "-- Statistiques sur les sources :" && $(CHRONY_STATS_SOURCES) && echo "-- Statistiques sur les clients :" && chronyc clients" | ||||||
| 
 | 
 | ||||||
| store-repair: | store-repair: | ||||||
| 	nix-store --verify --check-contents --repair | 	$(TIME) nix-store --verify --check-contents --repair | ||||||
|  | 
 | ||||||
|  | upgrade: | ||||||
|  | 	nix-channel --add https://nixos.org/channels/nixos-unstable nixos | ||||||
|  | 	$(TIME) nixos-rebuild switch --upgrade --fallback --show-trace | ||||||
|  | 
 | ||||||
|  | ##--------- Commandes spécifiques pour NixOS -- Opérations non courantes
 | ||||||
|  | 
 | ||||||
|  | download-sources: | ||||||
|  | 	# https://nixos.org/wiki/Download_all_sources | ||||||
|  | 	nix-store -r $$(grep -l outputHash $$(nix-store -qR $$(nix-instantiate '<nixpkgs>' -A geeqie) | grep '.drv$$')) | ||||||
|  | 
 | ||||||
|  | build-iso: | ||||||
|  | 	nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage -I nixos-config=/etc/nixos/base/iso-image/livecd-minimal.nix | ||||||
|  | 
 | ||||||
|  | ##--------- Commandes spécifiques pour GIT
 | ||||||
|  | 
 | ||||||
|  | push: submodules-push | ||||||
|  | 	git push --all | ||||||
|  | 	git push --tags | ||||||
| 
 | 
 | ||||||
| submodules-update: | submodules-update: | ||||||
| 	#git submodule update --remote | 	#git submodule update --remote | ||||||
| 	git submodule foreach git co master | 	#$(GSF) git co master | ||||||
| 	git submodule foreach git ff | 	$(GSF) git ff | ||||||
|  | 	$(GSF) git gc --auto | ||||||
| 
 | 
 | ||||||
| submodules-push: | submodules-push: | ||||||
| 	git submodule foreach git push --all | 	$(GSF) git push --all | ||||||
| 	git submodule foreach git push --tags | 	$(GSF) git push --tags | ||||||
| 
 | 
 | ||||||
| submodules-tag: | submodules-tag: | ||||||
| 	git submodule foreach git tag -f "$$(date +%F)-$$(hostname -s)" | 	$(GSF) git tag -f "$$(date +%F)-$$(hostname -s)" | ||||||
|  | 
 | ||||||
|  | template: | ||||||
|  | 	find . -name "*.nix" -exec meld /etc/nixos/base/module-template.nix {} \; | ||||||
| 
 | 
 | ||||||
| tag: submodules-tag | tag: submodules-tag | ||||||
| 	git tag -f "$$(date +%F)-$$(hostname -s)" | 	git tag -f "$$(date +%F)-$$(hostname -s)" | ||||||
| 
 | 
 | ||||||
| upgrade: | ##--------- Munin
 | ||||||
| 	nixos-rebuild switch --upgrade --fallback --show-trace | 
 | ||||||
|  | munin: | ||||||
|  | 	pushd /var/www/munin/ ; python -m SimpleHTTPServer 8000 | ||||||
|  | ##--------- Gestion d'un système de fichier monté en mémoire
 | ||||||
|  | 
 | ||||||
|  | tmpfs-create: | ||||||
|  | 	mkdir -p /mnt/tmpfs | ||||||
|  | 
 | ||||||
|  | tmpfs-mount: tmpfs-create | ||||||
|  | 	mount -t tmpfs -o size=10G tmpfs /mnt/tmpfs | ||||||
|  | 
 | ||||||
|  | tmpfs-umount: | ||||||
|  | 	umount /mnt/tmpfs | ||||||
|  | 
 | ||||||
|  | tmpfs-destroy: tmpfs-umount | ||||||
|  | 	rmdir /mnt/tmpfs | ||||||
| 
 | 
 | ||||||
|  | ##- Test awesome
 | ||||||
|  | test-awesome: | ||||||
|  | 	Xephyr :5 & sleep 1; DISPLAY=:5 awesome | ||||||
|  | |||||||
| @ -1,11 +0,0 @@ | |||||||
| # nixos-template-base |  | ||||||
| 
 |  | ||||||
| Ce dépôt stocke une configuration générique des machines. |  | ||||||
| Une recette dite "config-generator" adapte la configuration selon le nom de la machine (FQDN). |  | ||||||
| 
 |  | ||||||
| Actuellement, les scripts contiennent un peu de configuration spécifique pour les machines des mainteneurs. |  | ||||||
| 
 |  | ||||||
| # Lien pour install sur machine distante |  | ||||||
| 
 |  | ||||||
| * https://nixos.org/wiki/How_to_install_NixOS_from_Linux#Installing_through_a_chroot |  | ||||||
| * https://github.com/NixOS/nixpkgs/issues/13305 |  | ||||||
| @ -0,0 +1,240 @@ | |||||||
|  | # nixos-template-base | ||||||
|  | 
 | ||||||
|  | Versions de NixOS supportées : | ||||||
|  | * NixOS unstable | ||||||
|  | 
 | ||||||
|  | Ce dépôt stocke une configuration générique des machines. | ||||||
|  | 
 | ||||||
|  | ~~Une recette dite "config-generator" adapte la configuration selon le nom de la machine (FQDN).~~ | ||||||
|  | 
 | ||||||
|  | ~~Actuellement, les scripts contiennent un peu de configuration spécifique pour les machines des mainteneurs.~~ | ||||||
|  | 
 | ||||||
|  | # Liens | ||||||
|  | * https://status.nixos.org/ pour savoir de quand datent les différentes releases de NixOS | ||||||
|  | * https://repology.org/repository/nix_unstable/problems pour lister les paquets avec problèmes | ||||||
|  | 
 | ||||||
|  | # Notes de mise-à-jour | ||||||
|  | 
 | ||||||
|  | ## pour l'utilisation de l'annuaire (à partir de 2017-04-28) | ||||||
|  | 
 | ||||||
|  | * faire les mises à jour de l'OS | ||||||
|  | * commiter & pusher l'état des dépôts (au cas où). Pour les différents dépôts `git a`, `git commit` puis `make tag push` | ||||||
|  | * mettre à jour les dépôts avec les dernières versions, `make submodules-update` | ||||||
|  | * vérifier que `configuration.nix` contient `services.xserver.enable = true;` pour les machines avec interface graphique | ||||||
|  | * vérifier que `configuration.nix` contient le nom de la machine `networking.hostName = "<X>";` | ||||||
|  | * vérifier que `configuration.nix` contient le nom de domaine `networking.domain = "<X>";` | ||||||
|  | * tester la configuration : `nixos-rebuild build` | ||||||
|  | * corriger et ajouter les éléments manquant (notamment dans `private/annuaire.nix` ) | ||||||
|  | * lorsque tout semble bon, vérifier : | ||||||
|  |   * qu'il y a toujours des utilisateurs dans la configuration | ||||||
|  |   * que le moyen d'accéder à la machine n'a pas été supprimé (surtout les machines distantes) | ||||||
|  | * lancer la commande de build de l'os : `make` :) | ||||||
|  | 
 | ||||||
|  | ## pour le passage de 16.09 à unstable | ||||||
|  | 
 | ||||||
|  | * mettre à jour tous les dépôts | ||||||
|  | * changer la branche de base vers `nixos-unstable` | ||||||
|  | * changer la declaration de la machine dans `configuration.nix` | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | networking.hostName = "<bidule>"; | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | devient | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | r6d.computers.is<bidule> = true; | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * mettre à jour le channel | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | nix-channel --add  https://nixos.org/channels/nixos-unstable nixos | ||||||
|  | nix-channel --update | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * faire la mise à jour | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | make | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | ## pour le passage de 16.03 à 16.09 | ||||||
|  | 
 | ||||||
|  | * mettre le dépôt base sur la branche upgrade-16.09 | ||||||
|  | * changer le channel nixos : ```nix-channel --add https://nixos.org/channels/nixos-16.09 nixos``` | ||||||
|  | * activer x11 dans le configuration.nix | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | services.xserver.enable = true; | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * remplacer le bootloader si gummiboot était utilisé | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | boot.loader.gummiboot.enable = true; | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | devient | ||||||
|  | 
 | ||||||
|  | ~~~ | ||||||
|  | boot.loader.systemd-boot.enable = true; | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | Pour résoudre les soucis d'upgrade, il est conseillé : | ||||||
|  | * de désactiver tous les imports (sauf `hardware.nix`) | ||||||
|  | * d'ajouter `.../localisation.nix` dans les imports sous peine d'être en clavier US | ||||||
|  | * d'ajouter ```nixpkgs.config.allowUnfree = true;``` | ||||||
|  | * d'ajouter `vim` aux paquets | ||||||
|  | * de réactiver petit à petit les lignes désactivées | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Installation sur machine chez online.net | ||||||
|  | 
 | ||||||
|  | * https://nixos.org/wiki/Install_NixOS_on_Online.Net | ||||||
|  | * https://nixos.org/wiki/Install_NixOS_on_Linode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Installation selon config online | ||||||
|  | 
 | ||||||
|  | * commander serveur | ||||||
|  | * lancer la procédure d'installation avec ubuntu LTS 64bits | ||||||
|  | * partitionner le disque avec l'interface web | ||||||
|  | * lancer l'installation de l'os. | ||||||
|  | * attendre que la procédure standard d'installation d'online ait terminée | ||||||
|  | * lorsque l'install est finie, dans l'onglet "Etat" se trouve l'option "Secours" | ||||||
|  | 
 | ||||||
|  | ## Transformation en NixOS | ||||||
|  | 
 | ||||||
|  | * relancer la machine en mode "Secours" | ||||||
|  | * choisir un linux 64bits (préférence pour ubuntu LTS) | ||||||
|  | * le système de boot donne des identifiants SSH pour le connecter à la machine | ||||||
|  | 
 | ||||||
|  | * se connecter à la machine | ||||||
|  | * passer en root | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | sudo su - | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * formater les partitions | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | mkfs.ext4 -L nixos /dev/sda1 | ||||||
|  | swapoff -a | ||||||
|  | mkswap /dev/sda2 | ||||||
|  | swapon -a | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * monter les partitions dans /mnt | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | mount /dev/sda1 /mnt/ | ||||||
|  | mkdir /mnt/etc/ | ||||||
|  | mkdir /mnt/etc/nixos | ||||||
|  | mkdir /etc/nixos | ||||||
|  | mkdir /mnt/nix | ||||||
|  | mkdir /nix | ||||||
|  | mount --bind /mnt/nix/ /nix | ||||||
|  | mkdir /mnt/tmp | ||||||
|  | mount --bind /mnt/tmp /tmp | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | * installer les paquets nécessaires | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | apt-get install bzip2 git byobu htop glances | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * création d'utilisateur (n'importe quil mot de passe) | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | adduser nix | ||||||
|  | groupadd -r nixbld | ||||||
|  | for n in $(seq 1 10); do useradd -c "Nix build user $n" -d /var/empty -g nixbld -G nixbld -M -N -r -s "$(which nologin)" nixbld$n; done | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * mise-à-jour des certificats | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | update-ca-certificates | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * installer nix | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | chown -R nix /nix /tmp | ||||||
|  | su - nix | ||||||
|  | bash <(curl https://nixos.org/nix/install) | ||||||
|  | exit | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * créer un profil nix pour root & un channel | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | . ~nix/.nix-profile/etc/profile.d/nix.sh | ||||||
|  | nix-channel --remove nixpkgs | ||||||
|  | nix-channel --add https://nixos.org/channels/nixos-unstable nixos | ||||||
|  | nix-channel --update | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * installer un editeur de texte | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | nix-env -i vim_configurable | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * installation de nixos-install | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | cat <<EOF > /root/configuration.nix | ||||||
|  | { fileSystems."/" = {}; | ||||||
|  |   boot.loader.grub.enable = false; | ||||||
|  | } | ||||||
|  | EOF | ||||||
|  | export NIX_PATH=nixpkgs=/root/.nix-defexpr/channels/nixos:nixos=/root/.nix-defexpr/channels/nixos/nixos | ||||||
|  | export NIXOS_CONFIG=/root/configuration.nix | ||||||
|  | nix-env -i -A config.system.build.nixos-install \ | ||||||
|  |        -A config.system.build.nixos-option \ | ||||||
|  |        -A config.system.build.nixos-generate-config \ | ||||||
|  |        -f "<nixos>" | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * configuration de NixOS | ||||||
|  | 
 | ||||||
|  | si la machine existe déjà, cloner le dépôt dans /mnt/etc/nixos | ||||||
|  | pour cela, créer clef ssh et l'ajouter sur la forge | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | ssh-keygen -t ed25519 | ||||||
|  | cp ~/.ssh/id_ed25519* /mnt/etc/nixos/ | ||||||
|  | 
 | ||||||
|  | git clone <> | ||||||
|  | git submodule init | ||||||
|  | git submodule update | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * monter /etc/nixos vers /mnt/etc/nixos pour que la config clonée fonctionne | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | mount --bind /mnt/etc/nixos/ /etc/nixos/ | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * mettre à jour la configuration matérielle | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | export NIX_PATH=nixpkgs=/root/.nix-defexpr/channels/nixos:nixos=/root/.nix-defexpr/channels/nixos/nixos | ||||||
|  | nixos-generate-config --root /mnt | ||||||
|  | ~~~ | ||||||
|  | 
 | ||||||
|  | * vérifier le /mnt/etc/nixos/configuration.nix | ||||||
|  | 
 | ||||||
|  | notamment le périphérique utilisé par grub | ||||||
|  | 
 | ||||||
|  | * installer le système sur le disque | ||||||
|  | 
 | ||||||
|  | ~~~bash | ||||||
|  | unset NIXOS_CONFIG | ||||||
|  | nixos-install | ||||||
|  | ~~~ | ||||||
| @ -0,0 +1,21 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.graphical { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |      # Gestion de FS | ||||||
|  |      gparted       # Gestion graphique de partitions | ||||||
|  |      unetbootin    # création de clefs USB bootables | ||||||
|  | 
 | ||||||
|  |      # visualisation de log | ||||||
|  |      #logstalgia | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf currentMachine.profiles.isDesktopEnvironment { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Environement de bureau | ||||||
|  |     arandr          # interface graphique pour xrandr | ||||||
|  |     wmname          # pour définir le nom du gestionnaire de fenêtre (utile pour java) | ||||||
|  |     #kde4.ksnapshot # capture d'écran | ||||||
|  |     xclip           # manipulation du clipboard X depuis la console | ||||||
|  |     xorg.xbacklight # pour gérer la luminosité de l'écran | ||||||
|  |     xorg.xev        # pour repérer les codes + noms standard des actions clavier/souris | ||||||
|  |     xorg.xkill      # pour 'tuer une application' | ||||||
|  | 
 | ||||||
|  |     ## Gestionnaire de fenêtre & Thème | ||||||
|  |     gnome3.adwaita-icon-theme  # thème d'icone - semble fonctionner avec spaceFM | ||||||
|  | 
 | ||||||
|  |     ## Manipulation de fichier | ||||||
|  |     #kde5.dolphin          # gestionnaire de fichiers graphique | ||||||
|  |     #kde5.dolphin-plugins  # gestionnaire de fichiers graphique | ||||||
|  |     pcmanfm               # gestionnaire de fichiers graphique | ||||||
|  |     #vifm                  # gestionnaire de fichiers basé sur VIM (console) | ||||||
|  | 
 | ||||||
|  |     ## Terminal | ||||||
|  |     kitty                  # terminal avec rendu par GPU | ||||||
|  |     sakura                # terminal | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Polices supplémentaires | ||||||
|  |   fonts.fonts = with pkgs; [ | ||||||
|  |     fira            # police créée pour Firefox | ||||||
|  |     fira-code       # idem fira-mono + ligatures pour la programmation | ||||||
|  |     fira-mono       # dérivée de fira en monospace | ||||||
|  |     font-awesome_5  # Jeux de police, utilisé avec Latex | ||||||
|  |     hack-font       # police monospace créée explicitement pour coder | ||||||
|  |     hasklig         # police dérivée de source-code-pro mais avec des ligatures | ||||||
|  |     jetbrains-mono  # police spécial développeurs par Jetbrains | ||||||
|  |   ]; | ||||||
|  |   fonts.fontconfig.defaultFonts = { | ||||||
|  |     monospace = [ "JetBrains Mono" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   programs = { | ||||||
|  |     slock.enable = true; | ||||||
|  |     spacefm.enable = true; | ||||||
|  |     udevil.enable = true; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.officeSuite && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Bureautique | ||||||
|  |     gnumeric      # tableur | ||||||
|  |     #kde4.ksnapshot# réalisation de capture d'écran | ||||||
|  | 
 | ||||||
|  |     ## Cartes mentales | ||||||
|  |     freemind | ||||||
|  | 
 | ||||||
|  |     ## Diagrammes & Schémas | ||||||
|  |     dia           # dessin & schéma technique | ||||||
|  | 
 | ||||||
|  |     ## Editeur de texte | ||||||
|  |     #lyx          # surcouche WISIWIM à LaTeX | ||||||
|  |     #focuswriter  # outil pour l'écriture | ||||||
|  |     #textadept     # un éditeur de texte facile pour copier-coller graphique | ||||||
|  |     #zim          # outil de prise de notes, wiki de bureau | ||||||
|  | 
 | ||||||
|  |     ## Visionneuse | ||||||
|  |     #kde5.okular   # pdf | ||||||
|  |     #mcomix        # livres (cbr, liste d'images), gestion d'une bibliothèque # Supprimé dans NixOS 20.03 | ||||||
|  |     pdfpc         # pdf | ||||||
|  |     qpdfview      # pdf | ||||||
|  |     gqview        # visionneuse image & gestion basique de collection | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -1,15 +1,16 @@ | |||||||
| { config, lib, pkgs, ... }: | { config, lib, pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| let | let | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|   cfg = config.r6d.config-generator; |   annuaire = config.r6d.machines; | ||||||
|   computers = config.r6d.computers; |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|   profiles = config.r6d.profiles; |   flags = currentMachine.configurationFlags; | ||||||
| in | in | ||||||
| 
 | 
 | ||||||
| mkIf cfg.conception-assistee { | mkIf (flags.conception-assistee && flags.graphical) { | ||||||
| 
 | 
 | ||||||
| environment.systemPackages = with pkgs; [ |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|     # CAO |     # CAO | ||||||
|     ## Modélisation 3D |     ## Modélisation 3D | ||||||
|     freecad   # modélisation de pièces en 3D |     freecad   # modélisation de pièces en 3D | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.cartographie && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Gestion de données géographiques | ||||||
|  |     josm          # outil de contribution à OpenStreetMap | ||||||
|  |     #qgis         # client lourd de manipulation de données géographiques | ||||||
|  |     viking        # analyse de topo, gestion de données GPS | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.internetSuite && flags.graphical) { | ||||||
|  | 
 | ||||||
|  | # Paquets | ||||||
|  | environment.systemPackages = with pkgs; [ | ||||||
|  |     # Clients Internet | ||||||
|  | 
 | ||||||
|  |     ## Navigateur | ||||||
|  |     chromium | ||||||
|  |     firefox | ||||||
|  | 
 | ||||||
|  |     ## Mail & Discussion (texte, audio) | ||||||
|  |     claws-mail | ||||||
|  |     hexchat | ||||||
|  |     quasselClient | ||||||
|  |     mumble | ||||||
|  |     pidgin | ||||||
|  |     thunderbird | ||||||
|  | 
 | ||||||
|  |     # Transfert de fichier | ||||||
|  |     filezilla | ||||||
|  |     transmission-gtk | ||||||
|  |     transmission-remote-gtk | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (true && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   #inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     # installées systématiquement | ||||||
|  |     ./default-applications.nix | ||||||
|  | 
 | ||||||
|  |     # commandées par config-generator | ||||||
|  |     ## option de configuration spécifique | ||||||
|  |     ./cao.nix                   # de conception assisté par ordinateur & modélisation | ||||||
|  |     ./cartographie.nix          # manipuler les données géographiques & cartes | ||||||
|  |     ./developpement.nix         # développer des programmes/scripts | ||||||
|  |     ./developpement-elm.nix     # développer en elm | ||||||
|  |     ./developpement-haskell.nix # développer en haskell | ||||||
|  |     ./developpement-java.nix    # développer en java | ||||||
|  |     ./developpement-jetbrains.nix # outils jetbrains | ||||||
|  |     ./developpement-rust.nix    # développer en rust | ||||||
|  |     ./edition-musique.nix       # modifier les fichiers musicaux | ||||||
|  |     ./edition-photo.nix         # modifier les photos & assimilé | ||||||
|  |     ./edition-video.nix         # modifier les vidéos | ||||||
|  |     ./jeux.nix                  # jouer, tout simplement ;) | ||||||
|  |     ./radio.nix                 # outils pour faire de la radio SDR | ||||||
|  | 
 | ||||||
|  |     ## if isDesktop | ||||||
|  |     ./adminsys.nix              # pour gérer le système dans son ensemble et les services | ||||||
|  |     ./bureau.nix                # éléments pour avoir un environement graphique minimal utilisable | ||||||
|  |     ./bureautique.nix           # dédiée à la bureautique (traitement de texte, dessin, ...) | ||||||
|  |     ./client-internet.nix       # pour accéder & utiliser des ressources par le réseau | ||||||
|  |     ./multimedia.nix            # pour gérer le son, l'image et la vidéo | ||||||
|  |     ./network.nix               # de gestion, de diagnostique & surveillance réseau | ||||||
|  |     ./securite.nix              # relatives à la sécurité (chiffrement, gpg, mots de passe, ...) | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.developpement-elm && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Services | ||||||
|  | 
 | ||||||
|  |   # Réseau | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedTCPPorts = [ | ||||||
|  |     ]; | ||||||
|  |     allowedUDPPorts = [ | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.developpement-haskell && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ] ++ (with pkgs.haskellPackages; [ | ||||||
|  |     # Haskell lib | ||||||
|  |     #threadscope     # visualisation des threads (<bidule>.eventlog) | ||||||
|  |   ]); | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.developpement-java && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # IDE | ||||||
|  |     jetbrains.idea-community # IntelliJ IDEA | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.jetbrains-licensed && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     jetbrains.idea-ultimate | ||||||
|  |     jetbrains.clion | ||||||
|  |     jetbrains.datagrip | ||||||
|  |     jetbrains.pycharm-professional | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.developpement-rust && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.developpement && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Base de données | ||||||
|  |     #pgadmin             # interface d'administration de postgres ***plus à jour, version openssl dépréciée*** | ||||||
|  |     #sqlitebrowser       # interface d'administration de sqlite | ||||||
|  | 
 | ||||||
|  |     # Documentation | ||||||
|  |     #zeal                # consulter la documentation hors ligne | ||||||
|  | 
 | ||||||
|  |     # Gestion des sources | ||||||
|  |     #gitg               # interface pour utiliser git (historique, commit) | ||||||
|  |     gitstats            # génère un site web statique avec des statistiques | ||||||
|  |     git-cola            # interface pour utiliser git (historique, commit) | ||||||
|  | 
 | ||||||
|  |     ## Visualisation & outils de diff | ||||||
|  |     #gource              # visualisation en mouvement de l'historique git | ||||||
|  |     meld                # outil de comparaison graphique | ||||||
|  | 
 | ||||||
|  |     # Editeur texte | ||||||
|  |     atom | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.edition-musique && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # | ||||||
|  |     audacity      # montage audio | ||||||
|  |     easytag       # gestion des métadonnées des fichiers musicaux | ||||||
|  |     picard        # gestion des métadonnées des fichiers musicaux | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.edition-photo && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Retouche, modification & dessin vectoriel | ||||||
|  |     gimp          # logiciel d'édition/montage/retouche photo | ||||||
|  |     inkscape      # édition d'image vectorielle (svg & autre) | ||||||
|  |     #rawtherapee  # développemen de photos en RAW | ||||||
|  | 
 | ||||||
|  |     # TEST d'outil de gestion de catalogue de photos | ||||||
|  |     #kde4.digikam  # gestionnaire de bibliothèque de photo | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.edition-video && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Vidéo | ||||||
|  |     #cinelerra     # editeur video | ||||||
|  |     pitivi        # montage vidéo | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.jeux && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Jeux | ||||||
|  |     urbanterror | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.multimediaSuite && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ## Video | ||||||
|  |     smplayer      # lecteur vidéo | ||||||
|  |     vlc           # lecteur vidéo | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,21 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (true && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Diagnostic réseau Wireshark (droits fins par le groupe wireshark) | ||||||
|  |   programs.wireshark = { | ||||||
|  |     enable = true; | ||||||
|  |     package = pkgs.wireshark; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,27 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.radio && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ## GUI | ||||||
|  |     chirp                   # Configuration de radios portatives | ||||||
|  |     gqrx                    # GUI | ||||||
|  |     cubicsdr                # Another GUI | ||||||
|  |     gnuradio-with-packages  # Software Defined Radio (SDR) software | ||||||
|  | 
 | ||||||
|  |     ## A Trier | ||||||
|  |     #inspectrum    # Tool for analysing captured signals from sdr receivers | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   nixpkgs.config.permittedInsecurePackages = [ | ||||||
|  |     "python2.7-Pillow-6.2.2" | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf (flags.securitySuite && flags.graphical) { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     gnome3.seahorse # gestionnaire graphique de clef GPG | ||||||
|  |     #yubikey-personalization-gui # utilisation de la clef Yubikey | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   nixpkgs.config.packageOverrides = pkgs: { | ||||||
|  |     claws-mail = pkgs.claws-mail.override { | ||||||
|  |       enablePgp = true; | ||||||
|  |       enablePluginArchive = true; | ||||||
|  |       #enablePluginFancy = false; # nécessite wekitgtk qui est troué # Option supprimée dans NixOS 20.03 | ||||||
|  |       enablePluginPdf = true; | ||||||
|  |       enablePluginRavatar = true; | ||||||
|  |       enablePluginSmime = true; | ||||||
|  |       enablePluginVcalendar = true; | ||||||
|  |       enableSpellcheck = true; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     ffmpeg-full = pkgs.ffmpeg-full.override { | ||||||
|  |       nonfreeLicensing = true; | ||||||
|  |       nvenc  = true; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     # bug connu : https://nixos.org/nix-dev/2014-December/015225.html | ||||||
|  |     # find /nix/store/  -maxdepth 1 -type d -name "*gnuradio-*" | ||||||
|  |     # Commande pour générer le path : find /nix/store/  -maxdepth 1 -type d -name "*gnuradio-*"|paste -d: -s - | ||||||
|  |     gnuradio-with-packages = pkgs.gnuradio-with-packages.override { | ||||||
|  |       extraPackages = with pkgs; [ | ||||||
|  |         gnuradio-ais | ||||||
|  |         gnuradio-gsm | ||||||
|  |         gnuradio-nacl | ||||||
|  |         gnuradio-osmosdr    # support des dongle Realtek | ||||||
|  |         gnuradio-rds        # support du décodage de RDS sur les radio FM | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     mumble = pkgs.mumble.override { pulseSupport = true; }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   #nixpkgs.config.permittedInsecurePackages = [ | ||||||
|  |   #  "webkitgtk-2.4.11"       # pour que le plugin fancy de claws-mail fonctionne | ||||||
|  |   #]; | ||||||
|  | } | ||||||
| @ -0,0 +1,58 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Adminsys | ||||||
|  |     bind          # utilisé pour les utilitaires comme dig | ||||||
|  |     cowsay        # pour ansible & 4lulz | ||||||
|  |     dhcp          # client dhcp | ||||||
|  |     iotop | ||||||
|  |     lm_sensors | ||||||
|  |     lshw | ||||||
|  |     lsof | ||||||
|  |     ntp | ||||||
|  |     powerline-fonts | ||||||
|  |     powertop | ||||||
|  |     #ansible | ||||||
|  |     glances | ||||||
|  |     pv            # afficher le débit d'un flux     dd if=/dev/zero | pv | dd of=/dev/null | ||||||
|  |     sysstat       # pour la commande "iostat -x -1" de monitoring d'activité disque | ||||||
|  |     usbutils | ||||||
|  | 
 | ||||||
|  |     # Backup | ||||||
|  |     duplicity     # création de sauvegarde chiffrées (GPG) | ||||||
|  |     par2cmdline   # outil de récupération de fichiers corrompus - .par2 | ||||||
|  | 
 | ||||||
|  |     # Compression | ||||||
|  |     lz4 | ||||||
|  |     lzop | ||||||
|  | 
 | ||||||
|  |     # Système de fichier | ||||||
|  |     ## Montage de filesystem | ||||||
|  |     curlftpfs     # ftp | ||||||
|  |     exfat         # Pour monter les FAT avec Fuse | ||||||
|  |     hubicfuse     # montage hubic | ||||||
|  |     ntfs3g        # ntfs | ||||||
|  |     samba         # partages windows | ||||||
|  |     squashfsTools # squashfs | ||||||
|  |     sshfs-fuse    # ssh | ||||||
|  | 
 | ||||||
|  |     ## Gestion de FS | ||||||
|  |     nfs-utils | ||||||
|  | 
 | ||||||
|  |     ## Exploitation FS | ||||||
|  |     inotify-tools # être notifié lorsque le contenu d'un répertoire change | ||||||
|  |     detox			    # The detox utility renames files to make them easier to work with. | ||||||
|  |     duff          # outil de recherche de fichiers en doublons | ||||||
|  |     #rdfind        # recherche de fichiers doublons pour remplacement par hard/soft link | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ## Manipulation de fichier | ||||||
|  |     vifm            # gestionnaire de fichiers basé sur VIM (console) | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.officeSuite { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Bureautique | ||||||
|  |     aspell aspellDicts.fr         # correction d'ortographe | ||||||
|  |     python39Packages.grammalecte  # correction gramatical | ||||||
|  | 
 | ||||||
|  |     # Gestion de tâche | ||||||
|  |     taskwarrior     # gestionnaire de tâches en console | ||||||
|  | 
 | ||||||
|  |     ## Convertisseurs (texte -> <autre format>) | ||||||
|  |     gnuplot       # générateur de graphes à partir de données numériques | ||||||
|  |     graphviz      # dot, neato : traçage de graphes (carré, rond) | ||||||
|  |     #jekyll       # générateur statique de site web | ||||||
|  |     #odpdown      # conversion md -> presentation ODP : https://github.com/thorstenb/odpdown | ||||||
|  |     pandoc | ||||||
|  |     #haskellPackages.pandoc-citeproc # ***BROKEN*** | ||||||
|  |     texlive.combined.scheme-full # distribution LaTeX | ||||||
|  |     #texLive       # distribution LaTeX de base | ||||||
|  |     #texLiveBeamer # paquets et extensions pour Beamer | ||||||
|  |     #texLiveModerncv # paquets pour la classe Modern CV | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.conception-assistee { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.cartographie { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Gestion de données géographiques | ||||||
|  |     expat | ||||||
|  |     gpsbabel      # pour convertir les données des GPS | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.internetSuite { | ||||||
|  | 
 | ||||||
|  | # Paquets | ||||||
|  | environment.systemPackages = with pkgs; [ | ||||||
|  |     # Clients Internet | ||||||
|  | 
 | ||||||
|  |     ## Réseaux sociaux | ||||||
|  |     #turses                            # client twitter en ncurse | ||||||
|  |     #python39Packages.rainbowstream    # client twitter en console | ||||||
|  |     #rtv                               # client reddit en console | ||||||
|  | 
 | ||||||
|  |     ## Mail & Discussion (texte, audio) | ||||||
|  |     mutt | ||||||
|  | 
 | ||||||
|  |     ## Sauvegarde nuagique (cloud storage) | ||||||
|  |     #rclone | ||||||
|  | 
 | ||||||
|  |     ## P2P | ||||||
|  |     rtorrent      # outil de téléchargement de torrent & magnet | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,73 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |       byobu         # permet de se déconnecter d'un terminal sans l'arréter | ||||||
|  |       tig gti lazygit # outil de gestion de version | ||||||
|  |       gnumake       # pour décrire les recettes de compilation | ||||||
|  |       gnupg         # GPG | ||||||
|  |       htop          # monitoring | ||||||
|  |       lsb-release   # pour les scripts qui utilisent cet outil (dont byobu) | ||||||
|  |       #libressl      # librairie pour faire du TLS et les algorithmes de crypto par OpenBSD | ||||||
|  |       ncdu          # outil pour voir l'espace utilisé | ||||||
|  |       p7zip         # compression de fichier | ||||||
|  |       parted        # partitionnement de disque | ||||||
|  |       pciutils | ||||||
|  |       pinentry      # pour taper les mots de passe gpg | ||||||
|  |       psmisc        # fournis les utilitaires comme killall, fuser, pstree | ||||||
|  |       #python        # python -- python -m SimpleHTTPServer 8000 | ||||||
|  |       shared-mime-info  # MIME info | ||||||
|  |       tmux          # nécessaire pour byobu | ||||||
|  |       tree          # affiche une arborescence de fichiers et dossiers | ||||||
|  |       usbutils | ||||||
|  |       wget          # client HTTP console | ||||||
|  |       which         # pour connaitre le chemin d'un exécutable | ||||||
|  |   ]; | ||||||
|  |   programs = { | ||||||
|  |     fish.enable = true; | ||||||
|  |     gnupg.agent.enable = true; | ||||||
|  |     git = { | ||||||
|  |       enable = true; | ||||||
|  |       package = pkgs.gitFull; | ||||||
|  |       config = { | ||||||
|  |         # http://www.git-attitude.fr/2014/09/15/30-options-git-qui-gagnent-a-etre-connues/ | ||||||
|  |         color = { | ||||||
|  |           diff = "auto"; | ||||||
|  |           branch = "auto"; | ||||||
|  |           interactive = "auto"; | ||||||
|  |           pager = true; | ||||||
|  |           showbranch = "auto"; | ||||||
|  |           status = "auto"; | ||||||
|  |         }; | ||||||
|  |         alias = { | ||||||
|  |           a  = "add -p"; | ||||||
|  |           br = "for-each-ref --sort=committerdate refs/heads/ --format='%(committerdate:short)\t%(authorname)\t%(refname:short)'"; | ||||||
|  |           ci = "commit"; | ||||||
|  |           co = "checkout"; | ||||||
|  |           ff = "pull --ff-only"; | ||||||
|  |           oops = "commit --amend --no-edit"; | ||||||
|  |           # Show files ignored by git | ||||||
|  |           ignored = "ls-files -o -i --exclude-standard"; | ||||||
|  |           ls = "ls-files"; | ||||||
|  |           st = "status"; | ||||||
|  |           # Logs | ||||||
|  |           lol = "log --graph --decorate --pretty=oneline --abbrev-commit"; | ||||||
|  |           lola = "log --graph --decorate --pretty=oneline --abbrev-commit --all"; | ||||||
|  |           not-pushed = "log --branches --not --remotes"; | ||||||
|  |         }; | ||||||
|  |         push.default = "simple"; | ||||||
|  |         code.editor = "${pkgs.vim_configurable}/bin/vim"; | ||||||
|  |       }; | ||||||
|  |       lfs.enable = true; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   #inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     # installées systématiquement | ||||||
|  |     ./default-applications.nix | ||||||
|  | 
 | ||||||
|  |     # commandées par config-generator | ||||||
|  |     ## option de configuration spécifique | ||||||
|  |     ./cao.nix                   # de conception assisté par ordinateur & modélisation | ||||||
|  |     ./cartographie.nix          # manipuler les données géographiques & cartes | ||||||
|  |     ./developpement.nix         # développer des programmes/scripts | ||||||
|  |     ./developpement-elm.nix     # développer en elm | ||||||
|  |     ./developpement-haskell.nix # développer en haskell | ||||||
|  |     ./developpement-java.nix    # développer en java | ||||||
|  |     ./developpement-jetbrains.nix # outils jetbrains | ||||||
|  |     ./developpement-rust.nix    # développer en rust | ||||||
|  |     ./edition-musique.nix       # modifier les fichiers musicaux | ||||||
|  |     ./edition-photo.nix         # modifier les photos & assimilé | ||||||
|  |     ./edition-video.nix         # modifier les vidéos | ||||||
|  |     ./jeux.nix                  # jouer, tout simplement ;) | ||||||
|  |     ./radio.nix                 # outils pour faire de la radio SDR | ||||||
|  |     ./vim.nix                   # vim avec plugins | ||||||
|  | 
 | ||||||
|  |     ## if isDesktop | ||||||
|  |     ./adminsys.nix              # pour gérer le système dans son ensemble et les services | ||||||
|  |     ./bureau.nix                # éléments pour avoir un environement graphique minimal utilisable | ||||||
|  |     ./bureautique.nix           # dédiée à la bureautique (traitement de texte, dessin, ...) | ||||||
|  |     ./client-internet.nix       # pour accéder & utiliser des ressources par le réseau | ||||||
|  |     ./multimedia.nix            # pour gérer le son, l'image et la vidéo | ||||||
|  |     ./network.nix               # de gestion, de diagnostique & surveillance réseau | ||||||
|  |     ./securite.nix              # relatives à la sécurité (chiffrement, gpg, mots de passe, ...) | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.developpement-elm { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     elmPackages.elm | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Services | ||||||
|  | 
 | ||||||
|  |   # Réseau | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedTCPPorts = [ | ||||||
|  |     ]; | ||||||
|  |     allowedUDPPorts = [ | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,36 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.developpement-haskell { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Haskell platform | ||||||
|  |     cabal-install         # fournis cabal | ||||||
|  |     cabal2nix             # convertir les .cabal en .nix | ||||||
|  |     ghc                   # pour les appels depuis les scripts | ||||||
|  |     stack                 # pour les paquets en LTS de stackage | ||||||
|  |   ] ++ (with pkgs.haskellPackages; [ | ||||||
|  |     # Haskell lib | ||||||
|  |     autoproc              # ? procmail | ||||||
|  |     #brittany              # formatteur de code | ||||||
|  |     #darcs                 # gestionnaire de version éponyme | ||||||
|  |     #ghc-mod               # outil d'analyse de code haskell utilisé par IDE | ||||||
|  |     #hindent               # indentation code ***BROKEN*** | ||||||
|  |     hlint                 # qualite de code, analyse statique de code + astuces & bonnes pratiques | ||||||
|  |     #postgrest            # mapper HTTP <-> PostgreSQL | ||||||
|  |     servant               # génération d'API REST | ||||||
|  |     stylish-haskell       # qualité de code | ||||||
|  |     turtle                # genre shell-scripting | ||||||
|  | 
 | ||||||
|  |     # Application perso | ||||||
|  |     #hahp | ||||||
|  |     #pandoc-filter-graphviz # filtre pour utiliser graphviz à partir de pandoc ***BROKEN*** | ||||||
|  |   ]); | ||||||
|  | } | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.developpement-java { | ||||||
|  | 
 | ||||||
|  |   # Installe le paquet + JAVA_HOME | ||||||
|  |   programs.java = { | ||||||
|  |     enable = true; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Systèmes de build autour de java | ||||||
|  |     ant | ||||||
|  |     maven | ||||||
|  |     gradle | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.jetbrains-licensed { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,20 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.developpement-rust { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Rust | ||||||
|  |     cargo               # récupération des dépendances + compilation projet rust | ||||||
|  |     rustc               # pour les appels depuis les scripts | ||||||
|  |     rustup              # outil de configuration de toolchain rust | ||||||
|  |     crate2nix           # génère les fichiers de build Nix dans un projet Rust | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.developpement { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Build / outil de construction | ||||||
|  |     autobuild | ||||||
|  |     autoconf | ||||||
|  |     automake | ||||||
|  | 
 | ||||||
|  |     # Base de données | ||||||
|  |     pg_top                 # monitoring de PostgreSQL | ||||||
|  |     sqlite                 # le moteur de base de données | ||||||
|  | 
 | ||||||
|  |     # C / C++ | ||||||
|  |     gcc                    # pour les appels depuis les scripts | ||||||
|  | 
 | ||||||
|  |     # Gestion des sources | ||||||
|  |     cloc                   # outil pour compter les lignes de code source | ||||||
|  |     mercurial | ||||||
|  |     subversion | ||||||
|  | 
 | ||||||
|  |     # spécification | ||||||
|  |     plantuml               # diagrammes UML et plus si affinité | ||||||
|  | 
 | ||||||
|  |     # Mono | ||||||
|  |     #mono46                # interpréteur .NET | ||||||
|  | 
 | ||||||
|  |     ## Visualisation & outils de diff | ||||||
|  |     #vbindiff              # diff de fichier hexadecimaux avec vim | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.edition-musique { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,21 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.edition-photo { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  | environment.systemPackages = with pkgs; [ | ||||||
|  |     # Méta données | ||||||
|  |     exif | ||||||
|  |     exiftags | ||||||
|  | 
 | ||||||
|  |     # Retouche, modification & dessin vectoriel | ||||||
|  |     imagemagick   # modification image en CLI | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.edition-video { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ffmpeg-full   # assemblage de flux audio & video en ligne de commande | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.jeux { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,20 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.multimediaSuite { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ## Audio | ||||||
|  |     beep | ||||||
|  |     cmus          # lecteur audio console | ||||||
|  |     espeak        # synthèse vocale | ||||||
|  |     vorbis-tools  # codec | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     # Outils réseau | ||||||
|  |     iperf         # outil de mesure de la qualité du réseau | ||||||
|  |     iptraf-ng     # outil de mesure de la qualité du réseau | ||||||
|  |     nload         # affichage de statisques d'utilisation instantannées du réseau | ||||||
|  |     inetutils | ||||||
|  | 
 | ||||||
|  |     ## Diagnostic | ||||||
|  |     arp-scan | ||||||
|  |     #mtr  -> installé plus bas | ||||||
|  |     nmap          # outil de scan de port réseau | ||||||
|  |     whois | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # https://github.com/NixOS/nixpkgs/issues/30335 | ||||||
|  |   # Some programs need SUID wrappers, can be configured further or are started in user sessions. | ||||||
|  |   programs.mtr.enable = true; | ||||||
|  | 
 | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedTCPPorts = [ | ||||||
|  |       5201 # iperf | ||||||
|  |     ]; | ||||||
|  |     allowedUDPPorts = [ | ||||||
|  |       5201 # iperf | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,29 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.radio { | ||||||
|  | 
 | ||||||
|  | # pour que ça marche | ||||||
|  | # sudo rmmod dvb_usb_rtl28xxu | ||||||
|  | 
 | ||||||
|  | # lecture radio FM | ||||||
|  | # rtl_fm -f 96.9e6 -M wbfm -s 440000 -r 44100 - | aplay -r 44100 -f S16_LE | ||||||
|  | # rtl_fm -f 96.95e6 -M wbfm -s 441000 -r 44100 - | aplay -r 44100 -f S16_LE -t raw -c 1 | ||||||
|  | # rtl_fm -f 96.95e6 -M wbfm -s 441000 -r 44100 -E deemp - |pv| aplay -r 44100 -f S16_LE -t raw -c 1 | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     gnss-sdr    # Global Navigation Satellite Systems software-defined receiver | ||||||
|  |     liquid-dsp  # Digital signal processing library for software-defined radios | ||||||
|  |     rtl-sdr     # Turns your Realtek RTL2832 based DVB dongle into a SDR receiver | ||||||
|  |     dump1090    # Listen to planes ADS-B and view them on a map | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   hardware.rtl-sdr.enable = true; | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.securitySuite { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     pass            # gestionnaire de mots de passe | ||||||
|  |     pwgen           # générateur de mots de passe | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | {pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   myVim = pkgs.vim_configurable.customize { | ||||||
|  |     # Specifies the vim binary name. | ||||||
|  |     # E.g. set this to "my-vim" and you need to type "my-vim" to open this vim | ||||||
|  |     # This allows to have multiple vim packages installed (e.g. with a different set of plugins) | ||||||
|  |     name = "vim"; | ||||||
|  |     vimrcConfig.customRC = builtins.readFile ./vimrc; | ||||||
|  |     vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; { | ||||||
|  |       start = [ | ||||||
|  |         wombat256-vim | ||||||
|  |       ]; | ||||||
|  |       opt = [ | ||||||
|  |         elm-vim | ||||||
|  |         vim-fish | ||||||
|  |         vim-nix | ||||||
|  |         vimwiki | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | in { | ||||||
|  |   programs.vim = { | ||||||
|  |     defaultEditor = true; | ||||||
|  |     package = myVim; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -1,13 +1,18 @@ | |||||||
| { ... }: | { config, lib, pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|   imports = [ |   imports = [ | ||||||
|     # recettes |  | ||||||
|     ./base/base.nix |  | ||||||
|     ./desktop/desktop.nix |  | ||||||
|     ./public/public.nix |  | ||||||
| 
 |  | ||||||
|     # moulinette de configuration |     # moulinette de configuration | ||||||
|     ./config-generator.nix |     /*./config-generator.nix*/ | ||||||
|  |     ./options.nix | ||||||
|  | 
 | ||||||
|  |     # Redéfinition d'applications et de modules | ||||||
|  |     ./applications/overrides.nix | ||||||
|  | 
 | ||||||
|  |     # subfolders | ||||||
|  |     ./applications/graphical/default.nix | ||||||
|  |     ./applications/terminal/default.nix | ||||||
|  |     ./configuration/default.nix | ||||||
|  |     ./services/default.nix | ||||||
|   ]; |   ]; | ||||||
| } | } | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| /etc/nixos/base/Makefile |  | ||||||
| @ -1,24 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf mkMerge; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
| in { |  | ||||||
|   nix = mkIf config.r6d.config-generator.nix-serve-client { |  | ||||||
|     # Cache http pour le store |  | ||||||
|     requireSignedBinaryCaches = false; |  | ||||||
|     binaryCaches =  [ |  | ||||||
|       ("https://cache.nixos.org/") |  | ||||||
|       (mkIf (profiles.isDubronetwork && (! computers.isMonstre)) "http://192.168.10.169:5000") |  | ||||||
|       (mkIf profiles.isDubronetwork "http://192.168.10.252:5000") |  | ||||||
| 
 |  | ||||||
|       (mkIf (profiles.isPrunetwork && !profiles.isServer) "http://192.168.1.20:5000") |  | ||||||
|     ]; |  | ||||||
|     extraOptions = '' |  | ||||||
|       connect-timeout = 5 |  | ||||||
|     ''; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|   } |  | ||||||
| @ -1,12 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| with pkgs.lib; |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
| in { |  | ||||||
|   # Cache http pour le store |  | ||||||
| 
 |  | ||||||
|   services.nix-serve.enable = cfg.nix-serve-server; |  | ||||||
|   networking.firewall.allowedTCPPorts = mkIf cfg.nix-serve-server [ 5000 ]; |  | ||||||
| } |  | ||||||
| @ -1,39 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| with pkgs.lib; |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
| 
 |  | ||||||
|   ignoreip = "pedro.dubronetwork.fr cube.dubronetwork.fr voyage.prunetwork.fr xray.prunetwork.fr 192.168.0.0/16 172.16.0.0/16"; |  | ||||||
|   destemail = "admins@dubronetwork.fr"; |  | ||||||
| 
 |  | ||||||
| in { |  | ||||||
|   # Gestion de fail2ban |  | ||||||
|    |  | ||||||
|   services = mkIf cfg.fail2ban { |  | ||||||
|     fail2ban = { |  | ||||||
|       enable = true; |  | ||||||
|       jails = { |  | ||||||
|         DEFAULT = '' |  | ||||||
|           # "ignoreip" can be an IP address, a CIDR mask or a DNS host |  | ||||||
|           ignoreip = 127.0.0.1/8 ${ignoreip} |  | ||||||
| 
 |  | ||||||
|           # 1 jour |  | ||||||
|           # bantime  = 86400 |  | ||||||
|           # 5 jours  |  | ||||||
|           bantime  = 432000 |  | ||||||
| 
 |  | ||||||
|           maxretry = 3 |  | ||||||
| 
 |  | ||||||
|           destemail = ${destemail} |  | ||||||
|         ''; |  | ||||||
|         ssh-route = '' |  | ||||||
|           filter   = sshd |  | ||||||
|           action   = route[blocktype=blackhole] |  | ||||||
|           maxretry = 3 |  | ||||||
|         ''; |  | ||||||
|       }; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								| @ -1,13 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   imports = [ |  | ||||||
|     ./network-dns.nix |  | ||||||
| 
 |  | ||||||
|     # inclusion conditionnelle |  | ||||||
|     ./activation-manuelle/service-fail2ban.nix |  | ||||||
|     ./activation-manuelle/nix-serve-client.nix |  | ||||||
|     ./activation-manuelle/nix-serve-server.nix |  | ||||||
|     ./activation-manuelle/users.nix |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,14 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   # Définition des domaines utilisés lorsque un identifiant non-FQDN est donné (ping, nslookup) |  | ||||||
|   networking = { |  | ||||||
|     search = [ |  | ||||||
|       "dubronetwork.fr" |  | ||||||
|       "prunetwork.fr" |  | ||||||
|       "teleragno.fr" |  | ||||||
|       "teleragno.net" |  | ||||||
|     ]; |  | ||||||
|     dnsExtensionMechanism = true; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | 
 | ||||||
|  | SESSION_NAME="Adminsys" | ||||||
|  | PROJECT_DIR="/etc/nixos" | ||||||
|  | PROJECT_MODULES=$(cd $PROJECT_DIR && git submodule --quiet foreach 'echo $path') | ||||||
|  | HEAD_ADDITIONNAL_TABS="git config" | ||||||
|  | TAIL_ADDITIONNAL_TABS="glances htop" | ||||||
|  | 
 | ||||||
|  | # création de la session | ||||||
|  | byobu new-session -d -s ${SESSION_NAME} -n 'run' -c ${PROJECT_DIR}; | ||||||
|  | 
 | ||||||
|  | # définition des onglets | ||||||
|  | 
 | ||||||
|  | ## onglets courants au début. Positionnés dans dossier projet | ||||||
|  | for i in ${HEAD_ADDITIONNAL_TABS} | ||||||
|  | do | ||||||
|  |     byobu new-window -n ${i} -c ${PROJECT_DIR}; | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | ## onglets spécifiques au projet. Positionnés dans les dossiers enfants | ||||||
|  | for i in ${PROJECT_MODULES} | ||||||
|  | do | ||||||
|  |     byobu new-window -n ${i} -c ${PROJECT_DIR}/${i}; | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | ## onglets courants à la fin. Positionnés dans dossier projet. Lance la commande du même nom que l'onglet | ||||||
|  | for i in ${TAIL_ADDITIONNAL_TABS} | ||||||
|  | do | ||||||
|  |     byobu new-window -n ${i} -c ${PROJECT_DIR} ${i}; | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | # affiche la session | ||||||
|  | byobu -2 attach-session -t ${SESSION_NAME}; | ||||||
|  | 
 | ||||||
| @ -1,261 +1,55 @@ | |||||||
| { config, lib, pkgs, ... }: | { config, lib, pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| # exemple utilisé pour commencer bird.nix |  | ||||||
| let | let | ||||||
|   inherit (lib) mkEnableOption mkIf mkMerge mkOption singleton types; |   inherit (lib) mkEnableOption mkIf mkMerge mkOption singleton types; | ||||||
|   cfg = config.r6d.config-generator; |   cfg = config.r6d.config-generator; | ||||||
|   pfl = config.r6d.profiles; |   pfl = config.r6d.profiles; | ||||||
|   comp = config.r6d.computers; |   comp = config.r6d.computers; | ||||||
|   host = config.networking.hostName; |   host = config.networking.fqdn; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
| in | in | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|     ###### interface | # TODO camel case partout | ||||||
| 
 | # TODO everything in english | ||||||
|     options = { | # TODO sortir ce qui est privé | ||||||
| 
 |   ###### interface | ||||||
|       #* Utilisé pour afecter des capacités aux machines | 
 | ||||||
|       r6d.profiles  = { |   options = { | ||||||
|         # Domaine |     #* Utilisé pour avoir des raccourcis de machine | ||||||
|         isDubronetwork  = mkEnableOption "Pour distinguer les machines dubronetwork."; |     r6d.computers = { | ||||||
|         isPrunetwork    = mkEnableOption "Pour distinguer les machines prunetwork."; |       isNomade    = mkEnableOption "Identification du nom de machine."; | ||||||
|         # Utilisation machine |  | ||||||
|         isDesktop       = mkEnableOption "Pour indiquer une machine avec interface graphique."; |  | ||||||
|         isHome          = mkEnableOption "Pour indiquer que la machine sert à la maison (divertissement & autre)."; |  | ||||||
|         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"; |  | ||||||
|         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."; |  | ||||||
|         fail2ban        = mkEnableOption "Profil pour activer Fail2ban."; |  | ||||||
|         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."; |  | ||||||
|         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."; |  | ||||||
|         online-ipv6     = mkEnableOption "Profil pour activer l'IPv6 de online.net"; |  | ||||||
|         print           = mkEnableOption "Profil pour activer cups & pouvoir imprimer."; |  | ||||||
|         rabbitmq        = mkEnableOption "Profil pour activer le service de messagerie AMQP."; |  | ||||||
|         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."; |  | ||||||
|       }; |  | ||||||
|       #* Utilisé pour avoir des raccourcis de machine |  | ||||||
|       r6d.computers = { |  | ||||||
|         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."; |  | ||||||
|         isPhenom        = mkEnableOption "Identification du nom de machine."; |  | ||||||
|         isRadx          = mkEnableOption "Identification du nom de machine."; |  | ||||||
|         isRollo         = mkEnableOption "Identification du nom de machine."; |  | ||||||
|         isXray          = mkEnableOption "Identification du nom de machine."; |  | ||||||
|       }; |  | ||||||
|     }; |     }; | ||||||
|  |   }; | ||||||
| 
 | 
 | ||||||
|     ###### implementation |   ###### implementation | ||||||
|     # https://nixos.org/releases/nixos/14.12-small/nixos-14.12.374.61adf9e/manual/sec-writing-modules.html |   # 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 |   # https://nixos.org/wiki/NixOS:extend_NixOS | ||||||
|     config = mkMerge |   config = mkMerge | ||||||
|     [ # Unconditional stuff. |   [ | ||||||
|     { |  | ||||||
|       r6d.config-generator.enable = true; |  | ||||||
|       r6d.computers = { |  | ||||||
|         isLatitude  = host == "latitude.dubronetwork.fr"; |  | ||||||
|         isMonstre   = host == "monstre.dubronetwork.fr"; |  | ||||||
|         isNeoNomade = host == "neo-nomade.dubronetwork.fr"; |  | ||||||
|         isNomade    = host == "nomade.dubronetwork.fr"; |  | ||||||
|         isOcean     = host == "ocean.prunetwork.fr"; |  | ||||||
|         isPhenom    = host == "phenom.dubronetwork.fr"; |  | ||||||
|         isRadx      = host == "radx.prunetwork.fr"; |  | ||||||
|         isRollo     = host == "rollo.dubronetwork.fr"; |  | ||||||
|         isXray      = host == "xray.prunetwork.fr"; |  | ||||||
|       }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     # Conditional stuff |  | ||||||
| 
 |  | ||||||
|     ## Définition des profils génériques |     ## Définition des profils génériques | ||||||
|     (mkIf pfl.isDesktop { |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         awesome = true; |  | ||||||
|         nix-serve-client = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf pfl.isHome { |  | ||||||
|       r6d.profiles.isDesktop = true; |  | ||||||
|     }) |  | ||||||
|     (mkIf pfl.isServer { |  | ||||||
|       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; |  | ||||||
| 
 |  | ||||||
|         #rabbitmq =  true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     # /!\ PAS un serveur |     # /!\ PAS un serveur | ||||||
|     (mkIf (!pfl.isServer) { |     (mkIf (!pfl.isServer || comp.isMonstre) { | ||||||
|       r6d.config-generator = { |       r6d.config-generator = { | ||||||
|         dns_resolveur = true; |         dns_resolveur = true; | ||||||
|       }; |       }; | ||||||
|     }) |     }) | ||||||
|     (mkIf pfl.isWorkstation { |  | ||||||
|       r6d.profiles.isDesktop = true; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         cartographie = true; |  | ||||||
|         developpement = true; |  | ||||||
|         docker = true; |  | ||||||
| 
 |  | ||||||
|         edition-musique = true; |  | ||||||
|         edition-photo = true; |  | ||||||
|         edition-video = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     ## Profils liés à Dubronetwork |  | ||||||
|     (mkIf pfl.isDubronetwork { |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         auto-upgrade = true; |  | ||||||
|         print = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf (pfl.isDubronetwork && pfl.isHome) { |  | ||||||
|       r6d.config-generator.jeux = true; |  | ||||||
|     }) |  | ||||||
|     (mkIf (pfl.isDubronetwork && pfl.isServer) { |  | ||||||
|       r6d.config-generator.nix-serve-server = true; |  | ||||||
|     }) |  | ||||||
|     (mkIf (pfl.isDubronetwork && pfl.isWorkstation) { |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         conception-assistee = true; |  | ||||||
|         virtualbox = true; |  | ||||||
|         xmonad = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     ## Profils liés à Prunetwork |  | ||||||
|     (mkIf pfl.isPrunetwork { |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         auto-upgrade = true; |  | ||||||
|         fail2ban = true; |  | ||||||
|         swap = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|     ## Affectation des profils aux machines |     ## Affectation des profils aux machines | ||||||
|     (mkIf comp.isOcean { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isPrunetwork = true; |  | ||||||
|         isServer = true; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         docker = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf comp.isRadx { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isHome = true; |  | ||||||
|         isPrunetwork = true; |  | ||||||
|         isServer = true; |  | ||||||
|         isWorkstation = true; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         nix-serve-server = true; |  | ||||||
|         virtualbox = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf comp.isXray { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isPrunetwork = true; |  | ||||||
|         isServer = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     (mkIf comp.isLatitude { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isDubronetwork = true; |  | ||||||
|         isHome = true; |  | ||||||
|         isWorkstation = true; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         laptop = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf comp.isMonstre { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isDubronetwork = true; |  | ||||||
|         isServer = true; |  | ||||||
|       }; |  | ||||||
| 
 | 
 | ||||||
|       r6d.config-generator.fail2ban = true; |     # Dubro Vivo - St Malo | ||||||
|     }) |     #tincAddress = "192.168.12.8/24"; | ||||||
|     (mkIf comp.isNeoNomade{ |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isDubronetwork = true; |  | ||||||
|         isHome = true; |  | ||||||
|       }; |  | ||||||
| 
 | 
 | ||||||
|       r6d.config-generator = { |  | ||||||
|         laptop = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf comp.isNomade{ |     (mkIf comp.isNomade{ | ||||||
|  |       networking.hostName = "nomade"; # Define your hostname. | ||||||
|  |       networking.domain = "dubronetwork.fr"; | ||||||
|       r6d.profiles.isDubronetwork = true; |       r6d.profiles.isDubronetwork = true; | ||||||
| 
 | 
 | ||||||
|       r6d.config-generator = { |       r6d.config-generator = { | ||||||
|         laptop = true; |         laptop = true; | ||||||
|       }; |       }; | ||||||
|     }) |     }) | ||||||
|     (mkIf comp.isPhenom { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isDubronetwork = true; |  | ||||||
|         isHome = true; |  | ||||||
|         isWorkstation = true; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         nix-serve-server = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|     (mkIf comp.isRollo { |  | ||||||
|       r6d.profiles = { |  | ||||||
|         isDubronetwork = true; |  | ||||||
|         isServer = true; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       r6d.config-generator = { |  | ||||||
|         dovecot = true; |  | ||||||
|         fail2ban = true; |  | ||||||
|         murmur = true; |  | ||||||
|         online-ipv6 = true; |  | ||||||
|         znc = true; |  | ||||||
|       }; |  | ||||||
|     }) |  | ||||||
|   ]; |   ]; | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,28 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   #inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  | 
 | ||||||
|  |     # installées systématiquement | ||||||
|  |     ./environment.nix | ||||||
|  |     ./localisation.nix | ||||||
|  |     ./network.nix | ||||||
|  |     #./network-ipv6.nix | ||||||
|  |     ./u2f.nix | ||||||
|  |     ./udev.nix | ||||||
|  | 
 | ||||||
|  |     # commandées par config-generator | ||||||
|  |     ## option de configuration spécifique | ||||||
|  |     ./awesome.nix               # pour le gestionaire de fenêtres awesome | ||||||
|  |     ./laptop.nix                    # appli & configuration adaptée pour un PC portable | ||||||
|  |     ./nix-options.nix              # options de Nix (update, gc, optimisation) | ||||||
|  |     ./swap.nix                      # définition de l'utilisation du swap | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,64 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # The NixOS release to be compatible with for stateful data such as databases. | ||||||
|  |   system.stateVersion = "19.09"; | ||||||
|  | 
 | ||||||
|  |   # copies the NixOS configuration file (usually /etc/nixos/configuration.nix) and links it from the resulting system (getting to /run/current-system/configuration.nix) | ||||||
|  |   system.copySystemConfiguration = true; | ||||||
|  | 
 | ||||||
|  |   # On autorise les paquets non-libres | ||||||
|  |   nixpkgs.config.allowUnfree = true; | ||||||
|  | 
 | ||||||
|  |   # NixOS Hardening | ||||||
|  |   #security.grsecurity.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Ménage de /tmp au boot | ||||||
|  |   boot.cleanTmpDir = true; | ||||||
|  | 
 | ||||||
|  |   # Activation des pages de manuel | ||||||
|  |   documentation.man.enable = true; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment = { | ||||||
|  |     shellAliases = { | ||||||
|  |       byobu = "byobu-tmux"; | ||||||
|  |       gpg = "gpg2"; | ||||||
|  |       jacques-a-dit = "sudo"; | ||||||
|  |       tree = "tree -C"; | ||||||
|  |       tree1 = "tree -d -L 1"; | ||||||
|  |       tree2 = "tree -d -L 2"; | ||||||
|  |       tree3 = "tree -d -L 3"; | ||||||
|  |       # https://gist.github.com/amitchhajer/4461043 : Count number of code lines in git repository per user | ||||||
|  |       #git-loc = "git ls-files | while read f; do git blame --line-porcelain "${f}" | grep '^author '; done | sort -f | uniq -ic | sort -n"; | ||||||
|  |       grep = "grep --color=auto"; | ||||||
|  |       vi = "vim"; | ||||||
|  |       byobu-adminsys = "/etc/nixos/base/byobu-adminsys"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |   programs.bash = { | ||||||
|  |     enableCompletion = true; | ||||||
|  |     promptInit = builtins.readFile ./bash-prompt.sh; | ||||||
|  |     interactiveShellInit = builtins.readFile ./bash-interactive-init.sh; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # https://wiki.mozilla.org/Security/Guidelines/OpenSSH#Modern | ||||||
|  |   programs.ssh.extraConfig = '' | ||||||
|  |     # Ensure KnownHosts are unreadable if leaked - it is otherwise easier to know which hosts your keys have access to. | ||||||
|  |     HashKnownHosts yes | ||||||
|  |     # Host keys the client accepts - order here is honored by OpenSSH | ||||||
|  |     HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256 | ||||||
|  | 
 | ||||||
|  |     KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256 | ||||||
|  |     MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com | ||||||
|  |     Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr | ||||||
|  |   ''; | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf flags.laptop { | ||||||
|  | 
 | ||||||
|  |   # Gestion spécifique pour PC portable | ||||||
|  | 
 | ||||||
|  |   ## Gestion de l'énergie | ||||||
|  |   services.tlp.enable = true; | ||||||
|  | 
 | ||||||
|  |   ## Activation d'un gestionnaire de réseau | ||||||
|  |   networking.networkmanager.enable = true; | ||||||
|  | 
 | ||||||
|  |   hardware.bluetooth = { | ||||||
|  |     enable = true; | ||||||
|  |     powerOnBoot = false; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Gestion graphique du réseau dans la barre système | ||||||
|  |   programs.nm-applet.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     wirelesstools           # fournis iwconfig | ||||||
|  |     blueman                 # outils bluetooth (manager, system tray) | ||||||
|  |     cbatticon               # status de la batterie dans le system tray | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Services | ||||||
|  |   services.blueman.enable = true; | ||||||
|  |   services.xserver.libinput = { | ||||||
|  |     enable = true; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Select internationalisation properties. | ||||||
|  |   console = { | ||||||
|  |     font = "Lat2-Terminus16"; | ||||||
|  |     keyMap = "fr"; | ||||||
|  |   }; | ||||||
|  |   i18n = { | ||||||
|  |     defaultLocale = "fr_FR.UTF-8"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Set your time zone. | ||||||
|  |   time.timeZone = "Europe/Paris"; | ||||||
|  | } | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # fix: Hostname -s renvoie "Unknown host" alors que hostname renvoie la bonne valeur | ||||||
|  |   #      Il s'avère que hostname vérifie la validité du FQDN et du reverse. | ||||||
|  |   #      Fixer ces paramètres dans les hosts permet de faire tomber en marche | ||||||
|  |   networking.extraHosts = '' | ||||||
|  |     127.0.0.1   ${config.networking.fqdn} ${config.networking.hostName} | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   # Activation du routage | ||||||
|  |   boot.kernel.sysctl = { | ||||||
|  |     "net.ipv4.conf.all.forwarding" = true; | ||||||
|  |     "net.ipv4.conf.default.forwarding" = true; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |   # Automatic update & automatic clean | ||||||
|  | 
 | ||||||
|  |   system.autoUpgrade.enable = flags.auto-upgrade; | ||||||
|  |   nix = { | ||||||
|  |     extraOptions = '' | ||||||
|  |       experimental-features = nix-command flakes | ||||||
|  |     ''; | ||||||
|  |     settings = { | ||||||
|  |       auto-optimise-store = true; | ||||||
|  |       # Nombre de process d'installation en parrallèle effectués par Nix | ||||||
|  |       cores = 0; | ||||||
|  |     }; | ||||||
|  |     gc = { | ||||||
|  |       automatic = true; | ||||||
|  |       dates = "daily"; | ||||||
|  |       options = "--delete-older-than 7d"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -1,15 +1,16 @@ | |||||||
| { config, lib, pkgs, ... }: | { config, lib, pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| let | let | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|   cfg = config.r6d.config-generator; |   annuaire = config.r6d.machines; | ||||||
|   computers = config.r6d.computers; |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|   profiles = config.r6d.profiles; |   flags = currentMachine.configurationFlags; | ||||||
| in | in | ||||||
| 
 | 
 | ||||||
| mkIf cfg.swap { | mkIf flags.swap { | ||||||
|  | 
 | ||||||
|   # Gestion du swap |   # Gestion du swap | ||||||
|    | 
 | ||||||
|   # https://en.wikipedia.org/wiki/Swappiness |   # https://en.wikipedia.org/wiki/Swappiness | ||||||
|   boot.kernel.sysctl = { |   boot.kernel.sysctl = { | ||||||
|     # le swap est activé (!= 0) |     # le swap est activé (!= 0) | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  |   # Ajout du support des yobikey & hyperfido | ||||||
|  |   ## source des valeurs udev : https://github.com/Yubico/libu2f-host/blob/master/70-u2f.rules | ||||||
|  | 
 | ||||||
|  |   ## source car udev sur nixos semble ancien : https://raw.githubusercontent.com/Yubico/libu2f-host/master/70-old-u2f.rules | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |   # this udev file should be used with udev older than 188 | ||||||
|  |   ACTION!="add|change", GOTO="u2f_end" | ||||||
|  | 
 | ||||||
|  |   # Yubico YubiKey | ||||||
|  |   KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0113|0114|0115|0116|0120|0402|0403|0406|0407|0410", GROUP="plugdev", MODE="0660" | ||||||
|  | 
 | ||||||
|  |   # Happlink (formerly Plug-Up) Security KEY | ||||||
|  |   KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0", GROUP="plugdev", MODE="0660" | ||||||
|  | 
 | ||||||
|  |   #  Neowave Keydo and Keydo AES | ||||||
|  |   KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1e0d", ATTRS{idProduct}=="f1d0|f1ae", GROUP="plugdev", MODE="0660" | ||||||
|  | 
 | ||||||
|  |   # HyperSecu HyperFIDO | ||||||
|  |   KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="096e", ATTRS{idProduct}=="0880", GROUP="plugdev", MODE="0660" | ||||||
|  | 
 | ||||||
|  |   LABEL="u2f_end" | ||||||
|  | 
 | ||||||
|  |   SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", GROUP="audio", MODE="0666", SYMLINK+="rtl_sdr" | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   security.pam.u2f.enable = true; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     libu2f-host | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf false { | ||||||
|  |   # Définition du IO Scheduler pour les SSD | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |   # set deadline scheduler for non-rotating disks | ||||||
|  |   # according to https://wiki.debian.org/SSDOptimization, deadline is preferred over noop | ||||||
|  |   ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline" | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -1,24 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| 
 |  | ||||||
| in  mkIf cfg.xmonad { |  | ||||||
|   # Paquets spécifiques pour xmonad |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs;[ |  | ||||||
|     dmenu |  | ||||||
|     haskellPackages.xmobar |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   services.xserver.windowManager.xmonad = { |  | ||||||
|     enable = true; |  | ||||||
|     enableContribAndExtras = true; |  | ||||||
|     extraPackages = haskellPackages: [ |  | ||||||
|       haskellPackages.xmobar |  | ||||||
|     ]; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @ -1,57 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
|   mkIf = pkgs.lib.mkIf; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   imports = [                   # applications : |  | ||||||
|     # commandées par config-generator |  | ||||||
|     ./activation-manuelle/xmonad/xmonad.nix      # gestionnaire de fenêtres xmonad |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; mkIf profiles.isDesktop [ |  | ||||||
|     # Environement de bureau |  | ||||||
|     arandr          # interface graphique pour xrandr |  | ||||||
|     wmname          # pour définir le nom du gestionnaire de fenêtre (utile pour java) |  | ||||||
|     kde4.ksnapshot# capture d'écran |  | ||||||
|     xorg.xbacklight # pour gérer la luminosité de l'écran |  | ||||||
|     xorg.xev        # pour repérer les codes + noms standard des actions clavier/souris |  | ||||||
|     xorg.xkill      # pour 'tuer une application' |  | ||||||
| 
 |  | ||||||
|     ## Gestionnaire de fenêtre & Thème |  | ||||||
|     gnome.gnome_icon_theme  # thème d'icone - semble fonctionner avec spaceFM |  | ||||||
| 
 |  | ||||||
|     ## Manipulation de fichier |  | ||||||
|     pcmanfm         # gestionnaire de fichiers graphique |  | ||||||
|     spaceFM         # gestionnaire de fichiers graphique |  | ||||||
|     vifm            # gestionnaire de fichiers basé sur VIM (console) |  | ||||||
| 
 |  | ||||||
|     ## Terminal |  | ||||||
|     sakura          # terminal |  | ||||||
| 
 |  | ||||||
|     # A trier |  | ||||||
|     cowsay |  | ||||||
|     fgallery        # générateur de gallerie statique http://www.thregr.org/~wavexx/software/fgallery/ |  | ||||||
|     samba |  | ||||||
|     taskwarrior     # gestionnaire de tâches en console |  | ||||||
|     udevil          # pour le montage des media amovibles |  | ||||||
|     xclip           # manipulation du clipboard X depuis la console |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   # Polices supplémentaires |  | ||||||
|   fonts.fonts = with pkgs; mkIf profiles.isDesktop [ |  | ||||||
|     fira            # police créée pour Firefox |  | ||||||
|     fira-code       # idem fira-mono + ligatures pour la programmation |  | ||||||
|     fira-mono       # dérivée de fira en monospace |  | ||||||
|     hack-font       # police monospace créée explicitement pour coder |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   nixpkgs.config.packageOverrides = pkgs: { |  | ||||||
|     clawsMail = pkgs.clawsMail.override { enablePluginFancy = true; }; |  | ||||||
|     mumble = pkgs.mumble.override { pulseSupport = true; }; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | all: | ||||||
|  | 	nixos-generate-config --root /mnt | ||||||
|  | 	git config --global user.email "nixos-live@example.org" | ||||||
|  | 	git config --global user.name "NixOS Live" | ||||||
|  | 	cd /mnt/etc/nixos && git init . && git add . && git commit -m "initial commit" | ||||||
|  | 	cd /mnt/etc/nixos && git submodule add http://gogs.prunetwork.fr:80/nixos-config/nixos-template-base.git base | ||||||
|  | 	cd /mnt/etc/nixos && git submodule add https://gogs.prunetwork.fr/Capgemini-CDS-Arkea/template-nixos.git capgemini-cmb | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     capgemini-cmb/default.nix | ||||||
|  |     /nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix | ||||||
|  |     nixos-template-base/base.nix | ||||||
|  |   ]; | ||||||
|  |   # Custom name | ||||||
|  |   isoImage.isoName = pkgs.lib.mkForce "${config.isoImage.isoBaseName}-capgemini-${config.system.nixosLabel}-${pkgs.stdenv.system}.iso"; | ||||||
|  |   # Avoid having the terminal flooded by kernel audit messages | ||||||
|  |   boot.kernelParams = [ "audit=0" ]; | ||||||
|  | 
 | ||||||
|  |   # Files to copy to the liveCD | ||||||
|  |   isoImage.contents = [ | ||||||
|  |     { | ||||||
|  |       source = ./Makefile.installation; | ||||||
|  |       target = "/custom/Makefile"; | ||||||
|  |     } | ||||||
|  |   ]; | ||||||
|  |   environment.shellAliases = { nixos-generate-custom-config = "cd /iso/custom/ && make";}; | ||||||
|  |   networking.hostName = "nixos-livecd"; | ||||||
|  |   networking.domain = "grudu.net"; | ||||||
|  | } | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | let | ||||||
|  |   lib = with import <nixpkgs> {}; pkgs.lib; | ||||||
|  | 
 | ||||||
|  |   profiles = { | ||||||
|  |     isDesktopEnvironment = { | ||||||
|  |       awesome = true; | ||||||
|  |       internetSuite = true; | ||||||
|  |       graphical = true; | ||||||
|  |       multimediaSuite = true; | ||||||
|  |       officeSuite = true; | ||||||
|  |       pulseaudio = true; | ||||||
|  |       securitySuite = true; | ||||||
|  |     }; | ||||||
|  |     isWorkstation = { | ||||||
|  |       docker = true; | ||||||
|  |       developpement = true; | ||||||
|  |       developpement-elm = true; | ||||||
|  |       developpement-haskell = true; | ||||||
|  |       developpement-java = true; | ||||||
|  |       developpement-rust = true; | ||||||
|  |     }; | ||||||
|  |     #isServer = { | ||||||
|  |       #}; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | with lib; rec{ | ||||||
|  |   # Apply the profiles (pre-defined + custom) to the whole directory | ||||||
|  |   applyProfilesToDirectory = customProfiles: directory: | ||||||
|  |     lib.mapAttrs (applyProfilesToMachine customProfiles) directory; | ||||||
|  | 
 | ||||||
|  |   # Apply the profiles (pre-defined + custom) to a machine | ||||||
|  |   applyProfilesToMachine = customProfiles: machineName: machineOptions: | ||||||
|  |   { configurationFlags = lib.recursiveUpdate (generateFlagsSet customProfiles machineOptions.profiles) machineOptions.configurationFlags; | ||||||
|  |     configurationOptions = machineOptions.configurationOptions; | ||||||
|  |     profiles = machineOptions.profiles; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Generate a set of configuration flags based on profiles | ||||||
|  |   generateFlagsSet = customProfiles: machineProfiles: | ||||||
|  |   let | ||||||
|  |     allProfiles = recursiveUpdate profiles customProfiles; | ||||||
|  |     conditionalFlags = name: value: | ||||||
|  |       if machineProfiles.${name} | ||||||
|  |       then value | ||||||
|  |       else {}; | ||||||
|  |   in | ||||||
|  |   foldr (a: b: a // b) {} (mapAttrsToList conditionalFlags allProfiles); | ||||||
|  | } | ||||||
| @ -1,40 +0,0 @@ | |||||||
| { stdenv, fetchurl |  | ||||||
| , boost |  | ||||||
| , bzip2 |  | ||||||
| , cmake |  | ||||||
| , expat |  | ||||||
| , geos |  | ||||||
| , lua |  | ||||||
| , postgresql |  | ||||||
| , proj |  | ||||||
| , zlib |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| stdenv.mkDerivation rec { |  | ||||||
|   #version = "0.87.1"; |  | ||||||
|   version = "0.90.1"; |  | ||||||
|   name = "osm2pgsql-${version}-0"; |  | ||||||
| 
 |  | ||||||
|   src = fetchurl { |  | ||||||
|     url = "https://github.com/openstreetmap/osm2pgsql/archive/${version}.tar.gz"; |  | ||||||
|     sha256 = "0i0zg8di8nbh96qnyyr156ikwcsq1w9b2291bazm5whb351flmqx"; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     #nativeBuildInputs = [ ]; |  | ||||||
|     buildInputs = [ ]; |  | ||||||
| 
 |  | ||||||
|     #preConfigure = '' |  | ||||||
|     ''; |  | ||||||
|     #buildPhase = ''jam "-j$NIX_BUILD_CORES" ''; |  | ||||||
|     #installPhase = '' |  | ||||||
|     #''; |  | ||||||
| 
 |  | ||||||
|     meta = with stdenv.lib; { |  | ||||||
|       homepage = http://wiki.openstreetmap.org/wiki/Osm2pgsql; |  | ||||||
|       description = "osm2pgsql is a tool for loading OpenStreetMap data into a PostgreSQL / PostGIS database suitable for applications like rendering into a map, geocoding with Nominatim, or general analysis."; |  | ||||||
|       license = licenses.gpl2; |  | ||||||
|       #maintainers = [ maintainers.phunehehe ]; |  | ||||||
|       maintainers = [ maintainers.jpierre03 ]; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   inherit (lib) mkIf mkMerge mkThenElse; | ||||||
|  |   annuaire = config.r6d.machines; | ||||||
|  |   currentMachine = annuaire."${config.networking.fqdn}"; | ||||||
|  |   flags = currentMachine.configurationFlags; | ||||||
|  | in | ||||||
|  | 
 | ||||||
|  | mkIf true { | ||||||
|  | 
 | ||||||
|  |   # Paquets | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Services | ||||||
|  | 
 | ||||||
|  |   # Réseau | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedTCPPorts = [ | ||||||
|  |     ]; | ||||||
|  |     allowedUDPPorts = [ | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } // { | ||||||
|  |   assertions = [ | ||||||
|  |     { | ||||||
|  |       assertion = true; | ||||||
|  |       message = "Assetion toujours valide."; | ||||||
|  |     } | ||||||
|  |   ]; | ||||||
|  | } | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | 
 | ||||||
|  | EXCLUSION="~$|swp$|swo$" | ||||||
|  | 
 | ||||||
|  | while inotifywait --exclude $EXCLUSION -r -e modify . | ||||||
|  | do | ||||||
|  | 	$@ | ||||||
|  | done | ||||||
| @ -0,0 +1,216 @@ | |||||||
|  | { 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"; | ||||||
|  |         pipewire              = mkEnableOption "Profil pour activer pipewire."; | ||||||
|  |         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!"; | ||||||
|  |      } | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -1,43 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Adminsys |  | ||||||
|     iotop |  | ||||||
|     lm_sensors |  | ||||||
|     lshw |  | ||||||
|     lsof |  | ||||||
|     ntp |  | ||||||
|     powerline-fonts |  | ||||||
|     powertop |  | ||||||
|     python27Packages.ansible2 |  | ||||||
|     python27Packages.glances |  | ||||||
|     usbutils |  | ||||||
| 
 |  | ||||||
|     # DNS |  | ||||||
|     unbound |  | ||||||
| 
 |  | ||||||
|     # Compression |  | ||||||
|     lz4 |  | ||||||
|     lzop |  | ||||||
| 
 |  | ||||||
|     # Système de fichier |  | ||||||
|     curlftpfs |  | ||||||
|     gparted |  | ||||||
|     inotify-tools |  | ||||||
|     nfs-utils |  | ||||||
|     ntfs3g |  | ||||||
|     sshfsFuse |  | ||||||
| 
 |  | ||||||
|     # |  | ||||||
|     unetbootin    # création de clefs USB bootables |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,43 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Bureautique |  | ||||||
|     aspell aspellDicts.fr |  | ||||||
|     dia |  | ||||||
|     gnumeric |  | ||||||
| 
 |  | ||||||
|     ## Cartes mentales |  | ||||||
|     freemind |  | ||||||
| 
 |  | ||||||
|     ## Editeur de texte |  | ||||||
|     lyx           # surcouche WISIWIM à LaTeX |  | ||||||
|     textadept     # un éditeur de texte facile pour copier-coller graphique |  | ||||||
|     zim           # outil de prise de notes, wiki de bureau |  | ||||||
| 
 |  | ||||||
|     ## Visionneuse |  | ||||||
|     kde5.okular   # pdf |  | ||||||
|     mcomix        # livres (cbr, liste d'images), gestion d'une bibliothèque |  | ||||||
|     pdfpc         # pdf |  | ||||||
|     qpdfview      # pdf |  | ||||||
|     gqview        # visionneuse image & gestion basique de collection |  | ||||||
| 
 |  | ||||||
|     ## Convertisseurs (texte -> <autre format>) |  | ||||||
|     gnuplot       # générateur de graphes à partir de données numériques |  | ||||||
|     graphviz      # dot, neato : traçage de graphes (carré, rond) |  | ||||||
|     jekyll        # générateur statique de site web |  | ||||||
|     pandoc |  | ||||||
|     texLiveFull   # distribution LaTeX |  | ||||||
|     #texLive       # distribution LaTeX de base |  | ||||||
|     #texLiveBeamer # paquets et extensions pour Beamer |  | ||||||
|     #texLiveModerncv # paquets pour la classe Modern CV |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,20 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.cartographie { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Gestion de données géographiques |  | ||||||
|     expat          |  | ||||||
|     gpsbabel      # pour convettir les données des GPS |  | ||||||
|     josm          # outil de contribution à OpenStreetMap |  | ||||||
|     qgis          # client lourd de manipulation de données géographiques |  | ||||||
|     viking        # analyse de topo, gestion de données GPS |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,38 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
| environment.systemPackages = with pkgs; [ |  | ||||||
|     # Clients Internet |  | ||||||
| 
 |  | ||||||
|     ## Navigateur |  | ||||||
|     chromium |  | ||||||
|     firefox |  | ||||||
| 
 |  | ||||||
|     ## Réseaux sociaux |  | ||||||
|     python27Packages.turses           # client twitter en ncurse |  | ||||||
|     python27Packages.rainbowstream    # client twitter en console |  | ||||||
|     rtv                               # client reddit en console |  | ||||||
| 
 |  | ||||||
|     ## Mail & Discussion (texte, audio) |  | ||||||
|     clawsMail |  | ||||||
|     hexchat |  | ||||||
|     kde5.quasselClient |  | ||||||
|     mumble |  | ||||||
|     mutt |  | ||||||
|     pidgin |  | ||||||
|     thunderbird |  | ||||||
| 
 |  | ||||||
|     # Transfert de fichier |  | ||||||
|     filezilla |  | ||||||
|     transmission_gtk |  | ||||||
|     transmission_remote_gtk |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,44 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.developpement { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Base de données |  | ||||||
|     pgadmin |  | ||||||
|     sqlitebrowser |  | ||||||
| 
 |  | ||||||
|     # Développement |  | ||||||
|     cloc |  | ||||||
|     idea.idea-community |  | ||||||
|     gcc           # pour les appels depuis les scripts |  | ||||||
| 
 |  | ||||||
|     # Documentation |  | ||||||
|     zeal |  | ||||||
| 
 |  | ||||||
|     ## Gestion des sources |  | ||||||
|     # git       # déjà présent dans "base" |  | ||||||
|     git-cola |  | ||||||
|     mercurial |  | ||||||
|     subversion |  | ||||||
| 
 |  | ||||||
|     ## Haskell |  | ||||||
|     ghc |  | ||||||
|     stack |  | ||||||
| 
 |  | ||||||
|     ## Rust |  | ||||||
|     cargo       # récupération des dépendances + compilation projet rust |  | ||||||
|     rustPlatform.rustc |  | ||||||
| 
 |  | ||||||
|     ## Visualisation & outils de diff |  | ||||||
|     gource |  | ||||||
|     meld |  | ||||||
|     vbindiff    # diff de fichier hexadecimaux avec vim |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,19 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.docker { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Ecosystème Docker |  | ||||||
|     docker |  | ||||||
|     python27Packages.docker_compose |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   virtualisation.docker.enable = true; |  | ||||||
| } |  | ||||||
| @ -1,18 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.edition-musique { |  | ||||||
| 
 |  | ||||||
| environment.systemPackages = with pkgs; [ |  | ||||||
|     # |  | ||||||
|     audacity      # montage audio |  | ||||||
|     easytag       # gestion des métadonnées des fichiers musicaux |  | ||||||
|     picard        # gestion des métadonnées des fichiers musicaux |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,26 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.edition-photo { |  | ||||||
| 
 |  | ||||||
| environment.systemPackages = with pkgs; [ |  | ||||||
|     # Méta données |  | ||||||
|     exif |  | ||||||
|     exiftags |  | ||||||
| 
 |  | ||||||
|     # Retouche, modification & dessin vectoriel |  | ||||||
|     gimp          # logiciel d'édition/montage/retouche photo |  | ||||||
|     inkscape      # édition d'image vectorielle (svg & autre) |  | ||||||
|     imagemagick   # modification image en CLI |  | ||||||
|     rawtherapee   # développemen de photos en RAW |  | ||||||
| 
 |  | ||||||
|     # TEST d'outil de gestion de catalogue de photos |  | ||||||
|     kde4.digikam  # gestionnaire de bibliothèque de photo |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,17 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.edition-video { |  | ||||||
| 
 |  | ||||||
| environment.systemPackages = with pkgs; [ |  | ||||||
|     # Vidéo |  | ||||||
|     #cinelerra     # editeur video |  | ||||||
|     pitivi        # montage vidéo |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,16 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.jeux { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Jeux |  | ||||||
|     urbanterror |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,29 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Multimedia |  | ||||||
| 
 |  | ||||||
|     ## Audio |  | ||||||
|     beep |  | ||||||
|     cmus          # lecteur audio console |  | ||||||
|     espeak        # synthèse vocale |  | ||||||
|     paprefs       # préferences pulseaudio |  | ||||||
|     pavucontrol   # mixer pulseaudio |  | ||||||
|     vorbis-tools  # codec |  | ||||||
| 
 |  | ||||||
|     ## Video |  | ||||||
|     smplayer      # lecteur vidéo |  | ||||||
|     vlc           # lecteur vidéo |  | ||||||
| 
 |  | ||||||
|     kde4.ksnapshot# réalisation de capture d'écran |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,29 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Outils réseau |  | ||||||
|     iperf         # outil de mesure de la qualité du réseau |  | ||||||
|     iptraf-ng     # outil de mesure de la qualité du réseau |  | ||||||
|     nload         # affichage de statisques d'utilisation instantannées du réseau |  | ||||||
|     telnet |  | ||||||
| 
 |  | ||||||
|     ## Diagnostic |  | ||||||
|     arp-scan |  | ||||||
|     wireshark |  | ||||||
|     whois |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   networking.firewall = { |  | ||||||
|     allowedTCPPorts = [5201]; # iperf |  | ||||||
|     allowedUDPPorts = [5201]; # iperf |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @ -1,20 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf profiles.isDesktop { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     # Securité |  | ||||||
|     gnome3.seahorse # gestionnaire graphique de clef GPG |  | ||||||
|     pass            # gestionnaire de mots de passe |  | ||||||
|     pwgen           # générateur de mots de passe |  | ||||||
|     slock           # vérouiller l''écran. "cannot disable the out-of-memory killer for this process (make sure to suid or sgid slock)" --> en root |  | ||||||
|     yubikey-personalization-gui # utilisation de la clef Yubikey |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @ -1,18 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.virtualbox { |  | ||||||
| 
 |  | ||||||
|   environment.systemPackages = with pkgs; [ |  | ||||||
|     linuxPackages.virtualbox |  | ||||||
|     linuxPackages.virtualboxGuestAdditions |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   virtualisation.virtualbox.host.enable = true; |  | ||||||
| } |  | ||||||
| @ -1,15 +0,0 @@ | |||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   cfg = config.r6d.config-generator; |  | ||||||
|   computers = config.r6d.computers; |  | ||||||
|   profiles = config.r6d.profiles; |  | ||||||
| in |  | ||||||
| 
 |  | ||||||
| mkIf cfg.auto-upgrade { |  | ||||||
|   # Automatic update & automatic clean |  | ||||||
| 
 |  | ||||||
|   system.autoUpgrade.enable = true; |  | ||||||
|   nix.gc.automatic = true; |  | ||||||
| } |  | ||||||
| @ -0,0 +1,470 @@ | |||||||
|  | -- ~home : .config/awesome/rc.lua | ||||||
|  | 
 | ||||||
|  | -- Standard awesome library | ||||||
|  | local gears = require("gears") | ||||||
|  | local awful = require("awful") | ||||||
|  | awful.rules = require("awful.rules") | ||||||
|  | require("awful.autofocus") | ||||||
|  | -- Widget and layout library | ||||||
|  | local wibox = require("wibox") | ||||||
|  | -- Theme handling library | ||||||
|  | local beautiful = require("beautiful") | ||||||
|  | -- Notification library | ||||||
|  | local naughty = require("naughty") | ||||||
|  | local menubar = require("menubar") | ||||||
|  | 
 | ||||||
|  | -- {{{ Error handling | ||||||
|  | -- Check if awesome encountered an error during startup and fell back to | ||||||
|  | -- another config (This code will only ever execute for the fallback config) | ||||||
|  | if awesome.startup_errors then | ||||||
|  |     naughty.notify({ preset = naughty.config.presets.critical, | ||||||
|  |                      title = "Oops, there were errors during startup!", | ||||||
|  |                      text = awesome.startup_errors }) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Handle runtime errors after startup | ||||||
|  | do | ||||||
|  |     local in_error = false | ||||||
|  |     awesome.connect_signal("debug::error", function (err) | ||||||
|  |         -- Make sure we don't go into an endless error loop | ||||||
|  |         if in_error then return end | ||||||
|  |         in_error = true | ||||||
|  | 
 | ||||||
|  |         naughty.notify({ preset = naughty.config.presets.critical, | ||||||
|  |                          title = "Oops, an error happened!", | ||||||
|  |                          text = err }) | ||||||
|  |         in_error = false | ||||||
|  |     end) | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Variable definitions | ||||||
|  | -- Themes define colours, icons, font and wallpapers. | ||||||
|  | 
 | ||||||
|  | local config_dir = os.getenv("AWESOME_CONFIG_DIR") | ||||||
|  | beautiful.init(config_dir .. "/share/awesome/themes/zenburn/theme.lua") | ||||||
|  | -- beautiful.init("/nix/store/vpj4i2vmqbinqfcigy44xzh81k9h0mv8-awesome-3.5.8/share/awesome/themes/zenburn/theme.lua") | ||||||
|  | 
 | ||||||
|  | -- This is used later as the default terminal and editor to run. | ||||||
|  | terminal = "sakura" | ||||||
|  | editor = os.getenv("EDITOR") or "vim" | ||||||
|  | editor_cmd = terminal .. " -e " .. editor | ||||||
|  | 
 | ||||||
|  | -- Default modkey. | ||||||
|  | -- Usually, Mod4 is the key with a logo between Control and Alt. | ||||||
|  | -- If you do not like this or do not have such a key, | ||||||
|  | -- I suggest you to remap Mod4 to another key using xmodmap or other tools. | ||||||
|  | -- However, you can use another modifier like Mod1, but it may interact with others. | ||||||
|  | modkey = "Mod4" | ||||||
|  | 
 | ||||||
|  | -- Table of layouts to cover with awful.layout.inc, order matters. | ||||||
|  | local layouts = | ||||||
|  | { | ||||||
|  | 	awful.layout.suit.fair, | ||||||
|  | 	awful.layout.suit.fair.horizontal, | ||||||
|  | 	awful.layout.suit.max.fullscreen, | ||||||
|  | 	awful.layout.suit.spiral, | ||||||
|  | 	awful.layout.suit.spiral.dwindle, | ||||||
|  | 	awful.layout.suit.max, | ||||||
|  | 	awful.layout.suit.floating, | ||||||
|  | 	awful.layout.suit.tile, | ||||||
|  | 	awful.layout.suit.tile.left, | ||||||
|  | 	awful.layout.suit.tile.bottom, | ||||||
|  | 	awful.layout.suit.tile.top, | ||||||
|  | 	awful.layout.suit.magnifier | ||||||
|  | } | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Wallpaper | ||||||
|  | if beautiful.wallpaper then | ||||||
|  |     for s = 1, screen.count() do | ||||||
|  |         gears.wallpaper.maximized(beautiful.wallpaper, s, true) | ||||||
|  |     end | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Tags | ||||||
|  | -- Define a tag table which hold all screen tags. | ||||||
|  | tags = {} | ||||||
|  | for s = 1, screen.count() do | ||||||
|  |     -- Each screen has its own tag table. | ||||||
|  |     tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1]) | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Menu | ||||||
|  | -- Create a laucher widget and a main menu | ||||||
|  | myawesomemenu = { | ||||||
|  |    { "manual", terminal .. " -e man awesome" }, | ||||||
|  |    { "edit config", editor_cmd .. " " .. awesome.conffile }, | ||||||
|  |    { "restart", awesome.restart }, | ||||||
|  |    { "quit", awesome.quit } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, | ||||||
|  |                                     { "open terminal", terminal } | ||||||
|  |                                   } | ||||||
|  |                         }) | ||||||
|  | 
 | ||||||
|  | mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, | ||||||
|  |                                      menu = mymainmenu }) | ||||||
|  | 
 | ||||||
|  | -- Menubar configuration | ||||||
|  | menubar.utils.terminal = terminal -- Set the terminal for applications that require it | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Wibox | ||||||
|  | -- Create a textclock widget | ||||||
|  | mytextclock = awful.widget.textclock() | ||||||
|  | 
 | ||||||
|  | -- Create a wibox for each screen and add it | ||||||
|  | mywibox = {} | ||||||
|  | mypromptbox = {} | ||||||
|  | mylayoutbox = {} | ||||||
|  | mytaglist = {} | ||||||
|  | mytaglist.buttons = awful.util.table.join( | ||||||
|  |                     awful.button({ }, 1, awful.tag.viewonly), | ||||||
|  |                     awful.button({ modkey }, 1, awful.client.movetotag), | ||||||
|  |                     awful.button({ }, 3, awful.tag.viewtoggle), | ||||||
|  |                     awful.button({ modkey }, 3, awful.client.toggletag), | ||||||
|  |                     awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), | ||||||
|  |                     awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) | ||||||
|  |                     ) | ||||||
|  | mytasklist = {} | ||||||
|  | mytasklist.buttons = awful.util.table.join( | ||||||
|  |                      awful.button({ }, 1, function (c) | ||||||
|  |                                               if c == client.focus then | ||||||
|  |                                                   c.minimized = true | ||||||
|  |                                               else | ||||||
|  |                                                   -- Without this, the following | ||||||
|  |                                                   -- :isvisible() makes no sense | ||||||
|  |                                                   c.minimized = false | ||||||
|  |                                                   if not c:isvisible() then | ||||||
|  |                                                       awful.tag.viewonly(c:tags()[1]) | ||||||
|  |                                                   end | ||||||
|  |                                                   -- This will also un-minimize | ||||||
|  |                                                   -- the client, if needed | ||||||
|  |                                                   client.focus = c | ||||||
|  |                                                   c:raise() | ||||||
|  |                                               end | ||||||
|  |                                           end), | ||||||
|  |                      awful.button({ }, 3, function () | ||||||
|  |                                               if instance then | ||||||
|  |                                                   instance:hide() | ||||||
|  |                                                   instance = nil | ||||||
|  |                                               else | ||||||
|  |                                                   instance = awful.menu.clients({ | ||||||
|  |                                                       theme = { width = 250 } | ||||||
|  |                                                   }) | ||||||
|  |                                               end | ||||||
|  |                                           end), | ||||||
|  |                      awful.button({ }, 4, function () | ||||||
|  |                                               awful.client.focus.byidx(1) | ||||||
|  |                                               if client.focus then client.focus:raise() end | ||||||
|  |                                           end), | ||||||
|  |                      awful.button({ }, 5, function () | ||||||
|  |                                               awful.client.focus.byidx(-1) | ||||||
|  |                                               if client.focus then client.focus:raise() end | ||||||
|  |                                           end)) | ||||||
|  | 
 | ||||||
|  | for s = 1, screen.count() do | ||||||
|  |     -- Create a promptbox for each screen | ||||||
|  |     mypromptbox[s] = awful.widget.prompt() | ||||||
|  |     -- Create an imagebox widget which will contains an icon indicating which layout we're using. | ||||||
|  |     -- We need one layoutbox per screen. | ||||||
|  |     mylayoutbox[s] = awful.widget.layoutbox(s) | ||||||
|  |     mylayoutbox[s]:buttons(awful.util.table.join( | ||||||
|  |                            awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), | ||||||
|  |                            awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), | ||||||
|  |                            awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), | ||||||
|  |                            awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) | ||||||
|  |     -- Create a taglist widget | ||||||
|  |     mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) | ||||||
|  | 
 | ||||||
|  |     -- Create a tasklist widget | ||||||
|  |     mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) | ||||||
|  | 
 | ||||||
|  |     -- Create the wibox | ||||||
|  |     mywibox[s] = awful.wibox({ position = "top", screen = s }) | ||||||
|  | 
 | ||||||
|  |     -- Widgets that are aligned to the left | ||||||
|  |     local left_layout = wibox.layout.fixed.horizontal() | ||||||
|  |     left_layout:add(mylauncher) | ||||||
|  |     left_layout:add(mytaglist[s]) | ||||||
|  |     left_layout:add(mypromptbox[s]) | ||||||
|  | 
 | ||||||
|  |     -- Widgets that are aligned to the right | ||||||
|  |     local right_layout = wibox.layout.fixed.horizontal() | ||||||
|  |     if s == 1 then right_layout:add(wibox.widget.systray()) end | ||||||
|  |     right_layout:add(mytextclock) | ||||||
|  |     right_layout:add(mylayoutbox[s]) | ||||||
|  | 
 | ||||||
|  |     -- Now bring it all together (with the tasklist in the middle) | ||||||
|  |     local layout = wibox.layout.align.horizontal() | ||||||
|  |     layout:set_left(left_layout) | ||||||
|  |     layout:set_middle(mytasklist[s]) | ||||||
|  |     layout:set_right(right_layout) | ||||||
|  | 
 | ||||||
|  |     mywibox[s]:set_widget(layout) | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Mouse bindings | ||||||
|  | root.buttons(awful.util.table.join( | ||||||
|  |     awful.button({ }, 3, function () mymainmenu:toggle() end), | ||||||
|  |     awful.button({ }, 4, awful.tag.viewnext), | ||||||
|  |     awful.button({ }, 5, awful.tag.viewprev) | ||||||
|  | )) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Key bindings | ||||||
|  | globalkeys = awful.util.table.join( | ||||||
|  |     awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ), | ||||||
|  |     awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ), | ||||||
|  |     awful.key({ modkey,           }, "Escape", awful.tag.history.restore), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey,           }, "j", | ||||||
|  |         function () | ||||||
|  |             awful.client.focus.byidx( 1) | ||||||
|  |             if client.focus then client.focus:raise() end | ||||||
|  |         end), | ||||||
|  |     awful.key({ modkey,           }, "k", | ||||||
|  |         function () | ||||||
|  |             awful.client.focus.byidx(-1) | ||||||
|  |             if client.focus then client.focus:raise() end | ||||||
|  |         end), | ||||||
|  |     awful.key({ modkey,           }, "w", function () mymainmenu:show() end), | ||||||
|  | 
 | ||||||
|  |     -- Layout manipulation | ||||||
|  |     awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end), | ||||||
|  |     awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), | ||||||
|  |     awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), | ||||||
|  |     awful.key({ modkey,           }, "u", awful.client.urgent.jumpto), | ||||||
|  |     awful.key({ modkey,           }, "Tab", | ||||||
|  |         function () | ||||||
|  |             awful.client.focus.history.previous() | ||||||
|  |             if client.focus then | ||||||
|  |                 client.focus:raise() | ||||||
|  |             end | ||||||
|  |         end), | ||||||
|  | 
 | ||||||
|  |     -- Standard program | ||||||
|  |     awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end), | ||||||
|  |     awful.key({ modkey, "Control" }, "r", awesome.restart), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "q", awesome.quit), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)    end), | ||||||
|  |     awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)    end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end), | ||||||
|  |     awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end), | ||||||
|  |     awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end), | ||||||
|  |     awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1) end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1) end), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey, "Control" }, "n", awful.client.restore), | ||||||
|  | 
 | ||||||
|  |     -- Prompt | ||||||
|  |     awful.key({ modkey            }, "r",     function () mypromptbox[mouse.screen]:run() end), | ||||||
|  |     awful.key({ modkey            }, "x", | ||||||
|  |               function () | ||||||
|  |                   awful.prompt.run({ prompt = "Run Lua code: " }, | ||||||
|  |                   mypromptbox[mouse.screen].widget, | ||||||
|  |                   awful.util.eval, nil, | ||||||
|  |                   awful.util.getdir("cache") .. "/history_eval") | ||||||
|  |               end), | ||||||
|  |     -- Menubar | ||||||
|  |     awful.key({ modkey            }, "p",  function() menubar.show() end), | ||||||
|  |     -- Lanceurs perso | ||||||
|  |     awful.key({ modkey            }, "F1", function () awful.util.spawn("kontact") end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F1", function () awful.util.spawn("claws-mail") end), | ||||||
|  |     awful.key({ modkey            }, "F2", function () awful.util.spawn("firefox") end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F2", function () awful.util.spawn("uzbl-tabbed") end), | ||||||
|  |     awful.key({ modkey            }, "F3", function () awful.util.spawn("spacefm") end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F3", function () awful.util.spawn("pcmanfm") end), | ||||||
|  | --  awful.key({ modkey            }, "F11", function () awful.util.spawn("/home/taeradan/bin/xrandr-auto") end), | ||||||
|  | --  awful.key({ modkey, "Shift"   }, "F11", function () awful.util.spawn("/home/taeradan/bin/xrandr-left") end), | ||||||
|  | --  awful.key({ modkey, "Control" }, "F11", function () awful.util.spawn("/home/taeradan/bin/xrandr-right") end), | ||||||
|  |     awful.key({ modkey            }, "F12", function () awful.util.spawn("slock") end) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | clientkeys = awful.util.table.join( | ||||||
|  |     awful.key({ modkey,           }, "f",      function (c) c.fullscreen = not c.fullscreen  end), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end), | ||||||
|  |     awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ), | ||||||
|  |     awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), | ||||||
|  |     awful.key({ modkey,           }, "o",      awful.client.movetoscreen                        ), | ||||||
|  |     awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end), | ||||||
|  |     awful.key({ modkey,           }, "n", | ||||||
|  |         function (c) | ||||||
|  |             -- The client currently has the input focus, so it cannot be | ||||||
|  |             -- minimized, since minimized clients can't have the focus. | ||||||
|  |             c.minimized = true | ||||||
|  |         end), | ||||||
|  |     awful.key({ modkey,           }, "m", | ||||||
|  |         function (c) | ||||||
|  |             c.maximized_horizontal = not c.maximized_horizontal | ||||||
|  |             c.maximized_vertical   = not c.maximized_vertical | ||||||
|  |         end) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | -- Bind all key numbers to tags. | ||||||
|  | -- Be careful: we use keycodes to make it works on any keyboard layout. | ||||||
|  | -- This should map on the top row of your keyboard, usually 1 to 9. | ||||||
|  | for i = 1, 9 do | ||||||
|  |     globalkeys = awful.util.table.join(globalkeys, | ||||||
|  |         -- View tag only. | ||||||
|  |         awful.key({ modkey }, "#" .. i + 9, | ||||||
|  |                   function () | ||||||
|  |                         local screen = mouse.screen | ||||||
|  |                         local tag = awful.tag.gettags(screen)[i] | ||||||
|  |                         if tag then | ||||||
|  |                            awful.tag.viewonly(tag) | ||||||
|  |                         end | ||||||
|  |                   end), | ||||||
|  |         -- Toggle tag. | ||||||
|  |         awful.key({ modkey, "Control" }, "#" .. i + 9, | ||||||
|  |                   function () | ||||||
|  |                       local screen = mouse.screen | ||||||
|  |                       local tag = awful.tag.gettags(screen)[i] | ||||||
|  |                       if tag then | ||||||
|  |                          awful.tag.viewtoggle(tag) | ||||||
|  |                       end | ||||||
|  |                   end), | ||||||
|  |         -- Move client to tag. | ||||||
|  |         awful.key({ modkey, "Shift" }, "#" .. i + 9, | ||||||
|  |                   function () | ||||||
|  |                       if client.focus then | ||||||
|  |                           local tag = awful.tag.gettags(client.focus.screen)[i] | ||||||
|  |                           if tag then | ||||||
|  |                               awful.client.movetotag(tag) | ||||||
|  |                           end | ||||||
|  |                      end | ||||||
|  |                   end), | ||||||
|  |         -- Toggle tag. | ||||||
|  |         awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, | ||||||
|  |                   function () | ||||||
|  |                       if client.focus then | ||||||
|  |                           local tag = awful.tag.gettags(client.focus.screen)[i] | ||||||
|  |                           if tag then | ||||||
|  |                               awful.client.toggletag(tag) | ||||||
|  |                           end | ||||||
|  |                       end | ||||||
|  |                   end)) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | clientbuttons = awful.util.table.join( | ||||||
|  |     awful.button({ }, 1, function (c) client.focus = c; c:raise() end), | ||||||
|  |     awful.button({ modkey }, 1, awful.mouse.client.move), | ||||||
|  |     awful.button({ modkey }, 3, awful.mouse.client.resize) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | -- Set keys | ||||||
|  | root.keys(globalkeys) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Rules | ||||||
|  | -- Rules to apply to new clients (through the "manage" signal). | ||||||
|  | awful.rules.rules = { | ||||||
|  |     -- All clients will match this rule. | ||||||
|  |     { rule = { }, | ||||||
|  |       properties = { border_width = beautiful.border_width, | ||||||
|  |                      border_color = beautiful.border_normal, | ||||||
|  |                      focus = awful.client.focus.filter, | ||||||
|  |                      raise = true, | ||||||
|  |                      keys = clientkeys, | ||||||
|  |                      buttons = clientbuttons } | ||||||
|  |     }, | ||||||
|  |     {   rule = { class = "MPlayer" }, | ||||||
|  |         properties = { floating = true } | ||||||
|  |     }, | ||||||
|  |     {   rule = { class = "pinentry" }, | ||||||
|  |         properties = { floating = true } | ||||||
|  |     }, | ||||||
|  |     {   rule = { class = "gimp" }, | ||||||
|  |         properties = { floating = true } | ||||||
|  |     } | ||||||
|  |     -- Set Firefox to always map on tags number 2 of screen 1. | ||||||
|  |     -- { rule = { class = "Firefox" }, | ||||||
|  |     --   properties = { tag = tags[1][2] } }, | ||||||
|  | } | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Signals | ||||||
|  | -- Signal function to execute when a new client appears. | ||||||
|  | client.connect_signal("manage", function (c, startup) | ||||||
|  |     -- Enable sloppy focus | ||||||
|  |     c:connect_signal("mouse::enter", function(c) | ||||||
|  |         if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier | ||||||
|  |             and awful.client.focus.filter(c) then | ||||||
|  |             client.focus = c | ||||||
|  |         end | ||||||
|  |     end) | ||||||
|  | 
 | ||||||
|  |     if not startup then | ||||||
|  |         -- Set the windows at the slave, | ||||||
|  |         -- i.e. put it at the end of others instead of setting it master. | ||||||
|  |         -- awful.client.setslave(c) | ||||||
|  | 
 | ||||||
|  |         -- Put windows in a smart way, only if they does not set an initial position. | ||||||
|  |         if not c.size_hints.user_position and not c.size_hints.program_position then | ||||||
|  |             awful.placement.no_overlap(c) | ||||||
|  |             awful.placement.no_offscreen(c) | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     local titlebars_enabled = false | ||||||
|  |     if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then | ||||||
|  |         -- buttons for the titlebar | ||||||
|  |         local buttons = awful.util.table.join( | ||||||
|  |                 awful.button({ }, 1, function() | ||||||
|  |                     client.focus = c | ||||||
|  |                     c:raise() | ||||||
|  |                     awful.mouse.client.move(c) | ||||||
|  |                 end), | ||||||
|  |                 awful.button({ }, 3, function() | ||||||
|  |                     client.focus = c | ||||||
|  |                     c:raise() | ||||||
|  |                     awful.mouse.client.resize(c) | ||||||
|  |                 end) | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  |         -- Widgets that are aligned to the left | ||||||
|  |         local left_layout = wibox.layout.fixed.horizontal() | ||||||
|  |         left_layout:add(awful.titlebar.widget.iconwidget(c)) | ||||||
|  |         left_layout:buttons(buttons) | ||||||
|  | 
 | ||||||
|  |         -- Widgets that are aligned to the right | ||||||
|  |         local right_layout = wibox.layout.fixed.horizontal() | ||||||
|  |         right_layout:add(awful.titlebar.widget.floatingbutton(c)) | ||||||
|  |         right_layout:add(awful.titlebar.widget.maximizedbutton(c)) | ||||||
|  |         right_layout:add(awful.titlebar.widget.stickybutton(c)) | ||||||
|  |         right_layout:add(awful.titlebar.widget.ontopbutton(c)) | ||||||
|  |         right_layout:add(awful.titlebar.widget.closebutton(c)) | ||||||
|  | 
 | ||||||
|  |         -- The title goes in the middle | ||||||
|  |         local middle_layout = wibox.layout.flex.horizontal() | ||||||
|  |         local title = awful.titlebar.widget.titlewidget(c) | ||||||
|  |         title:set_align("center") | ||||||
|  |         middle_layout:add(title) | ||||||
|  |         middle_layout:buttons(buttons) | ||||||
|  | 
 | ||||||
|  |         -- Now bring it all together | ||||||
|  |         local layout = wibox.layout.align.horizontal() | ||||||
|  |         layout:set_left(left_layout) | ||||||
|  |         layout:set_right(right_layout) | ||||||
|  |         layout:set_middle(middle_layout) | ||||||
|  | 
 | ||||||
|  |         awful.titlebar(c):set_widget(layout) | ||||||
|  |     end | ||||||
|  | end) | ||||||
|  | 
 | ||||||
|  | client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) | ||||||
|  | client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- Au démarrage | ||||||
|  | -- awful.util.spawn_with_shell("/home/taeradan/bin/xrandr-auto") | ||||||
|  | -- awful.util.spawn_with_shell("gnome-sound-applet") | ||||||
|  | -- awful.util.spawn_with_shell("nm-applet") | ||||||
| @ -0,0 +1,654 @@ | |||||||
|  | -- $HOME : .config/awesome/rc.lua | ||||||
|  | 
 | ||||||
|  | -- Standard awesome library | ||||||
|  | local gears = require("gears") | ||||||
|  | local awful = require("awful") | ||||||
|  | awful.rules = require("awful.rules") | ||||||
|  | require("awful.autofocus") | ||||||
|  | -- Widget and layout library | ||||||
|  | local wibox = require("wibox") | ||||||
|  | -- Theme handling library | ||||||
|  | local beautiful = require("beautiful") | ||||||
|  | -- Notification library | ||||||
|  | local naughty = require("naughty") | ||||||
|  | local menubar = require("menubar") | ||||||
|  | local hotkeys_popup = require("awful.hotkeys_popup").widget | ||||||
|  | 
 | ||||||
|  | -- {{{ Error handling | ||||||
|  | -- Check if awesome encountered an error during startup and fell back to | ||||||
|  | -- another config (This code will only ever execute for the fallback config) | ||||||
|  | if awesome.startup_errors then | ||||||
|  |     naughty.notify({ | ||||||
|  |       preset = naughty.config.presets.critical, | ||||||
|  |       title = "Oops, there were errors during startup!", | ||||||
|  |       text = awesome.startup_errors | ||||||
|  |   }) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Handle runtime errors after startup | ||||||
|  | do | ||||||
|  |     local in_error = false | ||||||
|  |     awesome.connect_signal("debug::error", function (err) | ||||||
|  |         -- Make sure we don't go into an endless error loop | ||||||
|  |         if in_error then return end | ||||||
|  |         in_error = true | ||||||
|  | 
 | ||||||
|  |         naughty.notify({ | ||||||
|  |             preset = naughty.config.presets.critical, | ||||||
|  |             title = "Oops, an error happened!", | ||||||
|  |             text = tostring(err) | ||||||
|  |           }) | ||||||
|  |         in_error = false | ||||||
|  |     end) | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Variable definitions | ||||||
|  | -- Themes define colours, icons, font and wallpapers. | ||||||
|  | local config_dir = os.getenv("AWESOME_CONFIG_DIR") | ||||||
|  | beautiful.init(config_dir .. "/share/awesome/themes/zenburn/theme.lua") | ||||||
|  | 
 | ||||||
|  | -- This is used later as the default terminal and editor to run. | ||||||
|  | terminal = "sakura" | ||||||
|  | editor = os.getenv("EDITOR") or "vim" | ||||||
|  | editor_cmd = terminal .. " -e " .. editor | ||||||
|  | 
 | ||||||
|  | -- Default modkey. | ||||||
|  | -- Usually, Mod4 is the key with a logo between Control and Alt. | ||||||
|  | -- If you do not like this or do not have such a key, | ||||||
|  | -- I suggest you to remap Mod4 to another key using xmodmap or other tools. | ||||||
|  | -- However, you can use another modifier like Mod1, but it may interact with others. | ||||||
|  | modkey = "Mod4" | ||||||
|  | 
 | ||||||
|  | -- Table of layouts to cover with awful.layout.inc, order matters. | ||||||
|  | awful.layout.layouts = { | ||||||
|  |     awful.layout.suit.corner.nw, | ||||||
|  |     awful.layout.suit.tile, | ||||||
|  |     awful.layout.suit.tile.left, | ||||||
|  |     awful.layout.suit.tile.bottom, | ||||||
|  |     awful.layout.suit.tile.top, | ||||||
|  |     awful.layout.suit.fair, | ||||||
|  |     awful.layout.suit.fair.horizontal, | ||||||
|  |     awful.layout.suit.spiral, | ||||||
|  |     awful.layout.suit.spiral.dwindle, | ||||||
|  |     awful.layout.suit.max, | ||||||
|  |     awful.layout.suit.max.fullscreen, | ||||||
|  |     awful.layout.suit.magnifier, | ||||||
|  |     awful.layout.suit.floating, | ||||||
|  |     -- awful.layout.suit.corner.ne, | ||||||
|  |     -- awful.layout.suit.corner.sw, | ||||||
|  |     -- awful.layout.suit.corner.se, | ||||||
|  | } | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Helper functions | ||||||
|  | local function client_menu_toggle_fn() | ||||||
|  |     local instance = nil | ||||||
|  | 
 | ||||||
|  |     return function () | ||||||
|  |         if instance and instance.wibox.visible then | ||||||
|  |             instance:hide() | ||||||
|  |             instance = nil | ||||||
|  |         else | ||||||
|  |             instance = awful.menu.clients({ theme = { width = 250 } }) | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | end | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Menu | ||||||
|  | -- Create a launcher widget and a main menu | ||||||
|  | myawesomemenu = { | ||||||
|  |     { "hotkeys", function() return false, hotkeys_popup.show_help end}, | ||||||
|  |     { "manual", terminal .. " -e man awesome" }, | ||||||
|  |     { "edit config", editor_cmd .. " " .. awesome.conffile }, | ||||||
|  |     { "restart", awesome.restart }, | ||||||
|  |     { "quit", function() awesome.quit() end} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | mymainmenu = awful.menu({ | ||||||
|  |     items = { | ||||||
|  |         { "awesome", myawesomemenu, beautiful.awesome_icon }, | ||||||
|  |         { "open terminal", terminal } | ||||||
|  |     } | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | mylauncher = awful.widget.launcher({ | ||||||
|  |     image = beautiful.awesome_icon, | ||||||
|  |     menu = mymainmenu | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- Menubar configuration | ||||||
|  | menubar.utils.terminal = terminal -- Set the terminal for applications that require it | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- Keyboard map indicator and switcher | ||||||
|  | mykeyboardlayout = awful.widget.keyboardlayout() | ||||||
|  | 
 | ||||||
|  | -- {{{ Wibar | ||||||
|  | -- Create a textclock widget | ||||||
|  | mytextclock = wibox.widget.textclock() | ||||||
|  | 
 | ||||||
|  | -- Create a wibox for each screen and add it | ||||||
|  | local taglist_buttons = awful.util.table.join( | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         1, | ||||||
|  |         function(t) t:view_only() end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { modkey }, | ||||||
|  |         1, | ||||||
|  |         function(t) | ||||||
|  |             if client.focus then | ||||||
|  |                 client.focus:move_to_tag(t) | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         3, | ||||||
|  |         awful.tag.viewtoggle | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { modkey }, | ||||||
|  |         3, | ||||||
|  |         function(t) | ||||||
|  |             if client.focus then | ||||||
|  |                 client.focus:toggle_tag(t) | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         4, | ||||||
|  |         function(t) awful.tag.viewnext(t.screen) end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         5, | ||||||
|  |         function(t) awful.tag.viewprev(t.screen) end | ||||||
|  |     ) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | local tasklist_buttons = awful.util.table.join( | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         1, | ||||||
|  |         function (c) | ||||||
|  |             if c == client.focus then | ||||||
|  |                 c.minimized = true | ||||||
|  |             else | ||||||
|  |                 -- Without this, the following | ||||||
|  |                 -- :isvisible() makes no sense | ||||||
|  |                 c.minimized = false | ||||||
|  |                 if not c:isvisible() and c.first_tag then | ||||||
|  |                     c.first_tag:view_only() | ||||||
|  |                 end | ||||||
|  |                 -- This will also un-minimize | ||||||
|  |                 -- the client, if needed | ||||||
|  |                 client.focus = c | ||||||
|  |                 c:raise() | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         3, | ||||||
|  |         client_menu_toggle_fn() | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         4, | ||||||
|  |         function () | ||||||
|  |             awful.client.focus.byidx(1) | ||||||
|  |         end | ||||||
|  |     ), | ||||||
|  |     awful.button( | ||||||
|  |         { }, | ||||||
|  |         5, | ||||||
|  |         function () | ||||||
|  |             awful.client.focus.byidx(-1) | ||||||
|  |         end | ||||||
|  |     ) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | local function set_wallpaper(s) | ||||||
|  |     -- Wallpaper | ||||||
|  |     if beautiful.wallpaper then | ||||||
|  |         local wallpaper = beautiful.wallpaper | ||||||
|  |         -- If wallpaper is a function, call it with the screen | ||||||
|  |         if type(wallpaper) == "function" then | ||||||
|  |             wallpaper = wallpaper(s) | ||||||
|  |         end | ||||||
|  |         gears.wallpaper.maximized(wallpaper, s, true) | ||||||
|  |     end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | local iostat_tooltiptext = "" | ||||||
|  | -- Widget de monitoring de l'activité des disques https://awesomewm.org/recipes/watch/ | ||||||
|  | -- disk I/O using iostat from sysstat utilities | ||||||
|  | local iotable = {} | ||||||
|  | local iostat = awful.widget.watch("iostat -dm -y 1 1", 2, -- in Kb, use -dm for Mb | ||||||
|  |     function(widget, stdout) | ||||||
|  |         for line in stdout:match("(sd.*)\n"):gmatch("(.-)\n") do | ||||||
|  |             local device, tps, read_s, wrtn_s, read, wrtn = | ||||||
|  |             line:match("(%w+)%s*(%d+,?%d*)%s*(%d+,?%d*)%s*(%d+,?%d*)%s*(%d+,?%d*)%s*(%d+,?%d*)") | ||||||
|  |             --                  [1]  [2]     [3]     [4]   [5] | ||||||
|  |             iotable[device] = { tps, read_s, wrtn_s, read, wrtn } | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         local label = "" | ||||||
|  |         for device,values in spairs(iotable) do | ||||||
|  |           label = label..(device..": "..iotable[device][2].." MB_read/s  |"..iotable[device][3].." MB_wrtn/s").."\n" | ||||||
|  |         end | ||||||
|  |         iostat_tooltiptext = label | ||||||
|  | 
 | ||||||
|  |         -- customize here | ||||||
|  |         --widget:set_text("sda: "..iotable["sda"][2].."/"..iotable["sda"][3]) -- read_s/wrtn_s | ||||||
|  |         widget:set_text("iostat") | ||||||
|  |     end | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | iostat_t = awful.tooltip({ | ||||||
|  |  --objects = {  }, | ||||||
|  |  timer_function = function() | ||||||
|  |          return iostat_tooltiptext | ||||||
|  |      end, | ||||||
|  |  }) | ||||||
|  | 
 | ||||||
|  | iostat_t:add_to_object(iostat) | ||||||
|  | 
 | ||||||
|  | -- tris d'un tableau par la clef https://stackoverflow.com/questions/15706270/sort-a-table-in-lua | ||||||
|  | function spairs(t, order) | ||||||
|  |     -- collect the keys | ||||||
|  |     local keys = {} | ||||||
|  |     for k in pairs(t) do keys[#keys+1] = k end | ||||||
|  | 
 | ||||||
|  |     -- if order function given, sort by it by passing the table and keys a, b, | ||||||
|  |     -- otherwise just sort the keys | ||||||
|  |     if order then | ||||||
|  |         table.sort(keys, function(a,b) return order(t, a, b) end) | ||||||
|  |     else | ||||||
|  |         table.sort(keys) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     -- return the iterator function | ||||||
|  |     local i = 0 | ||||||
|  |     return function() | ||||||
|  |         i = i + 1 | ||||||
|  |         if keys[i] then | ||||||
|  |             return keys[i], t[keys[i]] | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) | ||||||
|  | screen.connect_signal("property::geometry", set_wallpaper) | ||||||
|  | 
 | ||||||
|  | awful.screen.connect_for_each_screen( | ||||||
|  |     function(s) | ||||||
|  |         -- Wallpaper | ||||||
|  |         set_wallpaper(s) | ||||||
|  | 
 | ||||||
|  |         -- Each screen has its own tag table. | ||||||
|  |         awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1]) | ||||||
|  | 
 | ||||||
|  |         -- Create a promptbox for each screen | ||||||
|  |         s.mypromptbox = awful.widget.prompt() | ||||||
|  |         -- Create an imagebox widget which will contains an icon indicating which layout we're using. | ||||||
|  |         -- We need one layoutbox per screen. | ||||||
|  |         s.mylayoutbox = awful.widget.layoutbox(s) | ||||||
|  |         s.mylayoutbox:buttons(awful.util.table.join( | ||||||
|  |             awful.button({ }, 1, function () awful.layout.inc( 1) end), | ||||||
|  |             awful.button({ }, 3, function () awful.layout.inc(-1) end), | ||||||
|  |             awful.button({ }, 4, function () awful.layout.inc( 1) end), | ||||||
|  |             awful.button({ }, 5, function () awful.layout.inc(-1) end) | ||||||
|  |         )) | ||||||
|  |         -- Create a taglist widget | ||||||
|  |         s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons) | ||||||
|  | 
 | ||||||
|  |         -- Create a tasklist widget | ||||||
|  |         s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons) | ||||||
|  | 
 | ||||||
|  |         -- Create the wibox | ||||||
|  |         s.mywibox = awful.wibar({ position = "top", screen = s }) | ||||||
|  | 
 | ||||||
|  |         -- Add widgets to the wibox | ||||||
|  |         s.mywibox:setup { | ||||||
|  |             layout = wibox.layout.align.horizontal, | ||||||
|  |             { -- Left widgets | ||||||
|  |                 layout = wibox.layout.fixed.horizontal, | ||||||
|  |                 mylauncher, | ||||||
|  |                 s.mytaglist, | ||||||
|  |                 s.mypromptbox | ||||||
|  |             }, | ||||||
|  |             s.mytasklist, -- Middle widget | ||||||
|  |             { -- Right widgets | ||||||
|  |               layout = wibox.layout.fixed.horizontal, | ||||||
|  |               wibox.widget.textbox(' | '), | ||||||
|  |               iostat, | ||||||
|  |               wibox.widget.textbox(' | '), | ||||||
|  |               mykeyboardlayout, | ||||||
|  |               wibox.widget.systray(), | ||||||
|  |               mytextclock, | ||||||
|  |               s.mylayoutbox | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     end | ||||||
|  | ) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Mouse bindings | ||||||
|  | root.buttons(awful.util.table.join( | ||||||
|  |     awful.button({ }, 3, function () mymainmenu:toggle() end), | ||||||
|  |     awful.button({ }, 4, awful.tag.viewnext), | ||||||
|  |     awful.button({ }, 5, awful.tag.viewprev) | ||||||
|  | )) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Key bindings | ||||||
|  | globalkeys = awful.util.table.join( | ||||||
|  |     awful.key({ modkey,           }, "s",      hotkeys_popup.show_help,                               {description="show help", group="awesome"}), | ||||||
|  |     awful.key({ modkey,           }, "Left",   awful.tag.viewprev,                                    {description = "view previous", group = "tag"}), | ||||||
|  |     awful.key({ modkey,           }, "Right",  awful.tag.viewnext,                                    {description = "view next", group = "tag"}), | ||||||
|  |     awful.key({ modkey,           }, "Escape", awful.tag.history.restore,                             {description = "go back", group = "tag"}), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey,           }, "j", function () awful.client.focus.byidx( 1) end,               {description = "focus next by index", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "k", function () awful.client.focus.byidx(-1) end,               {description = "focus previous by index", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "w", function () mymainmenu:show() end,                          {description = "show main menu", group = "awesome"}), | ||||||
|  | 
 | ||||||
|  |     -- Layout manipulation | ||||||
|  |     awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end,            {description = "swap with next client by index", group = "client"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end,            {description = "swap with previous client by index", group = "client"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end,            {description = "focus the next screen", group = "screen"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end,            {description = "focus the previous screen", group = "screen"}), | ||||||
|  |     awful.key({ modkey,           }, "u", awful.client.urgent.jumpto,                                 {description = "jump to urgent client", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end, | ||||||
|  |                                                                                                       {description = "go back", group = "client"}), | ||||||
|  | 
 | ||||||
|  |     -- Standard program | ||||||
|  |     awful.key({ modkey,           }, "Return", function () awful.spawn(terminal) end,                 {description = "open a terminal", group = "launcher"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "r", awesome.restart,                                            {description = "reload awesome", group = "awesome"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "q", awesome.quit,                                               {description = "quit awesome", group = "awesome"}), | ||||||
|  |     awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)          end,    {description = "increase master width factor", group = "layout"}), | ||||||
|  |     awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)          end,    {description = "decrease master width factor", group = "layout"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1, nil, true) end,    {description = "increase the number of master clients", group = "layout"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1, nil, true) end,    {description = "decrease the number of master clients", group = "layout"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1, nil, true)    end,    {description = "increase the number of columns", group = "layout"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1, nil, true)    end,    {description = "decrease the number of columns", group = "layout"}), | ||||||
|  |     awful.key({ modkey,           }, "space", function () awful.layout.inc( 1)                end,    {description = "select next", group = "layout"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(-1)                end,    {description = "select previous", group = "layout"}), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey, "Control" }, "n", function () local c = awful.client.restore() --[[ Focus restored client ]] if c then client.focus = c c:raise() end end, | ||||||
|  |                                                                                                       {description = "restore minimized", group = "client"}), | ||||||
|  | 
 | ||||||
|  |     -- Prompt | ||||||
|  |     awful.key({ modkey },            "r", function () awful.screen.focused().mypromptbox:run() end,   {description = "run prompt", group = "launcher"}), | ||||||
|  | 
 | ||||||
|  |     awful.key({ modkey }, "x", | ||||||
|  |     function () | ||||||
|  |         awful.prompt.run { | ||||||
|  |             prompt       = "Run Lua code: ", | ||||||
|  |             textbox      = awful.screen.focused().mypromptbox.widget, | ||||||
|  |             exe_callback = awful.util.eval, | ||||||
|  |             history_path = awful.util.get_cache_dir() .. "/history_eval" | ||||||
|  |         } | ||||||
|  |     end, | ||||||
|  |                                                                                                       {description = "lua execute prompt", group = "awesome"}), | ||||||
|  |     -- Menubar | ||||||
|  |     awful.key({ modkey }, "p", function() menubar.show() end,                                         {description = "show the menubar", group = "launcher"}), | ||||||
|  | 
 | ||||||
|  |     -- Lanceurs perso | ||||||
|  |     awful.key({ modkey            }, "F1",  function () awful.util.spawn("firefox") end,              {description = "Lance Firefox", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F2",  function () awful.util.spawn("firefox") end,              {description = "Lance Firefox", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F3",  function () awful.util.spawn("gqrx") end,                 {description = "Lance gqrx", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F4",  function () awful.util.spawn("chromium") end,             {description = "Lance Chromium", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F5",  function () awful.util.spawn("spacefm") end,              {description = "Lance spacefm", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F6",  function () awful.util.spawn("vlc") end,                  {description = "Lance vlc", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F7",  function () awful.util.spawn("claws-mail") end,           {description = "Lance claws", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F11", function () awful.util.spawn("xrandr-auto") end,          {description = "Lance le script xrandr-auto", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey            }, "F12", function () awful.util.spawn("slock") end,                {description = "Verouille la session avec slock", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F1",  function () awful.util.spawn("claws-mail") end,           {description = "Lance claws", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F3",  function () awful.util.spawn("pcmanfm") end,              {description = "Lance pcmanfm", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F6",  function () awful.util.spawn("clementine") end,           {description = "Lance clementine", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "F11", function () awful.util.spawn("xrandr-auto-2") end,        {description = "Lance le script xrandr-auto-2", group = "Lanceurs personnels"}), | ||||||
|  |     awful.key({ modkey  }, "l", function () awful.util.spawn("slock systemctl suspend -i") end, {description = "Verouille la session avec slock", group = "Lanceurs personnels"}) | ||||||
|  |     --  awful.key({ modkey, "Shift"   }, "F11", function () awful.util.spawn("/home/taeradan/bin/xrandr-left") end), | ||||||
|  |     --  awful.key({ modkey, "Control" }, "F11", function () awful.util.spawn("/home/taeradan/bin/xrandr-right") end), | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | clientkeys = awful.util.table.join( | ||||||
|  |     awful.key({ modkey,           }, "f", function (c) c.fullscreen = not c.fullscreen c:raise() end, {description = "toggle fullscreen", group = "client"}), | ||||||
|  |     awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end,     {description = "close", group = "client"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ,     {description = "toggle floating", group = "client"}), | ||||||
|  |     awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,     {description = "move to master", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "o",      function (c) c:move_to_screen()               end,     {description = "move to screen", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end,     {description = "toggle keep on top", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "n",      function (c) --[[ The client currently has the input focus, so it cannot be minimized, since minimized clients can't have the focus. ]]  c.minimized = true end , | ||||||
|  |                                                                                                       {description = "minimize", group = "client"}), | ||||||
|  |     awful.key({ modkey,           }, "m", function (c) c.maximized = not c.maximized c:raise() end ,  {description = "maximize", group = "client"}) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | -- Bind all key numbers to tags. | ||||||
|  | -- Be careful: we use keycodes to make it works on any keyboard layout. | ||||||
|  | -- This should map on the top row of your keyboard, usually 1 to 9. | ||||||
|  | for i = 1, 9 do | ||||||
|  |     globalkeys = awful.util.table.join( | ||||||
|  |         globalkeys, | ||||||
|  |         -- View tag only. | ||||||
|  |         awful.key( | ||||||
|  |             { modkey }, | ||||||
|  |             "#" .. i + 9, | ||||||
|  |             function () | ||||||
|  |                 local screen = awful.screen.focused() | ||||||
|  |                 local tag = screen.tags[i] | ||||||
|  |                 if tag then | ||||||
|  |                     tag:view_only() | ||||||
|  |                 end | ||||||
|  |             end, | ||||||
|  |             {description = "view tag #"..i, group = "tag"} | ||||||
|  |         ), | ||||||
|  |         -- Toggle tag display. | ||||||
|  |         awful.key( | ||||||
|  |             { modkey, "Control" }, | ||||||
|  |             "#" .. i + 9, | ||||||
|  |             function () | ||||||
|  |                 local screen = awful.screen.focused() | ||||||
|  |                 local tag = screen.tags[i] | ||||||
|  |                 if tag then | ||||||
|  |                     awful.tag.viewtoggle(tag) | ||||||
|  |                 end | ||||||
|  |             end, | ||||||
|  |             {description = "toggle tag #" .. i, group = "tag"} | ||||||
|  |         ), | ||||||
|  |         -- Move client to tag. | ||||||
|  |         awful.key( | ||||||
|  |             { modkey, "Shift" }, | ||||||
|  |             "#" .. i + 9, | ||||||
|  |             function () | ||||||
|  |                 if client.focus then | ||||||
|  |                     local tag = client.focus.screen.tags[i] | ||||||
|  |                     if tag then | ||||||
|  |                         client.focus:move_to_tag(tag) | ||||||
|  |                     end | ||||||
|  |                 end | ||||||
|  |             end, | ||||||
|  |             {description = "move focused client to tag #"..i, group = "tag"} | ||||||
|  |         ), | ||||||
|  |         -- Toggle tag on focused client. | ||||||
|  |         awful.key( | ||||||
|  |             { modkey, "Control", "Shift" }, | ||||||
|  |             "#" .. i + 9, | ||||||
|  |             function () | ||||||
|  |                 if client.focus then | ||||||
|  |                     local tag = client.focus.screen.tags[i] | ||||||
|  |                     if tag then | ||||||
|  |                         client.focus:toggle_tag(tag) | ||||||
|  |                     end | ||||||
|  |                 end | ||||||
|  |             end, | ||||||
|  |             {description = "toggle focused client on tag #" .. i, group = "tag"} | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | clientbuttons = awful.util.table.join( | ||||||
|  | awful.button({ }, 1, function (c) client.focus = c; c:raise() end), | ||||||
|  | awful.button({ modkey }, 1, awful.mouse.client.move), | ||||||
|  | awful.button({ modkey }, 3, awful.mouse.client.resize)) | ||||||
|  | 
 | ||||||
|  | -- Set keys | ||||||
|  | root.keys(globalkeys) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Rules | ||||||
|  | -- Rules to apply to new clients (through the "manage" signal). | ||||||
|  | awful.rules.rules = { | ||||||
|  |     -- All clients will match this rule. | ||||||
|  |     { | ||||||
|  |         rule = { }, | ||||||
|  |         properties = { | ||||||
|  |             border_width = beautiful.border_width, | ||||||
|  |             border_color = beautiful.border_normal, | ||||||
|  |             focus = awful.client.focus.filter, | ||||||
|  |             raise = true, | ||||||
|  |             keys = clientkeys, | ||||||
|  |             buttons = clientbuttons, | ||||||
|  |             screen = awful.screen.preferred, | ||||||
|  |             placement = awful.placement.no_overlap+awful.placement.no_offscreen | ||||||
|  |           } | ||||||
|  |       }, | ||||||
|  |       -- Floating clients. | ||||||
|  |       { | ||||||
|  |           rule_any = { | ||||||
|  |               instance = { | ||||||
|  |                   "DTA",  -- Firefox addon DownThemAll. | ||||||
|  |                   "copyq",  -- Includes session name in class. | ||||||
|  |               }, | ||||||
|  |               class = { | ||||||
|  |                   "Arandr", | ||||||
|  |                   "Gpick", | ||||||
|  |                   "Kruler", | ||||||
|  |                   "MessageWin",  -- kalarm. | ||||||
|  |                   "Sxiv", | ||||||
|  |                   "Wpa_gui", | ||||||
|  |                   "pinentry", | ||||||
|  |                   "veromix", | ||||||
|  |                   "xtightvncviewer" | ||||||
|  |               }, | ||||||
|  |               name = { | ||||||
|  |                   "Event Tester",  -- xev. | ||||||
|  |               }, | ||||||
|  |               role = { | ||||||
|  |                   "AlarmWindow",  -- Thunderbird's calendar. | ||||||
|  |                   "pop-up",       -- e.g. Google Chrome's (detached) Developer Tools. | ||||||
|  |               } | ||||||
|  |           }, | ||||||
|  |           properties = { floating = true } | ||||||
|  |       }, | ||||||
|  | 
 | ||||||
|  |       -- Add titlebars to normal clients and dialogs | ||||||
|  |       { | ||||||
|  |           rule_any = { | ||||||
|  |               type = { "normal", "dialog" } | ||||||
|  |           }, | ||||||
|  |           properties = { titlebars_enabled = false } | ||||||
|  |       }, | ||||||
|  | 
 | ||||||
|  |       -- Set Firefox to always map on the tag named "2" on screen 1. | ||||||
|  |       -- { rule = { class = "Firefox" }, | ||||||
|  |       --   properties = { screen = 1, tag = "2" } }, | ||||||
|  | } | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- {{{ Signals | ||||||
|  | -- Signal function to execute when a new client appears. | ||||||
|  | client.connect_signal( | ||||||
|  |     "manage", | ||||||
|  |     function (c) | ||||||
|  |         --[[ Set the windows at the slave, i.e. put it at the end of others instead of setting it master.]] | ||||||
|  |         -- if not awesome.startup then awful.client.setslave(c) end | ||||||
|  | 
 | ||||||
|  |         if awesome.startup and | ||||||
|  |             not c.size_hints.user_position | ||||||
|  |             and not c.size_hints.program_position then | ||||||
|  |             --[[ Prevent clients from being unreachable after screen count changes.]] | ||||||
|  |             awful.placement.no_offscreen(c) | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | -- Add a titlebar if titlebars_enabled is set to true in the rules. | ||||||
|  | client.connect_signal( | ||||||
|  |     "request::titlebars", | ||||||
|  |     function(c) | ||||||
|  |         -- buttons for the titlebar | ||||||
|  |         local buttons = awful.util.table.join( | ||||||
|  |             awful.button( | ||||||
|  |                 { }, | ||||||
|  |                 1, | ||||||
|  |                 function() | ||||||
|  |                     client.focus = c | ||||||
|  |                     c:raise() | ||||||
|  |                     awful.mouse.client.move(c) | ||||||
|  |                 end | ||||||
|  |             ), | ||||||
|  |             awful.button( | ||||||
|  |                 { }, | ||||||
|  |                 3, | ||||||
|  |                 function() | ||||||
|  |                     client.focus = c | ||||||
|  |                     c:raise() | ||||||
|  |                     awful.mouse.client.resize(c) | ||||||
|  |                 end | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         awful.titlebar(c) : setup { | ||||||
|  |             { -- Left | ||||||
|  |                 awful.titlebar.widget.iconwidget(c), | ||||||
|  |                 buttons = buttons, | ||||||
|  |                 layout  = wibox.layout.fixed.horizontal | ||||||
|  |             }, | ||||||
|  |             { -- Middle | ||||||
|  |                 { -- Title | ||||||
|  |                     align  = "center", | ||||||
|  |                     widget = awful.titlebar.widget.titlewidget(c) | ||||||
|  |                 }, | ||||||
|  |                 buttons = buttons, | ||||||
|  |                 layout  = wibox.layout.flex.horizontal | ||||||
|  |             }, | ||||||
|  |             { -- Right | ||||||
|  |                 awful.titlebar.widget.floatingbutton (c), | ||||||
|  |                 awful.titlebar.widget.maximizedbutton(c), | ||||||
|  |                 awful.titlebar.widget.stickybutton   (c), | ||||||
|  |                 awful.titlebar.widget.ontopbutton    (c), | ||||||
|  |                 awful.titlebar.widget.closebutton    (c), | ||||||
|  |                 layout = wibox.layout.fixed.horizontal() | ||||||
|  |             }, | ||||||
|  |             layout = wibox.layout.align.horizontal | ||||||
|  |         } | ||||||
|  |     end | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | -- Enable sloppy focus, so that focus follows mouse. | ||||||
|  | client.connect_signal( | ||||||
|  |     "mouse::enter", | ||||||
|  |     function(c) | ||||||
|  |         if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier | ||||||
|  |         and awful.client.focus.filter(c) then | ||||||
|  |             client.focus = c | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) | ||||||
|  | client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) | ||||||
|  | -- }}} | ||||||
|  | 
 | ||||||
|  | -- Au démarrage | ||||||
|  | awful.util.spawn_with_shell("xrandr-auto || true") | ||||||
|  | -- awful.util.spawn_with_shell("gnome-sound-applet") | ||||||
|  | -- awful.util.spawn_with_shell("nm-applet") | ||||||
| @ -1,72 +0,0 @@ | |||||||
| { config, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   # Nombre de process d'installation en parrallèle effectués par Nix |  | ||||||
|   nix.buildCores = 0; |  | ||||||
| 
 |  | ||||||
|   # The NixOS release to be compatible with for stateful data such as databases. |  | ||||||
|   system.stateVersion = "16.03"; |  | ||||||
| 
 |  | ||||||
|   # On autorise les paquets non-libres |  | ||||||
|   nixpkgs.config.allowUnfree = true; |  | ||||||
| 
 |  | ||||||
|   # List packages installed in system profile. To search by name, run: |  | ||||||
|   # $ nix-env -qaP | grep wget |  | ||||||
|   environment = { |  | ||||||
|     systemPackages = with pkgs; [ |  | ||||||
|       bind          # utilisé pour les utilitaires comme dig |  | ||||||
|       byobu         # permet de se déconnecter d'un terminal sans l'aréter |  | ||||||
|       exfat         # Pour monter les FAT avec Fuse |  | ||||||
|       git gitAndTools.gitSVN gitAndTools.tig gti # outil de gestion de version |  | ||||||
|       gnumake       # pour décrire les recettes de compilation |  | ||||||
|       gnupg         # GPG |  | ||||||
|       gpm           # prise en charge de la souris en console |  | ||||||
|       htop          # monitoring |  | ||||||
|       #libressl      # librairie pour faire du TLS et les algorithmes de crypto par OpenBSD |  | ||||||
|       ncdu          # outil pour voir l'espace utilisé |  | ||||||
|       nmap          # outil de scan de port réseau |  | ||||||
|       mtr           # outil de diagnostic réseau |  | ||||||
|       par2cmdline   # outil de récupération de fichiers corrompus - .par2 |  | ||||||
|       p7zip         # compression de fichier |  | ||||||
|       parted        # partitionnement de disque |  | ||||||
|       pciutils |  | ||||||
|       python        # python -- python -m SimpleHTTPServer 8000 |  | ||||||
|       python34Packages.glances # monitoring |  | ||||||
|       pwgen         # générateur de mot de passe |  | ||||||
|       rtorrent      # outil de téléchargement de torrent & magnet |  | ||||||
|       tmux          # nécessaire pour byobu |  | ||||||
|       tree          # affiche une arborescence de fichiers et dossiers |  | ||||||
|       usbutils |  | ||||||
|       (import ./vim.nix) |  | ||||||
|       wget          # client HTTP console |  | ||||||
|       which         # pour connaitre le chemin d'un exécutable |  | ||||||
|     ]; |  | ||||||
|     shellAliases = { |  | ||||||
|       byobu = "byobu-tmux"; |  | ||||||
|       tree = "tree -C"; |  | ||||||
|       tree1 = "tree -d -L 1"; |  | ||||||
|       tree2 = "tree -d -L 2"; |  | ||||||
|       tree3 = "tree -d -L 3"; |  | ||||||
|       grep = "grep --color=auto"; |  | ||||||
|       vi = "vim"; |  | ||||||
|     }; |  | ||||||
|     etc.gitconfig.text = builtins.readFile ./gitconfig; |  | ||||||
|   }; |  | ||||||
|   programs.bash = { |  | ||||||
|     enableCompletion = true; |  | ||||||
|     promptInit = builtins.readFile ./bash-prompt.sh; |  | ||||||
|     interactiveShellInit = builtins.readFile ./bash-interactive-init.sh; |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   # https://wiki.mozilla.org/Security/Guidelines/OpenSSH#Modern |  | ||||||
|   programs.ssh.extraConfig = '' |  | ||||||
|     # Ensure KnownHosts are unreadable if leaked - it is otherwise easier to know which hosts your keys have access to. |  | ||||||
|     HashKnownHosts yes |  | ||||||
|     # Host keys the client accepts - order here is honored by OpenSSH |  | ||||||
|     HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256 |  | ||||||
| 
 |  | ||||||
|     KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp256,ecdh-sha2-nistp384,diffie-hellman-group-exchange-sha256 |  | ||||||
|     MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com |  | ||||||
|     Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr |  | ||||||
|   ''; |  | ||||||
| } |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in New Issue