Gestion d'Entreprise des Redémarrages Programmés sur macOS
Gérez et automatisez les redémarrages système de votre MacFleet avec des capacités de planification de niveau entreprise. Ce tutoriel couvre la planification avancée des redémarrages, les fenêtres de maintenance, les notifications utilisateur et le déploiement à l'échelle de la flotte avec surveillance de conformité.
Comprendre la Gestion des Redémarrages macOS
Les redémarrages programmés sont essentiels pour :
- 🔄 Maintenance système - Effacer la mémoire, appliquer les mises à jour, réinitialiser l'état système
- 🛡️ Conformité sécuritaire - S'assurer que les correctifs de sécurité sont actifs après installation
- ⚡ Optimisation performance - Réinitialiser l'utilisation des ressources et éliminer les fuites mémoire
- 🏢 Planification d'entreprise - Coordonner la maintenance sur des flottes entières
Planification de Base des Redémarrages
Redémarrage Programmé par Heure
#!/bin/bash
# Programmer un redémarrage à une heure spécifique (format 24h)
# Remplacer 0300 par l'heure de redémarrage désirée (03:00 AM)
sudo shutdown -r 0300
echo "✅ Redémarrage programmé pour 03:00"
Redémarrage Immédiat avec Délai
#!/bin/bash
# Programmer un redémarrage dans X minutes
MINUTES=30
sudo shutdown -r +$MINUTES
echo "✅ Redémarrage programmé dans $MINUTES minutes"
Annuler un Redémarrage Programmé
#!/bin/bash
# Annuler tout redémarrage en attente
sudo shutdown -c
echo "✅ Redémarrage programmé annulé"
Options de Planification Avancées
Redémarrage Conditionnel avec Vérifications Système
#!/bin/bash
# Redémarrer seulement si le système remplit des conditions spécifiques
perform_system_checks() {
echo "🔍 Exécution des vérifications système pré-redémarrage..."
# Vérifier la charge système
local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
local load_threshold=2.0
if (( $(echo "$load_avg > $load_threshold" | bc -l) )); then
echo "⚠️ Charge système trop élevée ($load_avg) - report du redémarrage"
return 1
fi
# Vérifier les processus critiques
local critical_processes=("backup" "sync" "deploy")
for process in "${critical_processes[@]}"; do
if pgrep -f "$process" > /dev/null; then
echo "⚠️ Processus critique '$process' en cours - report du redémarrage"
return 1
fi
done
# Vérifier l'espace disque disponible
local available_space=$(df / | tail -1 | awk '{print $4}')
local min_space=1048576 # 1GB en KB
if [[ $available_space -lt $min_space ]]; then
echo "⚠️ Espace disque insuffisant - report du redémarrage"
return 1
fi
echo "✅ Toutes les vérifications système réussies"
return 0
}
# Programmer le redémarrage seulement si les conditions sont remplies
if perform_system_checks; then
sudo shutdown -r +5
echo "✅ Redémarrage programmé dans 5 minutes"
else
echo "❌ Redémarrage reporté en raison des conditions système"
fi
Redémarrage Convivial avec Notifications
#!/bin/bash
# Redémarrage amélioré avec notifications utilisateur et période de grâce
graceful_restart() {
local delay_minutes="${1:-15}"
local restart_time="${2:-$(date -d "+$delay_minutes minutes" "+%H:%M")}"
echo "🔔 Programmation d'un redémarrage gracieux dans $delay_minutes minutes"
# Envoyer notification aux utilisateurs connectés
local logged_users=$(who | awk '{print $1}' | sort -u)
for user in $logged_users; do
sudo -u "$user" osascript -e "display notification \"Redémarrage système programmé pour $restart_time. Veuillez sauvegarder votre travail.\" with title \"Maintenance MacFleet\" sound name \"Glass\""
done
# Programmer le redémarrage
sudo shutdown -r "+$delay_minutes"
echo "✅ Redémarrage programmé pour $restart_time avec notifications utilisateur envoyées"
}
# Exécuter le redémarrage gracieux
graceful_restart 15
Fenêtres de Maintenance d'Entreprise
Planning de Maintenance Hebdomadaire
#!/bin/bash
# Programmer un redémarrage pendant la fenêtre de maintenance
schedule_maintenance_restart() {
local day_of_week=$(date +%u) # 1=Lundi, 7=Dimanche
local current_hour=$(date +%H)
local maintenance_day=7 # Dimanche
local maintenance_hour=03 # 3h du matin
# Calculer le temps jusqu'à la prochaine fenêtre de maintenance
local days_until_maintenance=$(( (maintenance_day - day_of_week) % 7 ))
if [[ $days_until_maintenance -eq 0 ]] && [[ $current_hour -ge $maintenance_hour ]]; then
days_until_maintenance=7 # Semaine prochaine si on a dépassé la fenêtre d'aujourd'hui
fi
local restart_date=$(date -d "+$days_until_maintenance days $maintenance_hour:00" "+%Y-%m-%d %H:%M")
local restart_timestamp=$(date -d "$restart_date" "+%m%d%H%M")
echo "📅 Programmation du redémarrage pour la prochaine fenêtre de maintenance : $restart_date"
# Utiliser la commande at pour une planification précise
echo "sudo shutdown -r now" | at "$restart_timestamp" 2>/dev/null
if [[ $? -eq 0 ]]; then
echo "✅ Redémarrage programmé pour la fenêtre de maintenance : $restart_date"
else
# Solution de repli si 'at' n'est pas disponible
echo "⚠️ Commande 'at' non disponible, utilisation de la planification immédiate"
sudo shutdown -r 0300 # 3h aujourd'hui/demain
fi
}
schedule_maintenance_restart
Protection des Heures de Bureau
#!/bin/bash
# Empêcher les redémarrages pendant les heures de bureau
business_hours_restart() {
local current_hour=$(date +%H)
local current_day=$(date +%u) # 1=Lundi, 7=Dimanche
local business_start=9
local business_end=17
# Vérifier si c'est un jour de semaine pendant les heures de bureau
if [[ $current_day -le 5 ]] && [[ $current_hour -ge $business_start ]] && [[ $current_hour -lt $business_end ]]; then
echo "🏢 Heures de bureau détectées - programmation du redémarrage après les heures de bureau"
if [[ $current_hour -lt 12 ]]; then
# Matin - programmer pour le soir
sudo shutdown -r 1800 # 18h
echo "✅ Redémarrage programmé pour 18:00 (après les heures de bureau)"
else
# Après-midi - programmer pour le lendemain tôt le matin
sudo shutdown -r 0600 # 6h le lendemain
echo "✅ Redémarrage programmé pour 06:00 demain (avant les heures de bureau)"
fi
else
echo "✅ En dehors des heures de bureau - redémarrage sûr"
sudo shutdown -r +5
echo "✅ Redémarrage programmé dans 5 minutes"
fi
}
business_hours_restart
Script de Gestion d'Entreprise de Flotte
#!/bin/bash
# Système de Gestion des Redémarrages d'Entreprise MacFleet
# Planification avancée, surveillance et déploiement de flotte
# Configuration
SCRIPT_NAME="MacFleet Restart Manager"
VERSION="3.0.0"
LOG_FILE="/var/log/macfleet_restart.log"
CONFIG_DIR="/etc/macfleet/restart"
SCHEDULE_DIR="/etc/macfleet/restart/schedules"
POLICY_DIR="/etc/macfleet/restart/policies"
AUDIT_DIR="/etc/macfleet/restart/audit"
# Créer les répertoires nécessaires
mkdir -p "$CONFIG_DIR" "$SCHEDULE_DIR" "$POLICY_DIR" "$AUDIT_DIR"
# Fonction de journalisation
log_action() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local message="$1"
echo "[$timestamp] $message" | tee -a "$LOG_FILE"
}
# Journalisation d'audit pour la conformité
log_restart_action() {
local action="$1"
local schedule_type="$2"
local restart_time="$3"
local user=$(whoami)
local hostname=$(hostname)
local audit_entry="{
\"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
\"hostname\": \"$hostname\",
\"user\": \"$user\",
\"action\": \"$action\",
\"schedule_type\": \"$schedule_type\",
\"restart_time\": \"$restart_time\",
\"script_version\": \"$VERSION\"
}"
echo "$audit_entry" >> "$AUDIT_DIR/restart_audit.json"
log_action "Action de redémarrage : $action - $schedule_type à $restart_time"
}
# Évaluation de la santé système
assess_system_health() {
echo "🏥 Évaluation de la santé système pour la préparation au redémarrage..."
local health_score=100
local issues=()
# Vérifier la charge système
local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
if (( $(echo "$load_avg > 3.0" | bc -l) )); then
health_score=$((health_score - 20))
issues+=("Charge système élevée : $load_avg")
fi
# Vérifier l'utilisation mémoire
local memory_pressure=$(memory_pressure | grep "System-wide memory free percentage" | awk '{print $5}' | sed 's/%//')
if [[ $memory_pressure -lt 10 ]]; then
health_score=$((health_score - 15))
issues+=("Mémoire faible : ${memory_pressure}% libre")
fi
# Vérifier l'espace disque
local disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [[ $disk_usage -gt 90 ]]; then
health_score=$((health_score - 10))
issues+=("Utilisation disque élevée : ${disk_usage}%")
fi
# Vérifier les processus critiques
local critical_procs=$(pgrep -f "(backup|sync|deploy|update)" | wc -l)
if [[ $critical_procs -gt 0 ]]; then
health_score=$((health_score - 25))
issues+=("Processus critiques en cours : $critical_procs")
fi
# Vérifier la connectivité réseau
if ! ping -c 1 -W 5 8.8.8.8 >/dev/null 2>&1; then
health_score=$((health_score - 5))
issues+=("Problème de connectivité réseau")
fi
# Générer le rapport de santé
local health_report="{
\"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
\"hostname\": \"$(hostname)\",
\"health_score\": $health_score,
\"issues\": [$(printf '\"%s\",' "${issues[@]}" | sed 's/,$//')]
}"
echo "$health_report" > "$AUDIT_DIR/health_assessment_$(date +%Y%m%d_%H%M%S).json"
echo "📊 Score de santé système : $health_score/100"
if [[ ${#issues[@]} -gt 0 ]]; then
echo "⚠️ Problèmes détectés :"
printf ' - %s\n' "${issues[@]}"
fi
# Retourner le score de santé (0 = échec, 1 = succès)
[[ $health_score -ge 70 ]]
}
# Système de notification avancé
send_restart_notifications() {
local restart_time="$1"
local minutes_until="$2"
local notification_type="${3:-standard}"
echo "🔔 Envoi des notifications de redémarrage..."
# Obtenir les utilisateurs connectés
local logged_users=$(who | awk '{print $1}' | sort -u)
# Messages de notification basés sur le type
case "$notification_type" in
"emergency")
local title="URGENCE : Redémarrage Système Requis"
local message="Mise à jour de sécurité critique nécessite un redémarrage immédiat à $restart_time"
local sound="Basso"
;;
"maintenance")
local title="Maintenance Programmée"
local message="Redémarrage système programmé pour $restart_time dans le cadre de la maintenance de routine"
local sound="Glass"
;;
*)
local title="Notification de Redémarrage Système"
local message="Redémarrage système programmé pour $restart_time. Veuillez sauvegarder votre travail."
local sound="Blow"
;;
esac
# Envoyer notifications à chaque utilisateur
for user in $logged_users; do
if [[ -n "$user" ]]; then
sudo -u "$user" osascript -e "display notification \"$message\" with title \"$title\" sound name \"$sound\"" 2>/dev/null
# Envoyer aussi un message terminal si l'utilisateur a un terminal ouvert
sudo -u "$user" wall "Avis MacFleet : $message" 2>/dev/null
fi
done
log_action "Notifications envoyées aux utilisateurs : $(echo $logged_users | tr '\n' ' ')"
}
# Planification intelligente de redémarrage
intelligent_restart() {
local schedule_type="$1"
local target_time="$2"
local force="${3:-false}"
echo "🧠 Initiation de la planification intelligente de redémarrage..."
# Évaluer la santé système sauf si forcé
if [[ "$force" != "true" ]]; then
if ! assess_system_health; then
echo "❌ Vérification de santé système échouée - redémarrage reporté"
log_restart_action "postponed" "$schedule_type" "$target_time"
return 1
fi
fi
case "$schedule_type" in
"immediate")
echo "⚡ Programmation d'un redémarrage immédiat..."
send_restart_notifications "dans 2 minutes" "2" "emergency"
sudo shutdown -r +2
;;
"maintenance")
echo "🔧 Programmation d'un redémarrage de maintenance..."
local delay_minutes=15
local restart_time=$(date -d "+$delay_minutes minutes" "+%H:%M")
send_restart_notifications "$restart_time" "$delay_minutes" "maintenance"
sudo shutdown -r "+$delay_minutes"
;;
"business_safe")
schedule_business_safe_restart
;;
"weekly")
schedule_weekly_maintenance
;;
"custom")
if [[ -n "$target_time" ]]; then
echo "🎯 Programmation d'un redémarrage personnalisé pour $target_time..."
send_restart_notifications "$target_time" "personnalisé" "standard"
sudo shutdown -r "$target_time"
else
echo "❌ Le redémarrage personnalisé nécessite une heure cible"
return 1
fi
;;
*)
echo "❌ Type de planification invalide : $schedule_type"
echo "Types disponibles : immediate, maintenance, business_safe, weekly, custom"
return 1
;;
esac
log_restart_action "scheduled" "$schedule_type" "${target_time:-auto}"
echo "✅ Redémarrage programmé avec succès"
}
# Planification de redémarrage sûre pour les affaires
schedule_business_safe_restart() {
local current_hour=$(date +%H)
local current_day=$(date +%u)
if [[ $current_day -le 5 ]] && [[ $current_hour -ge 9 ]] && [[ $current_hour -lt 17 ]]; then
echo "🏢 Heures de bureau détectées - programmation après les heures de bureau"
if [[ $current_hour -lt 12 ]]; then
sudo shutdown -r 1800 # 18h
send_restart_notifications "18:00" "après les heures de bureau" "maintenance"
else
sudo shutdown -r 0600 # 6h le lendemain
send_restart_notifications "06:00 demain" "tôt le matin" "maintenance"
fi
else
echo "✅ En dehors des heures de bureau - redémarrage sûr"
send_restart_notifications "dans 10 minutes" "10" "maintenance"
sudo shutdown -r +10
fi
}
# Planification de maintenance hebdomadaire
schedule_weekly_maintenance() {
local day_of_week=$(date +%u)
local maintenance_day=7 # Dimanche
local maintenance_hour=03
local days_until=$(( (maintenance_day - day_of_week) % 7 ))
if [[ $days_until -eq 0 ]] && [[ $(date +%H) -ge $maintenance_hour ]]; then
days_until=7
fi
local restart_date=$(date -d "+$days_until days $maintenance_hour:00" "+%Y-%m-%d %H:%M")
echo "📅 Programmation pour la prochaine fenêtre de maintenance : $restart_date"
# Utiliser launchd pour une planification précise (plus fiable que 'at')
create_maintenance_schedule "$restart_date"
}
# Créer un job launchd pour la planification de maintenance
create_maintenance_schedule() {
local restart_datetime="$1"
local plist_name="com.macfleet.maintenance.restart"
local plist_path="/Library/LaunchDaemons/${plist_name}.plist"
# Calculer l'intervalle de démarrage depuis l'époque
local start_time=$(date -j -f "%Y-%m-%d %H:%M" "$restart_datetime" "+%s" 2>/dev/null)
if [[ -n "$start_time" ]]; then
cat > "$plist_path" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>$plist_name</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/shutdown</string>
<string>-r</string>
<string>now</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>0</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
<key>RunAtLoad</key>
<false/>
</dict>
</plist>
EOF
# Charger le job
launchctl load "$plist_path"
echo "✅ Planning de maintenance créé et chargé"
else
echo "❌ Échec de l'analyse de la date/heure de redémarrage : $restart_datetime"
return 1
fi
}
# Déploiement de flotte
deploy_restart_schedule() {
local schedule_type="$1"
local target_time="$2"
local fleet_file="$CONFIG_DIR/fleet_hosts.txt"
if [[ ! -f "$fleet_file" ]]; then
echo "❌ Fichier des hôtes de flotte non trouvé : $fleet_file"
return 1
fi
echo "🚀 Déploiement du planning de redémarrage sur la flotte..."
echo "Type de Planning : $schedule_type"
echo "Heure Cible : ${target_time:-auto}"
local success_count=0
local total_count=0
while IFS= read -r host; do
[[ "$host" =~ ^#.*$ ]] && continue
[[ -z "$host" ]] && continue
((total_count++))
echo "Déploiement vers : $host"
# Déployer et exécuter
if scp "$0" "$host:/tmp/macfleet_restart.sh" >/dev/null 2>&1 && \
ssh "$host" "chmod +x /tmp/macfleet_restart.sh && sudo /tmp/macfleet_restart.sh --schedule '$schedule_type' ${target_time:+--time '$target_time'}" >/dev/null 2>&1; then
echo "✅ Déployé avec succès vers $host"
((success_count++))
else
echo "❌ Échec du déploiement vers $host"
fi
done < "$fleet_file"
echo "📊 Déploiement de flotte terminé : $success_count/$total_count réussi"
log_action "Déploiement de flotte : $success_count/$total_count hôtes réussis"
}
# Générer un rapport de conformité de redémarrage
generate_restart_report() {
local report_file="$AUDIT_DIR/restart_compliance_$(date +%Y%m%d_%H%M%S).json"
echo "📊 Génération du rapport de conformité de redémarrage..."
# Rassembler les informations système
local uptime_days=$(uptime | awk '{print $3}' | sed 's/,//')
local last_restart=$(last reboot | head -1 | awk '{print $3, $4, $5, $6}')
local pending_restart=$(sudo shutdown -q 2>&1 | grep -o "shutdown.*" || echo "aucun")
# Vérifier les mises à jour en attente
local pending_updates=$(softwareupdate -l 2>/dev/null | grep -c "recommended" || echo "0")
# Générer le rapport
local report="{
\"report_metadata\": {
\"generated_at\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
\"hostname\": \"$(hostname)\",
\"script_version\": \"$VERSION\",
\"compliance_frameworks\": [\"NIST\", \"ISO 27001\", \"SOX\", \"HIPAA\"]
},
\"system_status\": {
\"uptime_days\": \"$uptime_days\",
\"last_restart\": \"$last_restart\",
\"pending_restart\": \"$pending_restart\",
\"pending_updates\": $pending_updates
},
\"restart_history\": $(tail -10 "$LOG_FILE" 2>/dev/null | jq -R . | jq -s . || echo "[]"),
\"compliance_score\": $(calculate_restart_compliance_score "$uptime_days" "$pending_updates")
}"
echo "$report" > "$report_file"
echo "📋 Rapport de conformité sauvegardé : $report_file"
log_action "Rapport de conformité généré : $report_file"
}
# Calculer le score de conformité de redémarrage
calculate_restart_compliance_score() {
local uptime_days="$1"
local pending_updates="$2"
local score=100
# Déduire des points pour un temps de fonctionnement prolongé
if [[ "$uptime_days" =~ ^[0-9]+$ ]]; then
if [[ $uptime_days -gt 30 ]]; then
score=$((score - 30))
elif [[ $uptime_days -gt 14 ]]; then
score=$((score - 15))
elif [[ $uptime_days -gt 7 ]]; then
score=$((score - 5))
fi
fi
# Déduire des points pour les mises à jour en attente
if [[ "$pending_updates" =~ ^[0-9]+$ ]] && [[ $pending_updates -gt 0 ]]; then
score=$((score - (pending_updates * 10)))
fi
# S'assurer que le score est entre 0 et 100
[[ $score -lt 0 ]] && score=0
[[ $score -gt 100 ]] && score=100
echo "$score"
}
# Capacité de redémarrage d'urgence
emergency_restart() {
echo "🚨 REDÉMARRAGE D'URGENCE INITIÉ"
# Envoyer des notifications immédiates
send_restart_notifications "dans 60 secondes" "1" "emergency"
# Créer une entrée de journal d'urgence
log_restart_action "emergency" "immediate" "60 secondes"
# Forcer le redémarrage avec un délai minimal
sudo shutdown -r +1
echo "⚠️ REDÉMARRAGE D'URGENCE DANS 60 SECONDES"
}
# Vérification de statut
check_restart_status() {
echo "=== Statut de Redémarrage MacFleet ==="
# Temps de fonctionnement système
echo "🕐 Temps de Fonctionnement Système : $(uptime | awk '{print $3, $4}' | sed 's/,//')"
# Dernier redémarrage
echo "📅 Dernier Redémarrage : $(last reboot | head -1 | awk '{print $3, $4, $5, $6}')"
# Redémarrage en attente
local pending=$(sudo shutdown -q 2>&1 | grep -o "shutdown.*" || echo "aucun")
echo "⏰ Redémarrage en Attente : $pending"
# Santé système
if assess_system_health >/dev/null 2>&1; then
echo "🟢 Santé Système : Bonne"
else
echo "🔴 Santé Système : Problèmes détectés"
fi
# Mises à jour en attente
local updates=$(softwareupdate -l 2>/dev/null | grep -c "recommended" || echo "0")
echo "📦 Mises à Jour en Attente : $updates"
}
# Afficher l'utilisation
show_usage() {
cat << EOF
$SCRIPT_NAME v$VERSION
Utilisation : $0 [OPTION]
PLANIFICATION DE REDÉMARRAGE :
--schedule TYPE [TIME] Programmer un redémarrage (immediate|maintenance|business_safe|weekly|custom)
--emergency Redémarrage d'urgence (avertissement 60 secondes)
--cancel Annuler le redémarrage en attente
--status Afficher le statut de redémarrage actuel
GESTION DE FLOTTE :
--deploy-fleet TYPE [TIME] Déployer le planning de redémarrage sur toute la flotte
--generate-report Générer un rapport de conformité
EXEMPLES :
$0 --schedule immediate
$0 --schedule maintenance
$0 --schedule custom 0300
$0 --deploy-fleet weekly
$0 --emergency
$0 --status
Configuration :
$CONFIG_DIR/fleet_hosts.txt - Hôtes de déploiement de flotte
Journaux :
$LOG_FILE - Fichier de journal principal
$AUDIT_DIR/ - Journaux d'audit et de conformité
EOF
}
# Fonction principale
main() {
case "$1" in
--schedule)
[[ -z "$2" ]] && { echo "❌ Type de planification requis"; exit 1; }
intelligent_restart "$2" "$3"
;;
--emergency)
emergency_restart
;;
--cancel)
sudo shutdown -c 2>/dev/null && echo "✅ Redémarrage annulé" || echo "❌ Aucun redémarrage à annuler"
;;
--status)
check_restart_status
;;
--deploy-fleet)
[[ -z "$2" ]] && { echo "❌ Type de planification requis pour le déploiement de flotte"; exit 1; }
deploy_restart_schedule "$2" "$3"
;;
--generate-report)
generate_restart_report
;;
--help|"")
show_usage
;;
*)
echo "❌ Option invalide : $1"
show_usage
exit 1
;;
esac
}
# Exécuter la fonction principale
main "$@"
Politiques de Planification de Redémarrage
Politique d'Environnement de Production
#!/bin/bash
# Politique de redémarrage de production haute disponibilité
production_restart_policy() {
echo "🏭 Application de la politique de redémarrage de production..."
# Autoriser les redémarrages seulement pendant les fenêtres de maintenance désignées
local current_hour=$(date +%H)
local current_day=$(date +%u)
# Fenêtres de maintenance : Dimanches 2-4h, Jours de semaine 2-3h
local maintenance_allowed=false
if [[ $current_day -eq 7 ]] && [[ $current_hour -ge 2 ]] && [[ $current_hour -lt 4 ]]; then
maintenance_allowed=true
elif [[ $current_day -le 5 ]] && [[ $current_hour -ge 2 ]] && [[ $current_hour -lt 3 ]]; then
maintenance_allowed=true
fi
if [[ "$maintenance_allowed" == "true" ]]; then
echo "✅ Dans la fenêtre de maintenance - redémarrage autorisé"
return 0
else
echo "⛔ En dehors de la fenêtre de maintenance - redémarrage bloqué"
return 1
fi
}
Politique d'Environnement de Développement
#!/bin/bash
# Politique de redémarrage de développement flexible
development_restart_policy() {
echo "💻 Application de la politique de redémarrage de développement..."
# Planification plus flexible pour le développement
local current_hour=$(date +%H)
# Bloquer les redémarrages seulement pendant les heures de développement de pointe (9h-18h)
if [[ $current_hour -ge 9 ]] && [[ $current_hour -lt 18 ]]; then
echo "⚠️ Heures de développement de pointe - demande de confirmation"
# Dans une implémentation réelle, ceci pourrait déclencher un workflow d'approbation
echo "Le redémarrage sera programmé après les heures de pointe (18h)"
sudo shutdown -r 1800
return 0
else
echo "✅ En dehors des heures de pointe - redémarrage autorisé"
return 0
fi
}
Exemples d'Utilisation
Programmer un Redémarrage de Maintenance Immédiat
# Redémarrage d'urgence avec notifications utilisateur
sudo ./macfleet_restart.sh --schedule immediate
# Redémarrage de maintenance avec période de grâce de 15 minutes
sudo ./macfleet_restart.sh --schedule maintenance
Planification Sûre pour les Affaires
# Éviter automatiquement les heures de bureau
sudo ./macfleet_restart.sh --schedule business_safe
# Fenêtre de maintenance hebdomadaire
sudo ./macfleet_restart.sh --schedule weekly
Déploiement de Flotte
# Déployer un redémarrage immédiat sur toute la flotte
sudo ./macfleet_restart.sh --deploy-fleet immediate
# Déployer un planning de maintenance hebdomadaire
sudo ./macfleet_restart.sh --deploy-fleet weekly
Planification Personnalisée
# Programmer un redémarrage pour 3h du matin
sudo ./macfleet_restart.sh --schedule custom 0300
# Programmer un redémarrage pour 18h
sudo ./macfleet_restart.sh --schedule custom 1800
Conformité et Surveillance
Cadres de Conformité de Redémarrage
Cadre de Cybersécurité NIST
- 🛡️ Identifier : Suivre le temps de fonctionnement système et les exigences de redémarrage
- 🔒 Protéger : S'assurer que les mises à jour de sécurité sont appliquées via les redémarrages
- 🔍 Détecter : Surveiller les fenêtres de maintenance manquées
- 🚨 Réagir : Planification et application automatisées de redémarrage
- ♻️ Récupérer : Capacités de redémarrage d'urgence pour la réponse aux incidents
Conformité SOX
- 📋 Pistes d'audit pour toutes les activités de redémarrage
- 🔐 Contrôles d'accès pour la planification de redémarrage
- 📊 Rapports de conformité avec suivi du temps de fonctionnement système
Protections Techniques HIPAA
- 🏥 Maintenance système s'assurant que les correctifs de sécurité sont actifs
- 📝 Contrôles d'audit avec journalisation complète des redémarrages
Métriques de Surveillance
# Métriques clés suivies automatiquement :
# - Durée du temps de fonctionnement système
# - Horodatage du dernier redémarrage
# - Mises à jour logicielles en attente
# - Score de conformité de redémarrage
# - Tentatives de redémarrage échouées
# - Adhérence aux fenêtres de maintenance
Notes de Sécurité Importantes
- 🔐 Nécessite des privilèges administratifs pour la planification de redémarrage
- 📝 Toutes les activités de redémarrage sont auditées et journalisées pour la conformité
- 🔔 Les notifications utilisateur fournissent des périodes de grâce pour la sauvegarde du travail
- 🏥 Les vérifications de santé système empêchent les redémarrages pendant les opérations critiques
- ⏰ Protection des heures de bureau empêche la perturbation de la productivité
- 🚨 Override d'urgence disponible pour les incidents de sécurité critiques
Dépannage
Problèmes Courants
# Vérifier si un redémarrage est déjà programmé
sudo shutdown -q
# Annuler un redémarrage en attente
sudo shutdown -c
# Vérifier les journaux système pour les problèmes de redémarrage
log show --predicate 'eventMessage contains "shutdown"' --last 1d
# Vérifier les jobs launchd
launchctl list | grep macfleet
Échecs de Redémarrage
# Vérifier les processus empêchant le redémarrage
lsof +c 15 | grep COMMAND
# Forcer le redémarrage si le système ne répond pas
sudo shutdown -r now
# Vérifier la santé système avant une nouvelle tentative
./macfleet_restart.sh --status