# đ xsshend
[](https://crates.io/crates/xsshend)
[](https://docs.rs/xsshend)
[](https://opensource.org/licenses/MIT)
[](https://www.rust-lang.org)
**xsshend** est un outil Rust moderne et efficace pour le **téléversement de fichiers vers multiples serveurs SSH**. Interface en ligne de commande simple et intuitive avec suivi en temps réel des transferts.
## đ§ Installation
### Pré-requis
- Rust 1.70+ (recommandé: version stable la plus récente)
- OpenSSL (optionnel, pour accélérer la compilation)
### Via Cargo (recommandé)
```bash
cargo install xsshend
```
#### đ AccĂ©lĂ©rer l'installation
L'installation peut ĂȘtre longue car elle compile OpenSSL depuis les sources par dĂ©faut. Pour accĂ©lĂ©rer :
**Option 1 : Utiliser OpenSSL du systĂšme (Linux/macOS)**
```bash
# Installer OpenSSL si nécessaire
# Ubuntu/Debian:
sudo apt-get install libssl-dev pkg-config
# Fedora/RHEL:
sudo dnf install openssl-devel
# macOS:
brew install openssl pkg-config
# Installer xsshend (utilise OpenSSL systĂšme automatiquement)
cargo install xsshend
```
**Option 2 : Compilation parallĂšle**
```bash
# Utiliser tous les cĆurs CPU disponibles
cargo install xsshend -j $(nproc)
```
### Depuis les sources
```bash
git clone https://github.com/willisback/xsshend.git
cd xsshend
cargo install --path .
```
## đ Documentation
- [**Documentation complĂšte**](https://willisback.github.io/xsshend/)
- [Guide d'utilisation](#-utilisation)
- [Configuration](#%EF%B8%8F-configuration)
## ⚠Fonctionnalités principales
- đŻ **TĂ©lĂ©versement simple** vers plusieurs serveurs SSH
- đ **Barres de progression** en temps rĂ©el pour chaque transfert
- đ **Authentification sĂ©curisĂ©e** par clĂ©s SSH avec dĂ©couverte automatique
- đ **Filtrage avancĂ©** par environnement, rĂ©gion et type de serveur
- đïž **Configuration hiĂ©rarchique** des serveurs (environnements, rĂ©gions, types)
- đĄïž **Gestion d'erreurs robuste** avec rapports dĂ©taillĂ©s
- đ **Support multi-fichiers** avec validation automatique
- ⥠**Mode dry-run** pour simulation sans transfert réel
- đ§Ș **Suite de tests complĂšte** avec 93 tests automatisĂ©s
## đ DĂ©marrage rapide
### 1. Initialisation
```bash
# Initialiser la configuration avec assistant interactif
xsshend init
# Forcer la réinitialisation
xsshend init --force
```
### 2. Configuration des serveurs
Créez le fichier `~/.ssh/hosts.json` avec la structure hiérarchique :
```json
{
"Production": {
"Region-A": {
"Public": {
"WEB_SERVER_01": {
"alias": "web01@prod-web-01.example.com",
"env": "PROD"
},
"API_SERVER_01": {
"alias": "api01@prod-api-01.example.com",
"env": "PROD"
}
},
"Private": {
"DATABASE_01": {
"alias": "db01@prod-db-01.example.com",
"env": "PROD"
}
}
}
},
"Staging": {
"Region-A": {
"Public": {
"STAGE_WEB_01": {
"alias": "web01@stage-web-01.example.com",
"env": "STAGE"
}
}
}
},
"Development": {
"Local": {
"Services": {
"DEV_DATABASE": {
"alias": "dev@dev-db.local.example.com",
"env": "DEV"
}
}
}
}
}
```
### 3. Utilisation
```bash
# Lister les serveurs disponibles
xsshend list
# Téléverser un fichier vers tous les serveurs
xsshend upload myfile.txt
# Filtrer par environnement
xsshend upload config.json --env Production
# Mode dry-run (simulation)
xsshend upload deploy.sh --env Production --dry-run
```
## đź Utilisation
### Commandes principales
```bash
# Aide générale
xsshend --help
# Initialiser la configuration
xsshend init [--force]
# Lister les serveurs disponibles
xsshend list
# ou
xsshend --list
# Téléverser des fichiers
xsshend upload <FILES>... [OPTIONS]
```
### Options de téléversement
```bash
# Filtrage par environnement
xsshend upload file.txt --env Production
xsshend upload file.txt --env Staging
xsshend upload file.txt --env Development
# Filtrage par région
xsshend upload file.txt --region Region-A
xsshend upload file.txt --region Region-B
# Filtrage par type de serveur
xsshend upload file.txt --type Public
xsshend upload file.txt --type Private
# Filtrage combiné
xsshend upload config.json --env Production --region Region-A
xsshend upload deploy.sh --env Production --type Public
xsshend upload app.war --env Staging --region Region-A --type Public
# Spécifier la destination
xsshend upload file.txt --dest /opt/app/
xsshend upload file.txt --dest /var/www/html/
# Mode simulation (dry-run)
xsshend upload file.txt --env Production --dry-run
# Téléverser plusieurs fichiers
xsshend upload file1.txt file2.json directory/
```
### Exemples d'utilisation
```bash
# Déploiement en production
xsshend upload app.war --env Production --dest /opt/tomcat/webapps/
# Mise Ă jour de configuration de staging
xsshend upload config.json --env Staging --dest /etc/myapp/
# Déploiement sur serveurs publics uniquement
xsshend upload static-files/ --env Production --type Public --dest /var/www/
# Simulation d'un déploiement
xsshend upload deploy.sh --env Production --dry-run
# Upload vers une région spécifique
xsshend upload regional-config.json --env Production --region Region-A
```
### Interface de progression
Les transferts affichent une progression en temps réel :
```
đ DĂ©but du tĂ©lĂ©versement: 1 fichier(s) vers 3 serveur(s)
đ Destination: /opt/uploads/
đŻ Serveurs ciblĂ©s:
âą Production:Region-A:Public:WEB_SERVER_01 â web01@prod-web-01.example.com (PROD)
âą Production:Region-A:Public:API_SERVER_01 â api01@prod-api-01.example.com (PROD)
âą Production:Region-A:Private:DATABASE_01 â db01@prod-db-01.example.com (PROD)
đ€ TĂ©lĂ©versement de ./myapp.jar en cours...
web01@prod-web-01... [ââââââââââââââââââââââââââââââââ] 2.3MB/2.3MB â
api01@prod-api-01... [ââââââââââââââââââ ] 1.5MB/2.3MB âł
db01@prod-db-01..... [ââââââââââââââââââââââââââââ ] 2.1MB/2.3MB âł
â
Téléversement terminé avec succÚs!
đ 3 serveur(s) - 0 Ă©chec(s)
```
## đ Gestion des clĂ©s SSH
### Découverte automatique
xsshend détecte automatiquement les clés SSH disponibles dans `~/.ssh/` :
- **Types supportés** : Ed25519, RSA, ECDSA, DSA
- **Gestion des passphrases** avec ssh-agent
- **Sélection automatique** de la meilleure clé disponible
### Priorité de sélection
1. **Ed25519** - Recommandé pour la sécurité et performance
2. **RSA** - Compatibilité étendue
3. **ECDSA** - Alternative moderne
4. **DSA** - Support basique
### Configuration SSH
```bash
# Vérifier les clés disponibles
ssh-add -l
# Ajouter une clé à l'agent SSH
ssh-add ~/.ssh/id_ed25519
# Copier une clé publique vers un serveur
ssh-copy-id user@server.example.com
```
## âïž Configuration
### Structure hiérarchique
La configuration suit une structure Ă trois niveaux :
```
Environment/
âââ Region/
â âââ Type/
â â âââ SERVER_NAME_1
â â âââ SERVER_NAME_2
â âââ Type/
âââ Region/
```
**Exemple d'organisation :**
```
Production/
âââ Region-A/
â âââ Public/ # Serveurs web publics
â âââ Private/ # Bases de donnĂ©es internes
âââ Region-B/
âââ Public/
âââ Private/
Staging/
âââ Region-A/
â âââ Public/
âââ Region-B/
Development/
âââ Local/
âââ Services/
```
### Commande init
La commande `xsshend init` vous guide dans la configuration :
1. **Détection des clés SSH** existantes
2. **Création du fichier hosts.json** avec template
3. **Configuration des permissions** sécurisées (.ssh/ en 700)
4. **Conseils d'utilisation** personnalisés
```bash
# Configuration initiale interactive
xsshend init
# Réinitialisation complÚte
xsshend init --force
```
### Format des entrées serveur
Chaque serveur est défini avec :
```json
{
"SERVER_NAME": {
"alias": "username@hostname.example.com", // Obligatoire
"env": "ENVIRONMENT_TAG" // Optionnel
}
}
```
## đ ïž DĂ©veloppement
### Prérequis
- **Rust 2021 Edition** ou plus récent
- **OpenSSH** pour les clés SSH
- **Git** pour le développement
### Installation développement
```bash
# Cloner le projet
git clone https://github.com/willisback/xsshend.git
cd xsshend
# Installer les outils de développement
rustup component add clippy rustfmt
# Compiler en mode debug
cargo build
# Compiler en mode release
cargo build --release
```
### Tests
Le projet inclut une suite de tests complĂšte avec **93 tests** :
```bash
# Tests unitaires et d'intégration
cargo test
# Tests avec sortie détaillée
cargo test -- --nocapture
# Tests de performance (benchmarks)
cargo bench
```
### Qualité de code
```bash
# Formatage automatique
cargo fmt
# Linting avec Clippy
cargo clippy -- -D warnings
# Vérification complÚte
cargo check --all-targets --all-features
# Documentation
cargo doc --open
```
## đ§Ș Architecture de tests
### Couverture de tests
- **Unit tests** : 6 tests (modules core)
- **Config tests** : 14 tests (configuration JSON)
- **SSH keys tests** : 10 tests (gestion des clés)
- **Uploader tests** : 14 tests (téléversements)
- **CLI tests** : 21 tests (interface ligne de commande)
- **Integration tests** : 12 tests (workflows complets)
- **Validator tests** : 16 tests (validation fichiers)
### Tests d'intégration
Les tests d'intégration valident :
- â
Initialisation et configuration
- â
Détection et sélection des clés SSH
- â
Parsing et filtrage des configurations
- â
Workflows complets (init â list â upload)
- â
Gestion des erreurs et cas limites
- â
Performance avec grandes configurations
- â
Interface CLI et validation des arguments
## đ§ Stack technologique
### Dépendances principales
- **`ssh2`** - Client SSH/SFTP robuste
- **`clap`** - Interface ligne de commande moderne
- **`serde/serde_json`** - Sérialisation JSON
- **`indicatif`** - Barres de progression
- **`anyhow`** - Gestion d'erreurs ergonomique
- **`tempfile`** - Fichiers temporaires (tests)
### Architecture modulaire
```
src/
âââ main.rs # Point d'entrĂ©e CLI
âââ lib.rs # Interface bibliothĂšque
âââ config/ # Configuration hosts.json
â âââ mod.rs
â âââ hosts.rs
âââ ssh/ # Client SSH et clĂ©s
â âââ mod.rs
â âââ client.rs
â âââ keys.rs
âââ core/ # Logique mĂ©tier
â âââ mod.rs
â âââ uploader.rs
â âââ validator.rs
âââ utils/ # Utilitaires
âââ mod.rs
âââ logger.rs
tests/ # Tests d'intégration
âââ cli_test.rs
âââ config_test.rs
âââ integration_test.rs
âââ ssh_keys_test.rs
âââ uploader_test.rs
âââ validator_test.rs
âââ common/
âââ mod.rs # Utilitaires de test
benches/ # Tests de performance
âââ performance_bench.rs
```
## đĄïž DĂ©pannage
### ProblĂšmes courants
#### Erreur: "Permission denied (publickey)"
```bash
# Vérifier la configuration SSH
ssh -v user@server.example.com
# Vérifier l'agent SSH
ssh-add -l
# Ajouter une clé si nécessaire
ssh-add ~/.ssh/id_ed25519
```
#### Erreur: "hosts.json not found"
```bash
# Utiliser la commande d'initialisation
xsshend init
# Ou créer manuellement
mkdir -p ~/.ssh
nano ~/.ssh/hosts.json
```
#### Tests en échec
```bash
# Exécuter les tests avec détails
cargo test -- --nocapture
# Vérifier un test specific
cargo test test_name
# Tests d'intégration uniquement
cargo test --test integration_test
```
### Mode debug
```bash
# Logs détaillés
RUST_LOG=debug xsshend upload file.txt --env Production
# Mode trĂšs verbeux
RUST_LOG=trace xsshend upload file.txt --env Production
```
## đ€ Contribution
Les contributions sont les bienvenues !
### Processus de contribution
1. **Fork** le projet
2. Créer une **branche feature** (`git checkout -b feature/ma-fonctionnalite`)
3. **Commiter** les changements (`git commit -am 'Ajoute ma fonctionnalité'`)
4. **Pousser** vers la branche (`git push origin feature/ma-fonctionnalite`)
5. Ouvrir une **Pull Request**
### Standards de qualité
Avant de soumettre une PR, assurez-vous que :
- â
Code formaté : `cargo fmt`
- â
Linting OK : `cargo clippy -- -D warnings`
- â
Tests passants : `cargo test`
- â
Documentation Ă jour
Le workflow GitHub Actions vérifie automatiquement ces critÚres.
## đ Licence
Ce projet est sous licence **MIT** - voir le fichier [LICENSE](LICENSE) pour les détails.
## đ Remerciements
- **[clap-rs](https://github.com/clap-rs/clap)** pour l'excellent framework CLI
- **[ssh2-rs](https://github.com/alexcrichton/ssh2-rs)** pour les bindings SSH robustes
- **[indicatif](https://github.com/console-rs/indicatif)** pour les barres de progression
- **[serde](https://github.com/serde-rs/serde)** pour la sérialisation JSON
- Communauté **Rust** pour l'écosystÚme exceptionnel
---
**xsshend** - *TĂ©lĂ©versement SSH simple et efficace* đ