Initial commit: Script MD to Print avec Docker

This commit is contained in:
syoul
2025-12-25 15:20:50 +01:00
commit daa932a0ed
12 changed files with 2754 additions and 0 deletions

49
.dockerignore Normal file
View File

@@ -0,0 +1,49 @@
# Répertoires de sortie
output/
logs/
# Fichiers Git
.git/
.gitignore
.gitattributes
# Documentation (optionnel, décommenter si vous voulez réduire la taille)
# README.md
# CHANGELOG.md
# Fichiers de configuration personnalisés
config.conf
# Fichiers temporaires
*.tmp
*.swp
*.swo
*~
# Fichiers PDF générés
*.pdf
# Fichiers de log
*.log
# Fichiers de sauvegarde
*.bak
*.backup
# Fichiers système
.DS_Store
Thumbs.db
# Fichiers IDE
.vscode/
.idea/
*.code-workspace
# Fichiers Docker
docker-compose.yml
docker_run.sh
.docker/
# Fichiers de test
documents/test.md

38
.gitignore vendored Normal file
View File

@@ -0,0 +1,38 @@
# Fichiers de configuration personnalisés
config.conf
# Répertoires de sortie
output/
logs/
# Fichiers temporaires
*.tmp
*.swp
*.swo
*~
# Fichiers PDF générés (optionnel, décommenter si nécessaire)
# *.pdf
# Fichiers de log
*.log
# Fichiers de sauvegarde
*.bak
*.backup
# Fichiers système
.DS_Store
Thumbs.db
# Fichiers IDE
.vscode/
.idea/
*.code-workspace
# Fichiers Docker
.docker/
# Fichiers de test
documents/test.md

48
CHANGELOG.md Normal file
View File

