xsshend 0.4.1

Simple CLI tool for uploading files to multiple SSH servers
Documentation

🚀 xsshend

Crates.io Documentation License: MIT Rust

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é)

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)

# 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

# Utiliser tous les cƓurs CPU disponibles
cargo install xsshend -j $(nproc)

Depuis les sources

git clone https://github.com/willisback/xsshend.git
cd xsshend
cargo install --path .

📚 Documentation

✹ 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

# 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 :

{
  "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

# 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

# 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

# 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

# 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

# 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
# Configuration initiale interactive
xsshend init

# Réinitialisation complÚte
xsshend init --force

Format des entrées serveur

Chaque serveur est défini avec :

{
  "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

# 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 :

# 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

# 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)"

# 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"

# Utiliser la commande d'initialisation
xsshend init

# Ou créer manuellement
mkdir -p ~/.ssh
nano ~/.ssh/hosts.json

Tests en échec

# 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

# 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 pour les détails.

🙏 Remerciements

  • clap-rs pour l'excellent framework CLI
  • ssh2-rs pour les bindings SSH robustes
  • indicatif pour les barres de progression
  • serde pour la sĂ©rialisation JSON
  • CommunautĂ© Rust pour l'Ă©cosystĂšme exceptionnel

xsshend - TĂ©lĂ©versement SSH simple et efficace 🚀