Introduction
DAYMARK est un petit café. À la fermeture, l’équipe télécharge un CSV de ventes pour sa comptabilité. Un calcul qui échoue ne doit pas remplacer le dernier fichier complet. Vous comprendrez d’abord les totaux, puis compléterez un court script de publication Bash ; le calculateur est fourni.
Les bases du terminal suffisent. Les commandes et la syntaxe shell sont expliquées avant leur emploi. Commencez dans Daymark, le véritable site sur le port 8081 ; utilisez Workstation, préparé dans /srv/daymark-sales, pour les commandes. Les données sont fictives, sans installation ni compte externe.
Comprendre et calculer la clôture
Dans cette étape, vous comparerez les commandes sources du café à un véritable export candidat. Commencez dans Daymark. Ouvrez View source records ↗. Les quatre lignes sources décrivent 6 Espresso à 300 centimes, 3 Tea à 250 et 2 Cake à 450 : soit 11 articles et 3450 centimes. Un centime est le centième d’une unité monétaire ; les centimes entiers évitent les ambiguïtés d’arrondi. Les lignes répétées d’un article doivent être regroupées.

Ouvrez Reports puis Download latest CSV ↓. Cela enregistre un vrai fichier CSV. CSV signifie valeurs séparées par des virgules ; sa première ligne nomme les colonnes. Le fichier initial est une clôture précédente contenant TOTAL,1,100. Il doit rester disponible jusqu’à l’existence d’un remplacement complet. Revenez à l’accueil avec DAYMARK.
Passez à Workstation. pwd affiche le répertoire de travail ; ls liste les fichiers et cat affiche un fichier texte. Un chemin relatif est résolu depuis le répertoire courant.
pwd
Le résultat attendu est /srv/daymark-sales.
ls
cat orders.csv
Les lignes correspondent au site. python3 exécute le calculateur fourni. Son chemin absolu fonctionne quel que soit le répertoire courant. > redirige sa sortie standard vers un fichier, en remplaçant celui-ci avant l’exécution du programme. Utilisez un candidat distinct, jamais le rapport publié :
/usr/bin/python3 /opt/labex/d10/summarize.py orders.csv > candidate.csv
cat candidate.csv
item,quantity,value_cents
Cake,2,900
Espresso,6,1800
Tea,3,750
TOTAL,11,3450
La source contient le prix unitaire ; le rapport donne les quantités regroupées et les valeurs totales. Un code de sortie nul indique la réussite ; un code non nul indique un échec. $? se développe en état de la commande précédente : lisez-le immédiatement après la commande concernée. echo affiche du texte :
/usr/bin/python3 /opt/labex/d10/summarize.py fixtures/broken.csv > rejected.csv
echo $?
Vous devez voir Export failed: ... et 1. C’est volontaire. cat rejected.csv afficherait un en-tête malgré l’échec du calcul : une sortie partielle n’est pas un rapport valide. Le téléchargement existant contient toujours TOTAL,1,100, car vous n’avez écrit que des candidats distincts. Si un chemin échoue, utilisez pwd et ls, revenez avec cd /srv/daymark-sales et réessayez la commande du candidat. cd change de répertoire. Conservez les commandes sources et le rapport existant.
Publier seulement après réussite
Dans cette étape, vous remplacerez le script dangereux et démontrerez la conservation du fichier puis sa mise à jour après reprise. Commencez dans Workstation. Le script accepte deux arguments : le CSV d’entrée et le chemin de publication. Lisez-le :
cat publish.sh
Son > direct peut tronquer le fichier publié avant la fin d’un calcul qui échoue. Créez plutôt un fichier temporaire à côté de la destination, écrivez-le avec succès, puis renommez-le. Sur le même système de fichiers, le renommage remplace atomiquement le nom visible : les lecteurs voient les anciens octets complets ou les nouveaux octets complets. Cela ne fournit ni transaction de base de données ni protection contre la perte du disque.
Bash exécute ce petit script. set -e s’arrête lorsqu’une commande ordinaire échoue ; -u refuse les variables non définies. $1 et $2 sont les deux arguments. name=value affecte une variable shell sans espaces autour de = ; $(command) capture la sortie d’une commande. Les guillemets préservent les espaces des chemins. mktemp crée un fichier unique à partir du suffixe XXXXXX. trap ... EXIT supprime les octets temporaires restants après réussite ou échec. chmod 644 autorise le propriétaire à écrire et tout le monde à lire. mv -fT remplace exactement le nom de destination ; -T refuse un répertoire de destination au lieu d’y déplacer le fichier. printf affiche les détails de publication ; id -u affiche l’identifiant numérique réel et sha256sum identifie les octets du fichier.
cat > publish.sh remplace uniquement votre script. Le SH entre guillemets commence un here-document : collez jusqu’au dernier SH, seul sur sa ligne. Les guillemets conservent littéralement les signes dollar.
cat > publish.sh <<'SH'
#!/bin/bash
set -eu
input=$1
output=$2
tmp=$(mktemp "${output}.XXXXXX")
trap 'rm -f "$tmp"' EXIT
/usr/bin/python3 /opt/labex/d10/summarize.py "$input" > "$tmp"
chmod 644 "$tmp"
mv -fT "$tmp" "$output"
printf 'Published %s uid=%s cwd=%s sha256=' "$output" "$(id -u)" "$PWD"
sha256sum "$output"
SH
Le compte préparé daymark-report possède reports/ ; il peut écrire les rapports, tandis que le site ne fait que les lire. sudo -u exécute sous ce compte. /bin/bash est un chemin absolu ; le script n’a pas besoin du droit d’exécution lorsqu’il est explicitement passé à Bash.
sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
cat reports/sales.csv
Le rapport complet doit contenir TOTAL,11,3450. cp copie un fichier ; n’écrasez que le fichier orders.csv de cet exercice. Conservez son jeu de données original. Fournissez ensuite délibérément une entrée incorrecte :
cp fixtures/broken.csv orders.csv
sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
echo $?
Vous devez obtenir l’échec volontaire et 1. Passez à Daymark, rechargez Reports, téléchargez à nouveau et confirmez que TOTAL,11,3450 demeure. Une tentative ratée ne doit ni publier un simple en-tête ni supprimer le fichier précédent.
Revenez à Workstation. Reprenez avec une nouvelle clôture valide contenant deux Tea supplémentaires. Elle doit produire 13 articles et 3950 centimes, sans conserver indéfiniment l’ancien rapport :
cp fixtures/next.csv orders.csv
sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
cat reports/sales.csv
Vous devez voir Tea,5,1250 et TOTAL,13,3950. Dans Daymark, rechargez Records et Reports et téléchargez à nouveau ; la source et le rapport concordent désormais. Si l’accès est refusé, vérifiez le chemin exact de sortie et répétez la commande sudo -u daymark-report ; n’accordez pas l’écriture à tous. Si le script comporte une faute, remplacez-le par le here-document complet et réessayez. Le temporaire est créé à côté de la sortie pour que le renommage final reste sur le même système de fichiers.
Résumé
Vous avez pratiqué la publication complète de CSV, les états d’échec significatifs et la reprise. Un rapport planifié n’est utile que si son identité réelle d’exécution, son déclenchement et ses totaux métier concordent. Cet exercice sur une seule instance utilise des données fictives et un intervalle court de formation ; ce n’est pas une plateforme complète de reporting de production.