@@ -0,0 +1,48 @@
# Changelog
Tous les changements notables de ce projet seront documentés dans ce fichier.
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet adhère à [Semantic Versioning](https://semver.org/lang/fr/).
## [1.0.0] - 2024-01-XX
### Ajouté
- Script principal `md_to_print.sh` avec toutes les fonctionnalités de base
- Conversion automatique Markdown → PDF avec Pandoc
- Prévisualisation PDF avant impression (evince/okular/xdg-open)
- Options d'impression avancées:
- Sélection d'imprimante
- Nombre de copies
- Sélection de pages
- Orientation (portrait/paysage)
- Taille de papier
- Qualité d'impression
- Impression couleur/monochrome
- Mode recto-verso
- Fichier de configuration optionnel (format INI)
- Installation automatique des dépendances
- Support Docker complet:
- Dockerfile optimisé
- docker-compose.yml
- Script wrapper docker_run.sh
- Système de logging détaillé avec niveaux (DEBUG, INFO, WARN, ERROR)
- Gestion d'erreurs complète avec codes de retour appropriés
- Makefile avec commandes utiles (build, test, clean, install, uninstall)
- Documentation complète (README.md)
- Fichiers de support (.gitignore, .dockerignore)
### Sécurité
- Utilisateur non-root dans Docker
- Validation des chemins de fichiers
- Protection contre l'injection de commandes
- Validation des entrées utilisateur
### Documentation
- README.md complet avec exemples
- CHANGELOG.md pour le suivi des versions
- Commentaires dans le code
- Messages d'aide détaillés
[1.0.0]: https://github.com/yourusername/MD_to_print/releases/tag/v1.0.0

58
Dockerfile Normal file
View File

@@ -0,0 +1,58 @@
FROM debian:bookworm-slim
# Métadonnées
LABEL maintainer="MD_to_Print"
LABEL description="Script automatique Markdown vers PDF et impression"
LABEL version="1.0.0"
# Variables d'environnement
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Europe/Paris \
LANG=fr_FR.UTF-8 \
LC_ALL=fr_FR.UTF-8
# Installation des dépendances système et locales
RUN apt-get update && \
apt-get install -y --no-install-recommends \
locales \
&& sed -i '/fr_FR.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen fr_FR.UTF-8 && \
apt-get install -y --no-install-recommends \
pandoc \
texlive-latex-base \
texlive-xetex \
texlive-fonts-recommended \
texlive-latex-extra \
texlive-lang-french \
fonts-dejavu \
cups \
cups-client \
evince \
curl \
ca-certificates \
make \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Création d'un utilisateur non-root pour sécurité
RUN useradd -m -u 1000 -s /bin/bash mdprint && \
mkdir -p /workspace/documents /workspace/output /workspace/logs && \
chown -R mdprint:mdprint /workspace
# Répertoire de travail
WORKDIR /workspace
# Copie du script principal
COPY md_to_print.sh /usr/local/bin/md_to_print.sh
RUN chmod +x /usr/local/bin/md_to_print.sh
# Copie du fichier de configuration exemple
COPY config.example.conf /workspace/config.example.conf
# Basculer vers l'utilisateur non-root
USER mdprint
# Point d'entrée
ENTRYPOINT ["/usr/local/bin/md_to_print.sh"]
CMD ["--help"]

110
Makefile Normal file
View File

@@ -0,0 +1,110 @@
.PHONY: build run shell test clean install uninstall help
# Variables
IMAGE_NAME=md-to-print
IMAGE_TAG=latest
SCRIPT_NAME=md_to_print.sh
INSTALL_DIR=/usr/local/bin
CONFIG_DIR=/etc/md-to-print
# Couleurs
GREEN=\033[0;32m
YELLOW=\033[1;33m
NC=\033[0m
help:
@echo "Commandes disponibles:"
@echo " make build - Construire l'image Docker"
@echo " make shell - Ouvrir un shell interactif dans le conteneur"
@echo " make test - Tester avec un fichier markdown exemple"
@echo " make clean - Nettoyer les fichiers générés (PDFs, logs)"
@echo " make install - Installer le script localement"
@echo " make uninstall - Désinstaller le script"
@echo " make help - Afficher cette aide"
# Construction de l'image Docker
build:
@echo "$(GREEN)Construction de l'image Docker...$(NC)"
docker build -t $(IMAGE_NAME):$(IMAGE_TAG) .
@echo "$(GREEN)Image construite avec succès$(NC)"
# Exécution interactive avec shell
shell: build
@echo "$(GREEN)Ouverture d'un shell dans le conteneur...$(NC)"
docker run --rm -it \
-v $(PWD)/documents:/workspace/documents:ro \
-v $(PWD)/output:/workspace/output \
-v $(PWD)/logs:/workspace/logs \
--network host \
$(IMAGE_NAME):$(IMAGE_TAG) \
/bin/bash
# Test avec un fichier exemple
test: build
@echo "$(GREEN)Création d'un fichier markdown de test...$(NC)"
@mkdir -p documents output logs
@cat > documents/test.md << 'EOF'
# Test Markdown
Ceci est un test de conversion Markdown vers PDF.
## Fonctionnalités
- Conversion automatique
- Impression
- Prévisualisation
- Options avancées
## Exemple de code
\`\`\`bash
echo "Hello World"
\`\`\`
## Liste numérotée
1. Premier élément
2. Deuxième élément
3. Troisième élément
**Texte en gras** et *texte en italique*.
EOF
@echo "$(GREEN)Exécution du test...$(NC)"
docker run --rm -it \
-v $(PWD)/documents:/workspace/documents:ro \
-v $(PWD)/output:/workspace/output \
-v $(PWD)/logs:/workspace/logs \
--network host \
$(IMAGE_NAME):$(IMAGE_TAG) \
/workspace/documents/test.md --preview --keep-pdf --verbose
@echo "$(GREEN)Test terminé. Vérifiez le fichier output/test.pdf$(NC)"
# Nettoyage
clean:
@echo "$(YELLOW)Nettoyage des fichiers générés...$(NC)"
@rm -rf output/*.pdf logs/*.log 2>/dev/null || true
@rm -f documents/test.md 2>/dev/null || true
@echo "$(GREEN)Nettoyage terminé$(NC)"
# Installation locale
install:
@echo "$(GREEN)Installation du script...$(NC)"
@if [ ! -f "$(SCRIPT_NAME)" ]; then \
echo "Erreur: $(SCRIPT_NAME) introuvable"; \
exit 1; \
fi
@sudo mkdir -p $(INSTALL_DIR) $(CONFIG_DIR)
@sudo cp $(SCRIPT_NAME) $(INSTALL_DIR)/$(SCRIPT_NAME)
@sudo chmod +x $(INSTALL_DIR)/$(SCRIPT_NAME)
@sudo cp config.example.conf $(CONFIG_DIR)/config.example.conf
@echo "$(GREEN)Script installé dans $(INSTALL_DIR)/$(SCRIPT_NAME)$(NC)"
@echo "$(GREEN)Configuration exemple dans $(CONFIG_DIR)/config.example.conf$(NC)"
@echo "$(YELLOW)Créez $(CONFIG_DIR)/config.conf pour personnaliser la configuration$(NC)"
# Désinstallation
uninstall:
@echo "$(YELLOW)Désinstallation du script...$(NC)"
@sudo rm -f $(INSTALL_DIR)/$(SCRIPT_NAME)
@sudo rm -rf $(CONFIG_DIR)
@echo "$(GREEN)Désinstallation terminée$(NC)"

360
README.md Normal file
View File

@@ -0,0 +1,360 @@
# MD_to_Print - Script automatique Markdown → PDF → Impression
Application CLI complète pour convertir des fichiers Markdown en PDF et les imprimer automatiquement sur Debian/Linux, avec support Docker, prévisualisation, options d'impression avancées, et gestion d'erreurs robuste.
## Fonctionnalités
- **Conversion automatique** Markdown → PDF avec Pandoc
- **Prévisualisation** avant impression (evince/okular/xdg-open)
- **Options d'impression avancées** (copies, pages, orientation, qualité, couleur, recto-verso)
- **Fichier de configuration** optionnel (format INI)
- **Installation automatique** des dépendances
- **Support Docker** pour isolation et portabilité
- **Gestion d'erreurs** complète avec codes de retour appropriés
- **Système de logging** détaillé avec niveaux (DEBUG, INFO, WARN, ERROR)
- **Interface en ligne de commande** avec options complètes
## Installation
### Installation locale
1. Cloner ou télécharger le projet:
```bash
cd MD_to_print
chmod +x md_to_print.sh
```
2. Installer les dépendances manuellement ou automatiquement:
```bash
# Installation automatique
./md_to_print.sh --install-deps
# Ou installation manuelle
sudo apt-get update
sudo apt-get install -y pandoc texlive-latex-base texlive-fonts-recommended \
texlive-latex-extra texlive-lang-french cups
```
3. (Optionnel) Installation système:
```bash
make install
```
### Installation avec Docker
1. Construire l'image Docker:
```bash
make build
# ou
docker build -t md-to-print:latest .
```
2. Créer les répertoires nécessaires:
```bash
mkdir -p documents output logs
```
## Utilisation
### Utilisation locale
#### Commande de base
```bash
./md_to_print.sh document.md
```
#### Avec prévisualisation
```bash
./md_to_print.sh document.md --preview
```
#### Options avancées
```bash
./md_to_print.sh document.md \
--printer HP_LaserJet \
--copies 2 \
--color \
--duplex duplex \
--quality high \
--pages 1-5 \
--orientation landscape \
--keep-pdf
```
#### Avec fichier de configuration
```bash
# Créer votre configuration
cp config.example.conf config.conf
# Éditer config.conf selon vos besoins
# Utiliser la configuration
./md_to_print.sh document.md --config config.conf
```
### Utilisation avec Docker
#### Via le wrapper script
```bash
chmod +x docker_run.sh
./docker_run.sh documents/mon_fichier.md --preview
```
#### Directement avec docker
```bash
docker run --rm -it \
-v $(pwd)/documents:/workspace/documents:ro \
-v $(pwd)/output:/workspace/output \
-v $(pwd)/logs:/workspace/logs \
--network host \
md-to-print:latest \
/workspace/documents/document.md --preview
```
#### Via Docker Compose
```bash
# Modifier docker-compose.yml si nécessaire
docker-compose run --rm md-to-print \
/workspace/documents/document.md --preview
```
### Via Makefile
```bash
# Construire l'image
make build
# Tester avec fichier exemple
make test
# Ouvrir un shell dans le conteneur
make shell
# Nettoyer les fichiers générés
make clean
```
## Options disponibles
| Option | Description | Défaut |
|--------|-------------|--------|
| `-p, --preview` | Prévisualiser le PDF avant impression | false |
| `-P, --printer NOM` | Spécifier l'imprimante | Imprimante système |
| `-c, --copies N` | Nombre de copies | 1 |
| `-r, --pages RANGE` | Pages à imprimer (ex: 1-3,5,7-9) | Toutes |
| `-o, --orientation DIR` | Orientation (portrait/landscape) | portrait |
| `-s, --size SIZE` | Taille du papier (A4, A3, Letter, etc.) | A4 |
| `-q, --quality QUALITY` | Qualité (draft, normal, high) | normal |
| `-C, --color` | Impression en couleur | false |
| `-d, --duplex MODE` | Mode recto-verso (none, simplex, duplex) | none |
| `-i, --install-deps` | Installer les dépendances automatiquement | false |
| `-k, --keep-pdf` | Conserver le fichier PDF après impression | false |
| `--config FILE` | Fichier de configuration | Aucun |
| `-v, --verbose` | Mode verbeux (logging DEBUG) | false |
| `-l, --log FILE` | Fichier de log | Aucun |
| `-h, --help` | Afficher l'aide | - |
| `--version` | Afficher la version | - |
## Configuration
Le fichier de configuration utilise le format INI avec trois sections:
### Section `[default]`
Options d'impression par défaut (printer, copies, orientation, size, quality, color, duplex, preview, keep_pdf)
### Section `[paths]`
Chemins des répertoires (output_dir, log_dir)
### Section `[logging]`
Paramètres de logging (level, file, verbose)
Exemple de fichier `config.conf`:
```ini
[default]
printer=HP_LaserJet
copies=1
orientation=portrait
size=A4
quality=normal
color=false
duplex=none
preview=false
keep_pdf=false
[paths]
output_dir=./output
log_dir=./logs
[logging]
level=INFO
file=md_to_print.log
verbose=false
```
## Structure du projet
```
MD_to_print/
├── md_to_print.sh # Script principal
├── config.example.conf # Fichier de configuration exemple
├── Dockerfile # Configuration Docker
├── docker-compose.yml # Configuration Docker Compose
├── docker_run.sh # Wrapper Docker
├── Makefile # Commandes Make
├── .dockerignore # Fichiers à exclure du build Docker
├── .gitignore # Fichiers à ignorer dans Git
├── README.md # Documentation (ce fichier)
├── CHANGELOG.md # Historique des versions
├── documents/ # Fichiers Markdown sources
├── output/ # PDFs générés
└── logs/ # Fichiers de logs
```
## Exemples d'utilisation
### Impression simple
```bash
./md_to_print.sh rapport.md
```
### Impression avec prévisualisation
```bash
./md_to_print.sh rapport.md --preview
```
### Impression recto-verso en couleur
```bash
./md_to_print.sh rapport.md --duplex duplex --color --copies 2
```
### Impression de pages spécifiques
```bash
./md_to_print.sh rapport.md --pages 1-10,15,20-25
```
### Impression paysage haute qualité
```bash
./md_to_print.sh presentation.md --orientation landscape --quality high
```
### Avec logging détaillé
```bash
./md_to_print.sh document.md --verbose --log mon_log.txt
```
## Codes de retour
| Code | Signification |
|------|---------------|
| 0 | Succès |
| 1 | Erreur générale |
| 2 | Fichier introuvable |
| 3 | Dépendances manquantes |
| 4 | Erreur conversion PDF |
| 5 | Erreur impression |
| 6 | Erreur configuration |
| 7 | Erreur Docker |
| 8 | Permissions insuffisantes |
| 9 | Argument invalide |
| 10 | Imprimante non disponible |
## Configuration de l'impression dans Docker
Pour que l'impression fonctionne depuis Docker, vous devez configurer l'accès à CUPS:
1. Installer CUPS sur l'hôte:
```bash
sudo apt-get install cups
```
2. Configurer le partage réseau dans `/etc/cups/cupsd.conf`:
```
Listen localhost:631
Port 631
```
3. Redémarrer CUPS:
```bash
sudo systemctl restart cups
```
4. Le socket CUPS sera monté automatiquement via docker-compose.yml ou docker_run.sh
## Dépannage
### Erreur: "pandoc n'est pas installé"
```bash
./md_to_print.sh document.md --install-deps
```
### Erreur: "Imprimante non disponible"
```bash
# Lister les imprimantes disponibles
lpstat -p
# Utiliser l'imprimante par défaut
./md_to_print.sh document.md
```
### Erreur: "Permission de lecture refusée"
```bash
# Vérifier les permissions du fichier
ls -l document.md
# Donner les permissions de lecture
chmod +r document.md
```
### Erreur Docker: "Cannot connect to the Docker daemon"
```bash
# Vérifier que Docker est démarré
sudo systemctl status docker
# Démarrer Docker si nécessaire
sudo systemctl start docker
# Ajouter votre utilisateur au groupe docker
sudo usermod -aG docker $USER
# Déconnexion/reconnexion nécessaire
```
### Prévisualisation ne fonctionne pas dans Docker
La prévisualisation graphique nécessite l'accès X11. Assurez-vous que:
- `DISPLAY` est défini dans votre environnement
- `/tmp/.X11-unix` est accessible
- Les permissions X11 sont correctes:
```bash
xhost +local:docker
```
## Dépendances
### Dépendances système
- pandoc
- texlive-latex-base
- texlive-fonts-recommended
- texlive-latex-extra
- texlive-lang-french (support français)
- cups (pour l'impression)
- evince ou okular (pour la prévisualisation, optionnel)
Toutes les dépendances sont installées automatiquement avec l'option `--install-deps` ou dans l'image Docker.
## Contribution
Les contributions sont les bienvenues! N'hésitez pas à:
- Signaler des bugs
- Proposer des améliorations
- Soumettre des pull requests
## Licence
Ce projet est fourni tel quel, sans garantie.
## Auteur
MD_to_Print - Script automatique Markdown → PDF → Impression
## Historique
Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.

48
config.example.conf Normal file
View File

@@ -0,0 +1,48 @@
# Configuration exemple pour MD_to_Print
# Copiez ce fichier vers config.conf et modifiez selon vos besoins
[default]
# Imprimante par défaut (laisser vide pour utiliser l'imprimante système)
printer=
# Nombre de copies par défaut
copies=1
# Orientation: portrait ou landscape
orientation=portrait
# Taille du papier: A4, A3, Letter, Legal, etc.
size=A4
# Qualité d'impression: draft, normal, high
quality=normal
# Impression en couleur (true/false)
color=false
# Mode recto-verso: none, simplex, duplex
duplex=none
# Prévisualiser le PDF avant impression (true/false)
preview=false
# Conserver le fichier PDF après impression (true/false)
keep_pdf=false
[paths]
# Répertoire de sortie pour les PDFs générés
output_dir=./output
# Répertoire pour les fichiers de log
log_dir=./logs
[logging]
# Niveau de log: DEBUG, INFO, WARN, ERROR
level=INFO
# Nom du fichier de log (sera placé dans log_dir)
file=md_to_print.log
# Mode verbeux (true/false)
verbose=false

32
docker-compose.yml Normal file
View File

@@ -0,0 +1,32 @@
version: '3.8'
services:
md-to-print:
build:
context: .
dockerfile: Dockerfile
image: md-to-print:latest
container_name: md-to-print
volumes:
# Monter le répertoire contenant les fichiers markdown (lecture seule)
- ./documents:/workspace/documents:ro
# Monter le répertoire de sortie pour les PDFs
- ./output:/workspace/output
# Monter le répertoire de logs
- ./logs:/workspace/logs
# Accès à l'imprimante via CUPS (nécessite configuration CUPS)
- /var/run/cups:/var/run/cups:ro
# Optionnel: pour la prévisualisation graphique (décommenter si nécessaire)
# - /tmp/.X11-unix:/tmp/.X11-unix:ro
environment:
- TZ=Europe/Paris
- DISPLAY=${DISPLAY:-}
network_mode: host
# Pour l'accès à l'affichage (prévisualisation)
# Décommenter les lignes suivantes si vous avez besoin de la prévisualisation graphique:
# stdin_open: true
# tty: true
# devices:
# - /dev/dri:/dev/dri
restart: "no"

130
docker_run.sh Executable file
View File

@@ -0,0 +1,130 @@
#!/bin/bash
# Wrapper pour exécuter le script MD_to_Print dans Docker
# Usage: ./docker_run.sh fichier.md [options...]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MD_FILE="${1:-}"
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Fonction d'aide
show_help() {
cat << EOF
Wrapper Docker pour MD_to_Print
Usage: $0 fichier.md [options...]
Ce script simplifie l'exécution de MD_to_Print dans Docker en gérant:
- Les chemins absolus des fichiers
- Le montage des volumes
- Le passage des arguments
- La gestion des erreurs Docker
EXEMPLES:
$0 documents/rapport.md --preview
$0 documents/rapport.md --printer HP_LaserJet --copies 2
$0 documents/rapport.md --config config.conf --verbose
OPTIONS:
Toutes les options de md_to_print.sh sont supportées.
Utilisez: docker run --rm md-to-print:latest --help
pour voir toutes les options disponibles.
EOF
}
# Vérification des arguments
if [ -z "$MD_FILE" ] || [ "$MD_FILE" = "-h" ] || [ "$MD_FILE" = "--help" ]; then
show_help
exit 0
fi
# Vérifier que Docker est disponible
if ! command -v docker &> /dev/null; then
echo -e "${RED}Erreur: Docker n'est pas installé ou non disponible dans le PATH${NC}"
exit 1
fi
# Vérifier que le fichier existe
if [ ! -f "$MD_FILE" ]; then
echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}"
exit 2
fi
# Obtenir le chemin absolu du fichier
MD_FILE_ABS="$(realpath "$MD_FILE")"
MD_DIR="$(dirname "$MD_FILE_ABS")"
MD_NAME="$(basename "$MD_FILE_ABS")"
# Vérifier que le fichier est dans le répertoire documents ou un sous-répertoire
if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then
echo -e "${YELLOW}Attention: Le fichier n'est pas dans le répertoire documents/${NC}"
echo -e "${BLUE}Le fichier sera accessible via le montage du répertoire parent${NC}"
MD_REL_PATH="$(realpath --relative-to="$SCRIPT_DIR" "$MD_FILE_ABS")"
MD_DIR="$SCRIPT_DIR"
MD_NAME="$MD_REL_PATH"
fi
# Créer les répertoires nécessaires
mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs"
# Vérifier si l'image Docker existe
if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep -q "md-to-print:latest"; then
echo -e "${YELLOW}Image Docker non trouvée. Construction de l'image...${NC}"
cd "$SCRIPT_DIR"
docker build -t md-to-print:latest .
fi
# Construire la commande Docker
DOCKER_CMD=(
docker run
--rm
-it
-v "$SCRIPT_DIR/documents:/workspace/documents:ro"
-v "$SCRIPT_DIR/output:/workspace/output"
-v "$SCRIPT_DIR/logs:/workspace/logs"
--network host
)
# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation)
if [ -n "${DISPLAY:-}" ]; then
DOCKER_CMD+=(
-e DISPLAY="$DISPLAY"
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
)
fi
# Ajouter l'accès CUPS si disponible
if [ -d "/var/run/cups" ]; then
DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro)
fi
DOCKER_CMD+=(md-to-print:latest)
# Ajouter le fichier markdown et les options
if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then
DOCKER_CMD+=("/workspace/$MD_NAME")
else
DOCKER_CMD+=("/workspace/documents/$MD_NAME")
fi
# Ajouter les options restantes
shift
for arg in "$@"; do
DOCKER_CMD+=("$arg")
done
# Exécuter
echo -e "${GREEN}Exécution dans Docker...${NC}"
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
echo ""
exec "${DOCKER_CMD[@]}"

View File

@@ -0,0 +1,885 @@
# Plan de Déploiement - Ordre Logique - Smart-Motions
**Date** : Novembre 2025
**Version** : 1.0
**Contexte** : Plan complet de déploiement et configuration de l'infrastructure Smart-Motions
---
## 📋 Table des matières
1. [Vue d'ensemble](#vue-densemble)
2. [Phases de déploiement](#phases-de-déploiement)
3. [Phase 1 : Préparation et Infrastructure de base](#phase-1--préparation-et-infrastructure-de-base)
4. [Phase 2 : Réseau et Sécurité](#phase-2--réseau-et-sécurité)
5. [Phase 3 : Active Directory et Services de base](#phase-3--active-directory-et-services-de-base)
6. [Phase 4 : Services Windows](#phase-4--services-windows)
7. [Phase 5 : Services Infrastructure](#phase-5--services-infrastructure)
8. [Phase 6 : Services applicatifs](#phase-6--services-applicatifs)
7. [Phase 7 : Postes clients et finalisation](#phase-7--postes-clients-et-finalisation)
8. [Checklist complète](#checklist-complète)
9. [Dépendances entre services](#dépendances-entre-services)
---
## Vue d'ensemble
### Objectif
Ce document définit l'ordre logique de déploiement et de configuration de toute l'infrastructure Smart-Motions, en tenant compte des dépendances entre les services.
### Principes
1. **Infrastructure d'abord** : Réseau, virtualisation, stockage
2. **Services de base** : AD, DNS, DHCP
3. **Services dépendants** : Services qui nécessitent AD
4. **Services applicatifs** : Applications métier
5. **Postes clients** : Déploiement des postes utilisateurs
6. **Finalisation** : Tests, sécurité, documentation
### Durée estimée
- **Phase 1-2** : 2-3 jours
- **Phase 3** : 2-3 jours
- **Phase 4** : 3-4 jours
- **Phase 5** : 2-3 jours
- **Phase 6** : 2-3 jours
- **Phase 7** : 2-3 jours
- **Total** : 13-19 jours (environ 3-4 semaines)
---
## Phases de déploiement
```
┌─────────────────────────────────────────────────────────┐
│ PHASE 1 : Préparation et Infrastructure de base │
│ - Proxmox, Templates, Réseau │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 2 : Réseau et Sécurité │
│ - pfSense, VPN Site-to-Site, DMZ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 3 : Active Directory et Services de base │
│ - AD, DNS, DHCP, LAPS │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 4 : Services Windows │
│ - Serveur fichiers, RDS, Veeam, GPO │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 5 : Services Infrastructure │
│ - GLPI, Zabbix, DNS Split, Déploiement │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 6 : Services applicatifs │
│ - Messagerie, Nextcloud, DMZ (FTP/Extranet) │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PHASE 7 : Postes clients et finalisation │
│ - Déploiement postes, Tests, Pentest, Documentation │
└─────────────────────────────────────────────────────────┘
```
---
## Phase 1 : Préparation et Infrastructure de base
### Objectif
Préparer l'infrastructure de virtualisation et créer les templates nécessaires.
### Étapes
#### 1.1 Installation et configuration Proxmox
- [ ] **Installer Proxmox** sur les serveurs physiques (Paris et Lyon)
- [ ] **Configurer les bridges réseau** :
- `vmbr0` : Management (192.168.42.0/24)
- `vmbr1` : WAN (selon configuration)
- `vmbr2` : LAN (10.0.0.0/24 pour Paris, 10.1.0.0/24 pour Lyon)
- [ ] **Configurer le stockage** : Disques locaux ou partagés
- [ ] **Créer les pools de ressources** : Paris, Lyon
**Documentation** : `docs/proxmox/PROXMOX_NETWORK_CONFIG.md`
#### 1.2 Création des templates Proxmox
- [ ] **Template Windows Server 2022** :
- Installer Windows Server 2022
- Configurer sysprep
- Créer le template
- [ ] **Template Debian 12** :
- Installer Debian 12
- Configurer cloud-init
- Créer le template
- [ ] **Template Ubuntu 22.04** :
- Installer Ubuntu 22.04
- Configurer cloud-init
- Créer le template
- [ ] **Template pfSense** :
- Installer pfSense
- Configuration de base
- Créer le template
**Documentation** :
- `docs/proxmox/PROXMOX_TEMPLATES.md`
- `docs/pfsense/PFSENSE_TEMPLATE.md`
#### 1.3 Vérification de l'infrastructure
- [ ] **Tester la connectivité réseau** entre les serveurs Proxmox
- [ ] **Vérifier l'accès aux templates** créés
- [ ] **Valider les ressources** (CPU, RAM, stockage)
**Durée estimée** : 1-2 jours
---
## Phase 2 : Réseau et Sécurité
### Objectif
Déployer et configurer les firewalls pfSense et établir la connectivité entre les sites.
### Étapes
#### 2.1 Déploiement des firewalls pfSense
- [ ] **Déployer PAR-FW1** (10.0.0.1) :
- Créer la VM depuis le template pfSense
- Configurer les interfaces réseau (WAN, LAN, OPT1 pour DMZ)
- Configuration initiale via console
- [ ] **Déployer LYO-FW1** (10.1.0.1) :
- Créer la VM depuis le template pfSense
- Configurer les interfaces réseau
- Configuration initiale via console
**Documentation** : `docs/pfsense/PFSENSE_INITIAL_CONFIG.md`
#### 2.2 Configuration manuelle initiale pfSense
**Pour chaque firewall** :
- [ ] **Configuration de base** :
- Changer le mot de passe admin
- Configurer l'interface WAN (IP statique ou DHCP)
- Configurer l'interface LAN (10.0.0.1 pour Paris, 10.1.0.1 pour Lyon)
- Activer SSH (optionnel, pour Ansible)
- [ ] **Règles firewall de base** :
- Autoriser le trafic LAN → WAN
- Bloquer le trafic WAN → LAN (sauf exceptions)
- Configurer les règles de base
**Documentation** : `docs/pfsense/PFSENSE_INITIAL_CONFIG.md`
#### 2.3 Configuration VPN Site-to-Site
- [ ] **Configurer IPsec VPN** entre PAR-FW1 et LYO-FW1 :
- Phase 1 (IKE) : Chiffrement, authentification
- Phase 2 (IPsec) : Réseaux à connecter
- Routes statiques
- [ ] **Tester la connectivité** :
- Ping entre les sites
- Vérifier la réplication AD (une fois AD déployé)
**Documentation** : `docs/pfsense/PFSENSE_SETUP.md`
#### 2.4 Configuration DMZ
- [ ] **Créer l'interface DMZ** sur PAR-FW1 (OPT1)
- [ ] **Configurer le réseau DMZ** : 10.0.0.100/24
- [ ] **Règles firewall DMZ** :
- WAN → DMZ (ports spécifiques)
- DMZ → WAN (accès Internet)
- DMZ → LAN (bloqué par défaut)
**Documentation** : `docs/pfsense/PFSENSE_SETUP.md`
#### 2.5 Configuration automatisée pfSense (Ansible)
- [ ] **Déployer les VMs admin jump hosts** :
- PAR-ADMIN1 (10.0.0.151)
- LYO-ADMIN1 (10.1.0.151)
- [ ] **Configurer les jump hosts** :
- Interfaces réseau (Management + LAN)
- Installation Ansible et collections
- [ ] **Automatiser la configuration pfSense** :
- Règles firewall avancées
- Proxy et filtrage web
- VPN Client (OpenVPN)
- Filtrage géographique (PFBlockerNG)
**Documentation** :
- `docs/pfsense/PFSENSE_ANSIBLE.md`
- `docs/pfsense/PFSENSE_DEPLOYMENT_ORDER.md`
**Durée estimée** : 1-2 jours
---
## Phase 3 : Active Directory et Services de base
### Objectif
Déployer Active Directory, DNS, DHCP et sécuriser les comptes administrateurs.
### Étapes
#### 3.1 Déploiement du premier contrôleur de domaine (PAR-DC1)
- [ ] **Créer la VM PAR-DC1** (10.0.0.11) :
- 4 cores, 8 Go RAM, 100 Go disque
- Interface LAN (vmbr2)
- [ ] **Installer Windows Server 2022**
- [ ] **Configurer le réseau** :
- IP statique : 10.0.0.11/24
- DNS : 127.0.0.1 (lui-même)
- Passerelle : 10.0.0.1 (pfSense)
- [ ] **Promouvoir en contrôleur de domaine** :
- Créer la forêt : `smartmotion.ovh`
- Installer les rôles : AD DS, DNS
- Configurer DNS intégré
- [ ] **Vérifier la réplication DNS** : Automatique avec AD
**Documentation** : `docs/active-directory/ANALYSE_AD_VS_LDAP.md`
#### 3.2 Déploiement du second contrôleur de domaine (PAR-DC2)
- [ ] **Créer la VM PAR-DC2** (10.0.0.12) :
- 4 cores, 8 Go RAM, 100 Go disque
- [ ] **Installer Windows Server 2022**
- [ ] **Configurer le réseau** :
- IP statique : 10.0.0.12/24
- DNS : 10.0.0.11 (PAR-DC1)
- [ ] **Promouvoir en contrôleur de domaine** :
- Joindre le domaine existant : `smartmotion.ovh`
- Installer les rôles : AD DS, DNS
- [ ] **Vérifier la réplication AD** : Automatique
- [ ] **Configurer les forwarders DNS** : 1.1.1.1, 8.8.8.8
#### 3.3 Configuration DNS interne
- [ ] **Créer les enregistrements DNS internes** :
- `dc1.smartmotion.ovh` → 10.0.0.11
- `dc2.smartmotion.ovh` → 10.0.0.12
- Enregistrements pour les futurs serveurs
- [ ] **Configurer les zones DNS** :
- Zone `smartmotion.ovh` (intégrée AD)
- Zones de recherche inversée
**Documentation** : `docs/services/DNS_SPLIT.md`
#### 3.4 Configuration DHCP
- [ ] **Installer le rôle DHCP** sur PAR-DC1
- [ ] **Créer une étendue DHCP** :
- Plage : 10.0.0.100 - 10.0.0.200
- Passerelle : 10.0.0.1
- DNS : 10.0.0.11, 10.0.0.12
- Domaine : `smartmotion.ovh`
- [ ] **Autoriser le serveur DHCP** dans AD
- [ ] **Réservations IP** pour les serveurs fixes
#### 3.5 Déploiement RODC Lyon (LYO-RODC1)
- [ ] **Créer la VM LYO-RODC1** (10.1.0.10) :
- 2 cores, 4 Go RAM, 50 Go disque
- [ ] **Installer Windows Server 2022**
- [ ] **Configurer le réseau** :
- IP statique : 10.1.0.10/24
- DNS : 10.0.0.11 (via VPN)
- [ ] **Promouvoir en RODC** :
- Read-Only Domain Controller
- Pas de modifications AD possibles
- [ ] **Installer DHCP** sur LYO-RODC1 :
- Plage : 10.1.0.100 - 10.1.0.200
- Passerelle : 10.1.0.1
#### 3.6 Configuration Microsoft LAPS
- [ ] **Installer LAPS** sur PAR-DC1 et PAR-DC2
- [ ] **Extension du schéma AD** : Automatique
- [ ] **Créer une GPO** pour LAPS :
- Activer la gestion des mots de passe admin locaux
- Configurer les paramètres (longueur, complexité)
- [ ] **Lier la GPO** aux OUs des postes clients
- [ ] **Tester** : Vérifier la rotation des mots de passe
**Documentation** : `docs/windows/LAPS.md`
#### 3.7 Création des utilisateurs et groupes AD
- [ ] **Créer les OUs** :
- `Departements/Direction`
- `Departements/Commercial`
- `Departements/Technique`
- `Departements/Support`
- `Servers/Paris`
- `Servers/Lyon`
- `Clients/Paris`
- `Clients/Lyon`
- [ ] **Créer les groupes de sécurité** :
- `Direction`, `Commercial`, `Technique`, `Support`
- `Chefs-Services` (pour administrateurs locaux)
- `VPN-Users` (pour VPN client)
- [ ] **Créer les comptes utilisateurs** (50 utilisateurs)
- [ ] **Créer les comptes de service** :
- `svc-nextcloud` (pour Nextcloud LDAP)
- `svc-glpi` (pour GLPI LDAP)
- `svc-veeam` (pour Veeam)
**Durée estimée** : 2-3 jours
---
## Phase 4 : Services Windows
### Objectif
Déployer les services Windows : fichiers, RDS, sauvegardes, GPO.
### Étapes
#### 4.1 Serveur de fichiers Paris (PAR-FILE1)
- [ ] **Créer la VM PAR-FILE1** (10.0.0.20) :
- 4 cores, 8 Go RAM, 2 To disque
- [ ] **Installer Windows Server 2022**
- [ ] **Joindre au domaine** : `smartmotion.ovh`
- [ ] **Installer le rôle File Server**
- [ ] **Créer les partages** :
- `\\PAR-FILE1\Departements\`
- `\\PAR-FILE1\Public\`
- `\\PAR-FILE1\Applications\`
- `\\PAR-FILE1\Users\` (pour redirection profils)
- [ ] **Configurer FSRM** :
- Quotas par utilisateur (10 Go standard, 20 Go direction)
- Filtrage de fichiers (bloquer multimédia)
- [ ] **Activer la déduplication** :
- Volume D:\
- Type : General purpose file server
- [ ] **Activer Shadow Copies** :
- Volume D:\
- Fréquence : 2 fois par jour
- [ ] **Configurer les permissions** : Par groupes AD
**Documentation** : `docs/windows/SERVEUR_FICHIERS.md`
#### 4.2 Serveur de fichiers Lyon (LYO-FILE1)
- [ ] **Créer la VM LYO-FILE1** (10.1.0.20) :
- 2 cores, 4 Go RAM, 1 To disque
- [ ] **Installer Windows Server 2022**
- [ ] **Joindre au domaine**
- [ ] **Installer le rôle File Server**
- [ ] **Créer les partages locaux**
- [ ] **Configurer FSRM** (quotas)
#### 4.3 Configuration DFS-R (Réplication)
- [ ] **Installer DFS Replication** sur PAR-FILE1 et LYO-FILE1
- [ ] **Créer un groupe de réplication** :
- Nom : `Sylvestre-Replication`
- [ ] **Ajouter les membres** : PAR-FILE1, LYO-FILE1
- [ ] **Créer un dossier répliqué** :
- `Documents` : Réplication bidirectionnelle
- [ ] **Configurer la topologie** : Hub (Paris) - Spoke (Lyon)
- [ ] **Tester la réplication** : Vérifier la synchronisation
**Documentation** : `docs/windows/SERVEUR_FICHIERS.md`
#### 4.4 Remote Desktop Services (PAR-RDS1)
- [ ] **Créer la VM PAR-RDS1** (10.0.0.60) :
- 8 cores, 16 Go RAM, 100 Go disque
- [ ] **Installer Windows Server 2022**
- [ ] **Joindre au domaine**
- [ ] **Installer les rôles RDS** :
- RD Session Host
- RD Web Access
- RD Gateway
- RD Licensing
- [ ] **Configurer le déploiement RDS** :
- RD Connection Broker : PAR-RDS1
- RD Session Host : PAR-RDS1
- RD Web Access : PAR-RDS1
- [ ] **Publier des applications RemoteApp** :
- Microsoft Office
- Applications métier
- [ ] **Configurer TLS** : Certificat SSL
- [ ] **Tester l'accès** : Via navigateur web
**Documentation** : `docs/windows/RDS_REMOTE_DESKTOP.md`
#### 4.5 Veeam Backup & Replication (PAR-VEEAM1)
- [ ] **Créer la VM PAR-VEEAM1** (10.0.0.50) :
- 4 cores, 8 Go RAM, 5 To disque
- [ ] **Installer Windows Server 2022**
- [ ] **Joindre au domaine**
- [ ] **Installer Veeam Backup & Replication**
- [ ] **Configurer le repository** :
- Chemin : `D:\Backups`
- Espace : 5 To
- [ ] **Créer les jobs de sauvegarde** :
- PAR-DC1, PAR-DC2 : Quotidien
- PAR-FILE1, LYO-FILE1 : Quotidien
- PAR-RDS1 : Quotidien
- Autres serveurs : Hebdomadaire
- [ ] **Configurer la rétention** : 30 jours
- [ ] **Tester une restauration** : Fichier individuel
**Documentation** : `docs/windows/VEEAM_SAUVEGARDE.md`
#### 4.6 Group Policy Objects (GPO)
- [ ] **Créer les GPO de base** :
- `GPO-Departement-Direction`
- `GPO-Departement-Commercial`
- `GPO-Departement-Technique`
- `GPO-Postes-Clients`
- `GPO-Chefs-Services` (administrateurs locaux)
- [ ] **Configurer le déploiement automatique** :
- Imprimantes par département
- Lecteurs réseau mappés
- Redirection de profils (Documents, Desktop, AppData)
- [ ] **Configurer les administrateurs locaux** :
- Groupe `Chefs-Services` → Administrateurs locaux
- [ ] **Tester les GPO** : Sur un poste de test
**Documentation** : `docs/windows/GPO_GROUP_POLICY.md`
**Durée estimée** : 3-4 jours
---
## Phase 5 : Services Infrastructure
### Objectif
Déployer les services d'infrastructure : GLPI, Zabbix, DNS Split, déploiement.
### Étapes
#### 5.1 GLPI - Gestion de parc (PAR-GLPI1)
- [ ] **Créer la VM PAR-GLPI1** (10.0.0.30) :
- 2 cores, 4 Go RAM, 100 Go disque
- [ ] **Installer Debian 12**
- [ ] **Installer GLPI** :
- Apache, PHP, MariaDB
- GLPI 10.0.7
- [ ] **Configurer l'intégration AD** :
- LDAP : 10.0.0.11
- Compte de service : `svc-glpi`
- Synchronisation automatique
- [ ] **Installer OCS Inventory** :
- Serveur OCS
- Agents sur les postes clients
- [ ] **Configurer GLPI + OCS** :
- Plugin OCS dans GLPI
- Synchronisation inventaire
- [ ] **Créer les catégories d'incidents**
- [ ] **Tester la création de tickets**
**Documentation** : `docs/services/GLPI_GESTION_PARC.md`
#### 5.2 Zabbix - Supervision (PAR-ZABBIX1)
- [ ] **Créer la VM PAR-ZABBIX1** (10.0.0.40) :
- 4 cores, 8 Go RAM, 200 Go disque
- [ ] **Installer Ubuntu 22.04**
- [ ] **Installer Zabbix Server** :
- Zabbix 6.0
- PostgreSQL
- Nginx
- [ ] **Configurer les hôtes** :
- Serveurs Windows (via Zabbix Agent)
- Serveurs Linux (via Zabbix Agent)
- Équipements réseau (via SNMP si supporté)
- [ ] **Créer des tableaux de bord** :
- Dashboard Infrastructure
- Dashboard Réseau
- Dashboard Services
- [ ] **Configurer les alertes** :
- Notifications email
- Seuils d'alerte
- [ ] **Tester les alertes** : Simulation d'incident
**Documentation** : `docs/services/ZABBIX_SUPERVISION.md`
#### 5.3 DNS Split (Interne/Externe)
- [ ] **Acheter un nom de domaine** :
- `smartmotion.ovh` (ou autre)
- Registrar : OVH, Gandi, Online, etc.
- [ ] **Configurer DNS interne (AD)** :
- Enregistrements A pour tous les services
- `www.smartmotion.ovh` → 10.0.0.30 (GLPI)
- `mail.smartmotion.ovh` → 10.0.0.XX (Zimbra)
- `zabbix.smartmotion.ovh` → 10.0.0.40
- etc.
- [ ] **Configurer DNS externe (Hébergeur)** :
- Enregistrements A pour services exposés
- `www.smartmotion.ovh` → IP publique
- `ftp.smartmotion.ovh` → IP publique DMZ
- Enregistrements MX pour email
- [ ] **Configurer les forwarders DNS** : 1.1.1.1, 8.8.8.8
- [ ] **Tester la résolution** :
- Interne : `nslookup www.smartmotion.ovh 10.0.0.11`
- Externe : `nslookup www.smartmotion.ovh 8.8.8.8`
**Documentation** : `docs/services/DNS_SPLIT.md`
#### 5.4 Solution de déploiement des postes
- [ ] **Créer la VM PAR-DEPLOY1** (10.0.0.80) :
- 4 cores, 8 Go RAM, 500 Go disque
- [ ] **Installer Windows Server 2022**
- [ ] **Joindre au domaine**
- [ ] **Installer WDS + MDT** :
- Windows Deployment Services
- Microsoft Deployment Toolkit
- Windows ADK
- [ ] **Créer les images de référence** :
- Windows 11 Pro - PC fixes
- Windows 11 Pro - Portables
- [ ] **Configurer les Task Sequences** :
- Installation Windows 11
- Applications pré-installées
- Jointure au domaine
- [ ] **Tester le déploiement** : Sur un poste de test
**Documentation** : `docs/services/DEPLOIEMENT_POSTES.md`
**Durée estimée** : 2-3 jours
---
## Phase 6 : Services applicatifs
### Objectif
Déployer les services applicatifs : messagerie, Nextcloud, DMZ.
### Étapes
#### 6.1 Service de messagerie (Zimbra ou M365)
**Option A : Zimbra (hébergé localement)**
- [ ] **Créer la VM PAR-MAIL1** (10.0.0.XX) :
- 4 cores, 8 Go RAM, 200 Go disque
- [ ] **Installer Zimbra** :
- Debian 12
- Zimbra Open Source ou Network Edition
- [ ] **Configurer le domaine** : `smartmotion.ovh`
- [ ] **Créer les boîtes mail** : 50 utilisateurs
- [ ] **Configurer l'intégration AD** : LDAP
- [ ] **Configurer les enregistrements DNS** :
- MX : `mail.smartmotion.ovh`
- SPF, DKIM, DMARC
**Option B : Microsoft 365 (SaaS)**
- [ ] **Souscrire à Microsoft 365** :
- Plan Business Standard ou Premium
- 50 licences utilisateur
- [ ] **Configurer le domaine** : `smartmotion.ovh`
- Vérification du domaine
- Enregistrements DNS (MX, SPF, etc.)
- [ ] **Synchroniser avec AD** : Azure AD Connect (optionnel)
- [ ] **Créer les boîtes mail** : 50 utilisateurs
**Documentation** : `docs/messagerie/COMPARAISON_ZIMBRA_M365.md`
#### 6.2 Nextcloud
- [ ] **Créer la VM PAR-NEXTCLOUD1** (10.0.0.XX) :
- 2 cores, 4 Go RAM, 500 Go disque
- [ ] **Installer Nextcloud** :
- Debian 12
- Nextcloud 28+
- Apache, PHP, MariaDB
- [ ] **Configurer l'intégration AD** :
- LDAP : 10.0.0.11
- Compte de service : `svc-nextcloud`
- Synchronisation automatique
- [ ] **Configurer les partages** :
- Intégration avec serveur de fichiers
- Quotas par utilisateur
- [ ] **Tester l'accès** : Via navigateur web
**Documentation** : `docs/active-directory/NEXTCLOUD_LDAP_AD.md`
#### 6.3 DMZ - FTP et Extranet (PAR-FTP1)
- [ ] **Créer la VM PAR-FTP1** (10.0.0.70) :
- 2 cores, 2 Go RAM, 100 Go disque
- Interface DMZ (10.0.0.100/24)
- [ ] **Installer Debian 12**
- [ ] **Installer vsftpd** :
- Configuration FTP sécurisé
- Utilisateurs virtuels
- [ ] **Installer Apache** :
- Extranet web
- PHP, base de données
- [ ] **Configurer les règles firewall** :
- WAN → DMZ (ports FTP et HTTP/HTTPS)
- DMZ → LAN (bloqué)
- [ ] **Tester l'accès** :
- FTP depuis Internet
- Extranet depuis Internet
**Documentation** : `docs/services/DMZ_FTP_EXTRANET.md`
#### 6.4 VPN Client avec authentification RADIUS
- [ ] **Configurer NPS (Network Policy Server)** sur PAR-DC1 :
- Installer le rôle NPS
- Créer un RADIUS client (pfSense)
- Créer une Network Policy (groupe VPN-Users)
- [ ] **Configurer OpenVPN sur pfSense** :
- Serveur OpenVPN
- Authentification RADIUS
- Certificats SSL
- [ ] **Créer les profils VPN** :
- Fichiers .ovpn pour les clients
- [ ] **Tester la connexion VPN** :
- Depuis un poste externe
- Authentification avec compte AD
**Documentation** : `docs/services/VPN_CLIENT_RADIUS.md`
**Durée estimée** : 2-3 jours
---
## Phase 7 : Postes clients et finalisation
### Objectif
Déployer les postes clients, effectuer les tests et finaliser la documentation.
### Étapes
#### 7.1 Déploiement des postes clients
- [ ] **Déployer les 40 PC fixes (Paris)** :
- Via WDS + MDT
- Windows 11 Pro
- Applications pré-installées
- Jointure au domaine
- [ ] **Déployer les 5 portables (Paris)** :
- Via WDS + MDT
- Windows 11 Pro
- Configuration portable
- [ ] **Déployer les 5 portables (Lyon)** :
- Via WDS + MDT (depuis Paris via VPN)
- Windows 11 Pro
- [ ] **Vérifier les GPO** :
- Imprimantes déployées
- Lecteurs réseau mappés
- Redirection de profils active
- [ ] **Vérifier LAPS** :
- Mots de passe admin locaux gérés
- Rotation automatique
**Documentation** : `docs/services/DEPLOIEMENT_POSTES.md`
#### 7.2 Tests fonctionnels
- [ ] **Tests de connectivité** :
- Ping entre tous les serveurs
- Accès aux partages réseau
- Résolution DNS (interne et externe)
- [ ] **Tests de services** :
- Accès GLPI (gestion de parc)
- Accès Zabbix (supervision)
- Accès RDS (bureaux à distance)
- Accès Nextcloud
- Accès messagerie
- [ ] **Tests de réplication** :
- Réplication AD (Paris ↔ Lyon)
- Réplication DFS-R (fichiers)
- [ ] **Tests de sauvegarde** :
- Jobs Veeam fonctionnels
- Restauration test (fichier individuel)
- Shadow Copies accessibles
- [ ] **Tests VPN** :
- VPN Site-to-Site (Paris ↔ Lyon)
- VPN Client (depuis Internet)
#### 7.3 Tests de sécurité (Pentest)
- [ ] **Installation des outils** :
- Nmap
- Nessus (Community Edition ou commercial)
- [ ] **Scan réseau avec Nmap** :
- Scan de tous les réseaux (10.0.0.0/24, 10.1.0.0/24)
- Détection des ports ouverts
- Identification des services
- [ ] **Scan de vulnérabilités avec Nessus** :
- Scan de tous les serveurs
- Identification des vulnérabilités
- Classification (Critique, Haute, Moyenne, Faible)
- [ ] **Correction des vulnérabilités** :
- Mises à jour système
- Fermeture de ports inutiles
- Renforcement de la configuration
- [ ] **Nouveau scan de validation** :
- Vérifier que les vulnérabilités sont corrigées
- [ ] **Rapport de pentest** :
- Documenter les résultats
- Liste des vulnérabilités corrigées
- Recommandations
**Documentation** : `docs/security/PENTEST_NMAP_NESSUS.md`
#### 7.4 Documentation finale
- [ ] **Vérifier la documentation** :
- Tous les documents à jour
- Procédures complètes
- Schémas réseau
- [ ] **Créer un guide utilisateur** :
- Accès aux services
- Utilisation de Nextcloud
- Utilisation de la messagerie
- Accès VPN
- [ ] **Créer un guide administrateur** :
- Procédures de maintenance
- Procédures de sauvegarde/restauration
- Procédures de dépannage
- [ ] **Documenter les mots de passe** :
- Stockage sécurisé (Vault)
- Liste des comptes de service
- Accès aux équipements
**Durée estimée** : 2-3 jours
---
## Checklist complète
### Phase 1 : Préparation
- [ ] Proxmox installé et configuré
- [ ] Templates créés (Windows, Debian, Ubuntu, pfSense)
- [ ] Réseau configuré (bridges, VLAN)
### Phase 2 : Réseau et Sécurité
- [ ] pfSense déployé (Paris et Lyon)
- [ ] Configuration manuelle initiale
- [ ] VPN Site-to-Site configuré
- [ ] DMZ configurée
- [ ] Configuration automatisée (Ansible)
### Phase 3 : Active Directory
- [ ] PAR-DC1 déployé et promu
- [ ] PAR-DC2 déployé et promu
- [ ] LYO-RODC1 déployé et promu
- [ ] DNS interne configuré
- [ ] DHCP configuré (Paris et Lyon)
- [ ] LAPS installé et configuré
- [ ] Utilisateurs et groupes créés
### Phase 4 : Services Windows
- [ ] PAR-FILE1 déployé et configuré
- [ ] LYO-FILE1 déployé et configuré
- [ ] DFS-R configuré
- [ ] PAR-RDS1 déployé et configuré
- [ ] PAR-VEEAM1 déployé et configuré
- [ ] GPO créées et configurées
### Phase 5 : Services Infrastructure
- [ ] PAR-GLPI1 déployé et configuré
- [ ] PAR-ZABBIX1 déployé et configuré
- [ ] DNS Split configuré
- [ ] Solution de déploiement configurée
### Phase 6 : Services applicatifs
- [ ] Messagerie déployée (Zimbra ou M365)
- [ ] Nextcloud déployé et configuré
- [ ] DMZ (FTP/Extranet) déployée
- [ ] VPN Client configuré
### Phase 7 : Finalisation
- [ ] Postes clients déployés (50 postes)
- [ ] Tests fonctionnels réussis
- [ ] Pentest effectué et vulnérabilités corrigées
- [ ] Documentation complète
---
## Dépendances entre services
### Graphique des dépendances
```
Proxmox
pfSense (VPN Site-to-Site)
Active Directory (PAR-DC1, PAR-DC2)
├─→ DNS interne
├─→ DHCP
├─→ LAPS
└─→ Utilisateurs/Groups
├─→ GPO
├─→ Serveur fichiers (FSRM, DFS-R)
├─→ RDS
├─→ Veeam
├─→ GLPI (LDAP)
├─→ Nextcloud (LDAP)
├─→ VPN Client (RADIUS/NPS)
└─→ Déploiement postes (jointure domaine)
Postes clients
```
### Ordre critique
1. **Proxmox** : Nécessaire pour tout le reste
2. **pfSense** : Nécessaire pour la connectivité réseau
3. **Active Directory** : Nécessaire pour tous les services Windows et authentification
4. **DNS** : Nécessaire pour la résolution de noms
5. **DHCP** : Nécessaire pour l'attribution d'IPs automatiques
6. **Services dépendants** : Tous les autres services
### Points d'attention
- ⚠️ **Ne pas déployer de services avant AD** : Tous les services Windows nécessitent AD
- ⚠️ **VPN Site-to-Site avant RODC Lyon** : Le RODC doit pouvoir communiquer avec les DC Paris
- ⚠️ **DNS avant autres services** : La résolution de noms est critique
- ⚠️ **GPO avant déploiement postes** : Les postes doivent être configurés dès le déploiement
---
## Durée totale estimée
| Phase | Durée | Description |
|-------|-------|-------------|
| **Phase 1** | 1-2 jours | Préparation infrastructure |
| **Phase 2** | 1-2 jours | Réseau et sécurité |
| **Phase 3** | 2-3 jours | Active Directory |
| **Phase 4** | 3-4 jours | Services Windows |
| **Phase 5** | 2-3 jours | Services Infrastructure |
| **Phase 6** | 2-3 jours | Services applicatifs |
| **Phase 7** | 2-3 jours | Postes clients et finalisation |
| **TOTAL** | **13-19 jours** | **3-4 semaines** |
---
*Document créé le : Novembre 2025*
*Version : 1.0*
*Projet : Smart-Motions - Plan de déploiement*

View File

@@ -0,0 +1,326 @@
# Prochaines Etapes - Deploiement Smart-Motions
**Date** : Decembre 2025
**Statut** : En cours - Phase 2 (Reseau et Securite)
---
## Etat actuel de l'infrastructure
### Ce qui est deploye et operationnel
| Composant | IP | Statut | Notes |
|-----------|-----|--------|-------|
| Proxmox Paris | 192.168.42.231 | OK | Bridges vmbr0-3 configures |
| PAR-FW1 (pfSense) | WAN: 192.168.254.10, LAN: 10.0.0.1, DMZ: 10.0.10.1 | OK | Config initiale terminee |
| PAR-ADMIN1 (Jump Host) | 192.168.42.225 + 10.0.0.151 | OK | Acces SSH operationnel |
### Configuration pfSense terminee
- Hostname et DNS publics (8.8.8.8, 1.1.1.1) - temporaire
- DHCP sur LAN (10.0.0.100-199)
- Regles firewall LAN (Internet, Lyon, DMZ)
- Regles firewall WAN (OpenVPN, NAT vers DMZ)
- Regles firewall DMZ (Internet, Block vers LAN)
- NAT Port Forwards (FTP, HTTP, HTTPS vers DMZ)
- CA "SmartMotions-CA" cree manuellement
---
## Prochaines etapes par priorite
### ETAPE 0 : Configuration DNS OVH + Cloudflare (OPTIONNEL MAIS RECOMMANDE)
**Objectif** : Deleguer le DNS vers Cloudflare pendant que la propagation se fait (24-48h)
**Pourquoi maintenant ?**
- La propagation prend du temps, autant la lancer tot
- Permet de tester le VPN avec un nom de domaine (`vpn.smartmotion.ovh`)
- Aucune dependance avec les autres etapes
#### 0.1 Creer un compte Cloudflare
1. Aller sur [dash.cloudflare.com](https://dash.cloudflare.com)
2. Creer un compte (plan Free)
3. Ajouter le site `smartmotion.ovh`
4. Noter les nameservers Cloudflare (ex: `alex.ns.cloudflare.com`, `vera.ns.cloudflare.com`)
#### 0.2 Modifier les DNS chez OVH
1. Aller sur [manager.ovh.com](https://www.ovh.com/manager/)
2. Web Cloud > Noms de domaine > `smartmotion.ovh` > Serveurs DNS
3. Remplacer les serveurs OVH par les serveurs Cloudflare
4. Sauvegarder
#### 0.3 Creer les enregistrements de base dans Cloudflare
| Type | Name | Content | Proxy |
|------|------|---------|-------|
| A | @ | 45.80.22.46 | ON |
| A | www | 45.80.22.46 | ON |
| A | vpn | 45.80.22.46 | OFF |
**Duree** : 1-2h de configuration + 24-48h de propagation
**Documentation complete** : `docs/services/DNS_OVH_CLOUDFLARE_SETUP.md`
---
### ETAPE 1 : VPN Site-to-Site Paris-Lyon (Prerequis pour Lyon)
**Objectif** : Etablir la connectivite entre les deux sites avant de deployer quoi que ce soit a Lyon.
#### 1.1 Creer le certificat serveur OpenVPN (sur PAR-FW1)
1. Aller dans **System > Cert Manager > Certificates**
2. Cliquer **+ Add/Sign**
3. Remplir :
- **Method** : Create an internal Certificate
- **Descriptive Name** : `PAR-FW1-OpenVPN-Server`
- **Certificate Authority** : SmartMotions-CA
- **Certificate Type** : Server Certificate
- **Key Length** : 2048
- **Common Name** : `par-fw1.smartmotion.ovh`
- **Alternative Names** : `192.168.254.10`
4. **Save**
#### 1.2 Configurer le serveur OpenVPN (sur PAR-FW1)
1. Aller dans **VPN > OpenVPN > Servers**
2. Cliquer **+ Add**
3. Configuration :
- **Server mode** : Peer to Peer (SSL/TLS)
- **Protocol** : UDP on IPv4 only
- **Device mode** : tun
- **Interface** : WAN
- **Local port** : 1194
- **TLS Configuration** : Activer, generer une cle TLS
- **Peer Certificate Authority** : SmartMotions-CA
- **Server Certificate** : PAR-FW1-OpenVPN-Server
- **Encryption Algorithm** : AES-256-GCM
- **IPv4 Tunnel Network** : `10.10.0.0/30` (petit reseau pour P2P)
- **IPv4 Remote Network(s)** : `10.1.0.0/24` (LAN Lyon)
- **Compression** : Omit
4. **Save**
#### 1.3 Exporter la configuration pour Lyon
1. Aller dans **System > Cert Manager > CAs**
2. Exporter le CA (icone export) - sauvegarder le fichier
3. Creer un certificat client pour LYO-FW1 :
- **System > Cert Manager > Certificates > Add**
- **Descriptive Name** : `LYO-FW1-OpenVPN-Client`
- **Certificate Type** : User Certificate
4. Noter la cle TLS partagee
---
### ETAPE 2 : Deployer Lyon (LYO-FW1)
**Prerequis** : VPN configure cote Paris
#### 2.1 Deployer la VM LYO-FW1 avec Terraform
```bash
cd "/home/syoul/IPSSI SMARTMOTION/terraform/environments/lyon"
tofu init
tofu plan
tofu apply
```
#### 2.2 Configuration manuelle initiale LYO-FW1
Via la console Proxmox :
1. Assigner les interfaces :
- vtnet0 = WAN (192.168.254.11/24, GW: 192.168.254.254)
- vtnet1 = LAN (10.1.0.1/24)
2. Activer SSH
3. Changer le mot de passe admin
#### 2.3 Configurer le client OpenVPN (sur LYO-FW1)
1. Importer le CA SmartMotions-CA
2. Importer le certificat LYO-FW1-OpenVPN-Client
3. Configurer le client OpenVPN vers 192.168.254.10:1194
4. Verifier la connectivite : `ping 10.0.0.1` depuis LYO-FW1
---
### ETAPE 3 : Deployer les Domain Controllers Paris
**Prerequis** : pfSense Paris operationnel
#### 3.1 Deployer PAR-DC1 (10.0.0.11)
```bash
# Ajouter au main.tf de Paris si pas deja fait
cd "/home/syoul/IPSSI SMARTMOTION/terraform/environments/paris"
tofu plan
tofu apply
```
Configuration Windows Server :
1. IP statique : 10.0.0.11/24, GW: 10.0.0.1, DNS: 127.0.0.1
2. Installer le role AD DS
3. Promouvoir en DC : nouvelle foret `smartmotion.ovh`
4. Configurer DNS integre
#### 3.2 Deployer PAR-DC2 (10.0.0.12)
1. IP statique : 10.0.0.12/24, GW: 10.0.0.1, DNS: 10.0.0.11
2. Joindre le domaine `smartmotion.ovh`
3. Promouvoir en DC additionnel
#### 3.3 Mettre a jour DNS pfSense
Une fois les DC operationnels :
```bash
cd "/home/syoul/IPSSI SMARTMOTION/ansible"
ansible-playbook -i inventories/paris.yml playbooks/04b-configure-pfsense-paris-dns.yml
```
---
### ETAPE 4 : Deployer le serveur DMZ (PAR-FTP1)
**Prerequis** : pfSense et NAT configures
#### 4.1 Deployer PAR-FTP1 (10.0.10.70)
```bash
cd "/home/syoul/IPSSI SMARTMOTION/terraform/environments/paris"
tofu plan
tofu apply
```
#### 4.2 Configurer le serveur
1. IP statique : 10.0.10.70/24, GW: 10.0.10.1, DNS: 8.8.8.8
2. Installer vsftpd (FTP)
3. Installer Apache/Nginx (Extranet)
4. Tester l'acces depuis Internet via NAT
---
## Ordre de deploiement recommande
```
Phase actuelle : Phase 2 (Reseau) - EN COURS
|
v
+--------------------------------------------------+
| ETAPE 1 : VPN Site-to-Site |
| - Certificat serveur OpenVPN |
| - Serveur OpenVPN sur PAR-FW1 |
| Duree estimee : 1-2 heures |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| ETAPE 2 : Deploiement Lyon |
| - Terraform LYO-FW1 |
| - Config manuelle + Client OpenVPN |
| - Test connectivite VPN |
| Duree estimee : 2-3 heures |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| ETAPE 3 : Domain Controllers Paris |
| - PAR-DC1 (DC primaire, DNS, DHCP) |
| - PAR-DC2 (DC secondaire) |
| - Mise a jour DNS pfSense |
| Duree estimee : 1 jour |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| ETAPE 4 : Serveur DMZ |
| - PAR-FTP1 (FTP + Extranet) |
| - Tests NAT depuis Internet |
| Duree estimee : 2-3 heures |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| ETAPE 5 : RODC Lyon (apres VPN + DC) |
| - LYO-RODC1 (RODC + DNS cache + DHCP) |
| Duree estimee : 3-4 heures |
+--------------------------------------------------+
|
v
[Suite Phase 4 : Services Windows]
```
---
## Commandes utiles
### Acces SSH aux VMs
```bash
# Via le jump host PAR-ADMIN1
ssh -J debian@192.168.42.225 admin@10.0.0.1 # pfSense Paris
ssh -J debian@192.168.42.225 debian@10.0.10.70 # PAR-FTP1 (DMZ)
```
### Terraform
```bash
cd "/home/syoul/IPSSI SMARTMOTION/terraform/environments/paris"
tofu plan # Voir les changements
tofu apply # Appliquer
tofu destroy # Supprimer (attention!)
```
### Ansible
```bash
cd "/home/syoul/IPSSI SMARTMOTION/ansible"
# Installer les collections
ansible-galaxy collection install -r requirements.yml -p ./collections
# Lancer un playbook
ansible-playbook -i inventories/paris.yml playbooks/04a-configure-pfsense-paris-initial.yml
# Tester la connectivite
ansible -i inventories/paris.yml paris_firewalls -m ping
```
---
## Points d'attention
### VPN Site-to-Site
- Le tunnel doit etre etabli AVANT de deployer quoi que ce soit a Lyon
- Les routes doivent etre configurees des deux cotes
- Tester avec un ping avant de continuer
### Domain Controllers
- PAR-DC1 doit etre operationnel avant PAR-DC2
- Attendre la replication AD avant de deployer le RODC
- Ne pas oublier de mettre a jour les DNS sur pfSense
### DMZ
- Le serveur DMZ ne doit PAS avoir acces au LAN
- Tester le blocage : depuis PAR-FTP1, `ping 10.0.0.11` doit echouer
- Tester le NAT depuis une IP externe
---
## Ressources
- Architecture : `docs/architecture/architecture.md`
- Plan complet : `docs/deployment/PLAN_DEPLOIEMENT_ORDRE.md`
- Config pfSense : `docs/pfsense/PFSENSE_SETUP.md`
- Config VPN : `docs/services/VPN_CLIENT_RADIUS.md`
- DMZ : `docs/services/DMZ_FTP_EXTRANET.md`
- **DNS OVH + Cloudflare** : `docs/services/DNS_OVH_CLOUDFLARE_SETUP.md`
- **NAT Freebox + OpenWRT** : `docs/network/NAT_FREEBOX_OPENWRT.md`
---
*Document cree le : Decembre 2025*
*Derniere mise a jour : 13 Decembre 2025*

670
md_to_print.sh Executable file
View File

@@ -0,0 +1,670 @@
#!/bin/bash
# Script automatique : Markdown → PDF → Prévisualisation → Impression
# Usage: ./md_to_print.sh fichier.md [options]
set -euo pipefail
# Version
VERSION="1.0.0"
# Codes de retour
EXIT_SUCCESS=0
EXIT_GENERAL=1
EXIT_FILE_NOT_FOUND=2
EXIT_DEPS_MISSING=3
EXIT_PDF_CONVERSION=4
EXIT_PRINT_ERROR=5
EXIT_CONFIG_ERROR=6
EXIT_DOCKER_ERROR=7
EXIT_PERMISSIONS=8
EXIT_INVALID_ARG=9
EXIT_PRINTER_UNAVAILABLE=10
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Variables par défaut
PREVIEW=false
PRINTER=""
COPIES=1
PAGES=""
ORIENTATION="portrait"
SIZE="A4"
QUALITY="normal"
COLOR=false
DUPLEX="none"
INSTALL_DEPS=false
KEEP_PDF=false
CONFIG_FILE=""
VERBOSE=false
LOG_FILE=""
LOG_LEVEL="INFO"
# Répertoires
OUTPUT_DIR="./output"
LOG_DIR="./logs"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Fonction de logging
log() {
local level="$1"
shift
local message="$*"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local log_entry="[${timestamp}] [${level}] ${message}"
case "$level" in
DEBUG)
if [ "$VERBOSE" = true ] || [ "$LOG_LEVEL" = "DEBUG" ]; then
echo -e "${BLUE}${log_entry}${NC}" >&2
fi
;;
INFO)
echo -e "${GREEN}${log_entry}${NC}" >&2
;;
WARN)
echo -e "${YELLOW}${log_entry}${NC}" >&2
;;
ERROR)
echo -e "${RED}${log_entry}${NC}" >&2
;;
esac
if [ -n "$LOG_FILE" ] && [ -f "$LOG_FILE" ]; then
echo "${log_entry}" >> "$LOG_FILE"
fi
}
# Fonction d'aide
show_help() {
cat << EOF
MD_to_Print v${VERSION} - Conversion Markdown → PDF → Impression
Usage: $0 fichier.md [OPTIONS]
OPTIONS:
-p, --preview Prévisualiser le PDF avant impression
-P, --printer NOM Spécifier l'imprimante
-c, --copies N Nombre de copies (défaut: 1)
-r, --pages RANGE Pages à imprimer (ex: 1-3,5,7-9)
-o, --orientation DIR Orientation: portrait ou landscape (défaut: portrait)
-s, --size SIZE Taille: A4, A3, Letter, etc. (défaut: A4)
-q, --quality QUALITY Qualité: draft, normal, high (défaut: normal)
-C, --color Impression en couleur
-d, --duplex MODE Mode recto-verso: none, simplex, duplex (défaut: none)
-i, --install-deps Installer les dépendances automatiquement
-k, --keep-pdf Conserver le fichier PDF après impression
--config FILE Fichier de configuration
-v, --verbose Mode verbeux (logging DEBUG)
-l, --log FILE Fichier de log
-h, --help Afficher cette aide
--version Afficher la version
EXEMPLES:
$0 document.md --preview
$0 document.md --printer HP_LaserJet --copies 2 --color
$0 document.md --pages 1-5 --orientation landscape
$0 document.md --duplex duplex --quality high --config myconfig.conf
CONFIGURATION:
Le fichier de configuration utilise le format INI avec les sections:
[default], [paths], [logging]
Voir config.example.conf pour un exemple.
CODES DE RETOUR:
0 : Succès
1 : Erreur générale
2 : Fichier introuvable
3 : Dépendances manquantes
4 : Erreur conversion PDF
5 : Erreur impression
6 : Erreur configuration
7 : Erreur Docker
8 : Permissions insuffisantes
9 : Argument invalide
10 : Imprimante non disponible
EOF
}
# Fonction de chargement de configuration
load_config() {
local config_path="$1"
if [ ! -f "$config_path" ]; then
log ERROR "Fichier de configuration introuvable: $config_path"
return $EXIT_CONFIG_ERROR
fi
log INFO "Chargement de la configuration depuis: $config_path"
while IFS='=' read -r key value || [ -n "$key" ]; do
# Ignorer les commentaires et lignes vides
[[ "$key" =~ ^[[:space:]]*# ]] && continue
[[ -z "${key// }" ]] && continue
# Supprimer les espaces
key=$(echo "$key" | tr -d '[:space:]')
value=$(echo "$value" | tr -d '[:space:]')
case "$key" in
printer)
[ -z "$PRINTER" ] && PRINTER="$value"
;;
copies)
[ "$COPIES" = 1 ] && COPIES="$value"
;;
orientation)
[ "$ORIENTATION" = "portrait" ] && ORIENTATION="$value"
;;
size)
[ "$SIZE" = "A4" ] && SIZE="$value"
;;
quality)
[ "$QUALITY" = "normal" ] && QUALITY="$value"
;;
color)
[ "$COLOR" = false ] && COLOR=$( [ "$value" = "true" ] && echo true || echo false )
;;
duplex)
[ "$DUPLEX" = "none" ] && DUPLEX="$value"
;;
preview)
[ "$PREVIEW" = false ] && PREVIEW=$( [ "$value" = "true" ] && echo true || echo false )
;;
keep_pdf)
[ "$KEEP_PDF" = false ] && KEEP_PDF=$( [ "$value" = "true" ] && echo true || echo false )
;;
output_dir)
OUTPUT_DIR="$value"
;;
log_dir)
LOG_DIR="$value"
;;
level)
LOG_LEVEL="$value"
;;
file)
[ -z "$LOG_FILE" ] && LOG_FILE="$LOG_DIR/$value"
;;
verbose)
[ "$VERBOSE" = false ] && VERBOSE=$( [ "$value" = "true" ] && echo true || echo false )
;;
esac
done < <(grep -v '^\[' "$config_path" | grep -v '^[[:space:]]*$')
log INFO "Configuration chargée avec succès"
return $EXIT_SUCCESS
}
# Fonction d'installation des dépendances
install_dependencies() {
log INFO "Vérification et installation des dépendances..."
if ! command -v apt-get &> /dev/null; then
log ERROR "apt-get non disponible. Installation manuelle requise."
return $EXIT_DEPS_MISSING
fi
log INFO "Mise à jour de la liste des paquets..."
if ! sudo apt-get update -qq; then
log ERROR "Échec de la mise à jour des paquets"
return $EXIT_DEPS_MISSING
fi
local deps_to_install=()
if ! command -v pandoc &> /dev/null; then
deps_to_install+=("pandoc")
fi
if ! command -v pdflatex &> /dev/null; then
deps_to_install+=("texlive-latex-base" "texlive-fonts-recommended" "texlive-latex-extra")
fi
if ! command -v lp &> /dev/null; then
deps_to_install+=("cups")
fi
if [ ${#deps_to_install[@]} -gt 0 ]; then
log INFO "Installation: ${deps_to_install[*]}"
if ! sudo apt-get install -y "${deps_to_install[@]}"; then
log ERROR "Échec de l'installation des dépendances"
return $EXIT_DEPS_MISSING
fi
log INFO "Dépendances installées avec succès"
else
log INFO "Toutes les dépendances sont déjà installées"
fi
return $EXIT_SUCCESS
}
# Fonction de vérification des dépendances
check_dependencies() {
local missing_deps=()
if ! command -v pandoc &> /dev/null; then
missing_deps+=("pandoc")
fi
if ! command -v pdflatex &> /dev/null; then
missing_deps+=("texlive-latex-base")
fi
if ! command -v lp &> /dev/null; then
missing_deps+=("cups")
fi
if [ ${#missing_deps[@]} -gt 0 ]; then
log ERROR "Dépendances manquantes: ${missing_deps[*]}"
log INFO "Utilisez l'option --install-deps pour installer automatiquement"
return $EXIT_DEPS_MISSING
fi
return $EXIT_SUCCESS
}
# Fonction de prévisualisation
preview_pdf() {
local pdf_file="$1"
if [ ! -f "$pdf_file" ]; then
log ERROR "Fichier PDF introuvable pour prévisualisation: $pdf_file"
return $EXIT_FILE_NOT_FOUND
fi
log INFO "Ouverture de la prévisualisation..."
if command -v evince &> /dev/null; then
evince "$pdf_file" 2>/dev/null &
log DEBUG "Utilisation de evince pour la prévisualisation"
elif command -v okular &> /dev/null; then
okular "$pdf_file" 2>/dev/null &
log DEBUG "Utilisation de okular pour la prévisualisation"
elif command -v xdg-open &> /dev/null; then
xdg-open "$pdf_file" 2>/dev/null &
log DEBUG "Utilisation de xdg-open pour la prévisualisation"
else
log WARN "Aucun visualiseur PDF trouvé. Installation recommandée: evince ou okular"
return $EXIT_DEPS_MISSING
fi
log INFO "Appuyez sur Entrée pour continuer avec l'impression..."
read -r
return $EXIT_SUCCESS
}
# Fonction de liste des imprimantes
list_printers() {
log INFO "Imprimantes disponibles:"
if command -v lpstat &> /dev/null; then
lpstat -p 2>/dev/null | grep -E "^printer" | awk '{print " - " $2}' || log WARN "Aucune imprimante trouvée"
else
log WARN "lpstat non disponible, impossible de lister les imprimantes"
fi
}
# Fonction de validation de l'imprimante
check_printer() {
local printer_name="$1"
if [ -z "$printer_name" ]; then
return $EXIT_SUCCESS
fi
if ! command -v lpstat &> /dev/null; then
log WARN "lpstat non disponible, impossible de vérifier l'imprimante"
return $EXIT_SUCCESS
fi
if lpstat -p "$printer_name" &>/dev/null; then
log DEBUG "Imprimante '$printer_name' disponible"
return $EXIT_SUCCESS
else
log WARN "Imprimante '$printer_name' non disponible"
list_printers
return $EXIT_PRINTER_UNAVAILABLE
fi
}
# Parsing des arguments
MD_FILE=""
ARGS=("$@")
while [[ $# -gt 0 ]]; do
case $1 in
-p|--preview)
PREVIEW=true
shift
;;
-P|--printer)
if [ -z "${2:-}" ]; then
log ERROR "Option --printer nécessite un argument"
exit $EXIT_INVALID_ARG
fi
PRINTER="$2"
shift 2
;;
-c|--copies)
if [ -z "${2:-}" ]; then
log ERROR "Option --copies nécessite un argument"
exit $EXIT_INVALID_ARG
fi
COPIES="$2"
shift 2
;;
-r|--pages)
if [ -z "${2:-}" ]; then
log ERROR "Option --pages nécessite un argument"
exit $EXIT_INVALID_ARG
fi
PAGES="$2"
shift 2
;;
-o|--orientation)
if [ -z "${2:-}" ]; then
log ERROR "Option --orientation nécessite un argument"
exit $EXIT_INVALID_ARG
fi
ORIENTATION="$2"
shift 2
;;
-s|--size)
if [ -z "${2:-}" ]; then
log ERROR "Option --size nécessite un argument"
exit $EXIT_INVALID_ARG
fi
SIZE="$2"
shift 2
;;
-q|--quality)
if [ -z "${2:-}" ]; then
log ERROR "Option --quality nécessite un argument"
exit $EXIT_INVALID_ARG
fi
QUALITY="$2"
shift 2
;;
-C|--color)
COLOR=true
shift
;;
-d|--duplex)
if [ -z "${2:-}" ]; then
log ERROR "Option --duplex nécessite un argument"
exit $EXIT_INVALID_ARG
fi
DUPLEX="$2"
shift 2
;;
-i|--install-deps)
INSTALL_DEPS=true
shift
;;
-k|--keep-pdf)
KEEP_PDF=true
shift
;;
--config)
if [ -z "${2:-}" ]; then
log ERROR "Option --config nécessite un argument"
exit $EXIT_INVALID_ARG
fi
CONFIG_FILE="$2"
shift 2
;;
-v|--verbose)
VERBOSE=true
LOG_LEVEL="DEBUG"
shift
;;
-l|--log)
if [ -z "${2:-}" ]; then
log ERROR "Option --log nécessite un argument"
exit $EXIT_INVALID_ARG
fi
LOG_FILE="$2"
shift 2
;;
-h|--help)
show_help
exit $EXIT_SUCCESS
;;
--version)
echo "MD_to_Print v${VERSION}"
exit $EXIT_SUCCESS
;;
-*)
log ERROR "Option inconnue: $1"
show_help
exit $EXIT_INVALID_ARG
;;
*)
if [ -z "$MD_FILE" ]; then
MD_FILE="$1"
else
log ERROR "Trop de fichiers spécifiés: $MD_FILE et $1"
exit $EXIT_INVALID_ARG
fi
shift
;;
esac
done
# Vérification du fichier markdown
if [ -z "$MD_FILE" ]; then
log ERROR "Aucun fichier markdown spécifié"
show_help
exit $EXIT_INVALID_ARG
fi
# Résolution du chemin absolu
if [[ "$MD_FILE" != /* ]]; then
MD_FILE="$(realpath "$MD_FILE" 2>/dev/null || echo "$MD_FILE")"
fi
if [ ! -f "$MD_FILE" ]; then
log ERROR "Le fichier '$MD_FILE' n'existe pas"
exit $EXIT_FILE_NOT_FOUND
fi
# Vérification des permissions de lecture
if [ ! -r "$MD_FILE" ]; then
log ERROR "Permission de lecture refusée pour '$MD_FILE'"
exit $EXIT_PERMISSIONS
fi
# Création des répertoires nécessaires
mkdir -p "$OUTPUT_DIR" "$LOG_DIR"
# Initialisation du fichier de log si spécifié
if [ -n "$LOG_FILE" ]; then
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
fi
# Chargement de la configuration si spécifiée
if [ -n "$CONFIG_FILE" ]; then
if ! load_config "$CONFIG_FILE"; then
exit $EXIT_CONFIG_ERROR
fi
elif [ -f "$SCRIPT_DIR/config.conf" ]; then
log DEBUG "Chargement de la configuration par défaut: $SCRIPT_DIR/config.conf"
load_config "$SCRIPT_DIR/config.conf" || true
fi
# Installation des dépendances si demandée
if [ "$INSTALL_DEPS" = true ]; then
if ! install_dependencies; then
exit $EXIT_DEPS_MISSING
fi
fi
# Vérification des dépendances
if ! check_dependencies; then
exit $EXIT_DEPS_MISSING
fi
# Génération du nom du fichier PDF
MD_BASENAME=$(basename "$MD_FILE" .md)
PDF_FILE="$OUTPUT_DIR/${MD_BASENAME}.pdf"
log INFO "=== Conversion Markdown → PDF ==="
log INFO "Fichier source: $MD_FILE"
log INFO "Fichier PDF: $PDF_FILE"
# Conversion Markdown → PDF avec options
# Détection du moteur PDF disponible (xelatex gère mieux Unicode)
PDF_ENGINE="pdflatex"
if command -v xelatex &> /dev/null; then
PDF_ENGINE="xelatex"
log DEBUG "Utilisation de xelatex pour meilleure gestion Unicode"
fi
PANDOC_OPTS=(
"$MD_FILE"
-o "$PDF_FILE"
--pdf-engine="$PDF_ENGINE"
-V geometry:margin=2cm
-V fontsize=11pt
-V documentclass=article
-V papersize="$SIZE"
)
# Options spécifiques pour xelatex (meilleure gestion Unicode)
if [ "$PDF_ENGINE" = "xelatex" ]; then
PANDOC_OPTS+=(
-V mainfont="DejaVu Sans"
-V monofont="DejaVu Sans Mono"
)
fi
if [ "$ORIENTATION" = "landscape" ]; then
PANDOC_OPTS+=(-V geometry:landscape)
fi
log DEBUG "Exécution: pandoc ${PANDOC_OPTS[*]}"
if ! pandoc "${PANDOC_OPTS[@]}" 2>&1 | while IFS= read -r line; do log DEBUG "$line"; done; then
log ERROR "Erreur lors de la conversion en PDF"
exit $EXIT_PDF_CONVERSION
fi
if [ ! -f "$PDF_FILE" ]; then
log ERROR "Le fichier PDF n'a pas été créé"
exit $EXIT_PDF_CONVERSION
fi
log INFO "PDF créé avec succès: $PDF_FILE"
# Vérification de l'imprimante si spécifiée
if [ -n "$PRINTER" ]; then
if ! check_printer "$PRINTER"; then
log WARN "Tentative d'utilisation de l'imprimante par défaut"
PRINTER=""
fi
fi
# Prévisualisation si demandée
if [ "$PREVIEW" = true ]; then
if ! preview_pdf "$PDF_FILE"; then
log WARN "Échec de la prévisualisation, continuation avec l'impression"
fi
fi
# Préparation des options d'impression
LP_OPTS=()
if [ -n "$PRINTER" ]; then
LP_OPTS+=(-d "$PRINTER")
else
log INFO "Utilisation de l'imprimante par défaut"
list_printers
fi
LP_OPTS+=(-n "$COPIES")
if [ -n "$PAGES" ]; then
LP_OPTS+=(-o page-ranges="$PAGES")
fi
if [ "$ORIENTATION" = "landscape" ]; then
LP_OPTS+=(-o orientation-requested=4)
fi
LP_OPTS+=(-o media="$SIZE")
case "$QUALITY" in
draft)
LP_OPTS+=(-o print-quality=3)
;;
high)
LP_OPTS+=(-o print-quality=5)
;;
*)
LP_OPTS+=(-o print-quality=4)
;;
esac
if [ "$COLOR" = true ]; then
LP_OPTS+=(-o ColorMode=Color)
else
LP_OPTS+=(-o ColorMode=Monochrome)
fi
case "$DUPLEX" in
simplex)
LP_OPTS+=(-o sides=one-sided)
;;
duplex)
LP_OPTS+=(-o sides=two-sided-long-edge)
;;
*)
LP_OPTS+=(-o sides=one-sided)
;;
esac
# Impression
log INFO "=== Impression ==="
log INFO "Options:"
log INFO " - Copies: $COPIES"
log INFO " - Taille: $SIZE"
log INFO " - Orientation: $ORIENTATION"
log INFO " - Qualité: $QUALITY"
log INFO " - Couleur: $([ "$COLOR" = true ] && echo "Oui" || echo "Non")"
log INFO " - Recto-verso: $DUPLEX"
[ -n "$PAGES" ] && log INFO " - Pages: $PAGES"
[ -n "$PRINTER" ] && log INFO " - Imprimante: $PRINTER"
log DEBUG "Exécution: lp ${LP_OPTS[*]} $PDF_FILE"
if ! lp "${LP_OPTS[@]}" "$PDF_FILE" 2>&1 | while IFS= read -r line; do log DEBUG "$line"; done; then
log ERROR "Erreur lors de l'impression"
log INFO "Le fichier PDF a été conservé: $PDF_FILE"
exit $EXIT_PRINT_ERROR
fi
log INFO "Impression lancée avec succès!"
# Gestion du fichier PDF
if [ "$KEEP_PDF" = false ]; then
read -p "Supprimer le fichier PDF temporaire? (o/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Oo]$ ]]; then
rm "$PDF_FILE"
log INFO "Fichier PDF supprimé"
else
log INFO "Fichier PDF conservé: $PDF_FILE"
fi
else
log INFO "Fichier PDF conservé: $PDF_FILE"
fi
log INFO "=== Opération terminée avec succès ==="
exit $EXIT_SUCCESS