Introdução
A Field Notes sabe quais recursos estão danificados ou ausentes. Agora a organização precisa de uma rotina de reparo: buscar somente esses recursos, comparar os bytes com uma referência independente e publicar cada substituição apenas após a verificação. Uma origem pode retornar um erro HTTP ou uma resposta HTTP totalmente bem-sucedida com o documento errado.
Este laboratório começa com seu próprio pacote preparado. Você precisa do conhecimento do laboratório anterior sobre SHA256, linhas completas, substituição de comandos e nomes completos; não precisa de arquivos da VM anterior. Workspace e Download Desk compartilham um contêiner. O PDF sintético original e o curl estão preparados. O tempo é uma estimativa do autor, incluindo leitura e correção de erros.
Baixe um candidato antes de substituir
Nesta etapa, você salvará e verificará um material real em um diretório de prática separado.
Comece em Workspace, preparado para texto UTF-8. Use este caminho absoluto se um nome relativo não for encontrado. pwd e ls pack ajudam a distinguir um diretório errado de um nome digitado incorretamente.
cd /home/labex/project/download-desk
O manifesto confiável está em /opt/labex/download-pack-state/expected.sha256. O formato é o mesmo do primeiro laboratório: 64 caracteres hexadecimais em minúsculas, dois espaços e um nome completo sem níveis de diretórios. Ele é fornecido de forma independente, é legível, não vazio e termina com uma quebra de linha. Os nomes usam ASCII imprimível e podem conter espaços; barras, barras invertidas, CR, LF, tabulações e os nomes . e .. estão fora do escopo. Use diretórios reais sem links na cadeia de pais. Um membro esperado deve estar ausente ou ser um arquivo local regular; links e objetos de diretório são rejeitados. Não edite a referência nem a origem. Um SHA256 correspondente comprova a igualdade com essa referência confiável, não a identidade do publicador.
cat /opt/labex/download-pack-state/expected.sha256
O diretório preparado trial é para experimentos e está separado do pack da organização. mktemp cria um arquivo vazio exclusivo usando um modelo terminado em caracteres X e imprime seu caminho. Salvá-lo em candidate o mantém disponível nesta sessão de Workspace. Uma reconexão pode perder as variáveis do shell; recomece esta sequência de prática em vez de adivinhar o valor antigo.
candidate=$(mktemp trial/.incoming.XXXXXX)
curl envia uma requisição HTTP. As opções têm funções diferentes aqui:
--getenvia uma requisição GET, e--data-urlencode 'name=Workshop card.txt'codifica o nome com segurança como parâmetro de consulta. As aspas protegem os argumentos do shell; a codificação de URL trata os espaços dentro da requisição.--failproduz um status de saída diferente de zero em erros HTTP como 503. Ele não detecta conteúdo errado em HTTP 200.--silent --show-erroroculta indicadores de progresso e mantém mensagens de erro.--max-time 8limita toda a transferência a oito segundos.--output "$candidate"escreve somente no candidato temporário.127.0.0.1:8080é a origem local preparada no mesmo contêiner;/goodretorna os bytes corretos.
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' "$?"
O esperado é Download exit: 0. Se digitar a URL incorretamente, o curl pode informar falha de conexão ou recusa HTTP. Corrija o endereço acima, remova apenas seu candidato atual com rm -- "$candidate" e repita a partir de mktemp. -- encerra as opções; o valor exato da variável aponta para seu próprio experimento.
Copie o hash esperado do material de sua linha no manifesto confiável. É o valor abaixo, independente do candidato:
expected=a9986fb03d5ca72e42753d0ddd11dce7794b0e5a8b253dd4cd356825ca6d0583
Um pipe, |, conecta a saída padrão de um comando à entrada padrão do próximo. O printf abaixo cria uma entrada de soma de verificação para o candidato. sha256sum --check lê essa entrada, e && executa mv somente após uma verificação bem-sucedida. mv -- renomeia o candidato verificado para o arquivo final da prática. Ele pode ser substituído ao repetir o experimento; as regras de reparo seletivo da organização se aplicam a pack.
printf '%s %s\n' "$expected" "$candidate" | sha256sum --check && mv -- "$candidate" "trial/Workshop card.txt"
Espere uma linha terminada em : OK. Se aparecer FAILED, não mova o candidato: remova apenas esse arquivo e repita o download corrigido. Agora você pode ler o material verificado:
cat "trial/Workshop card.txt"
REPAIR DESK: EAST HALL
Você manteve um download não verificado longe de um nome final. Em seguida, aplicará essa ordem ao pacote inteiro.
Repare seletivamente e continue após falhas
Nesta etapa, você dará três argumentos à rotina e verificará tanto seu resultado útil quanto seu limite de proteção em caso de falha.
Comece em Workspace, em /home/labex/project/download-desk. O contrato do script é bash repair-pack.sh MANIFEST SOURCE_URL PACK_DIRECTORY. É um programa Bash independente que usa esses argumentos e comandos instalados, sem arquivos auxiliares vizinhos. Ele deve primeiro classificar os bytes reais de cada membro. Um membro correspondente não gera download e mantém bytes, modo, proprietário e mtime. A mesma proteção se aplica ao arquivo alheio à tarefa pack/notes.txt. Somente membros ausentes ou divergentes podem ser baixados, no máximo uma vez cada por chamada. Um arquivo vazio correspondente está correto. Uma segunda chamada em um pacote completo deve fazer zero requisições de download e preservar todo o estado do pacote.
Cada candidato fica ao lado do destino e é removido após sucesso normal ou falha relatada. A publicação é por arquivo: uma substituição verificada pode permanecer se um membro posterior falhar. Candidatos incorretos ou com falha nunca substituem seu destino. Isso não é uma transação para o pacote inteiro nem uma garantia diante de gravações simultâneas, falta de energia ou toda possível forma de término do processo. Use somente os caminhos do curso e evite alterações concorrentes.
O analisador e a extração do hash usam a sintaxe do laboratório anterior. Estes elementos adicionais protegem a substituição:
[ -r "$manifest" ]verifica a leitura;[ -s "$manifest" ]exige um manifesto não vazio.!inverte um teste.||significa OU entre testes ou executa uma ramificação de erro após um comando que falhou.&&significa E aqui. Chaves agrupam testes relacionados sem um novo subshell.[ -d "$pack" ]verifica um diretório.[ -L "$target" ]detecta até um link cujo destino está ausente;-everifica um destino existente, e-f, um arquivo regular. Rejeitar links e outros tipos de objeto antes demvevita seguir um link para a origem ou mover acidentalmente um candidato para dentro de um diretório.temporary=começa com uma variável vazia.trap '...' EXITregistra a limpeza ao sair do script. Aspas simples adiam a expansão até a limpeza.-nsignifica que a variável não está vazia; somente o arquivo criado pelo próprio script é removido.rm -faceita silenciosamente um candidato já removido;--encerra as opções.continueavança para a próxima linha do manifesto.exit 1informa falha.>&2envia uma explicação para a saída de erro padrão em vez da saída normal. Esvaziartemporaryapós renomear com sucesso impede que a limpeza toque no arquivo publicado.
Salve este script completo usando o here-document literal ensinado no primeiro laboratório:
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
A limpeza recebe somente seu caminho temporário exato e não remove arquivos de outras pessoas. Outro nome temporário seguro ou um laço equivalente também é permitido. A verificação avalia o comportamento, não a grafia exata dos comandos nem o texto de saída Keep:.
Teste uma resposta HTTP bem-sucedida com conteúdo errado
O endpoint controlado /html retorna uma página de erro HTML com HTTP 200. É uma resposta real, não um status simulado do curl. O próximo comando deve falhar, sem substituir o material danificado existente:
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/html pack
printf 'Repair exit: %s\n' "$?"
Espere Repair exit: 1 e Checksum mismatch: Workshop card.txt. O PDF já estava correto e foi ignorado. O candidato errado foi removido; o sucesso HTTP, sozinho, não permitiu sua publicação. ls -a também mostra nomes ocultos, permitindo observar que nenhum candidato .repair.* ficou para trás:
ls -a pack
Agora use a origem correta. O script repara o material e o mapa ausente, preservando o PDF, os agradecimentos vazios e a nota pessoal:
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)
Cada membro listado deve mostrar OK. Mude para Download Desk, atualize a página e abra o PDF e o mapa. O mapa indica a entrada leste. Selecione Download ao lado do PDF e abra o arquivo salvo no leitor do navegador. As duas operações usam seu pacote local; não há reposição a partir da origem. Use o zoom nativo para páginas fixas de PDF. Volte para Workspace.
Repita sem baixar novamente
A origem preparada escreve uma linha em requests.jsonl para cada requisição real de recurso, incluindo a identidade do processo da origem. Cada evento é totalmente gravado no arquivo antes de ser observado. wc -l < FILE conta linhas redirecionando o arquivo para o comando; não solicita um recurso. Leia o contador, execute a rotina novamente e leia-o outra vez:
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
Os dois números devem ser iguais. Os quatro membros devem ser preservados. Baixar tudo outra vez desperdiçaria requisições e poderia alterar modos ou timestamps de arquivos corretos, mesmo com hashes finais idênticos.
Pratique falhas de transferência fora do pacote concluído
mkdir -p cria um diretório de experimento se necessário. Ele não redefine o diretório. Deixe intacto o pacote concluído da organização:
mkdir -p trial/fault-test
O endpoint controlado /error retorna HTTP 503. Espere uma mensagem de erro do curl com 503 e um status de script diferente de zero:
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' "$?"
O esperado é HTTP-error exit: 1. O endpoint controlado /partial fecha a conexão após transferir apenas parte do corpo anunciado. Espere o erro 18 do curl sobre bytes restantes e, novamente, nenhum candidato publicado:
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' "$?"
O esperado é Partial-transfer exit: 1. Falha de conexão, recusa HTTP e conteúdo errado em HTTP 200 são observações diferentes; todas impedem uma substituição não verificada. Recupere o experimento com o mesmo endpoint correto e os mesmos argumentos:
bash repair-pack.sh /opt/labex/download-pack-state/expected.sha256 http://127.0.0.1:8080/good trial/fault-test
Se digitar incorretamente o caminho do manifesto ou do diretório, o script identifica o objeto necessário e termina com status diferente de zero. Confira pwd, ls e o caminho absoluto da referência antes de tentar de novo. Se houver um erro de sintaxe no script salvo, substitua somente repair-pack.sh pelo here-document completo acima. Não apague o pacote da organização para corrigir uma digitação.
A verificação final lê seu pacote real e os objetos que devem ser preservados. Ela também executa seu script sem alterações com pacotes isolados de outros nomes e falhas HTTP controladas, incluindo um destino danificado existente e um arquivo vazio legítimo ausente. Essas requisições vêm do seu script, não de um download do avaliador que complete evidências ausentes. Repetir a avaliação não repara nem redefine seu trabalho real.
Resumo
Você baixou um candidato, verificou SHA256 antes de publicá-lo e criou um script reutilizável de reparo seletivo. Erros HTTP reais, respostas bem-sucedidas com conteúdo errado e corpos interrompidos não chegaram aos nomes finais dos arquivos. Arquivos corretos e notas pessoais foram preservados, e uma segunda execução no pacote completo não precisou de downloads.



