Introdução
DAYMARK é um pequeno café. No fechamento, a equipe baixa um CSV de vendas para seu livro de contas. Um cálculo que falha não deve substituir o último arquivo completo. Primeiro você entenderá os totais e depois completará um pequeno script publicador Bash; o programa de cálculo é fornecido.
Basta familiaridade básica com o terminal. Os comandos e a sintaxe de shell são explicados antes do uso. Comece em Daymark, o site real na porta 8081; use Workstation, preparado em /srv/daymark-sales, para os comandos. Os dados são fictícios e não é necessário instalar nada nem ter conta externa.
Entender e calcular o fechamento
Nesta etapa, você comparará os pedidos de origem do café com uma exportação candidata real. Comece em Daymark. Abra View source records ↗. As quatro linhas de origem descrevem 6 Espresso a 300 centavos, 3 Tea a 250 e 2 Cake a 450: 11 unidades e 3450 centavos no total. Um centavo é um centésimo da unidade monetária; centavos inteiros evitam ambiguidades de arredondamento. Linhas repetidas de um item devem ser agrupadas.

Abra Reports e Download latest CSV ↓. Isso salva um arquivo CSV real. CSV significa valores separados por vírgulas; a primeira linha nomeia as colunas. O arquivo inicial é de um fechamento anterior com TOTAL,1,100. Ele deve permanecer disponível até existir uma substituição completa. Volte ao início com DAYMARK.
Mude para Workstation. pwd imprime o diretório de trabalho; ls lista arquivos e cat imprime um arquivo de texto. Um caminho relativo é resolvido a partir do diretório atual.
pwd
Espere /srv/daymark-sales.
ls
cat orders.csv
As linhas correspondem ao site. python3 executa o calculador fornecido. Seu caminho absoluto funciona independentemente do diretório atual. > redireciona a saída padrão para um arquivo, substituindo esse arquivo antes da execução do programa. Use um candidato separado, nunca o relatório 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
A origem usa preço unitário; o relatório usa quantidade agrupada e valor total. Um status de saída zero significa sucesso; diferente de zero significa falha. $? expande para o status do comando anterior, portanto leia-o imediatamente após o comando relevante. echo imprime texto:
/usr/bin/python3 /opt/labex/d10/summarize.py fixtures/broken.csv > rejected.csv
echo $?
Espere Export failed: ... e 1. Isso é intencional. cat rejected.csv mostraria um cabeçalho mesmo com falha no cálculo: uma saída parcial não é um relatório válido. O download existente ainda contém TOTAL,1,100 porque você escreveu apenas candidatos separados. Se um caminho falhar, use pwd e ls, volte com cd /srv/daymark-sales e tente novamente o comando do candidato. cd muda de diretório. Preserve os pedidos de origem e o relatório existente.
Publicar somente após o sucesso
Nesta etapa, você substituirá o script inseguro e demonstrará tanto a preservação quanto a recuperação com dados novos. Comece em Workstation. O script aceita dois argumentos: o CSV de entrada e o caminho de publicação. Leia-o:
cat publish.sh
O > direto pode truncar o arquivo publicado antes de um cálculo com falha terminar. Em vez disso, crie um arquivo temporário ao lado do destino, escreva com sucesso e depois renomeie. No mesmo sistema de arquivos, a renomeação substitui atomicamente o nome visível: os leitores veem os bytes antigos completos ou os novos completos. Isso não oferece transações de banco de dados nem proteção contra perda do disco.
Bash executa o pequeno script. set -e para quando um comando comum falha; -u rejeita variáveis não definidas. $1 e $2 são os dois argumentos. name=value atribui uma variável de shell sem espaços ao redor de =; $(command) captura a saída de um comando. Aspas preservam espaços nos caminhos. mktemp cria um arquivo único a partir do sufixo XXXXXX. trap ... EXIT remove restos temporários tanto no sucesso quanto na falha. chmod 644 permite escrita ao proprietário e leitura a todos. mv -fT substitui o nome exato do destino; -T rejeita um diretório de destino em vez de mover o arquivo para dentro dele. printf imprime os detalhes da publicação; id -u imprime o identificador numérico real e sha256sum identifica os bytes do arquivo.
cat > publish.sh substitui apenas seu script. O SH entre aspas inicia um here-document: cole até o último SH, sozinho em sua linha. As aspas preservam os sinais de dólar literalmente.
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
A conta preparada daymark-report é proprietária de reports/; ela pode escrever relatórios enquanto o site apenas os lê. sudo -u executa como essa conta. /bin/bash é absoluto; o script não precisa de permissão executável quando passado explicitamente ao Bash.
sudo -u daymark-report /bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
cat reports/sales.csv
Espere o relatório completo com TOTAL,11,3450. cp copia um arquivo; sobrescreva apenas orders.csv deste exercício. Preserve seu fixture original. Depois passe deliberadamente uma entrada malformada:
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 $?
Espere a falha intencional e 1. Mude para Daymark, recarregue Reports, baixe novamente e confirme que TOTAL,11,3450 permanece. Uma tentativa com falha não deve publicar apenas um cabeçalho nem remover o arquivo anterior.
Volte para Workstation. Recupere com um novo fechamento válido contendo dois Tea adicionais. Ele deve produzir 13 unidades e 3950 centavos, sem deixar o relatório antigo para sempre:
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
Espere Tea,5,1250 e TOTAL,13,3950. Em Daymark, recarregue Records e Reports e baixe novamente; agora origem e relatório concordam. Se a permissão for negada, confira o caminho exato de saída e repita sudo -u daymark-report; não conceda escrita a todos. Se o script tiver um erro de digitação, substitua-o pelo here-document completo e tente novamente. O temporário é criado ao lado da saída para que a renomeação final permaneça no mesmo sistema de arquivos.
Resumo
Você praticou publicação completa de CSV, estados de falha significativos e recuperação. Um relatório agendado só é útil quando sua identidade real de execução, acionamento e totais do negócio concordam. Este exercício de instância única usa dados fictícios e um agendamento curto de treinamento; não é uma plataforma completa de relatórios de produção.


