Compare commits
94 Commits
2017-01-27
...
2017-03-05
| Author | SHA1 | Date | |
|---|---|---|---|
| e2178821d8 | |||
| 1e00db3864 | |||
|
|
3364f19ed7 | ||
|
|
c10d2c6d63 | ||
| 8dd973ede1 | |||
| aeeea3a743 | |||
| 3b76bd00af | |||
| e74a1825d9 | |||
|
|
b47c6807d1 | ||
|
|
a4728792b2 | ||
|
|
4c4c2fed3e | ||
| 93254f45c0 | |||
| c1ce935adb | |||
| e68cbcd8b9 | |||
| ac39a52fd7 | |||
| 3dc8184bca | |||
| 24ef44b100 | |||
| 9e9ea00cd2 | |||
| 464da39592 | |||
| 963c818875 | |||
|
|
2f99508331 | ||
|
|
b6a7f50ebd | ||
|
|
2fdaf24fae | ||
|
|
c193d944d9 | ||
|
|
7750d1a266 | ||
|
|
08195188b2 | ||
|
|
b12e1f9ae5 | ||
|
|
d0b3497ccb | ||
|
|
ba0d43670d | ||
| 06aaf3cc23 | |||
| 0e1a1b0107 | |||
| c500c59732 | |||
| 9e3b1d163f | |||
| 9bdaae4593 | |||
| 1a80e445ce | |||
| 50d486565c | |||
| b6cf3b2674 | |||
| c0427bb622 | |||
|
|
5be0164cb9 | ||
|
|
493249ebd3 | ||
|
|
9d0c04810c | ||
|
|
e5de46f1d3 | ||
|
|
2a2c0a56fe | ||
| 8ef6642024 | |||
| e77df9816d | |||
|
|
ba09f97684 | ||
|
|
b0696f1983 | ||
|
|
2d9c9415a2 | ||
|
|
7e7736b631 | ||
|
|
52670ebd9c | ||
|
|
8845300555 | ||
| dce783708c | |||
| f2305d0a81 | |||
| a6e957afae | |||
| edfac07129 | |||
| 7799eb106f | |||
| e0a468bfeb | |||
| c4013be348 | |||
| 6cdd621db2 | |||
| a5bfdbcd3d | |||
| 5b954581db | |||
| ca11b46674 | |||
|
|
754a1ec934 | ||
|
|
80f7b32af6 | ||
|
|
5cd1cd0e6f | ||
|
|
fae4a8237c | ||
|
|
5f09c0896d | ||
|
|
2244b917ac | ||
| 458362bece | |||
| b4b213e836 | |||
| cc7f911141 | |||
| 4ffd71f10f | |||
|
|
07cf33a086 | ||
| f3741782e3 | |||
| b8c3447767 | |||
| eb3a945c7c | |||
| 6f19fdec07 | |||
| 91e81d50a6 | |||
|
|
293dd76025 | ||
| 65a21c197c | |||
|
|
c11cd5d456 | ||
|
|
805ef707f5 | ||
|
|
1ee426f50a | ||
|
|
0bcd327679 | ||
| 04c3397ff3 | |||
| 5f86c78e1b | |||
| 715a3519f4 | |||
| 0b08c7dbd0 | |||
| d7f2b4fd38 | |||
|
|
ce1cae293c | ||
|
|
1c58705adf | ||
|
|
1cc773c034 | ||
|
|
58c32c79fb | ||
| d1a5228a92 |
15
Makefile
15
Makefile
@@ -1,17 +1,18 @@
|
||||
GSF=git submodule foreach
|
||||
TIME=time
|
||||
|
||||
all: rebuild-switch
|
||||
date
|
||||
##--------- Commandes spécifiques pour NixOS
|
||||
|
||||
clean:
|
||||
nix-collect-garbage -d --delete-older-than 15d
|
||||
$(TIME) nix-collect-garbage -d --delete-older-than 15d
|
||||
|
||||
clean-aggressive:
|
||||
nix-collect-garbage -d --delete-older-than 1d
|
||||
$(TIME) nix-collect-garbage -d --delete-older-than 1d
|
||||
|
||||
clean-total:
|
||||
nix-collect-garbage -d
|
||||
$(TIME) nix-collect-garbage -d
|
||||
|
||||
clean-log:
|
||||
journalctl --vacuum-size=1G
|
||||
@@ -20,19 +21,19 @@ full-auto: submodules-update upgrade clean optimise
|
||||
@date
|
||||
|
||||
optimise:
|
||||
nix-store --optimise
|
||||
$(TIME) nix-store --optimise
|
||||
|
||||
rebuild-switch:
|
||||
nixos-rebuild switch --fallback --show-trace
|
||||
$(TIME) time nixos-rebuild switch --fallback --show-trace
|
||||
|
||||
show-roots:
|
||||
nix-store --gc --print-roots
|
||||
|
||||
store-repair:
|
||||
nix-store --verify --check-contents --repair
|
||||
$(TIME) nix-store --verify --check-contents --repair
|
||||
|
||||
upgrade:
|
||||
nixos-rebuild switch --upgrade --fallback --show-trace
|
||||
$(TIME) nixos-rebuild switch --upgrade --fallback --show-trace
|
||||
|
||||
##--------- Commandes spécifiques pour NixOS -- Opérations non courantes
|
||||
|
||||
|
||||
184
README.md
184
README.md
@@ -1,18 +1,45 @@
|
||||
# nixos-template-base
|
||||
|
||||
Version de nixos supportée : NixOs 16.09
|
||||
Versions de NixOS supportées :
|
||||
* NixOS 16.09
|
||||
* 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.
|
||||
|
||||
# Lien pour install sur machine distante
|
||||
# Notes de mise-à-jour
|
||||
## pour le passage de 16.09 à unstable
|
||||
|
||||
* https://nixos.org/wiki/How_to_install_NixOS_from_Linux#Installing_through_a_chroot
|
||||
* https://github.com/NixOS/nixpkgs/issues/13305
|
||||
* mettre à jour tous les dépôts
|
||||
* changer la branche de base vers `nixos-unstable`
|
||||
* changer la declaration de la machine dans `configuration.nix`
|
||||
|
||||
# Notes pour l'upgrade de 16.03 vers 16.09
|
||||
~~~
|
||||
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```
|
||||
@@ -41,3 +68,150 @@ Pour résoudre les soucis d'upgrade, il est conseillé :
|
||||
* 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
|
||||
|
||||
~~~
|
||||
sudo su -
|
||||
~~~
|
||||
|
||||
* formater les partitions
|
||||
|
||||
~~~
|
||||
mkfs.ext4 -L nixos /dev/sda1
|
||||
swapoff -a
|
||||
mkswap /dev/sda2
|
||||
swapon -a
|
||||
~~~
|
||||
|
||||
* monter les partitions dans /mnt
|
||||
|
||||
~~~
|
||||
mount /dev/sda1 /mnt/
|
||||
mkdir /mnt/etc/
|
||||
mkdir /etc/nixos
|
||||
mkdir /mnt/nix
|
||||
mount --bind /mnt/nix/ /nix
|
||||
~~~
|
||||
|
||||
|
||||
* installer les paquets nécessaires
|
||||
|
||||
~~~
|
||||
apt-get install bzip2 git byobu htop glances
|
||||
~~~
|
||||
|
||||
* création d'utilisateur (n'importe quil mot de passe)
|
||||
|
||||
~~~
|
||||
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
|
||||
|
||||
~~~
|
||||
update-ca-certificates
|
||||
~~~
|
||||
|
||||
* installer nix
|
||||
|
||||
~~~
|
||||
chown -R nix /nix
|
||||
su - nix
|
||||
bash <(curl https://nixos.org/nix/install)
|
||||
exit
|
||||
~~~
|
||||
|
||||
* créer un profil nix pour root & un channel
|
||||
|
||||
~~~
|
||||
. ~nix/.nix-profile/etc/profile.d/nix.sh
|
||||
nix-channel --remove nixpkgs
|
||||
nix-channel --add http://nixos.org/channels/nixos-unstable nixos
|
||||
nix-channel --update
|
||||
~~~
|
||||
|
||||
* installer un editeur de texte
|
||||
|
||||
~~~
|
||||
nix-env -i vim_configurable
|
||||
~~~
|
||||
|
||||
* installation de nixos-install
|
||||
|
||||
~~~
|
||||
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
|
||||
|
||||
~~~
|
||||
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
|
||||
|
||||
~~~
|
||||
mount --bind /mnt/etc/nixos/ /etc/nixos/
|
||||
~~~
|
||||
|
||||
* mettre à jour la configuration matérielle
|
||||
|
||||
~~~
|
||||
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
|
||||
|
||||
~~~
|
||||
unset NIXOS_CONFIG
|
||||
nixos-install
|
||||
~~~
|
||||
|
||||
|
||||
2
base.nix
2
base.nix
@@ -10,8 +10,6 @@ in
|
||||
{
|
||||
imports = [
|
||||
# recettes
|
||||
./base/base.nix
|
||||
./desktop/desktop.nix
|
||||
./public/public.nix
|
||||
|
||||
# moulinette de configuration
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
/etc/nixos/base/Makefile
|
||||
@@ -1,25 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
mkIf cfg.nix-serve-client {
|
||||
|
||||
nix = {
|
||||
# Cache http pour le store
|
||||
requireSignedBinaryCaches = false;
|
||||
binaryCaches = [
|
||||
(mkIf (profiles.isDubronetwork && (! computers.isPedro) && (! computers.isRollo)) "http://nix-cache.dubronetwork.fr:5001")
|
||||
|
||||
(mkIf profiles.isPrunetwork "https://cache.nixos.org/")
|
||||
(mkIf (profiles.isPrunetwork && !profiles.isServer) "http://nix-cache.dubronetwork.fr:5001")
|
||||
];
|
||||
extraOptions = ''
|
||||
connect-timeout = 5
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
mkIf cfg.nix-serve-server {
|
||||
|
||||
# Cache http pour le store
|
||||
|
||||
# Services
|
||||
services.nix-serve = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# Réseau
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [
|
||||
#5000 # ouvert sur tinc
|
||||
];
|
||||
allowedUDPPorts = [
|
||||
];
|
||||
extraCommands = ''
|
||||
iptables -A INPUT -i tinc.grudunet -p tcp --dport 5000 -j ACCEPT
|
||||
ip6tables -A INPUT -i tinc.grudunet -p tcp --dport 5000 -j ACCEPT
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
|
||||
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
|
||||
|
||||
mkIf cfg.fail2ban {
|
||||
|
||||
# Gestion de fail2ban
|
||||
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; [
|
||||
mailutils
|
||||
whois
|
||||
];
|
||||
|
||||
|
||||
# Services
|
||||
services = {
|
||||
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}
|
||||
|
||||
# https://github.com/Baughn/nixpkgs/blob/master/nixos/modules/services/security/fail2ban.nix
|
||||
findtime = 600
|
||||
maxretry = 3
|
||||
backend = systemd
|
||||
enabled = true
|
||||
'';
|
||||
ssh-route = ''
|
||||
filter = sshd
|
||||
action = route[blocktype=blackhole]
|
||||
'';
|
||||
# désactivation car souci de PATH avec les commandes mail ou sendmail. Nécessite un path motifiable
|
||||
# ticket à ouvrir
|
||||
#ssh-mail = ''
|
||||
# filter = sshd
|
||||
# action = sendmail[sendername=Fail2ban @${config.networking.hostName}]
|
||||
#'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/issues/8437
|
||||
services.fail2ban.jails.ssh-iptables = "enabled = true";
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,20 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
#inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
{
|
||||
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,22 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
mkIf true {
|
||||
|
||||
# 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;
|
||||
};
|
||||
}
|
||||
34
byobu-adminsys
Executable file
34
byobu-adminsys
Executable file
@@ -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};
|
||||
|
||||
@@ -9,118 +9,102 @@ let
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
# TODO: ménage
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
options = {
|
||||
|
||||
#* Utilisé pour afecter des capacités aux machines
|
||||
r6d.profiles = {
|
||||
# Domaine
|
||||
isDubronetwork = mkEnableOption "Pour distinguer les machines dubronetwork.";
|
||||
isPrunetwork = mkEnableOption "Pour distinguer les machines prunetwork.";
|
||||
# Utilisation machine
|
||||
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";
|
||||
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.";
|
||||
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.";
|
||||
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.";
|
||||
murmur = mkEnableOption "Profil pour activer un serveur Mumble (murmur)";
|
||||
nix-serve-client = mkEnableOption "Profil pour que la machine soit un client de cache nix.";
|
||||
nix-serve-server = mkEnableOption "Profil pour que la machine soit un serveur de cache nix.";
|
||||
nixStoreProxyCache = mkEnableOption "Profil pour activer le proxy cahce nginx pour le nix store";
|
||||
print = mkEnableOption "Profil pour activer cups & pouvoir imprimer.";
|
||||
rabbitmq = mkEnableOption "Profil pour activer le service de messagerie AMQP.";
|
||||
radicale = mkEnableOption "Profil pour activer le service d'hébergement de calendrier + tâches & contacts.";
|
||||
scanner = mkEnableOption "Profil pour que les scanners soient utilisable.";
|
||||
swap = mkEnableOption "Profil pour que le swap soit activé.";
|
||||
virtualbox = mkEnableOption "Profil pour l'utilisation de VirtualBox.";
|
||||
xmonad = mkEnableOption "Profil pour activer le gestionnaire de fenêtres xmonad.";
|
||||
znc = mkEnableOption "Profil pour activer le relais IRC ZNC.";
|
||||
|
||||
tincAddress = mkOption {
|
||||
default = "";
|
||||
example = "192.168.1.1";
|
||||
description = "Adresse du noeud tinc local";
|
||||
type = lib.types.string;
|
||||
};
|
||||
tincExtraConfig = mkOption {
|
||||
default = "";
|
||||
example = ''
|
||||
Mode = router
|
||||
ConnecTo = bar
|
||||
'';
|
||||
description = "Configuration supplémentaire pour tinc";
|
||||
type = lib.types.string;
|
||||
};
|
||||
};
|
||||
#* Utilisé pour avoir des raccourcis de machine
|
||||
r6d.computers = {
|
||||
isHydra = mkEnableOption "Identification du nom de machine.";
|
||||
isLatitude = mkEnableOption "Identification du nom de machine.";
|
||||
isMonstre = mkEnableOption "Identification du nom de machine.";
|
||||
isNeoNomade = mkEnableOption "Identification du nom de machine.";
|
||||
isNomade = mkEnableOption "Identification du nom de machine.";
|
||||
isOcean = mkEnableOption "Identification du nom de machine.";
|
||||
isPedro = mkEnableOption "Identification du nom de machine.";
|
||||
isPhenom = mkEnableOption "Identification du nom de machine.";
|
||||
isRadx = mkEnableOption "Identification du nom de machine.";
|
||||
isRollo = mkEnableOption "Identification du nom de machine.";
|
||||
};
|
||||
#* Utilisé pour afecter des capacités aux machines
|
||||
r6d.profiles = {
|
||||
# Domaine
|
||||
isDubronetwork = mkEnableOption "Pour distinguer les machines dubronetwork.";
|
||||
isPrunetwork = mkEnableOption "Pour distinguer les machines prunetwork.";
|
||||
# Utilisation machine
|
||||
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.";
|
||||
};
|
||||
|
||||
###### implementation
|
||||
# https://nixos.org/releases/nixos/14.12-small/nixos-14.12.374.61adf9e/manual/sec-writing-modules.html
|
||||
# https://nixos.org/wiki/NixOS:extend_NixOS
|
||||
config = mkMerge
|
||||
[ # Unconditional stuff.
|
||||
{
|
||||
r6d.config-generator.enable = true;
|
||||
r6d.computers = {
|
||||
isHydra = host == "hydra.prunetwork.fr";
|
||||
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";
|
||||
isPedro = host == "pedro.dubronetwork.fr";
|
||||
isPhenom = host == "phenom.dubronetwork.fr";
|
||||
isRadx = host == "radx.prunetwork.fr";
|
||||
isRollo = host == "rollo.dubronetwork.fr";
|
||||
#* Utilisé dans les fichiers .nix
|
||||
r6d.config-generator = {
|
||||
#enable = mkEnableOption "Génération de la configuration d'une machine.";
|
||||
awesome = mkEnableOption "Profil pour activer le gestionnaire de fenêtre awesome.";
|
||||
auto-upgrade = mkEnableOption "Profil pour activer les mises à jour automatiques.";
|
||||
cartographie = mkEnableOption "Profil pour activer les outils de gestion de données géographiques.";
|
||||
conception-assistee = mkEnableOption "Profil pour activer les outils de conception électronique & modélisation 3D";
|
||||
database_postgres = mkEnableOption "Profil pour activer le SGBD PostgreSQL.";
|
||||
developpement = mkEnableOption "Profil pour activer les outils de développement";
|
||||
developpement-elm = mkEnableOption "Profil pour activer les outils de développement Elm";
|
||||
developpement-haskell = mkEnableOption "Profil pour activer les outils de développement Haskell";
|
||||
developpement-java = mkEnableOption "Profil pour activer les outils de développement Java";
|
||||
developpement-rust = mkEnableOption "Profil pour activer les outils de développement Rust";
|
||||
docker = mkEnableOption "Profil pour l'utilisation de Docker.";
|
||||
dovecot = mkEnableOption "Profil pour activer le serveur Dovecot.";
|
||||
dns_autorite = mkEnableOption "Profil pour servir les fichiers de zone DNS.";
|
||||
dns_resolveur = mkEnableOption "Profil pour activer un résolveur DNS local.";
|
||||
edition-musique = mkEnableOption "Profil pour la création/édition de musique.";
|
||||
edition-photo = mkEnableOption "Profil pour la création/édition de photos.";
|
||||
edition-video = mkEnableOption "Profil pour la création/édition de video.";
|
||||
elasticsearch = mkEnableOption "Profil pour activer le service elasticsearch.";
|
||||
fail2ban = mkEnableOption "Profil pour activer Fail2ban.";
|
||||
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.";
|
||||
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.";
|
||||
murmur = mkEnableOption "Profil pour activer un serveur Mumble (murmur)";
|
||||
nix-serve-client = mkEnableOption "Profil pour que la machine soit un client de cache nix.";
|
||||
nix-serve-server = mkEnableOption "Profil pour que la machine soit un serveur de cache nix.";
|
||||
nixStoreProxyCache = mkEnableOption "Profil pour activer le proxy cahce nginx pour le nix store";
|
||||
print = mkEnableOption "Profil pour activer cups & pouvoir imprimer.";
|
||||
rabbitmq = mkEnableOption "Profil pour activer le service de messagerie AMQP.";
|
||||
radicale = mkEnableOption "Profil pour activer le service d'hébergement de calendrier + tâches & contacts.";
|
||||
scanner = mkEnableOption "Profil pour que les scanners soient utilisable.";
|
||||
swap = mkEnableOption "Profil pour que le swap soit activé.";
|
||||
virtualbox = mkEnableOption "Profil pour l'utilisation de VirtualBox.";
|
||||
xmonad = mkEnableOption "Profil pour activer le gestionnaire de fenêtres xmonad.";
|
||||
znc = mkEnableOption "Profil pour activer le relais IRC ZNC.";
|
||||
|
||||
tincAddress = mkOption {
|
||||
default = "";
|
||||
example = "192.168.1.1";
|
||||
description = "Adresse du noeud tinc local";
|
||||
type = lib.types.string;
|
||||
};
|
||||
}
|
||||
|
||||
# Conditional stuff
|
||||
tincExtraConfig = mkOption {
|
||||
default = "";
|
||||
example = ''
|
||||
Mode = router
|
||||
ConnecTo = bar
|
||||
'';
|
||||
description = "Configuration supplémentaire pour tinc";
|
||||
type = lib.types.string;
|
||||
};
|
||||
};
|
||||
#* Utilisé pour avoir des raccourcis de machine
|
||||
r6d.computers = {
|
||||
isHydra = mkEnableOption "Identification du nom de machine.";
|
||||
isLatitude = mkEnableOption "Identification du nom de machine.";
|
||||
isMonstre = mkEnableOption "Identification du nom de machine.";
|
||||
isNeoNomade = mkEnableOption "Identification du nom de machine.";
|
||||
isNomade = mkEnableOption "Identification du nom de machine.";
|
||||
isOcean = mkEnableOption "Identification du nom de machine.";
|
||||
isPedro = mkEnableOption "Identification du nom de machine.";
|
||||
isPhenom = mkEnableOption "Identification du nom de machine.";
|
||||
isRadx = mkEnableOption "Identification du nom de machine.";
|
||||
isRollo = mkEnableOption "Identification du nom de machine.";
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
# https://nixos.org/releases/nixos/14.12-small/nixos-14.12.374.61adf9e/manual/sec-writing-modules.html
|
||||
# https://nixos.org/wiki/NixOS:extend_NixOS
|
||||
config = mkMerge
|
||||
[
|
||||
## Définition des profils génériques
|
||||
(mkIf pfl.isDesktop {
|
||||
r6d.config-generator = {
|
||||
@@ -171,6 +155,7 @@ in
|
||||
conception-assistee = true;
|
||||
docker = true;
|
||||
developpement = true;
|
||||
developpement-elm = true;
|
||||
developpement-haskell = true;
|
||||
developpement-java = true;
|
||||
developpement-rust = true;
|
||||
@@ -195,21 +180,27 @@ in
|
||||
(mkIf (pfl.isPrunetwork && pfl.isWorkstation) {
|
||||
r6d.config-generator = {
|
||||
cartographie = true;
|
||||
conception-assistee = true;
|
||||
docker = true;
|
||||
developpement = true;
|
||||
#developpement-elm = true;
|
||||
developpement-haskell = true;
|
||||
developpement-java = true;
|
||||
#developpement-rust = true;
|
||||
#edition-musique = true;
|
||||
developpement-rust = true;
|
||||
edition-musique = true;
|
||||
edition-photo = true;
|
||||
#edition-video = true;
|
||||
edition-video = true;
|
||||
hydra-core = false; # DO NOT ENABLE ON WORKSTATION, YOU CAN CRASH YOUR SYSTEM
|
||||
print = true;
|
||||
virtualbox = true;
|
||||
#virtualbox = true;
|
||||
#xmonad = true;
|
||||
};
|
||||
})
|
||||
|
||||
|
||||
## Affectation des profils aux machines
|
||||
(mkIf comp.isHydra {
|
||||
networking.hostName = "hydra.prunetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isPrunetwork = true;
|
||||
isServer = true;
|
||||
@@ -219,14 +210,14 @@ in
|
||||
docker = true;
|
||||
hydra-builder = true;
|
||||
hydra-core = true;
|
||||
tincAddress = "192.168.12.8/24";
|
||||
tincExtraConfig = ''
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
#tincAddress = "192.168.12.6/24";
|
||||
#tincExtraConfig = ''
|
||||
# ConnectTo = rollo_dubronetwork_fr
|
||||
# '';
|
||||
};
|
||||
})
|
||||
(mkIf comp.isOcean {
|
||||
networking.hostName = "ocean.prunetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isPrunetwork = true;
|
||||
isServer = true;
|
||||
@@ -235,13 +226,16 @@ in
|
||||
r6d.config-generator = {
|
||||
docker = true;
|
||||
radicale = true;
|
||||
nix-serve-client = true;
|
||||
nix-serve-server = true;
|
||||
tincAddress = "192.168.12.6/24";
|
||||
tincExtraConfig = ''
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
'';
|
||||
'';
|
||||
};
|
||||
})
|
||||
(mkIf comp.isRadx {
|
||||
networking.hostName = "radx.prunetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isHome = true;
|
||||
isPrunetwork = true;
|
||||
@@ -249,21 +243,25 @@ in
|
||||
};
|
||||
|
||||
r6d.config-generator = {
|
||||
database_postgres = true;
|
||||
elasticsearch = true;
|
||||
hydra-builder = true;
|
||||
hydra-core = true;
|
||||
#hydra-core = false; # DO NOT ENABLE ON WORKSTATION
|
||||
kibana = true;
|
||||
nix-serve-client = true;
|
||||
nix-serve-server = true;
|
||||
rabbitmq = true;
|
||||
tincAddress = "192.168.12.3/24";
|
||||
tincExtraConfig = ''
|
||||
ConnectTo = monstre_dubronetwork_fr
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
};
|
||||
})
|
||||
|
||||
(mkIf comp.isLatitude {
|
||||
networking.hostName = "latitude.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isDubronetwork = true;
|
||||
isHome = true;
|
||||
@@ -278,11 +276,12 @@ in
|
||||
ConnectTo = monstre_dubronetwork_fr
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
nix-serve-server = true;
|
||||
};
|
||||
})
|
||||
(mkIf comp.isMonstre {
|
||||
networking.hostName = "monstre.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isDubronetwork = true;
|
||||
isServer = true;
|
||||
@@ -298,10 +297,11 @@ in
|
||||
tincExtraConfig = ''
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
};
|
||||
})
|
||||
(mkIf comp.isNeoNomade{
|
||||
networking.hostName = "neo-nomade.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isDubronetwork = true;
|
||||
isHome = true;
|
||||
@@ -314,10 +314,13 @@ in
|
||||
ConnectTo = monstre_dubronetwork_fr
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
};
|
||||
})
|
||||
# Dubro Vivo - St Malo
|
||||
#tincAddress = "192.168.12.8/24";
|
||||
(mkIf comp.isNomade{
|
||||
networking.hostName = "nomade.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles.isDubronetwork = true;
|
||||
|
||||
r6d.config-generator = {
|
||||
@@ -335,6 +338,7 @@ in
|
||||
};
|
||||
})
|
||||
(mkIf comp.isPhenom {
|
||||
networking.hostName = "phenom.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isDubronetwork = true;
|
||||
isHome = true;
|
||||
@@ -343,7 +347,8 @@ in
|
||||
|
||||
r6d.config-generator = {
|
||||
jetbrains-licensed = true;
|
||||
hydra-core = true;
|
||||
#hydra-core = true;
|
||||
nix-serve-client = true;
|
||||
nix-serve-server = true;
|
||||
edition-photo = true;
|
||||
tincAddress = "192.168.12.1/24";
|
||||
@@ -351,10 +356,11 @@ in
|
||||
ConnectTo = monstre_dubronetwork_fr
|
||||
ConnectTo = rollo_dubronetwork_fr
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
};
|
||||
})
|
||||
(mkIf comp.isRollo {
|
||||
networking.hostName = "rollo.dubronetwork.fr"; # Define your hostname.
|
||||
r6d.profiles = {
|
||||
isDubronetwork = true;
|
||||
isServer = true;
|
||||
@@ -365,10 +371,12 @@ in
|
||||
fail2ban = true;
|
||||
mailboxes = true;
|
||||
murmur = true;
|
||||
nix-serve-client = true;
|
||||
nix-serve-server = true;
|
||||
tincAddress = "192.168.12.5/24";
|
||||
tincExtraConfig = ''
|
||||
ConnectTo = ocean_prunetwork_fr
|
||||
'';
|
||||
'';
|
||||
znc = true;
|
||||
};
|
||||
})
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ mkIf true {
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; [
|
||||
# Adminsys
|
||||
cowsay # pour ansible & 4lulz
|
||||
iotop
|
||||
lm_sensors
|
||||
lshw
|
||||
@@ -36,6 +37,8 @@ mkIf true {
|
||||
exfat # Pour monter les FAT avec Fuse
|
||||
hubicfuse # montage hubic
|
||||
ntfs3g # ntfs
|
||||
samba # partages windows
|
||||
squashfsTools # squashfs
|
||||
sshfsFuse # ssh
|
||||
|
||||
## Gestion de FS
|
||||
@@ -43,6 +46,7 @@ mkIf true {
|
||||
|
||||
## 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
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ let
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: rc.lua par défaut (système)
|
||||
mkIf cfg.awesome {
|
||||
|
||||
environment.variables = {
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
mkIf = lib.mkIf;
|
||||
in
|
||||
|
||||
{
|
||||
imports = [ # applications :
|
||||
# commandées par config-generator
|
||||
./activation-manuelle/xmonad/xmonad.nix # gestionnaire de fenêtres xmonad
|
||||
];
|
||||
mkIf profiles.isDesktop {
|
||||
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; mkIf profiles.isDesktop [
|
||||
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'
|
||||
@@ -29,18 +26,10 @@ in
|
||||
## Manipulation de fichier
|
||||
pcmanfm # gestionnaire de fichiers graphique
|
||||
spaceFM # gestionnaire de fichiers graphique
|
||||
vifm # gestionnaire de fichiers basé sur VIM (console)
|
||||
#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
|
||||
@@ -49,19 +38,13 @@ in
|
||||
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
|
||||
hasklig # police dérivée de source-code-pro mais avec des ligatures
|
||||
];
|
||||
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
clawsMail = pkgs.clawsMail.override {
|
||||
enablePluginFancy = true;
|
||||
enablePluginPdf = true;
|
||||
enablePluginRavatar = true;
|
||||
enablePluginSmime = true;
|
||||
enablePluginVcalendar = true;
|
||||
enableSpellcheck = true;
|
||||
};
|
||||
mumble = pkgs.mumble.override { pulseSupport = true; };
|
||||
# Paquets avec setuid root
|
||||
security.wrappers = {
|
||||
# pour le montage des media amovibles
|
||||
devmon.source = "${pkgs.udevil}/bin/devmon";
|
||||
udevil.source = "${pkgs.udevil}/bin/udevil"; # utilisé par spacefm
|
||||
};
|
||||
|
||||
security.setuidPrograms = [ "udevil" ];
|
||||
}
|
||||
@@ -16,6 +16,9 @@ mkIf profiles.isDesktop {
|
||||
gnumeric # tableur
|
||||
#kde4.ksnapshot# réalisation de capture d'écran
|
||||
|
||||
# Gestion de tâche
|
||||
taskwarrior # gestionnaire de tâches en console
|
||||
|
||||
## Cartes mentales
|
||||
freemind
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ let
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: ménage
|
||||
mkIf profiles.isDesktop {
|
||||
|
||||
# Paquets
|
||||
@@ -25,6 +25,7 @@ environment.systemPackages = with pkgs; [
|
||||
## Mail & Discussion (texte, audio)
|
||||
clawsMail
|
||||
hexchat
|
||||
quassel
|
||||
quasselClient
|
||||
mumble
|
||||
mutt
|
||||
@@ -36,4 +37,21 @@ environment.systemPackages = with pkgs; [
|
||||
transmission_gtk
|
||||
transmission_remote_gtk
|
||||
];
|
||||
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
clawsMail = pkgs.clawsMail.override {
|
||||
enablePluginFancy = false; # nécessite wekitgtk qui est troué
|
||||
enablePluginPdf = true;
|
||||
enablePluginRavatar = true;
|
||||
enablePluginSmime = true;
|
||||
enablePluginVcalendar = true;
|
||||
enableSpellcheck = true;
|
||||
};
|
||||
mumble = pkgs.mumble.override { pulseSupport = true; };
|
||||
};
|
||||
|
||||
#nixpkgs.config.permittedInsecurePackages = [
|
||||
# "webkitgtk-2.4.11" # pour que le plugin fancy de claws-mail fonctionne
|
||||
#];
|
||||
|
||||
}
|
||||
|
||||
26
public/app-developpement-elm.nix
Normal file
26
public/app-developpement-elm.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
mkIf cfg.developpement-elm {
|
||||
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; [
|
||||
elmPackages.elm
|
||||
];
|
||||
|
||||
# Services
|
||||
|
||||
# Réseau
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [
|
||||
];
|
||||
allowedUDPPorts = [
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -11,16 +11,23 @@ mkIf cfg.developpement-haskell {
|
||||
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; [
|
||||
# Haskell
|
||||
# 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
|
||||
|
||||
haskellPackages.stylish-haskell # qualité de code
|
||||
haskellPackages.hindent
|
||||
] ++ (with pkgs.haskellPackages; [
|
||||
# Haskell lib
|
||||
autoproc # ? procmail
|
||||
darcs # Gestionnaire de version éponyme
|
||||
hindent # indentation code
|
||||
hlint # qualite de code, analyse statique de code + astuces & bonnes pratiques
|
||||
#postgrest # mapper HTTP <-> PostgreSQL
|
||||
stylish-haskell # qualité de code
|
||||
threadscope # visualisation des threads (<bidule>.eventlog)
|
||||
turtle # genre shell-scripting
|
||||
|
||||
# Application perso
|
||||
haskellPackages.hahp
|
||||
];
|
||||
hahp
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -16,5 +16,6 @@ mkIf cfg.developpement-java {
|
||||
|
||||
# Java
|
||||
maven
|
||||
zulu
|
||||
];
|
||||
}
|
||||
|
||||
@@ -14,5 +14,13 @@ mkIf cfg.edition-video {
|
||||
# Vidéo
|
||||
#cinelerra # editeur video
|
||||
pitivi # montage vidéo
|
||||
ffmpeg-full # assemblage de flux audio & video en ligne de commande
|
||||
];
|
||||
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
ffmpeg-full = pkgs.ffmpeg-full.override {
|
||||
nonfreeLicensing = true;
|
||||
nvenc = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -21,11 +21,16 @@ mkIf true {
|
||||
## Diagnostic
|
||||
arp-scan
|
||||
nmap # outil de scan de port réseau
|
||||
mtr # outil de diagnostic réseau
|
||||
#wireshark
|
||||
whois
|
||||
];
|
||||
|
||||
# Paquets avec setuid root
|
||||
security.wrappers = {
|
||||
# outil de diagnostic réseau
|
||||
mtr.source = "${pkgs.mtr}/bin/mtr";
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [
|
||||
5201 # iperf
|
||||
|
||||
@@ -15,8 +15,12 @@ mkIf profiles.isDesktop {
|
||||
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
|
||||
];
|
||||
security.setuidPrograms = [ "slock" ];
|
||||
|
||||
# Paquets avec setui root
|
||||
security.wrappers = {
|
||||
# vérouiller l''écran. "cannot disable the out-of-memory killer for this process (make sure to suid or sgid slock)" --> en root
|
||||
slock.source = "${pkgs.slock}/bin/slock";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -343,8 +343,8 @@ globalkeys = awful.util.table.join(
|
||||
awful.key({ modkey }, "F7", function () awful.util.spawn("claws-mail") end),
|
||||
awful.key({ modkey }, "F12", function () awful.util.spawn("slock") end),
|
||||
awful.key({ modkey, "Shift" }, "F1", function () awful.util.spawn("claws-mail") 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" }, "F3", function () awful.util.spawn("pcmanfm") end),
|
||||
awful.key({ modkey }, "F11", function () awful.util.spawn("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),
|
||||
|
||||
@@ -564,6 +564,6 @@ client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_n
|
||||
-- }}}
|
||||
|
||||
-- Au démarrage
|
||||
-- awful.util.spawn_with_shell("/home/taeradan/bin/xrandr-auto")
|
||||
awful.util.spawn_with_shell("xrandr-auto || true")
|
||||
-- awful.util.spawn_with_shell("gnome-sound-applet")
|
||||
-- awful.util.spawn_with_shell("nm-applet")
|
||||
|
||||
@@ -7,6 +7,7 @@ let
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: ménage
|
||||
{
|
||||
# Nombre de process d'installation en parrallèle effectués par Nix
|
||||
nix.buildCores = 0;
|
||||
@@ -47,7 +48,7 @@ in
|
||||
pinentry # pour taper les mots de passe gpg
|
||||
psmisc # fournis les utilitaires comme killall, fuser, pstree
|
||||
python # python -- python -m SimpleHTTPServer 8000
|
||||
python34Packages.glances # monitoring
|
||||
#python34Packages.glances # monitoring
|
||||
pwgen # générateur de mot de passe
|
||||
rtorrent # TODO outil de téléchargement de torrent & magnet
|
||||
tmux # nécessaire pour byobu
|
||||
@@ -69,13 +70,10 @@ in
|
||||
#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";
|
||||
};
|
||||
etc.gitconfig.text = builtins.readFile ./gitconfig;
|
||||
};
|
||||
# programmes qui n'ont pas besoin de sudo pour fonctionner
|
||||
security.setuidPrograms = [
|
||||
"mtr"
|
||||
];
|
||||
programs.bash = {
|
||||
enableCompletion = true;
|
||||
promptInit = builtins.readFile ./bash-prompt.sh;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
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
|
||||
|
||||
3
public/munin-muttrc
Normal file
3
public/munin-muttrc
Normal file
@@ -0,0 +1,3 @@
|
||||
set copy=no
|
||||
set realname = "Munin daemon"
|
||||
|
||||
@@ -14,18 +14,19 @@ in
|
||||
./localisation.nix
|
||||
./network.nix
|
||||
#./network-ipv6.nix
|
||||
./sudo.nix
|
||||
./service-haveged.nix
|
||||
./service-monitoring.nix
|
||||
./service-monitoring-munin.nix
|
||||
./service-monitoring-smokeping.nix
|
||||
./service-ssh.nix
|
||||
./udev.nix
|
||||
|
||||
# commandées par config-generator
|
||||
## option de configuration spécifique
|
||||
./app-awesome.nix # pour les profils awesome
|
||||
./app-awesome.nix # pour le gestionaire de fenêtres awesome
|
||||
./app-cao.nix # de conception assisté par ordinateur & modélisation
|
||||
./app-cartographie.nix # manipuler les données géographiques & cartes
|
||||
./app-developpement.nix # développer des programmes/scripts
|
||||
./app-developpement-elm.nix # développer en elm
|
||||
./app-developpement-haskell.nix # développer en haskell
|
||||
./app-developpement-java.nix # développer en java
|
||||
./app-developpement-jetbrains.nix # outils jetbrains
|
||||
@@ -46,9 +47,11 @@ in
|
||||
./service-laptop.nix # services spécifiques aux pc portables
|
||||
./service-locate.nix # service locate
|
||||
./swap.nix # définition de l'utilisation du swap
|
||||
./xmonad/xmonad.nix # pour le gestionaire de fenêtre xmonad
|
||||
|
||||
## if isDesktop
|
||||
./app-adminsys.nix # pour gérer le système dans son ensemble et les services
|
||||
./app-bureau.nix # éléments pour avoir un environement graphique minimal utilisable
|
||||
./app-bureautique.nix # dédiée à la bureautique (traitement de texte, dessin, ...)
|
||||
./app-client-internet.nix # pour accéder & utiliser des ressources par le réseau
|
||||
./app-multimedia.nix # pour gérer le son, l'image et la vidéo
|
||||
|
||||
@@ -6,7 +6,7 @@ let
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: ménage
|
||||
mkIf cfg.hydra-builder {
|
||||
|
||||
# Paquets
|
||||
|
||||
@@ -22,6 +22,7 @@ let
|
||||
# information pour l'état de hydra :
|
||||
# hydra-queue-runner --status | json_pp
|
||||
in
|
||||
# TODO: passe de ménage
|
||||
mkIf cfg.hydra-core {
|
||||
|
||||
# Paquets
|
||||
@@ -73,7 +74,7 @@ mkIf cfg.hydra-core {
|
||||
### Machines connues
|
||||
|
||||
programs.ssh.knownHosts = {
|
||||
"hydra.prunetwork.fr".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMhXFlj2oyArVyEwEwDxNXthB/JljHkq+UhTLxbekkMB";
|
||||
"hydra.prunetwork.fr".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHqja/yYsQeS5amZKPUG+EKSIkjEN6fYW54Fzvj1pFaP";
|
||||
"monstre.dubronetwork.fr".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBTTrLhq1Cwm0rpnwEIxSLqVrJWZnt+/9dt+SKd8NiIc";
|
||||
"pedro.dubronetwork.fr".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM7fjo2ysLqlfSo6BKnc6I6m1ayoPrbwEEyTKZmUzsOD";
|
||||
"ocean.prunetwork.fr".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINCaRuTl8iCTUE4XInOpkSlwQj5Re4w4Iq+gNIlJe8pA";
|
||||
|
||||
@@ -7,6 +7,8 @@ let
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: ajouter option
|
||||
# TODO: changer adresse mail
|
||||
mkIf true {
|
||||
|
||||
# Paquets
|
||||
@@ -21,7 +23,10 @@ mkIf true {
|
||||
services.munin-node = {
|
||||
enable = true;
|
||||
};
|
||||
systemd.services.munin-node.serviceConfig.TimeoutStartSec = "3min";
|
||||
systemd.services.munin-node = {
|
||||
path = with pkgs; [ munin lm_sensors ];
|
||||
serviceConfig.TimeoutStartSec = "3min";
|
||||
};
|
||||
|
||||
## Munin server -- generate /var/www/munin
|
||||
services.munin-cron = {
|
||||
@@ -31,7 +36,7 @@ mkIf true {
|
||||
address 127.0.0.1
|
||||
'';
|
||||
extraGlobalConfig = ''
|
||||
contact.email.command mail -s "Munin notification for ''${var:host}" root@${config.networking.hostName}
|
||||
contact.email.command ${pkgs.mutt}/bin/mutt -F /etc/nixos/base/public/munin-muttrc -s "Munin notification for ''${var:host}" jean-pierre@ocean.prunetwork.fr
|
||||
'';
|
||||
};
|
||||
|
||||
199
public/service-monitoring-smokeping.nix
Normal file
199
public/service-monitoring-smokeping.nix
Normal file
@@ -0,0 +1,199 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
# TODO: ajouter option
|
||||
mkIf true {
|
||||
|
||||
# Paquets
|
||||
environment.systemPackages = with pkgs; [
|
||||
bind
|
||||
];
|
||||
|
||||
# Paquets avec setuid root
|
||||
security.wrappers = {
|
||||
# outil de diagnostic réseau
|
||||
fping.source = "${pkgs.fping}/bin/fping";
|
||||
};
|
||||
|
||||
# Services
|
||||
|
||||
services.smokeping = {
|
||||
enable = true;
|
||||
probeConfig = ''
|
||||
+ FPing
|
||||
#binary = ${pkgs.fping}/bin/fping
|
||||
binary = ${config.security.wrapperDir}/fping
|
||||
|
||||
+DNS
|
||||
#binary = ${pkgs.bind}/bin/dig
|
||||
binary = /run/current-system/sw/bin/dig
|
||||
forks = 5
|
||||
offset = 50%
|
||||
step = 300
|
||||
timeout = 15
|
||||
'';
|
||||
targetConfig = ''
|
||||
probe = FPing
|
||||
menu = Top
|
||||
title = Suivi de la latence reseau
|
||||
remark = Monitoring de la latence reseau. \
|
||||
Here you will learn all about the latency of our network.
|
||||
+ Local
|
||||
probe = FPing
|
||||
menu = Local
|
||||
title = Local Network
|
||||
++ LocalMachine
|
||||
menu = Local Machine
|
||||
title = This host
|
||||
host = localhost
|
||||
|
||||
+ Grudu_Tinc
|
||||
probe = FPing
|
||||
title = Grudu_Tinc
|
||||
menu = Grudu.net - Tinc
|
||||
|
||||
++ Hydra
|
||||
menu = hydra.grudu.net
|
||||
title = hydra.grudu.net
|
||||
host = hydra.grudu.net
|
||||
|
||||
++ Monstre
|
||||
menu = monstre.grudu.net
|
||||
title = monstre.grudu.net
|
||||
host = monstre.grudu.net
|
||||
|
||||
++ Rollo
|
||||
menu = rollo.grudu.net
|
||||
title = rollo.grudu.net
|
||||
host = rollo.grudu.net
|
||||
|
||||
++ Ocean
|
||||
menu = ocean.grudu.net
|
||||
title = ocean.grudu.net
|
||||
host = ocean.grudu.net
|
||||
|
||||
++ MultiHost
|
||||
menu = Multihost
|
||||
title = Ensemble de mesures de latence
|
||||
host = /Grudu_Tinc/Monstre /Grudu_Tinc/Rollo /Grudu_Tinc/Ocean /Grudu_Tinc/Hydra
|
||||
|
||||
+ Grudu_DNS
|
||||
title = Grudu_DNS
|
||||
menu = Grudu.net - DNS
|
||||
probe = DNS
|
||||
pings = 5
|
||||
++ Ocean
|
||||
title = ocean
|
||||
menu = serveur ocean
|
||||
server = ocean.prunetwork.fr
|
||||
+++ ocean
|
||||
host = ocean.grudu.net
|
||||
lookup = ocean.grudu.net
|
||||
+++ rollo
|
||||
host = rollo.grudu.net
|
||||
lookup = rollo.grudu.net
|
||||
++ Rollo
|
||||
title = rollo
|
||||
menu = serveur rollo
|
||||
server = rollo.dubronetwork.fr
|
||||
+++ ocean
|
||||
host = ocean.grudu.net
|
||||
lookup = ocean.grudu.net
|
||||
+++ rollo
|
||||
host = rollo.grudu.net
|
||||
lookup = rollo.grudu.net
|
||||
++ MultiHost
|
||||
menu = Multihost
|
||||
title = Ensemble de mesures DNS
|
||||
host = /Grudu_DNS/Ocean/ocean /Grudu_DNS/Ocean/rollo /Grudu_DNS/Rollo/ocean /Grudu_DNS/Rollo/rollo
|
||||
+ France
|
||||
probe = FPing
|
||||
title = France
|
||||
menu = Operateur francais
|
||||
|
||||
++ Atos
|
||||
menu = Atos
|
||||
title = www.atos.fr
|
||||
host = www.atos.fr
|
||||
|
||||
++ Axialys
|
||||
menu = Axialys
|
||||
title = www.axialys.fr
|
||||
host = www.axialys.fr
|
||||
|
||||
++ Azurtel
|
||||
menu = azurtel
|
||||
title = www.azurtel.fr
|
||||
host = www.azurtel.fr
|
||||
|
||||
++ Bouygues-Telecom
|
||||
menu = Bouygues-Telecom
|
||||
title = www.bouygues-telecom.fr
|
||||
host = www.bouygues-telecom.fr
|
||||
|
||||
++ Colt
|
||||
menu = Colt
|
||||
title = www.colt.fr
|
||||
host = www.colt.fr
|
||||
|
||||
++ Completel
|
||||
menu = completel
|
||||
title = www.completel.fr
|
||||
host = www.completel.fr
|
||||
|
||||
++ Free
|
||||
menu = Free
|
||||
title = www.free.fr
|
||||
host = www.free.fr
|
||||
|
||||
++ Kosmos
|
||||
menu = Kosmos
|
||||
title = www.kosmos.fr
|
||||
host = www.kosmos.fr
|
||||
|
||||
++ Orange
|
||||
menu = Orange
|
||||
title = www.orange.fr
|
||||
host = www.orange.fr
|
||||
|
||||
++ Renater
|
||||
menu = Renater
|
||||
title = www.renater.fr
|
||||
host = www.renater.fr
|
||||
|
||||
++ SFR
|
||||
menu = SFR
|
||||
title = www.sfr.fr
|
||||
host = www.sfr.fr
|
||||
|
||||
++ MultiHost
|
||||
menu = Multihost
|
||||
title = Ensemble de mesures DNS
|
||||
host = /France/Atos /France/Axialys /France/Azurtel \
|
||||
/France/Bouygues-Telecom \
|
||||
/France/Completel \
|
||||
/France/Free \
|
||||
/France/Kosmos \
|
||||
/France/Orange \
|
||||
/France/Renater \
|
||||
/France/SFR
|
||||
|
||||
# /France/Colt
|
||||
'';
|
||||
};
|
||||
|
||||
# Réseau
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [
|
||||
#8081 # accès depuis localhost uniquement ou à travers un proxy nginx
|
||||
];
|
||||
allowedUDPPorts = [
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -13,6 +13,6 @@ mkIf profiles.isDesktop {
|
||||
hardware.pulseaudio = {
|
||||
enable = true;
|
||||
support32Bit = true;
|
||||
daemon.config = { flat-volumes = "no"; };
|
||||
};
|
||||
environment.etc."pulse/daemon.conf".text = "flat-volumes = no";
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkThenElse;
|
||||
cfg = config.r6d.config-generator;
|
||||
computers = config.r6d.computers;
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
mkIf true {
|
||||
|
||||
# Authorisation de certaines applications par sudo sans mot de passe
|
||||
|
||||
security.sudo.extraConfig = ''
|
||||
%users ALL = NOPASSWD: ${pkgs.mtr}/bin/mtr
|
||||
%users ALL = NOPASSWD: ${pkgs.slock}/bin/slock
|
||||
'';
|
||||
}
|
||||
@@ -7,7 +7,7 @@ let
|
||||
profiles = config.r6d.profiles;
|
||||
in
|
||||
|
||||
{
|
||||
mkIf false {
|
||||
# Définition du IO Scheduler pour les SSD
|
||||
services.udev.extraRules = ''
|
||||
# set deadline scheduler for non-rotating disks
|
||||
|
||||
@@ -12,6 +12,7 @@ vim_configurable.customize {
|
||||
# Here you can place all your vim plugins
|
||||
# They are installed managed by `vam` (a vim plugin manager)
|
||||
#"vim-addon-nix"
|
||||
"elm-vim"
|
||||
"vim-nix"
|
||||
"wombat256-vim"
|
||||
]; }
|
||||
|
||||
@@ -13,6 +13,7 @@ mkIf cfg.xmonad {
|
||||
environment.systemPackages = with pkgs; [
|
||||
dmenu
|
||||
haskellPackages.xmobar
|
||||
trayer
|
||||
];
|
||||
|
||||
# Services
|
||||
@@ -23,4 +24,7 @@ mkIf cfg.xmonad {
|
||||
haskellPackages.xmobar
|
||||
];
|
||||
};
|
||||
environment.variables = {
|
||||
_JAVA_AWT_WM_NONREPARENTING = "1";
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user