Introducción
DAYMARK es una pequeña cafetería. Al cerrar, el equipo descarga un CSV de ventas para su libro de cuentas. Un cálculo fallido no debe sustituir el último archivo completo. Primero comprenderás los totales y después completarás un pequeño script publicador en Bash; el programa de cálculo ya está proporcionado.
Basta conocer el uso básico de la terminal. Los comandos y la sintaxis de shell se explican antes de utilizarlos. Empieza en Daymark, el sitio real del puerto 8081; utiliza Workstation, preparado en /srv/daymark-sales, para los comandos. Los datos son ficticios y no se requiere instalación ni cuenta externa.
Comprender y calcular el cierre
En este paso compararás los pedidos de origen de la cafetería con una exportación candidata real. Empieza en Daymark. Abre View source records ↗. Las cuatro filas describen 6 Espresso a 300 céntimos, 3 Tea a 250 y 2 Cake a 450: 11 unidades y 3450 céntimos en total. Un céntimo es la centésima parte de una unidad monetaria; trabajar con céntimos enteros evita ambigüedades de redondeo. Las filas repetidas de un artículo deben agruparse.

Abre Reports y Download latest CSV ↓. Se guarda un archivo CSV real. CSV significa valores separados por comas; la primera fila nombra las columnas. El archivo inicial corresponde a un cierre anterior con TOTAL,1,100. Debe permanecer disponible hasta que exista un sustituto completo. Vuelve al inicio con DAYMARK.
Cambia a Workstation. pwd muestra el directorio de trabajo; ls enumera archivos y cat imprime un archivo de texto. Una ruta relativa se resuelve desde el directorio actual.
pwd
Espera /srv/daymark-sales.
ls
cat orders.csv
Las filas coinciden con el sitio. python3 ejecuta el calculador proporcionado. Su ruta absoluta funciona independientemente del directorio actual. > redirige su salida estándar a un archivo, sustituyendo ese archivo antes de ejecutar el programa. Utiliza un candidato separado, nunca el informe publicado:
/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
El origen contiene precios unitarios; el informe contiene cantidades agrupadas y valores totales. Un estado de salida cero significa éxito; uno distinto de cero indica fallo. $? se expande al estado del comando anterior, así que léelo inmediatamente después del comando que te interesa. echo imprime texto:
/usr/bin/python3 /opt/labex/d10/summarize.py fixtures/broken.csv > rejected.csv
echo $?
Espera Export failed: ... y 1. Es intencionado. cat rejected.csv mostraría una cabecera aunque el cálculo fallara: una salida parcial no es un informe válido. La descarga existente sigue diciendo TOTAL,1,100 porque solo escribiste candidatos separados. Si falla una ruta, usa pwd y ls, vuelve con cd /srv/daymark-sales y repite el comando del candidato. cd cambia de directorio. Conserva los pedidos de origen y el informe existente.
Publicar solo después del éxito
En este paso sustituirás el script inseguro y demostrarás tanto la conservación como una recuperación con datos nuevos. Empieza en Workstation. El script acepta dos argumentos: el CSV de entrada y la ruta de publicación. Léelo:
cat publish.sh
Su > directo puede truncar el archivo publicado antes de que termine un cálculo fallido. Crea un archivo temporal junto al destino, escríbelo correctamente y después renómbralo. En el mismo sistema de archivos, el cambio de nombre sustituye atómicamente el nombre visible: los lectores ven los bytes antiguos completos o los nuevos completos. Esto no ofrece transacciones de base de datos ni protección contra pérdida del disco.
Bash ejecuta este pequeño script. set -e se detiene ante un comando ordinario fallido; -u rechaza variables sin definir. $1 y $2 son los dos argumentos. name=value asigna una variable de shell sin espacios alrededor de =; $(command) captura la salida de un comando. Las comillas conservan espacios en las rutas. mktemp crea un archivo único con el sufijo XXXXXX. trap ... EXIT elimina restos temporales tanto al terminar correctamente como al fallar. chmod 644 permite escribir al propietario y leer a todos. mv -fT sustituye el nombre exacto del destino; -T rechaza un directorio de destino en lugar de mover el archivo a su interior. printf imprime detalles de publicación; id -u muestra el usuario numérico real y sha256sum identifica los bytes del archivo.
cat > publish.sh sustituye solo tu script. El SH entre comillas inicia un here-document: pega hasta el último SH, solo en su línea. Las comillas conservan literalmente los signos de dólar.
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
La cuenta preparada daymark-report es propietaria de reports/; puede escribir informes mientras el sitio solo los lee. sudo -u ejecuta como esa cuenta. /bin/bash es una ruta absoluta; el script no necesita permiso ejecutable si se pasa explícitamente a Bash.
sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
cat reports/sales.csv
Espera el informe completo TOTAL,11,3450. cp copia un archivo; sobrescribe únicamente orders.csv de este ejercicio. Conserva su fixture original. A continuación pasa deliberadamente una entrada mal formada:
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 $?
Espera el fallo intencionado y 1. Cambia a Daymark, recarga Reports, descarga de nuevo y confirma que se conserva TOTAL,11,3450. Un intento fallido no debe publicar una cabecera ni eliminar el archivo anterior.
Vuelve a Workstation. Recupera con un cierre válido nuevo que contiene dos Tea adicionales. Debe producir 13 unidades y 3950 céntimos, sin conservar el informe antiguo para siempre:
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
Espera Tea,5,1250 y TOTAL,13,3950. En Daymark, recarga Records y Reports y descarga otra vez; ahora el origen y el informe coinciden. Si se deniega el permiso, revisa la ruta exacta de salida y repite el comando sudo -u daymark-report; no concedas escritura a todo el mundo. Si hay un error tipográfico en el script, sustitúyelo con el here-document completo y repite. El temporal se crea junto a la salida para que el cambio de nombre final permanezca en el mismo sistema de archivos.
Resumen
Has practicado la publicación completa de CSV, estados de fallo significativos y recuperación. Un informe programado solo es útil cuando coinciden su identidad de ejecución real, su activación y los totales del negocio. Este ejercicio de una sola instancia usa datos ficticios y un intervalo de entrenamiento corto; no es una plataforma completa de informes de producción.


