Назад | Перейти на главную страницу

Получение проверенных данных из источника с ограниченным доступом

Вкратце: Мне нужно загрузить данные с устройства на базе Linux, проверить целостность данных и удалить исходные файлы (нельзя использовать rsync).

Подробности: У меня есть гидрофон, установленный на дне океана как часть океанской обсерватории. Их гидрофон запускает [очень] легкий RHEL-подобный дистрибутив Linux с завода. Гидрофон генерирует новый файл .wav каждые 5 минут и сохраняет его на SD-карте. Внутреннее хранилище мало, поэтому мы хотели бы получить данные с помощью cronjob / скрипта, запущенного на «поисковой машине» на берегу, полностью проверить переданные файлы, а затем удалить исходные файлы с гидрофона. Моей первой мыслью было использовать rsync, но исходный код не разрешает подключения rsync (см. Сложности ниже).

Осложнения:

  1. Мы делаем не иметь права root или sudo на гидрофоне.
  2. Гидрофон поддерживает только следующие протоколы: scp, wget, FTP, ssh.
  3. rsync не поддерживается :(
  4. Анонимный FTP не разрешен.
  5. В начале каждого 5-минутного интервала (например, 11:00, 11:05, ...) создается файл, в конце 5-минутного интервала (например, 11: 04: 59.999, 11: 09: 59.999. ..), остальная часть файла записывается. Это делает невозможным просто загрузить все файлы, а затем удалить все исходные файлы, потому что файл-заглушка для 5-минутных файлов, которые в данный момент записываются, также будет удален («заглушка» включает важные метаданные). Также обратите внимание, что когда файл изначально записывается, он записывается с полным (окончательным) размером файла 28 МБ, поэтому я не могу просто фильтровать файлы по размеру файла. 6) Иногда 5-минутные интервалы разделяются на два файла (общий размер файлов достигает 28 МБ). 7) Удаленный хост (гидрофон) не может запускать cronjobs, поэтому большинство команд необходимо передавать через ssh.

Имена файлов имеют следующий формат: SBW_yyyymmdd_HHMMSS.wav

Заранее благодарим вас за помощь и ответы, и, пожалуйста, дайте мне знать, смогу ли я улучшить ясность / детализацию вопроса.

ОБНОВИТЬ: После некоторых советов в комментариях ниже и грубых попыток я пришел к этому (я немного обобщил результат). Скрипт запускается каждые 5 минут как задание cron на нашем сервере поиска. Это ужасно медленно и неэффективно. Любой ввод будет полезен!

#!/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."