Script : copy-system7-disks.sh

#!/bin/bash

# CONFIGURATION PAR DÉFAUT (modifiable via les invites)
DEFAULT_IMAGES_DIR="/home/ebest/Documents/7.5.3/7.5.3 Disk Images/System Software"

# Couleurs
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

# Liste des disquettes dans l'ordre
DISKS=(
    "Disk Tools 1.image"
    "Install Disk 1.image"
    "Install Disk 2.image"
    "Install Disk 3.image"
    "Install Disk 4.image"
    "Install Disk 5.image"
    "Install Disk 6.image"
    "Install Disk 7.image"
    "Install Disk 8.image"
    "Install Disk 9.image"
    "Install Disk 10.image"
    "Install Disk 11.image"
    "Install Disk 12.image"
    "Install Disk 13.image"
    "Install Disk 14.image"
    "Install Disk 15.image"
    "Install Disk 16.image"
    "Disk Tools 2.image"
    "Before You Install.image"
)

#─────────────────────────────────────────────────────────────────────────────
# FONCTIONS UTILITAIRES
#─────────────────────────────────────────────────────────────────────────────

afficher_entete() {
    echo ""
    echo -e "${YELLOW}============================================${NC}"
    echo -e "${YELLOW}  Copie des disquettes System 7.5.3${NC}"
    echo -e "${YELLOW}============================================${NC}"
    echo ""
}

afficher_menu_principal() {
    echo -e "${CYAN}─── Menu principal ───${NC}"
    echo "  1) Choisir le périphérique cible (/dev/sdX)"
    echo "  2) Choisir le répertoire des images"
    echo "  3) Copier toutes les disquettes (19 images)"
    echo "  4) Copier une disquette spécifique"
    echo "  5) Afficher la configuration actuelle"
    echo "  6) Lister les périphériques disponibles (lsblk)"
    echo "  0) Quitter"
    echo ""
}

prompt_choix() {
    local msg="$1"
    local default="$2"
    local reponse
    if [ -n "$default" ]; then
        read -r -p "$(echo -e "${CYAN}$msg${NC} [${default}]: ")" reponse
        echo "${reponse:-$default}"
    else
        read -r -p "$(echo -e "${CYAN}$msg${NC}: ")" reponse
        echo "$reponse"
    fi
}

confirmer() {
    local msg="$1"
    local reponse
    read -r -p "$(echo -e "${YELLOW}$msg (o/n)${NC}: ")" reponse
    case "${reponse,,}" in
        o|oui|y|yes) return 0 ;;
        *) return 1 ;;
    esac
}

choisir_peripherique() {
    echo ""
    echo -e "${BOLD}Périphériques disponibles:${NC}"
    lsblk -d -o NAME,SIZE,MODEL,TRAN 2>/dev/null || lsblk
    echo ""
    local device
    device=$(prompt_choix "Entrez le périphérique (ex: /dev/sdb)" "$DEVICE")
    if [ -b "$device" ]; then
        DEVICE="$device"
        echo -e "${GREEN}✓ Périphérique configuré: $DEVICE${NC}"
    else
        echo -e "${RED}✗ $device n'est pas un périphérique bloc valide${NC}"
        return 1
    fi
}

choisir_repertoire() {
    echo ""
    local dir
    dir=$(prompt_choix "Répertoire des images" "$IMAGES_DIR")
    if [ -d "$dir" ]; then
        IMAGES_DIR="$dir"
        echo -e "${GREEN}✓ Répertoire configuré: $IMAGES_DIR${NC}"
    else
        echo -e "${RED}✗ Le répertoire '$dir' n'existe pas${NC}"
        return 1
    fi
}

afficher_config() {
    echo ""
    echo -e "${BOLD}Configuration actuelle:${NC}"
    echo "  Périphérique : ${DEVICE:-non défini}"
    echo "  Répertoire   : ${IMAGES_DIR:-non défini}"
    
    if [ -n "$IMAGES_DIR" ] && [ -d "$IMAGES_DIR" ]; then
        echo ""
        echo "  Images trouvées:"
        for d in "${DISKS[@]}"; do
            if [ -f "$IMAGES_DIR/$d" ]; then
                echo -e "    ${GREEN}✓${NC} $d"
            else
                echo -e "    ${RED}✗${NC} $d (manquant)"
            fi
        done
    fi
    echo ""
}

