Déployer des Fichiers ZIP sur Mac via URLs
Déployer des applications et fichiers dans votre MacFleet peut être rationalisé en hébergeant des fichiers ZIP sur un serveur et en les téléchargeant automatiquement sur les appareils cibles. Ce tutoriel montre comment créer des scripts robustes pour le déploiement de fichiers ZIP via URLs.
Comprendre le Processus
Le processus de déploiement implique :
- Téléchargement - Récupérer le fichier ZIP depuis une URL avec
curl
- Extraction - Décompresser le contenu avec
unzip
- Installation - Optionnellement installer ou déplacer les fichiers vers leur emplacement final
- Nettoyage - Supprimer les fichiers temporaires
Script de Déploiement ZIP de Base
Téléchargement et Extraction Simple
#!/bin/bash
# Script de déploiement ZIP basique
cd /tmp
# Télécharger le fichier ZIP
curl -k https://example.com/myapp.zip -o "myapp.zip"
# Extraire le contenu
unzip "myapp.zip"
Script Entreprise Amélioré
Pour les environnements de production avec gestion d'erreurs et journalisation :
#!/bin/bash
# Script de Déploiement de Fichiers ZIP pour MacFleet
# Compatible avec macOS 10.14+
# Variables de configuration
DOWNLOAD_URL="$1" # Premier argument : URL vers le fichier ZIP
ZIP_NAME="$2" # Deuxième argument : nom du fichier ZIP
DESTINATION="${3:-/tmp}" # Troisième argument : destination (défaut : /tmp)
LOG_FILE="/var/log/zip_deployment.log"
# Fonction pour enregistrer les messages
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Fonction pour valider l'URL
validate_url() {
local url="$1"
if [[ ! "$url" =~ ^https?:// ]]; then
log_message "✗ Format d'URL invalide : $url"
return 1
fi
return 0
}
# Fonction pour vérifier la connectivité internet
check_connectivity() {
if ! ping -c 1 google.com &> /dev/null; then
log_message "✗ Pas de connectivité internet"
return 1
fi
return 0
}
# Fonction pour télécharger le fichier ZIP
download_zip() {
local url="$1"
local filename="$2"
local destination="$3"
log_message "Début du téléchargement depuis : $url"
# Créer le répertoire de destination s'il n'existe pas
mkdir -p "$destination"
cd "$destination" || return 1
# Télécharger avec progression et gestion d'erreurs
if curl -L --fail --connect-timeout 30 --max-time 300 \
--progress-bar "$url" -o "$filename"; then
log_message "✓ Téléchargement terminé : $filename"
return 0
else
log_message "✗ Échec du téléchargement depuis : $url"
return 1
fi
}
# Fonction pour extraire le fichier ZIP
extract_zip() {
local filename="$1"
local destination="$2"
cd "$destination" || return 1
# Vérifier si le fichier ZIP existe
if [[ ! -f "$filename" ]]; then
log_message "✗ Fichier ZIP non trouvé : $filename"
return 1
fi
# Tester l'intégrité du ZIP
if ! unzip -t "$filename" &> /dev/null; then
log_message "✗ Fichier ZIP corrompu : $filename"
return 1
fi
# Extraire les fichiers
if unzip -o "$filename"; then
log_message "✓ Extraction terminée : $filename"
return 0
else
log_message "✗ Échec de l'extraction : $filename"
return 1
fi
}
# Fonction pour installer l'application (si bundle .app trouvé)
install_application() {
local source_dir="$1"
# Chercher les bundles .app
local app_bundle
app_bundle=$(find "$source_dir" -name "*.app" -type d | head -1)
if [[ -n "$app_bundle" ]]; then
local app_name
app_name=$(basename "$app_bundle")
log_message "Bundle d'application trouvé : $app_name"
# Copier dans le dossier Applications
if cp -R "$app_bundle" "/Applications/"; then
log_message "✓ Application installée : $app_name"
return 0
else
log_message "✗ Échec de l'installation de l'application : $app_name"
return 1
fi
else
log_message "! Aucun bundle d'application trouvé pour l'installation"
return 0
fi
}
# Fonction pour nettoyer les fichiers temporaires
cleanup() {
local destination="$1"
local filename="$2"
cd "$destination" || return 1
if [[ -f "$filename" ]]; then
rm -f "$filename"
log_message "✓ Nettoyage terminé : $filename"
fi
}
# Fonction principale de déploiement
deploy_zip() {
log_message "=== Début du déploiement ZIP ==="
# Valider les entrées
if [[ -z "$DOWNLOAD_URL" ]] || [[ -z "$ZIP_NAME" ]]; then
log_message "✗ Usage : $0 <download_url> <zip_filename> [destination]"
return 1
fi
# Valider le format de l'URL
if ! validate_url "$DOWNLOAD_URL"; then
return 1
fi
# Vérifier la connectivité
if ! check_connectivity; then
return 1
fi
# Télécharger le fichier ZIP
if ! download_zip "$DOWNLOAD_URL" "$ZIP_NAME" "$DESTINATION"; then
return 1
fi
# Extraire le fichier ZIP
if ! extract_zip "$ZIP_NAME" "$DESTINATION"; then
return 1
fi
# Tentative d'installation d'application
install_application "$DESTINATION"
# Nettoyer le fichier ZIP temporaire
cleanup "$DESTINATION" "$ZIP_NAME"
log_message "=== Déploiement ZIP terminé avec succès ==="
return 0
}
# Exécuter la fonction principale
if deploy_zip; then
exit 0
else
log_message "=== Échec du déploiement ZIP ==="
exit 1
fi
Scripts de Déploiement Rapide
Téléchargement vers Applications
#!/bin/bash
# Télécharger et installer l'app directement dans Applications
URL="https://example.com/MyApp.zip"
ZIP_NAME="MyApp.zip"
cd /tmp
curl -L "$URL" -o "$ZIP_NAME"
unzip "$ZIP_NAME"
# Trouver et déplacer le bundle .app
APP_BUNDLE=$(find . -name "*.app" -type d | head -1)
if [[ -n "$APP_BUNDLE" ]]; then
cp -R "$APP_BUNDLE" /Applications/
echo "Application installée avec succès"
fi
# Nettoyage
rm -f "$ZIP_NAME"
rm -rf "${ZIP_NAME%.zip}"
Téléchargement avec Vérification de Somme de Contrôle
#!/bin/bash
URL="https://example.com/myapp.zip"
ZIP_NAME="myapp.zip"
EXPECTED_SHA256="abc123..." # Remplacer par la vraie somme de contrôle
cd /tmp
curl -L "$URL" -o "$ZIP_NAME"
# Vérifier la somme de contrôle
if echo "$EXPECTED_SHA256 $ZIP_NAME" | shasum -a 256 -c; then
echo "Somme de contrôle vérifiée"
unzip "$ZIP_NAME"
else
echo "Échec de la vérification de la somme de contrôle"
exit 1
fi
Exemples d'Usage
Usage en Ligne de Commande
# Usage basique
./deploy_zip.sh "https://example.com/app.zip" "app.zip"
# Destination personnalisée
./deploy_zip.sh "https://example.com/app.zip" "app.zip" "/Applications"
# Avec journalisation
./deploy_zip.sh "https://example.com/app.zip" "app.zip" 2>&1 | tee deployment.log
Déploiement MacFleet
#!/bin/bash
# Déployer plusieurs applications
APPS=(
"https://cdn.example.com/productivity.zip:productivity.zip"
"https://cdn.example.com/security.zip:security.zip"
"https://cdn.example.com/utilities.zip:utilities.zip"
)
for app in "${APPS[@]}"; do
IFS=':' read -r url filename <<< "$app"
echo "Déploiement : $filename"
./deploy_zip.sh "$url" "$filename"
done
Dépannage
Problème | Solution |
---|---|
Échec du téléchargement | Vérifier l'accessibilité de l'URL et la connexion internet |
Erreurs d'extraction ZIP | Vérifier l'intégrité du fichier ZIP avec unzip -t |
Permission refusée | Exécuter le script avec des privilèges admin |
App ne s'installe pas | Vérifier la présence d'un bundle .app dans le contenu extrait |
Téléchargements lents | Augmenter les valeurs de timeout de curl |
Considérations de Sécurité
- URLs HTTPS - Toujours utiliser des connexions sécurisées quand possible
- Vérification de somme de contrôle - Vérifier l'intégrité des fichiers avant extraction
- Signature de code - Vérifier les signatures d'application avant installation
- Téléchargements isolés - Utiliser
/tmp
pour le stockage temporaire
Référence d'Emplacements de Fichiers
- Fichiers temporaires :
/tmp/
- Applications :
/Applications/
- Applications utilisateur :
~/Applications/
- Utilitaires système :
/usr/local/bin/
- Journaux :
/var/log/zip_deployment.log
Fonctionnalités Avancées
Surveillance de Progression
# Afficher la progression du téléchargement
curl --progress-bar -L "$URL" -o "$ZIP_NAME"
# Ou avec progression détaillée
curl -# -L "$URL" -o "$ZIP_NAME"
Logique de Nouvelle Tentative
# Réessayer le téléchargement jusqu'à 3 fois
for i in {1..3}; do
if curl -L "$URL" -o "$ZIP_NAME"; then
break
elif [[ $i -eq 3 ]]; then
echo "Échec du téléchargement après 3 tentatives"
exit 1
fi
sleep 5
done
Notes Importantes
- Les fichiers ZIP sont temporairement stockés dans
/tmp
par défaut - Utiliser des URLs HTTPS sécurisées quand possible
- Tester les scripts sur un petit groupe avant le déploiement d'entreprise
- Surveiller l'espace disque lors du déploiement de gros fichiers
- Considérer les limitations de bande passante de votre réseau