Nur einen vollständigen Verkaufsbericht veröffentlichen

ShellBeginner
Jetzt üben

Einführung

DAYMARK ist ein kleines Café. Zum Geschäftsschluss lädt das Team eine Verkaufs-CSV für sein Kassenbuch herunter. Eine fehlgeschlagene Berechnung darf die letzte vollständige Datei nicht ersetzen. Zuerst verstehst du die Summen, dann vervollständigst du ein kurzes Bash-Skript zur Veröffentlichung; das Berechnungsprogramm ist vorgegeben.

Grundlegende Terminalkenntnisse reichen aus. Befehle und Shell-Syntax werden vor ihrer Verwendung erklärt. Beginne in Daymark, der echten Website auf Port 8081; für Befehle verwendest du Workstation, vorbereitet in /srv/daymark-sales. Die Daten sind erfunden. Eine Installation oder ein externes Konto ist nicht nötig.

Den Tagesabschluss verstehen und berechnen

In diesem Schritt vergleichst du die ursprünglichen Bestellungen des Cafés mit einem echten Exportkandidaten. Beginne in Daymark. Öffne View source records ↗. Die vier Quellzeilen enthalten 6 Espresso zu 300 Cent, 3 Tea zu 250 Cent und 2 Cake zu 450 Cent: insgesamt 11 Artikel und 3450 Cent. Ein Cent ist ein Hundertstel einer Währungseinheit; ganze Cent vermeiden Rundungsmehrdeutigkeiten. Wiederholte Artikelzeilen müssen zusammengefasst werden.

Die vier Quellzeilen mit ihren Einzelpreisen

Öffne Reports und Download latest CSV ↓. Damit speicherst du eine echte CSV-Datei. CSV bedeutet durch Kommas getrennte Werte; die erste Zeile benennt die Spalten. Die anfängliche Datei ist ein früherer Abschluss mit TOTAL,1,100. Sie muss verfügbar bleiben, bis ein vollständiger Ersatz vorhanden ist. Kehre mit DAYMARK zur Startseite zurück.

Wechsle zu Workstation. pwd zeigt das Arbeitsverzeichnis, ls listet Dateien auf und cat zeigt eine Textdatei an. Ein relativer Pfad wird vom aktuellen Verzeichnis aus aufgelöst.

pwd

Erwartet wird /srv/daymark-sales.

ls
cat orders.csv

Die Zeilen entsprechen der Website. python3 führt das bereitgestellte Berechnungsprogramm aus. Sein absoluter Pfad funktioniert unabhängig vom aktuellen Verzeichnis. > leitet die Standardausgabe in eine Datei um und ersetzt diese bereits vor Programmstart. Verwende einen gesonderten Kandidaten, niemals den veröffentlichten Bericht:

/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

Die Quelle enthält Einzelpreise; der Bericht enthält zusammengefasste Mengen und Gesamtwerte. Der Exit-Status null bedeutet Erfolg, ein anderer Wert einen Fehler. $? wird zum Status des vorherigen Befehls erweitert. Lies ihn deshalb unmittelbar nach dem betreffenden Befehl. echo gibt Text aus:

/usr/bin/python3 /opt/labex/d10/summarize.py fixtures/broken.csv > rejected.csv
echo $?

Erwartet werden Export failed: ... und 1. Das ist beabsichtigt. cat rejected.csv würde trotz fehlgeschlagener Berechnung eine Kopfzeile anzeigen: Eine Teilausgabe ist kein gültiger Bericht. Der vorhandene Download enthält weiterhin TOTAL,1,100, weil du nur getrennte Kandidaten geschrieben hast. Bei einem Pfadfehler prüfst du mit pwd und ls, kehrst mit cd /srv/daymark-sales zurück und wiederholst den Kandidatenbefehl. cd wechselt das Verzeichnis. Behalte die ursprünglichen Bestellungen und den vorhandenen Bericht.

Erst nach Erfolg veröffentlichen

In diesem Schritt ersetzt du das unsichere Skript und zeigst sowohl die Erhaltung des Berichts als auch seine Aktualisierung nach Wiederherstellung. Beginne in Workstation. Das Skript erwartet zwei Argumente: Eingabe-CSV und Veröffentlichungspfad. Lies es:

cat publish.sh

Sein direktes > kann die veröffentlichte Datei leeren, bevor eine fehlgeschlagene Berechnung endet. Erstelle stattdessen neben dem Ziel eine temporäre Datei, schreibe sie erfolgreich und benenne sie dann um. Auf demselben Dateisystem ersetzt das Umbenennen den sichtbaren Dateinamen atomar: Leser sehen entweder die vollständigen alten oder die vollständigen neuen Bytes. Das bietet weder Datenbanktransaktionen noch Schutz vor Festplattenverlust.

Bash führt das kurze Skript aus. set -e stoppt bei einem fehlgeschlagenen gewöhnlichen Befehl; -u weist nicht gesetzte Variablen zurück. $1 und $2 sind die beiden Argumente. name=value weist ohne Leerzeichen um = eine Shell-Variable zu; $(command) erfasst eine Befehlsausgabe. Anführungszeichen erhalten Leerzeichen in Pfaden. mktemp erzeugt über das Suffix XXXXXX eine eindeutige Datei. trap ... EXIT entfernt temporäre Reste bei Erfolg und Fehler. chmod 644 erlaubt dem Eigentümer das Schreiben und allen das Lesen. mv -fT ersetzt den genauen Zieldateinamen; -T weist ein Zielverzeichnis zurück, statt die Datei hineinzuschieben. printf zeigt Veröffentlichungsdetails, id -u die tatsächliche numerische Benutzerkennung und sha256sum kennzeichnet die Dateibytes.

cat > publish.sh ersetzt nur dein Skript. Das in Anführungszeichen gesetzte SH beginnt ein Here-Dokument: Füge alles bis zum letzten SH in einer eigenen Zeile ein. Die Anführungszeichen erhalten die Dollarzeichen wörtlich.

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

Das vorbereitete Konto daymark-report besitzt reports/. Es darf Berichte schreiben, während die Website sie nur liest. sudo -u führt unter diesem Konto aus. /bin/bash ist absolut; bei ausdrücklicher Übergabe an Bash braucht das Skript keine Ausführungsberechtigung.

sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
cat reports/sales.csv

Erwartet wird der vollständige Bericht mit TOTAL,11,3450. cp kopiert eine Datei; überschreibe nur die Datei orders.csv dieser Übung. Behalte den ursprünglichen Beispieldatensatz. Übergib dann absichtlich fehlerhafte Eingaben:

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 $?

Erwartet werden der beabsichtigte Fehler und 1. Wechsle zu Daymark, lade Reports neu, lade die Datei erneut herunter und bestätige, dass TOTAL,11,3450 erhalten bleibt. Ein fehlgeschlagener Versuch darf weder nur eine Kopfzeile veröffentlichen noch die vorherige Datei entfernen.

Kehre zu Workstation zurück. Stelle einen neuen gültigen Abschluss mit zwei zusätzlichen Tea bereit. Er muss 13 Artikel und 3950 Cent ergeben und darf nicht für immer den alten Bericht behalten:

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

Erwartet werden Tea,5,1250 und TOTAL,13,3950. Lade in Daymark Records und Reports neu und lade die Datei nochmals herunter; Quelle und Bericht stimmen jetzt überein. Bei verweigertem Zugriff prüfst du den genauen Ausgabepfad und wiederholst sudo -u daymark-report. Vergib keine Schreibrechte für alle. Bei einem Tippfehler im Skript ersetzt du es mit dem vollständigen Here-Dokument und versuchst es erneut. Die temporäre Datei liegt neben der Ausgabe, damit das endgültige Umbenennen auf demselben Dateisystem bleibt.

Zusammenfassung

Du hast die vollständige Veröffentlichung von CSV-Dateien, aussagekräftige Fehlerstatus und Wiederherstellung geübt. Ein geplanter Bericht ist nur nützlich, wenn tatsächliche Ausführungsidentität, Auslösung und Geschäftssummen zusammenpassen. Diese Übung auf einer Instanz verwendet erfundene Daten und einen kurzen Übungszeitplan; sie ist keine vollständige Berichtsplattform für den Produktivbetrieb.