Recuperação de dados verificados da fonte com acesso limitado

1

Resumidamente: eu preciso baixar dados de um dispositivo baseado em Linux, verificar a integridade dos dados e excluir os arquivos de origem (não posso usar o rsync).

Detalhes: Eu tenho um hidrofone implantado no fundo do oceano como parte de um observatório oceânico. Eles hidrofone executa uma distribuição de linux [muito] similar a RHEL da fábrica. O hidrofone gera um novo arquivo .wav a cada 5 minutos e o armazena em um cartão SD. O armazenamento interno é pequeno, por isso gostaríamos de recuperar dados usando um cronjob / script em execução em uma "máquina de recuperação" em terra, verificar os arquivos transferidos completamente e excluir os arquivos de origem do hidrofone. Meu primeiro pensamento foi usar o rsync, mas a fonte não permite conexões rsync (veja as complicações abaixo).

Complicações:

  1. Fazemos não privilégios root ou sudo no hidrofone.
  2. Os únicos protocolos suportados pelo hidrofone são: scp, wget, FTP, ssh
  3. rsync não é suportado: (
  4. FTP anônimo não é permitido.
  5. No início de cada intervalo de 5 minutos (por exemplo, 11:00, 11:05, ...) um arquivo é criado, no final do intervalo de 5 minutos (por exemplo, 11: 04: 59.999, 11:09 : 59.999 ...), o restante do arquivo está escrito. Isso impossibilita o download de todos os arquivos e, em seguida, a exclusão de todos os arquivos de origem, pois o arquivo "stub" dos arquivos de 5 min atualmente em gravação também será excluído (o "stub" inclui metadados importantes). Observe também que, quando o arquivo é gravado inicialmente, ele é gravado com o tamanho de arquivo completo (final) de 28 MB, portanto, não posso filtrar apenas os arquivos com base no tamanho do arquivo. 6) Ocasionalmente, os intervalos de 5 minutos são divididos em dois arquivos (com tamanhos de arquivo totalizando até 28 MB). 7) O host remoto (hidrofone) não pode executar cronjobs, então a maioria dos comandos tem que ser passada por ssh.

Os nomes dos arquivos são formatados como: SBW_yyyymmdd_HHMMSS.wav

Agradecemos antecipadamente por sua ajuda e respostas, e por favor, sinta-se à vontade para me informar se posso melhorar a clareza / detalhes da pergunta.

UPDATE: Depois de algumas dicas nos comentários abaixo, e fazendo uma tentativa dura, é isso que eu fiz (eu generalizei o resultado um pouco). O script é executado a cada 5 minutos como um cron job em nosso servidor de recuperação. É terrivelmente lento e ineficiente. Qualquer entrada seria heplful!

#!/bin/bash
## Define Variables
remUser="<user>"           # Hydrophone SSH Username
remHost="<remote-host>"    # Hydrophone hostname   
sshCon="$remUser@$remHost"

## Remove previous md5 and get current MD5 Sums from remote-host
echo "Getting remoteWAV.md5 info"
rm -f remoteWAV.md5
ssh $sshCon 'cd ~/Data; md5sum *.wav' > remoteWAV.md5

## Check exit status and exit if bad connection
if [ $? -gt 0 ]; then echo "Connection failed, aborting"; exit 1; fi

## Wait One minute for any changes to remote files
### This is to allow any in-progress files the chance
### to change their md5sum from the ones gathered earlier
echo "pausing 60 sec..."
sleep 60
echo "resuming..."

## Download the files
echo "Getting files from remote host"
scp $sshCon:~/Data/*.wav /path/to/local-data-files/
if [ $? -gt 0 ]; then echo "Connection failed, aborting"; exit 1; fi

## Check the md5 sums
##    - First delete the old localWAV.md5 file
##    - Then we need to add the local directory to the filenames
##    - Now we can finally check the remote vs local checksums
echo "Checking local files against remoteWAV.md5 sums"
rm -f localWAV.md5
sed -i 's|SBW|/path/to/local-data-files/SBW|g' remoteWAV.md5
md5sum -c < remoteWAV.md5 > localWAV.md5

## Display checksum results
echo "Local MD5 results:"
echo "=================="
cat localWAV.md5

## Remove files that failed md5sum check from local storage
##    (This is so users don't download bad data)
cat localWAV.md5 | grep -v "OK" | cut -d ":" -f 1 | xargs -I {} rm -fv {}

## Find list of files that were downloaded successfully
##     - First remove the old goodfiles.tmp list
##     - Create a new listing of files that passed the md5sum check
##       but remove the last (most recent) file from the list in case
##       it is still being written on the remote host (second safety check)
##     - Remove the local directory from the filenames
##     - Copy the list of good files to the remote host
##     - Issue the delete command on the remote host
rm -f goodfilesWAV.tmp
head -n -1 localWAV.md5 | grep "OK" | cut -d ":" -f 1 > goodfilesWAV.tmp
sed -i 's|/path/to/local-data-files/||g' goodfilesWAV.tmp
echo "Sending deletion list to remote host"
scp ./goodfilesWAV.tmp $sshCon:~/Data/
echo "Removing files from remote host"
ssh $sshCon 'cd ~/Data; xargs rm -fv < goodfilesWAV.tmp; rm goodfilesWAV.tmp'
echo "Complete."
    
por Kellen 06.03.2018 / 21:23

0 respostas

Tags