Introduction
Field Notes sait quels fichiers sont endommagés ou manquants. L'organisateur a maintenant besoin d'une routine de réparation : récupérer uniquement ces ressources, comparer leurs octets à une référence indépendante et publier chaque remplacement seulement après validation. La source peut renvoyer une erreur HTTP ou une réponse HTTP parfaitement réussie contenant le mauvais document.
Ce laboratoire dispose de son propre paquet préparé. Vous réutiliserez les notions du laboratoire précédent sur SHA256, la lecture de lignes entières, la substitution de commandes et les noms complets ; aucun fichier de la VM précédente n'est nécessaire. Workspace et Download Desk partagent un conteneur. Le PDF synthétique original et curl sont prêts. La durée est une estimation de l'auteur comprenant la lecture et la récupération après erreur.
Télécharger un candidat avant tout remplacement
Dans cette étape, vous enregistrerez et vérifierez un véritable document dans un répertoire d'exercice séparé.
Commencez dans Workspace, préparé pour le texte UTF-8. Utilisez ce chemin absolu lorsqu'un nom relatif est introuvable. pwd et ls pack permettent de distinguer un mauvais répertoire d'un nom mal saisi.
cd /home/labex/project/download-desk
Le manifeste de confiance est /opt/labex/download-pack-state/expected.sha256. Son format est celui du premier laboratoire : 64 caractères hexadécimaux en minuscules, deux espaces et un nom complet sur un seul niveau. Il est fourni indépendamment, lisible, non vide et terminé par un saut de ligne. Les noms utilisent l'ASCII imprimable et peuvent contenir des espaces ; les barres obliques, les barres obliques inverses, CR, LF, les tabulations et les noms . et .. sont hors du périmètre. Utilisez de véritables répertoires sans parents liés. Un élément attendu doit être absent ou être un fichier local ordinaire ; les liens et les objets répertoires sont refusés. Ne modifiez ni la référence ni la source. Une correspondance SHA256 prouve l'accord avec cette référence de confiance, pas l'identité de l'éditeur.
cat /opt/labex/download-pack-state/expected.sha256
Le répertoire préparé trial sert aux expériences, à part du pack de l'organisateur. mktemp crée un fichier vide unique à partir d'un modèle se terminant par des caractères X et affiche son chemin. Le capturer dans candidate permet de réutiliser ce chemin dans cette session Workspace. Une nouvelle connexion peut perdre les variables shell ; dans ce cas, recommencez cette séquence d'exercice au lieu de deviner l'ancienne valeur.
candidate=$(mktemp trial/.incoming.XXXXXX)
curl effectue une requête HTTP. Chaque option a ici un rôle distinct :
--getenvoie une requête GET, et--data-urlencode 'name=Workshop card.txt'encode correctement le nom comme paramètre de requête. Les guillemets protègent les arguments shell ; l'encodage URL traite les espaces dans la requête.--failfait produire un code de sortie non nul aux erreurs HTTP telles que 503. Il ne détecte pas un mauvais corps renvoyé avec HTTP 200.--silent --show-errormasque la progression en conservant les messages d'erreur.--max-time 8limite le transfert entier à huit secondes.--output "$candidate"écrit uniquement dans le candidat temporaire.127.0.0.1:8080est la source locale préparée dans ce même conteneur ;/goodfournit les octets corrects.
curl --fail --silent --show-error --get --data-urlencode 'name=Workshop card.txt' --max-time 8 --output "$candidate" http://127.0.0.1:8080/good
printf 'Download exit: %s\n' "$?"
Vous devez voir Download exit: 0. Si vous avez mal saisi l'URL, curl peut signaler un échec de connexion ou un refus HTTP. Corrigez l'adresse ci-dessus, supprimez uniquement votre candidat courant avec rm -- "$candidate", puis recommencez à partir de mktemp. -- termine les options et cette variable précise identifie votre propre expérience.
Copiez l'empreinte attendue du document depuis sa ligne dans le manifeste de confiance. C'est la valeur suivante, indépendante du candidat :
expected=a9986fb03d5ca72e42753d0ddd11dce7794b0e5a8b253dd4cd356825ca6d0583
Un tube, |, relie la sortie standard d'une commande à l'entrée standard de la suivante. Le printf ci-dessous construit un enregistrement de contrôle désignant votre candidat. sha256sum --check le lit, et && ne lance mv que si la vérification réussit. mv -- renomme le candidat validé vers le nom final d'exercice. Ce fichier peut être remplacé lorsque vous répétez l'expérience ; les règles de réparation sélective de l'organisateur concernent pack.
printf '%s %s\n' "$expected" "$candidate" | sha256sum --check && mv -- "$candidate" "trial/Workshop card.txt"
Vous devez obtenir une ligne se terminant par : OK. Si elle indique FAILED, ne déplacez pas le candidat : supprimez uniquement ce fichier, puis répétez le téléchargement corrigé. Vous pouvez maintenant lire le document vérifié :
cat "trial/Workshop card.txt"
REPAIR DESK: EAST HALL
Vous avez maintenu un téléchargement non vérifié à l'écart d'un nom final. Vous appliquerez ensuite cet ordre au paquet entier.
Réparer sélectivement et récupérer après un échec
Dans cette étape, vous donnerez trois arguments à la routine et testerez à la fois son résultat utile et sa protection en cas d'échec.
Commencez dans Workspace, dans /home/labex/project/download-desk. Le contrat du script est bash repair-pack.sh MANIFEST SOURCE_URL PACK_DIRECTORY. C'est un programme Bash autonome utilisant ces arguments et les commandes installées, sans fichiers auxiliaires voisins. Il doit d'abord classer les octets réels des éléments. Un élément conforme ne provoque aucune requête de téléchargement et conserve ses octets, son mode, son propriétaire et son mtime. Le fichier sans rapport avec la tâche pack/notes.txt bénéficie de la même protection. Seuls les éléments manquants ou non conformes peuvent être téléchargés, au plus une fois chacun par invocation. Un fichier vide conforme est correct. Une deuxième exécution sur le paquet complet doit effectuer zéro requête de téléchargement et conserver tout l'état du paquet.
Chaque candidat se trouve à côté de sa destination et est supprimé après une réussite normale ou un échec signalé. La publication se fait fichier par fichier : un remplacement vérifié peut rester en place si un élément ultérieur échoue. Un candidat en échec ou incorrect ne remplace jamais sa destination. Il ne s'agit ni d'une transaction sur tout le paquet, ni d'une garantie contre les écritures concurrentes, les coupures de courant ou toutes les conditions de terminaison d'un processus. Utilisez uniquement les chemins du cours, sans modifications concurrentes.
L'analyse et l'extraction de l'empreinte reprennent la syntaxe du laboratoire précédent. Ces éléments supplémentaires protègent la frontière du remplacement :
[ -r "$manifest" ]vérifie la lisibilité ;[ -s "$manifest" ]impose un manifeste non vide.!inverse un test.||signifie OU entre des tests, ou exécute une branche d'échec si la commande précédente échoue. Ici,&&signifie ET. Les accolades regroupent les tests associés sans créer de sous-shell.[ -d "$pack" ]vérifie un répertoire.[ -L "$target" ]détecte même un lien dont la cible est absente ;-eteste l'existence de la cible et-fun fichier ordinaire. Refuser les liens et les autres types avantmvévite de suivre un lien vers la source ou de déplacer par erreur le candidat dans un répertoire.temporary=initialise une variable vide.trap '...' EXITenregistre un nettoyage à la sortie du script. Les guillemets simples retardent le développement jusqu'au nettoyage.-nsignifie que la variable n'est pas vide ; le nettoyage ne supprime que le fichier créé par le script.rm -faccepte silencieusement qu'un candidat ait déjà disparu ;--termine les options.continuepasse à la ligne suivante du manifeste.exit 1signale un échec.>&2envoie l'explication sur l'erreur standard plutôt que sur la sortie normale. Vidertemporaryaprès un renommage réussi empêche le nettoyage de toucher le fichier publié.
Enregistrez ce script complet avec le here-document littéral présenté dans le premier laboratoire :
cat > repair-pack.sh <<'BASH'
#!/usr/bin/env bash
manifest=$1
base=$2
pack=$3
if [ ! -r "$manifest" ] || [ ! -s "$manifest" ]; then
printf 'A readable nonempty trusted manifest is required.\n' >&2
exit 1
fi
if [ ! -d "$pack" ] || [ -L "$pack" ]; then
printf 'A real pack directory is required.\n' >&2
exit 1
fi
temporary=
trap 'if [ -n "$temporary" ]; then rm -f -- "$temporary"; fi' EXIT
while IFS= read -r line; do
expected=${line:0:64}
name=${line:66}
target=$pack/$name
if [ -L "$target" ] || { [ -e "$target" ] && [ ! -f "$target" ]; }; then
printf 'Expected a regular file or absent member: %s\n' "$name" >&2
exit 1
fi
if [ -f "$target" ]; then
actual=$(sha256sum -- "$target")
actual=${actual%% *}
if [ "$actual" = "$expected" ]; then
printf 'Keep: %s\n' "$name"
continue
fi
fi
temporary=$(mktemp "$pack/.repair.XXXXXX") || exit 1
if ! curl --fail --silent --show-error --get --data-urlencode "name=$name" --max-time 8 --output "$temporary" "$base"; then
printf 'Download failed: %s\n' "$name" >&2
exit 1
fi
actual=$(sha256sum -- "$temporary")
actual=${actual%% *}
if [ "$actual" != "$expected" ]; then
printf 'Checksum mismatch: %s\n' "$name" >&2
exit 1
fi
mv -- "$temporary" "$target" || exit 1
temporary=
printf 'Repaired: %s\n' "$name"
done < "$manifest"
BASH
Le nettoyage ne reçoit que votre chemin temporaire exact ; il ne supprime pas les fichiers d'autres personnes. Le contrat autorise aussi un autre nom temporaire sûr ou une boucle équivalente. La vérification juge le comportement, pas cette écriture des commandes ni le texte de sortie Keep:.
Essayer une réponse HTTP réussie contenant le mauvais corps
Le point d'accès contrôlé /html renvoie une page d'erreur HTML avec HTTP 200. Il s'agit d'une vraie réponse, pas d'un code curl simulé. La commande suivante doit échouer, sans remplacer le document endommagé existant :
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/html pack
printf 'Repair exit: %s\n' "$?"
Vous devez voir Repair exit: 1 et Checksum mismatch: Workshop card.txt. Le PDF était déjà correct et a été ignoré. Le mauvais candidat a été supprimé ; le seul succès HTTP n'autorisait pas sa publication. ls -a inclut les noms cachés et permet de voir qu'aucun candidat .repair.* ne reste :
ls -a pack
Utilisez maintenant la bonne source. Le script répare le document et la carte absente, tout en conservant le PDF, le fichier vide de remerciements et la note personnelle :
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/good pack
(cd pack && sha256sum --check /opt/labex/download-pack-state/expected.sha256)
Chaque élément listé doit indiquer OK. Passez à Download Desk, rechargez la page et ouvrez le PDF et la carte. La carte indique l'entrée est. Sélectionnez Download à côté du PDF et ouvrez le fichier enregistré dans le lecteur du navigateur. Ces opérations utilisent votre paquet local ; elles ne récupèrent rien depuis la source en remplacement. Utilisez le zoom natif pour les pages fixes du PDF. Revenez dans Workspace.
Réexécuter sans télécharger à nouveau
La source préparée écrit une ligne par véritable requête de ressource dans requests.jsonl, avec l'identité du processus source. Chaque événement est effectivement enregistré dans le fichier avant observation. wc -l < FILE compte les lignes en redirigeant le fichier vers la commande ; il ne demande aucune ressource. Lisez le compteur, relancez la routine, puis relisez-le :
wc -l < /opt/labex/download-pack-state/requests.jsonl
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/good pack
wc -l < /opt/labex/download-pack-state/requests.jsonl
Les deux nombres doivent être identiques. Les quatre éléments doivent être conservés. Tout retélécharger gaspillerait des requêtes et pourrait modifier les modes ou les horodatages des fichiers corrects, même si les empreintes finales correspondaient.
Essayer les erreurs de transport à l'écart du paquet terminé
mkdir -p crée un répertoire d'expérience si nécessaire. Il ne le réinitialise pas. Préservez le paquet terminé de l'organisateur :
mkdir -p trial/fault-test
Le point d'accès contrôlé /error renvoie HTTP 503. Vous devez obtenir une erreur curl mentionnant 503 et un code de sortie non nul du script :
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/error trial/fault-test
printf 'HTTP-error exit: %s\n' "$?"
Vous devez voir HTTP-error exit: 1. Le point d'accès contrôlé /partial ferme la connexion après n'avoir envoyé qu'une partie du corps annoncé. Vous devez obtenir l'erreur curl 18 signalant des octets manquants et, à nouveau, aucun candidat publié :
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/partial trial/fault-test
printf 'Partial-transfer exit: %s\n' "$?"
Vous devez voir Partial-transfer exit: 1. Une connexion impossible, un refus HTTP et un mauvais corps avec HTTP 200 sont des observations différentes ; toutes empêchent un remplacement non vérifié. Récupérez l'expérience en utilisant le même point d'accès correct et les mêmes arguments :
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/good trial/fault-test
Si le chemin du manifeste ou du répertoire est mal saisi, le script indique l'objet requis et se termine avec un code non nul. Vérifiez pwd, ls et le chemin absolu de référence avant de réessayer. Si le script enregistré comporte une erreur de syntaxe, remplacez uniquement repair-pack.sh avec le here-document complet ci-dessus. Ne supprimez pas le paquet de l'organisateur pour corriger une faute de saisie.
La vérification finale lit votre véritable paquet et les objets à conserver. Elle exécute aussi votre script inchangé sur des paquets isolés avec d'autres noms et des erreurs HTTP contrôlées, dont une cible existante endommagée et un fichier vide légitime absent. Ces requêtes proviennent de votre script, pas d'un téléchargement effectué par l'évaluateur pour compléter les preuves. Répéter la vérification ne répare ni ne réinitialise votre travail réel.
Résumé
Vous avez téléchargé un candidat, vérifié son SHA256 avant publication et créé un script réutilisable de réparation sélective. Les véritables erreurs HTTP, les réponses réussies au contenu incorrect et les corps interrompus n'ont pas atteint les noms de fichiers finaux. Les fichiers corrects et les notes personnelles ont été préservés, et une deuxième exécution sur le paquet complet n'a nécessité aucun téléchargement.