menu_action_disquette() {
    echo ""
    echo -e "${CYAN}─── Action pour cette disquette ───${NC}"
    echo "  [Entrée] Continuer la copie"
    echo "  s) Sauter cette disquette"
    echo "  r) Réessayer la copie"
    echo "  a) Annuler tout et quitter"
    echo ""
    read -r -p "$(echo -e "${CYAN}Votre choix${NC} [Entrée=copier]: ")" choix
    echo "$choix"
}

menu_erreur_espace() {
    local choix
    while true; do
        echo -e "${CYAN}─── Périphérique plein - Que faire ? ───${NC}"
        echo "  1) Débrancher le lecteur USB, insérer une disquette vierge, rebrancher"
        echo "  2) Lister les périphériques (lsblk)"
        echo "  3) Changer le périphérique cible"
        echo "  r) Réessayer la copie"
        echo "  s) Sauter cette disquette"
        echo "  a) Annuler et quitter"
        echo ""
        read -r -p "$(echo -e "${CYAN}Votre choix${NC} (1/2/3/r/s/a): ")" choix
        
        case "${choix,,}" in
            1)
                echo ""
                echo -e "${YELLOW}Étapes recommandées:${NC}"
                echo "  1. Débranchez le lecteur USB (ou retirez la disquette du lecteur)"
                echo "  2. Insérez une disquette vierge ou formatée"
                echo "  3. Rebranchez le lecteur / remettez la disquette"
                echo "  4. Choisissez 'r' pour réessayer"
                echo ""
                read -r -p "Appuyez sur Entrée pour continuer..."
                ;;
            2)
                echo ""
                lsblk
                echo ""
                read -r -p "Appuyez sur Entrée pour continuer..."
                ;;
            3)
                echo ""
                choisir_peripherique
                read -r -p "Appuyez sur Entrée pour continuer..."
                ;;
            r)
                echo "Nouvelle tentative..."
                choix="r"
                break
                ;;
            s)
                echo "Disquette sautée."
                choix="s"
                break
                ;;
            a)
                echo "Opération annulée."
                choix="a"
                break
                ;;
            *)
                echo -e "${RED}Choix non reconnu${NC}"
                ;;
        esac
    done
    echo -n "$choix"
}

#─────────────────────────────────────────────────────────────────────────────
# COPIE D'UNE DISQUETTE
#─────────────────────────────────────────────────────────────────────────────

copier_disquette() {
    local disk="$1"
    local label
    label=$(basename "$disk" .image)
    
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}Fichier: $disk${NC}"
    echo -e "${GREEN}========================================${NC}"
    
    if [ ! -f "$IMAGES_DIR/$disk" ]; then
        echo -e "${RED}ERREUR: Fichier non trouvé: $disk${NC}"
        return 2
    fi
    
    while true; do
        echo ""
        echo -e "${YELLOW}Insérez la disquette et appuyez sur Entrée...${NC}"
        echo "(Étiquetez-la: $label)"
        read -r
        
        # Démonter
        sudo umount "${DEVICE}"* 2>/dev/null
        
        echo "Copie en cours..."
        local dd_tmp dd_exit
        dd_tmp=$(mktemp)
        sudo dd if="$IMAGES_DIR/$disk" of="$DEVICE" bs=1440k status=progress 2>&1 | tee "$dd_tmp"
        dd_exit=${PIPESTATUS[0]}
        
        if [ $dd_exit -eq 0 ]; then
            sudo sync
            echo ""
            echo -e "${GREEN}✓ Copie réussie!${NC}"
            
            if sudo file -s "$DEVICE" 2>/dev/null | grep -q "Macintosh HFS"; then
                echo -e "${GREEN}✓ Format HFS vérifié${NC}"
            else
                echo -e "${YELLOW}⚠ Format non reconnu (peut fonctionner quand même)${NC}"
            fi
            
            echo ""
            echo "Retirez la disquette et étiquetez-la: ${BOLD}$label${NC}"
            rm -f "$dd_tmp"
            return 0
        else
            echo -e "${RED}✗ Erreur de copie!${NC}"
            # Détecter l'erreur "Aucun espace disponible"
            if grep -qiE "No space left on device|Aucun espace disponible|No space" "$dd_tmp" 2>/dev/null; then
                echo ""
                echo -e "${RED}⚠ Aucun espace disponible sur le périphérique${NC}"
                echo ""
                echo "Causes possibles:"
                echo "  • Le lecteur USB contient une disquette déjà pleine ou corrompue"
                echo "  • Mauvais périphérique sélectionné"
                echo "  • Le lecteur doit être débranché puis rebranché"
                echo ""
                action=$(menu_erreur_espace)
            else
                action=$(menu_action_disquette)
            fi
            rm -f "$dd_tmp"
            case "${action,,}" in
                s) echo "Disquette sautée."; return 1 ;;
                a) echo "Opération annulée."; exit 0 ;;
                r) echo "Nouvelle tentative..." ;;
                *) echo "Nouvelle tentative..." ;;
            esac
        fi
    done
}

