Gestion Entreprise de l'Arrêt et du Redémarrage pour macOS
Implémentez une gestion d'arrêt et de redémarrage de niveau entreprise sur votre déploiement MacFleet avec la planification automatisée de maintenance, les procédures d'arrêt en douceur, la validation de sécurité et la gestion complète de l'alimentation de la flotte. Ce tutoriel fournit des solutions pour maintenir la continuité opérationnelle tout en assurant des opérations d'alimentation système sécurisées et efficaces.
Comprendre la Gestion d'Arrêt et de Redémarrage macOS
macOS fournit plusieurs mécanismes et outils de contrôle d'alimentation :
shutdown
- Outil principal en ligne de commande pour le contrôle d'alimentation systèmereboot
- Commande alternative de redémarragehalt
- Arrêt du système sans extinction- Menu Apple - Interface d'arrêt via GUI
- Bouton d'alimentation - Contrôle d'alimentation au niveau matériel
Opérations d'Arrêt de Base
Arrêt Instantané
#!/bin/bash
# Arrêter le Mac instantanément
sudo shutdown -h now
Redémarrage Programmé
#!/bin/bash
# Redémarrer le Mac dans 5 minutes
sudo shutdown -r +5
Arrêt à une Heure Spécifique
#!/bin/bash
# Arrêt à une heure spécifique : 18 octobre, 16:11:00 2022
sudo shutdown -h 2210181611
Redémarrage avec Message d'Avertissement
#!/bin/bash
# Redémarrer avec message d'avertissement
sudo shutdown -r +2 "le système redémarrera dans 2 minutes"
Veille d'Écran et Verrouillage
#!/bin/bash
# Verrouiller l'appareil et éteindre l'écran
sudo shutdown -s
Système de Gestion d'Arrêt et de Redémarrage Entreprise
Outil de Gestion d'Alimentation Complet
#!/bin/bash
# Outil de Gestion d'Arrêt et de Redémarrage Entreprise MacFleet
# Contrôle d'alimentation avancé et planification de maintenance
# Configuration
CONFIG_FILE="/etc/macfleet/shutdown_policy.conf"
LOG_FILE="/var/log/macfleet_shutdown.log"
SCHEDULES_DIR="/Library/MacFleet/ShutdownSchedules"
AUDIT_LOG="/var/log/macfleet_shutdown_audit.log"
# Créer les répertoires
mkdir -p "$(dirname "$CONFIG_FILE")" "$(dirname "$LOG_FILE")" "$SCHEDULES_DIR" "$(dirname "$AUDIT_LOG")"
# Politique de gestion d'arrêt par défaut
cat > "$CONFIG_FILE" 2>/dev/null << 'EOF' || true
# Politique de Gestion d'Arrêt et de Redémarrage Entreprise MacFleet
# Version : 2.0
# Application des Politiques d'Arrêt
ENFORCE_SHUTDOWN_POLICIES=true
GRACEFUL_SHUTDOWN_ENABLED=true
SAVE_WORK_BEFORE_SHUTDOWN=true
FORCE_SHUTDOWN_TIMEOUT=300
WARNING_NOTIFICATION_TIME=300
# Sécurité et Sûreté
REQUIRE_ADMIN_APPROVAL=false
VALIDATE_USER_SESSIONS=true
CHECK_RUNNING_PROCESSES=true
BACKUP_BEFORE_SHUTDOWN=false
ENCRYPTION_KEY_PROTECTION=true
# Fenêtres de Maintenance
MAINTENANCE_WINDOW_ENABLED=true
MAINTENANCE_START_TIME="02:00"
MAINTENANCE_END_TIME="06:00"
MAINTENANCE_DAYS="MTWRF"
WEEKEND_MAINTENANCE_ENABLED=true
HOLIDAY_MAINTENANCE_DISABLED=true
# Protection des Heures de Bureau
BUSINESS_HOURS_START="09:00"
BUSINESS_HOURS_END="18:00"
PREVENT_SHUTDOWN_BUSINESS_HOURS=true
EMERGENCY_SHUTDOWN_OVERRIDE=true
CRITICAL_SYSTEM_PROTECTION=true
# Notification et Communication
USER_NOTIFICATION_ENABLED=true
ADMIN_NOTIFICATION_ENABLED=true
SLACK_WEBHOOK_URL=""
EMAIL_NOTIFICATION_ENABLED=false
NOTIFICATION_LEAD_TIME=600
# Planification Automatique
AUTO_REBOOT_ENABLED=true
AUTO_REBOOT_FREQUENCY="weekly"
AUTO_REBOOT_DAY="sunday"
AUTO_REBOOT_TIME="03:00"
PATCH_REBOOT_REQUIRED=true
EOF
# Charger la configuration
source "$CONFIG_FILE" 2>/dev/null || true
# Fonction de journalisation
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Fonction de journalisation d'audit
audit_log() {
local action="$1"
local result="$2"
local details="$3"
echo "$(date '+%Y-%m-%d %H:%M:%S') - ACTION:$action RESULT:$result DETAILS:$details USER:$(whoami)" >> "$AUDIT_LOG"
}
# Vérifier si l'arrêt est autorisé
check_shutdown_allowed() {
local operation="$1"
local force="${2:-false}"
echo "=== Validation de l'Autorisation d'Arrêt ==="
# Vérifier la protection des heures de bureau
if [[ "$PREVENT_SHUTDOWN_BUSINESS_HOURS" == "true" && "$force" != "true" ]]; then
local current_hour
current_hour=$(date +%H)
local start_hour
start_hour=$(echo "$BUSINESS_HOURS_START" | cut -d':' -f1)
local end_hour
end_hour=$(echo "$BUSINESS_HOURS_END" | cut -d':' -f1)
if [[ $current_hour -ge $start_hour && $current_hour -lt $end_hour ]]; then
echo "❌ Arrêt bloqué : Actuellement en heures de bureau ($BUSINESS_HOURS_START - $BUSINESS_HOURS_END)"
log_action "ARRÊT BLOQUÉ : Protection des heures de bureau active"
audit_log "SHUTDOWN_BLOCKED" "BUSINESS_HOURS" "Opération : $operation Heure : $(date '+%H:%M')"
return 1
fi
fi
# Vérifier les sessions utilisateur actives
if [[ "$VALIDATE_USER_SESSIONS" == "true" ]]; then
local active_users
active_users=$(who | wc -l)
if [[ $active_users -gt 0 && "$force" != "true" ]]; then
echo "⚠️ Avertissement : $active_users session(s) utilisateur active(s) détectée(s)"
log_action "AVERTISSEMENT : Sessions utilisateur actives pendant $operation"
if [[ "$GRACEFUL_SHUTDOWN_ENABLED" != "true" ]]; then
echo "❌ Arrêt bloqué : Utilisateurs actifs et arrêt en douceur désactivé"
audit_log "SHUTDOWN_BLOCKED" "ACTIVE_USERS" "Utilisateurs : $active_users Opération : $operation"
return 1
fi
fi
fi
# Vérifier les processus critiques en cours
if [[ "$CHECK_RUNNING_PROCESSES" == "true" ]]; then
local critical_processes=(
"backupd"
"softwareupdate"
"installer"
"diskutil"
"fsck"
)
for process in "${critical_processes[@]}"; do
if pgrep -f "$process" >/dev/null 2>&1; then
echo "⚠️ Processus critique en cours : $process"
if [[ "$force" != "true" ]]; then
echo "❌ Arrêt bloqué : Le processus critique $process est en cours"
log_action "ARRÊT BLOQUÉ : Processus critique $process en cours"
audit_log "SHUTDOWN_BLOCKED" "CRITICAL_PROCESS" "Processus : $process Opération : $operation"
return 1
else
echo "🚨 Arrêt forcé : Terminera le processus critique $process"
log_action "ARRÊT FORCÉ : Termination du processus critique $process"
fi
fi
done
fi
echo "✅ Autorisation d'arrêt validée"
audit_log "SHUTDOWN_AUTHORIZED" "APPROVED" "Opération : $operation"
return 0
}
# Envoyer une notification avant l'arrêt
send_shutdown_notification() {
local operation="$1"
local delay_minutes="$2"
local message="$3"
echo "=== Envoi des Notifications d'Arrêt ==="
local notification_title="Notification $operation Système MacFleet"
local notification_message="${message:-$operation système programmé dans $delay_minutes minutes}"
# Notification utilisateur
if [[ "$USER_NOTIFICATION_ENABLED" == "true" ]]; then
# Afficher la notification à tous les utilisateurs connectés
local logged_users
logged_users=$(who | awk '{print $1}' | sort -u)
for user in $logged_users; do
if [[ -n "$user" ]]; then
sudo -u "$user" osascript -e "display notification \"$notification_message\" with title \"$notification_title\"" 2>/dev/null || true
echo "📱 Notification envoyée à l'utilisateur : $user"
fi
done
# Notification terminal
wall "$notification_title : $notification_message" 2>/dev/null || true
fi
log_action "Notifications d'arrêt envoyées pour $operation (délai : $delay_minutes minutes)"
}
# Arrêt en douceur avec gestion des sessions utilisateur
graceful_shutdown() {
local operation="$1"
local delay_minutes="$2"
local message="$3"
echo "=== Initiation de l'$operation en Douceur ==="
# Envoyer la notification initiale
send_shutdown_notification "$operation" "$delay_minutes" "$message"
# Sauvegarder le travail utilisateur si activé
if [[ "$SAVE_WORK_BEFORE_SHUTDOWN" == "true" ]]; then
echo "💾 Tentative de sauvegarde du travail utilisateur..."
# Essayer de sauvegarder le travail dans les applications courantes
local save_commands=(
"osascript -e 'tell application \"System Events\" to keystroke \"s\" using command down'"
"pkill -USR1 TextEdit" # Signal TextEdit pour sauvegarder
)
for cmd in "${save_commands[@]}"; do
eval "$cmd" 2>/dev/null || true
done
log_action "Tentative de sauvegarde du travail utilisateur avant $operation"
fi
# Protection des clés FileVault
if [[ "$ENCRYPTION_KEY_PROTECTION" == "true" ]]; then
echo "🔐 Assurance de la sécurité des clés FileVault..."
sudo pmset -a destroyfvkeyonstandby 1 2>/dev/null || true
log_action "Protection des clés FileVault activée avant $operation"
fi
# Attendre la période de délai avec compte à rebours
if [[ $delay_minutes -gt 0 ]]; then
echo "⏱️ Attente de $delay_minutes minutes avant $operation..."
local remaining_seconds=$((delay_minutes * 60))
local notification_intervals=(300 120 60 30 10) # 5min, 2min, 1min, 30s, 10s
while [[ $remaining_seconds -gt 0 ]]; do
# Envoyer des rappels de notification à des intervalles spécifiques
for interval in "${notification_intervals[@]}"; do
if [[ $remaining_seconds -eq $interval ]]; then
local remaining_minutes=$((remaining_seconds / 60))
if [[ $remaining_minutes -gt 0 ]]; then
send_shutdown_notification "$operation" "$remaining_minutes" "Avertissement final : $operation système dans $remaining_minutes minute(s)"
else
send_shutdown_notification "$operation" "0" "Avertissement final : $operation système dans $remaining_seconds secondes"
fi
break
fi
done
sleep 1
remaining_seconds=$((remaining_seconds - 1))
done
fi
echo "✅ Préparation de l'$operation en douceur terminée"
log_action "Préparation de l'$operation en douceur terminée"
}
# Arrêt entreprise avec validation complète
enterprise_shutdown() {
local delay="${1:-now}"
local message="$2"
local force="${3:-false}"
echo "=== Arrêt Entreprise Initié ==="
# Valider l'autorisation d'arrêt
if ! check_shutdown_allowed "arrêt" "$force"; then
return 1
fi
# Analyser le délai
local delay_minutes=0
if [[ "$delay" != "now" ]]; then
if [[ "$delay" =~ ^\+([0-9]+)$ ]]; then
delay_minutes="${BASH_REMATCH[1]}"
else
echo "❌ Format de délai invalide. Utilisez 'now' ou '+minutes'"
return 1
fi
fi
# Arrêt en douceur si activé
if [[ "$GRACEFUL_SHUTDOWN_ENABLED" == "true" ]]; then
graceful_shutdown "arrêt" "$delay_minutes" "$message"
fi
# Journaliser l'action d'arrêt
log_action "ARRÊT ENTREPRISE : Exécution de l'arrêt avec délai : $delay"
audit_log "SHUTDOWN" "INITIATED" "Délai : $delay Message : ${message:-Aucun} Force : $force"
# Exécuter l'arrêt
if [[ "$delay" == "now" ]]; then
echo "🔌 Exécution de l'arrêt immédiat..."
sudo shutdown -h now "$message"
else
echo "🔌 Programmation de l'arrêt dans $delay_minutes minutes..."
sudo shutdown -h +"$delay_minutes" "$message"
fi
audit_log "SHUTDOWN" "EXECUTED" "Commande terminée avec succès"
return 0
}
# Redémarrage entreprise avec validation complète
enterprise_reboot() {
local delay="${1:-now}"
local message="$2"
local force="${3:-false}"
echo "=== Redémarrage Entreprise Initié ==="
# Valider l'autorisation de redémarrage
if ! check_shutdown_allowed "redémarrage" "$force"; then
return 1
fi
# Analyser le délai
local delay_minutes=0
if [[ "$delay" != "now" ]]; then
if [[ "$delay" =~ ^\+([0-9]+)$ ]]; then
delay_minutes="${BASH_REMATCH[1]}"
else
echo "❌ Format de délai invalide. Utilisez 'now' ou '+minutes'"
return 1
fi
fi
# Redémarrage en douceur si activé
if [[ "$GRACEFUL_SHUTDOWN_ENABLED" == "true" ]]; then
graceful_shutdown "redémarrage" "$delay_minutes" "$message"
fi
# Journaliser l'action de redémarrage
log_action "REDÉMARRAGE ENTREPRISE : Exécution du redémarrage avec délai : $delay"
audit_log "REBOOT" "INITIATED" "Délai : $delay Message : ${message:-Aucun} Force : $force"
# Exécuter le redémarrage
if [[ "$delay" == "now" ]]; then
echo "🔄 Exécution du redémarrage immédiat..."
sudo shutdown -r now "$message"
else
echo "🔄 Programmation du redémarrage dans $delay_minutes minutes..."
sudo shutdown -r +"$delay_minutes" "$message"
fi
audit_log "REBOOT" "EXECUTED" "Commande terminée avec succès"
return 0
}
# Programmer un redémarrage de maintenance
schedule_maintenance_reboot() {
local schedule_time="$1"
local reason="$2"
echo "=== Programmation d'un Redémarrage de Maintenance ==="
if [[ -z "$schedule_time" ]]; then
echo "❌ Heure de programmation requise (format : AAMMJJHHMM)"
return 1
fi
# Valider le format de l'heure de programmation
if [[ ! "$schedule_time" =~ ^[0-9]{10}$ ]]; then
echo "❌ Format d'heure de programmation invalide. Utilisez AAMMJJHHMM"
return 1
fi
# Vérifier si l'heure programmée est dans la fenêtre de maintenance
if [[ "$MAINTENANCE_WINDOW_ENABLED" == "true" ]]; then
local schedule_hour
schedule_hour=$(echo "$schedule_time" | cut -c 7-8)
local maintenance_start_hour
maintenance_start_hour=$(echo "$MAINTENANCE_START_TIME" | cut -d':' -f1)
local maintenance_end_hour
maintenance_end_hour=$(echo "$MAINTENANCE_END_TIME" | cut -d':' -f1)
if [[ $schedule_hour -lt $maintenance_start_hour || $schedule_hour -ge $maintenance_end_hour ]]; then
echo "⚠️ Avertissement : Heure programmée en dehors de la fenêtre de maintenance ($MAINTENANCE_START_TIME - $MAINTENANCE_END_TIME)"
fi
fi
# Programmer le redémarrage
local message="Redémarrage de maintenance programmé : ${reason:-Maintenance système}"
log_action "REDÉMARRAGE DE MAINTENANCE PROGRAMMÉ : Heure : $schedule_time Raison : ${reason:-Maintenance système}"
audit_log "MAINTENANCE_SCHEDULED" "CREATED" "Heure : $schedule_time Raison : ${reason:-Maintenance système}"
echo "🗓️ Programmation du redémarrage de maintenance..."
sudo shutdown -r "$schedule_time" "$message"
echo "✅ Redémarrage de maintenance programmé pour $(date -j -f "%Y%m%d%H%M" "20$schedule_time" "+%Y-%m-%d %H:%M")"
return 0
}
# Annuler les opérations programmées
cancel_scheduled_operation() {
echo "=== Annulation des Opérations Programmées ==="
# Obtenir la liste des opérations programmées
local scheduled_ops
scheduled_ops=$(ps aux | grep "shutdown" | grep -v grep | wc -l)
if [[ $scheduled_ops -eq 0 ]]; then
echo "ℹ️ Aucune opération d'arrêt/redémarrage programmée trouvée"
return 0
fi
# Annuler les opérations d'arrêt
if sudo pkill -f "shutdown"; then
echo "✅ Opérations d'arrêt/redémarrage programmées annulées"
log_action "Opérations d'arrêt/redémarrage programmées annulées"
audit_log "SCHEDULE_CANCELLED" "SUCCESS" "Opérations annulées par $(whoami)"
# Notifier les utilisateurs de l'annulation
send_shutdown_notification "annulation" "0" "L'opération système programmée a été annulée"
else
echo "❌ Échec de l'annulation des opérations programmées"
log_action "ÉCHEC : Impossible d'annuler les opérations programmées"
audit_log "SCHEDULE_CANCELLED" "FAILED" "Tentative d'annulation par $(whoami)"
return 1
fi
return 0
}
# Arrêt d'urgence (contourne toutes les vérifications)
emergency_shutdown() {
local reason="$1"
echo "🚨 ARRÊT D'URGENCE INITIÉ 🚨"
if [[ -z "$reason" ]]; then
echo "❌ Raison d'urgence requise"
return 1
fi
log_action "ARRÊT D'URGENCE : Raison : $reason"
audit_log "EMERGENCY_SHUTDOWN" "INITIATED" "Raison : $reason Utilisateur : $(whoami)"
# Envoyer une notification d'urgence
send_shutdown_notification "ARRÊT D'URGENCE" "0" "URGENCE : Arrêt système initié - $reason"
# Exécuter l'arrêt immédiat forcé
echo "🔌 Exécution de l'arrêt d'urgence (forcé)..."
sudo shutdown -h now "ARRÊT D'URGENCE : $reason"
audit_log "EMERGENCY_SHUTDOWN" "EXECUTED" "Arrêt immédiat terminé"
}
# Vérifier l'état du système pour la préparation à l'arrêt
check_system_status() {
echo "=== Vérification de l'État du Système ==="
local status_issues=()
local status_warnings=()
# Vérifier le temps de fonctionnement
local uptime_seconds
uptime_seconds=$(uptime | awk '{print $3}' | cut -d',' -f1)
echo "Temps de Fonctionnement Système : $uptime_seconds"
# Vérifier la charge moyenne
local load_average
load_average=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | tr -d ',')
if (( $(echo "$load_average > 5.0" | bc -l) )); then
status_warnings+=("Charge système élevée : $load_average")
fi
# Vérifier l'espace disque
local disk_usage
disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [[ $disk_usage -gt 90 ]]; then
status_warnings+=("Espace disque faible : ${disk_usage}% utilisé")
fi
# Vérifier les mises à jour en attente
if softwareupdate -l 2>/dev/null | grep -q "Software Update found"; then
status_warnings+=("Mises à jour logicielles en attente disponibles")
fi
# Rapporter l'état
if [[ ${#status_issues[@]} -eq 0 && ${#status_warnings[@]} -eq 0 ]]; then
echo "✅ État du système : Prêt pour arrêt/redémarrage"
return 0
else
if [[ ${#status_issues[@]} -gt 0 ]]; then
echo "❌ Problèmes d'état du système :"
printf ' - %s\n' "${status_issues[@]}"
fi
if [[ ${#status_warnings[@]} -gt 0 ]]; then
echo "⚠️ Avertissements d'état du système :"
printf ' - %s\n' "${status_warnings[@]}"
fi
return 1
fi
}
# Fonction principale avec gestion d'arguments
main() {
log_action "=== Outil de Gestion d'Arrêt MacFleet Démarré ==="
case "${1:-status}" in
"shutdown")
enterprise_shutdown "$2" "$3" "$4"
;;
"reboot")
enterprise_reboot "$2" "$3" "$4"
;;
"schedule")
schedule_maintenance_reboot "$2" "$3"
;;
"cancel")
cancel_scheduled_operation
;;
"emergency")
emergency_shutdown "$2"
;;
"status")
check_system_status
;;
*)
echo "Outil de Gestion d'Arrêt et de Redémarrage Entreprise MacFleet"
echo "Usage : $0 [commande] [options]"
echo ""
echo "Commandes :"
echo " shutdown [délai] [message] [force] - Arrêter le système avec délai optionnel"
echo " reboot [délai] [message] [force] - Redémarrer le système avec délai optionnel"
echo " schedule [heure] [raison] - Programmer un redémarrage de maintenance (AAMMJJHHMM)"
echo " cancel - Annuler les opérations programmées"
echo " emergency [raison] - Arrêt d'urgence (contourne les vérifications)"
echo " status - Vérifier l'état du système pour préparation à l'arrêt"
echo ""
echo "Formats de Délai :"
echo " now - Opération immédiate"
echo " +minutes - Délai en minutes (ex : +5)"
echo ""
echo "Exemples :"
echo " $0 shutdown now - Arrêt immédiat"
echo " $0 reboot +10 \"Maintenance système\" - Redémarrer dans 10 minutes avec message"
echo " $0 schedule 2501020300 \"Patch Tuesday\" - Programmer redémarrage 2 jan, 3h00"
echo " $0 emergency \"Incident de sécurité\" - Arrêt d'urgence"
;;
esac
log_action "=== Opération de gestion d'arrêt terminée ==="
}
# Exécuter la fonction principale
main "$@"
Notes de Configuration Importantes
Options de Commande d'Arrêt macOS
-h
- Arrêter le système (shutdown)-r
- Redémarrer le système (reboot)-s
- Mettre le système en veille (écran éteint + verrouillage)- Formats d'heure -
now
,+minutes
,AAMMJJHHMM
- Messages d'avertissement - Texte supplémentaire affiché aux utilisateurs
Points d'Intégration Entreprise
- Systèmes de Gestion des Changements - Intégration avec les plateformes ITSM
- Systèmes de Surveillance - Suivi en temps réel des événements d'arrêt
- Solutions de Sauvegarde - Automatisation de sauvegarde pré-arrêt
- Cadres de Sécurité - Conformité avec les politiques d'arrêt
Bonnes Pratiques pour la Gestion d'Arrêt Entreprise
-
Continuité Opérationnelle
- Implémenter des procédures d'arrêt en douceur avec notifications utilisateur
- Valider la préparation du système avant les opérations d'arrêt
- Maintenir des capacités de contournement d'urgence pour les situations critiques
- Programmer les opérations de maintenance pendant les fenêtres désignées
-
Sécurité et Conformité
- Activer la journalisation d'audit complète pour toutes les opérations d'alimentation
- Implémenter la protection des clés FileVault pendant l'arrêt
- Valider les sessions utilisateur et les processus en cours avant l'arrêt
- Maintenir la conformité avec les exigences réglementaires d'arrêt
-
Gestion des Changements
- Exiger l'approbation pour les opérations d'arrêt non programmées
- Documenter tous les arrêts liés à la maintenance
- Intégrer avec les plateformes ITSM pour le suivi des changements
- Maintenir les informations de contact d'urgence pour les situations critiques
-
Expérience Utilisateur
- Fournir un avertissement adéquat avant les opérations d'arrêt
- Tenter de sauvegarder le travail utilisateur avant l'arrêt système
- Envoyer des notifications via plusieurs canaux (GUI, email, Slack)
- Permettre l'annulation des opérations programmées le cas échéant
Dépannage des Problèmes Courants
- Erreurs de permissions - S'assurer des privilèges administrateur pour les commandes d'arrêt
- Conflits d'opérations programmées - Vérifier les arrêts programmés existants
- Échecs de notification réseau - Vérifier les URLs webhook et la connectivité réseau
- Échecs de sauvegarde - Vérifier l'espace disque et la disponibilité de destination de sauvegarde
- Violations de fenêtre de maintenance - Examiner les heures de bureau et les horaires de maintenance
N'oubliez pas de tester minutieusement les procédures d'arrêt dans un environnement contrôlé avant l'implémentation sur l'ensemble de votre MacFleet pour assurer la continuité des activités et la protection des données.