Feuille classe

De Travail-ivan
#!/bin/bash

# Script de redimensionnement automatique de partition
# À utiliser avec précaution - Faire une sauvegarde avant utilisation

# Vérification des privilèges root
if [ "$EUID" -ne 0 ]; then
    echo "Ce script doit être exécuté en tant que root"
    exit 1
fi

# Fonction pour vérifier les outils nécessaires
check_prerequisites() {
    local prerequisites=("parted" "e2fsprogs" "fdisk")
    local missing_tools=()

    for tool in "${prerequisites[@]}"; do
        if ! command -v $tool &> /dev/null; then
            missing_tools+=($tool)
        fi
    done

    if [ ${#missing_tools[@]} -ne 0 ]; then
        echo "Installation des outils manquants : ${missing_tools[*]}"
        apt-get update
        apt-get install -y "${missing_tools[@]}"
    fi
}

# Fonction pour calculer l'espace total et utilisé
calculate_space() {
    local disk="/dev/sda"
    
    # Obtenir la taille totale du disque en secteurs
    local total_sectors=$(fdisk -l "$disk" | grep "Disk $disk" | awk '{print $7}')
    
    # Obtenir la dernière position utilisée en secteurs
    local last_used_sector=$(fdisk -l "$disk" | grep "^$disk" | sort -k3 -n | tail -n1 | awk '{print $3}')
    
    # Calculer l'espace libre en secteurs
    local free_sectors=$((total_sectors - last_used_sector))
    
    # Convertir en GB (approximatif)
    local free_space_gb=$((free_sectors / 2097152))
    
    echo "Espace libre détecté : environ ${free_space_gb}GB"
    
    if [ $free_space_gb -lt 1 ]; then
        echo "Pas assez d'espace libre disponible"
        exit 1
    fi
    
    return $free_space_gb
}

# Fonction pour redimensionner avec fdisk
resize_with_fdisk() {
    local disk="/dev/sda"
    local partition_number="2"
    
    # Sauvegarder la table de partitions
    echo "Sauvegarde de la table de partitions..."
    sfdisk -d "$disk" > "/root/partition_table_backup_$(date +%Y%m%d_%H%M%S).sf"
    
    # Utiliser fdisk pour supprimer et recréer la partition
    echo "Redimensionnement de la partition..."
    
    # Créer une commande fdisk
    (
        echo "d"  # Supprimer
        echo "2"  # Partition 2
        echo "n"  # Nouvelle partition
        echo "p"  # Partition primaire
        echo "2"  # Numéro 2
        echo     # Premier secteur (défaut)
        echo     # Dernier secteur (défaut - utilise tout l'espace disponible avant la partition swap)
        echo "N"  # Ne pas supprimer la signature
        echo "w"  # Écrire les changements
    ) | fdisk "$disk"
    
    # Forcer le noyau à relire la table de partitions
    partprobe "$disk"
}

# Fonction principale
main() {
    local disk="/dev/sda"
    local partition="/dev/sda2"
    
    # Vérification des prérequis
    check_prerequisites
    
    # Calculer l'espace disponible
    calculate_space
    free_space=$?
    
    echo "Vous avez environ ${free_space}GB d'espace libre à utiliser"
    
    # Vérifier le système de fichiers
    echo "Vérification du système de fichiers..."
    e2fsck -f "$partition"
    
    # Redimensionner
    resize_with_fdisk
    
    # Redimensionner le système de fichiers
    echo "Redimensionnement du système de fichiers..."
    resize2fs "$partition"
    
    # Afficher le résultat
    echo "Nouvelle configuration :"
    df -h "$partition"
}

# Message d'avertissement
echo "ATTENTION: Ce script va redimensionner la partition système."
echo "Assurez-vous d'avoir fait une sauvegarde avant de continuer."
read -p "Voulez-vous continuer ? (o/N) " response

if [[ "$response" =~ ^[oO]$ ]]; then
    main
else
    echo "Opération annulée"
    exit 0
fi