#─────────────────────────────────────────────────────────────────────────────
# FLUX PRINCIPAL
#─────────────────────────────────────────────────────────────────────────────

configurer_defauts() {
    # Répertoire par défaut
    if [ -d "$DEFAULT_IMAGES_DIR" ]; then
        IMAGES_DIR="$DEFAULT_IMAGES_DIR"
    else
        IMAGES_DIR=""
    fi
    
    # Périphérique: essayer de détecter sdb comme défaut
    if [ -b "/dev/sdb" ]; then
        DEVICE="/dev/sdb"
    else
        DEVICE=""
    fi
}

boucle_interactive() {
    configurer_defauts
    afficher_entete
    
    while true; do
        afficher_menu_principal
        local choix
        choix=$(prompt_choix "Choisissez une option" "3")
        
        case "$choix" in
            1) choisir_peripherique ;;
            2) choisir_repertoire ;;
            3)
                if [ -z "$DEVICE" ]; then
                    echo -e "${RED}Configurez d'abord le périphérique (option 1)${NC}"
                    choisir_peripherique || continue
                fi
                if [ -z "$IMAGES_DIR" ]; then
                    echo -e "${RED}Configurez d'abord le répertoire (option 2)${NC}"
                    choisir_repertoire || continue
                fi
                if [ ! -b "$DEVICE" ]; then
                    echo -e "${RED}$DEVICE n'existe pas. Reconfigurez le périphérique.${NC}"
                    continue
                fi
                
                if ! confirmer "Copier les 19 disquettes vers $DEVICE ? (OPÉRATION DESTRUCTIVE)"; then
                    continue
                fi
                
                cd "$IMAGES_DIR" || exit 1
                TOTAL=${#DISKS[@]}
                CURRENT=0
                
                for disk in "${DISKS[@]}"; do
                    CURRENT=$((CURRENT + 1))
                    echo ""
                    echo -e "${BOLD}Disquette $CURRENT / $TOTAL${NC}"
                    
                    if copier_disquette "$disk"; then
                        :
                    elif [ $? -eq 1 ]; then
                        echo "Disquette $disk sautée."
                    fi
                    
                    if [ $CURRENT -lt $TOTAL ]; then
                        echo ""
                        action=$(menu_action_disquette)
                        case "${action,,}" in
                            a) echo "Opération annulée."; break 2 ;;
                            s) echo "Passage à la disquette suivante..." ;;
                        esac
                    fi
                done
                
                echo ""
                echo -e "${GREEN}============================================${NC}"
                echo -e "${GREEN}  ✓ TERMINÉ! ${TOTAL} disquettes traitées${NC}"
                echo -e "${GREEN}============================================${NC}"
                echo ""
                echo "Ordre d'installation sur le Performa 460:"
                echo "1. Démarrer avec 'Disk Tools 1'"
                echo "2. Installer avec Install Disk 1 à 16"
                echo "3. Utiliser Disk Tools 2 si nécessaire"
                ;;
            4)
                if [ -z "$DEVICE" ] || [ -z "$IMAGES_DIR" ]; then
                    echo -e "${RED}Configurez d'abord le périphérique et le répertoire (options 1 et 2)${NC}"
                    continue
                fi
                
                echo ""
                echo "Disquettes disponibles:"
                for i in "${!DISKS[@]}"; do
                    echo "  $((i+1))) ${DISKS[$i]}"
                done
                echo "  0) Retour au menu"
                echo ""
                
                local num
                num=$(prompt_choix "Numéro de la disquette à copier" "")
                [ -z "$num" ] && continue
                [ "$num" = "0" ] && continue
                
                if [[ "$num" =~ ^[0-9]+$ ]] && [ "$num" -ge 1 ] && [ "$num" -le "${#DISKS[@]}" ]; then
                    cd "$IMAGES_DIR" || exit 1
                    copier_disquette "${DISKS[$((num-1))]}"
                else
                    echo -e "${RED}Numéro invalide${NC}"
                fi
                ;;
            5) afficher_config ;;
            6)
                echo ""
                lsblk
                echo ""
                ;;
            0)
                echo "Au revoir!"
                exit 0
                ;;
            *)
                echo -e "${RED}Option non reconnue${NC}"
                ;;
        esac
    done
}

# Point d'entrée
boucle_interactive