Skip to content
forked from urpylka/filesync

Sync a group of files w difficult access (PX4 logs, FlirDuo images & videos)

License

Notifications You must be signed in to change notification settings

Uriy13/filesync

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

591 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FileSync

This software allows to sync a group of files between devices w difficult access:

  • Pixracer (mavros ftp)
  • FlirDuo (external flash drive)
  • website (POST requests, developed for logs.px4.io)
  • FTP server

Start FTP server & filesync manager

For start ftp-server use:

git clone https://github.com/urpylka/filesync
cd filesync
mkdir temp
sudo ./src/ftp_server.py

For start filesync manager use:

git clone https://github.com/urpylka/filesync
cd filesync
mkdir temp
sudo ./src/manager.py config.json

For debug

rm -f flir/db.json && clear && sudo ./src/manager.py
while :; do sleep 1; clear; ls -l Sherlock.s03e01.avi; done

Config file

Some devices:

"source": {
    "device_class": "DISK",
    "module_path": "device_disk",
    "args": {
        "uuid": "D1C6-0146",
        "mount_point": "/mnt"
    }
},
"target": {
    "device_class": "FTP",
    "module_path": "device_ftp",
    "args": {
        "host": "192.168.20.131",
        "user": "test-1",
        "passwd": "passwd"
    }
},
"source": {
    "device_class": "LOCAL",
    "module_path": "device_local",
    "args": {
        "dir": "/home/pi/worker1"
    }
},
"target": {
    "device_class": "POST",
    "module_path": "device_post",
    "args": {
        "uploader_url": "https://logs.px4.io/upload",
        "values": {
            "description": "",
            "additional_feedback": "",
            "email": "email@test.com",
            "allow_for_analysis": false,
            "obfuscated": false
        }
    }
},
"target": {
    "device_class": "WEBDAV",
    "module_path": "device_webdav",
    "args": {
        "host": "https://webdav.yandex.ru",
        "user": "login",
        "passwd": "passwd"
    }
},

Logic model

Model of devices

SOURCE -> LOCAL -> TARGET

All sources & targets must be inherited from device_abstract.py. The local storage placed on computer where executing this program.

Model of program

Program wrote by pubsub technology & consist three workers:

  1. Finder – searching new files on source and adding those to DB and DownloadQueue.
  2. Downloader – downloading files from source to local which contain in DownloadQueue and adding those to DB and UploadQueue.
  3. Uploader – uploading files from local to target which contain in UploadQueue and adding those to DB.

Also

  • The asynchronous DB based on JSON file json_array.py.
  • Internet/connection checker.

Other

MAVFTP

  • For use this script bundle your PixHawk must connect to Companation Computer with USB (NOT UART!)
  • Нельзя запрашивать несколько mavftp-команд параллельно, будет ошибка: "FTP: Busy". По этой причине нельзя создавать несколько downloader'ов, а также по этой причине введена mavftp_lock между downloader'ом и finder'ом. Аналогичным образом работает QGC.
  • Найти ошибку в crc32 для проверки файлов по контрольной сумме
  • Ускорить загрузку логов mavlink/mavros#874

Что может сломаться

  1. Переполнение лога программы
  2. Не запуск программы из-за ошибки (например, db.json incorrect)
  3. Хеш не совпадает
  4. Нет места на сервере
  5. Как помечать на сервере файлы, которые только передаются
  6. Нужно добавить автоматическое создание бекапа бд

Один из алгоритмов

  1. Начинаем качать в буффер сначала или с сохраненной позции
  2. Спрашиваем сколько мы передали без ошибок
  3. Смотрим, что у нас есть в буффере
  4. Сбрасываем буффер (выбрасываем исключение в target.write()), если у нас позиция невходит в него

Обрабатываемые ситуации

Данные случаи не должны приводить к остановке программы требующей участия человека, а также к перезаписи всего файла сначала

  1. Выключение программы и RPi
  2. Горячее изъятие и вставка флеш-карты
  3. Выключение FTP

TODO

  • Если процесс непрерывный и последовательный, можно сделать одну числовую переменную, описывающую состояния файла. Например:

    • 0 - лог найден в source
    • 1 - лог скачен в local
    • 2 - лог выкачен в target
    • 3 - лог удален из source
    • 4 - лог выкачен не полностью
  • Reverse direction

  • Надежность

Ошибки

  1. Вот так можно сломать:
pi@raspberrypi:~ $ sudo mount /dev/disk/by-uuid/5C3D-DD9E /mnt
FUSE exfat 1.2.5
ERROR: 'Video_Tuner_WP_20151216_004_110904.mp4' points to invalid cluster 0.
  1. Если качать с FTP на DISK и отключать диск, бывает так, что файл не сохраняет свою позицию. Мб нужно добавить в деструктор какой-нибудь внутренний Lock (ожидание чтобы операции download & upload завершились). Или что-то, что могло бы вызвать ошибку в их работе или прерывание.

ротация логов мб конфиг и бд где то в другом месте держать?

/mnt/20190403_122014/20190403_122537_816_R.jpg

20190403_122533_785_R.jpg.part

"target_path": "", "downloaded": true, "source_path": "/20190403_122014/20190403_122537_816_R.jpg", "uploaded": false, "dropped": false, "size": 196048

Apr 04 08:14:11 raspberrypi manager.py[314]: 2019-04-04 08:14:11,213 - ERROR - test-1@192.168.20.186: Renaming was interrupted: 550 No such file or directory. Apr 04 08:14:11 raspberrypi manager.py[314]: 2019-04-04 08:14:11,984 - INFO - D1C6-0146: Started w 0 Apr 04 08:14:11 raspberrypi manager.py[314]: 2019-04-04 08:14:11,987 - ERROR - D1C6-0146: Downloading was interrupted: [Errno 2] No such file or directory: '/mnt/20190403_122014/20190403_122537_816_R.jpg'

[I 2019-04-04 15:07:33] ::ffff:192.168.20.172:55558-[test-1] CWD /Users/smirart/github/filesync/temp 250 [I 2019-04-04 15:07:33] ::ffff:192.168.20.172:55558-[test-1] RNFR /Users/smirart/github/filesync/temp/20190403_160336_487_R.jpg.part 550 'No such file or directory.' [I 2019-04-04 15:07:34] ::ffff:192.168.20.172:55558-[test-1] CWD /Users/smirart/github/filesync/temp 250 [I 2019-04-04 15:07:34] ::ffff:192.168.20.172:55558-[test-1] RNFR /Users/smirart/github/filesync/temp/20190403_160336_487_R.jpg.part 550 'No such file or directory.'

drone@drone:~/Desktop/filesync$ sudo ./src/ftp_server.py Traceback (most recent call last): File "./src/ftp_server.py", line 7, in from pyftpdlib.authorizers import DummyAuthorizer ImportError: No module named pyftpdlib.authorizers

Добавить в логи разделение \t

мб разделить логи программы на

если не скаченный файл уже удален нужно посмотреть его на удаленном сервере

https://tunnelblick.net

Filesync Synchronizer

  1. путь + hesh + мб mountpoint
  2. Выявление поддеревьев в деревьях
  3. Нужно выделить максимально большое поддерево
  4. мб нужно чтобы прога строила большой граф со всеми связями
  5. Мб первоначально (для ускорения) строить деревья по hesh

Что такое хеш функция https://www.chaynikam.info/chto-takoe-hash-fayla-i-kak-ego-uznat.html Коллизия в хешах https://habrahabr.ru/post/113127/ Примеры на python http://qaru.site/questions/32672/get-md5-hash-of-big-files-in-python

import hashlib def checksum_md5(filename): md5 = hashlib.md5() with open(filename ,'rb') as f: for chunk in iter(lambda: f.read(128 * md5.block_size), b''): md5.update(chunk) return md5.hexdigest()

print checksum_md5("Downloads/Клубника.rar")

Обход директорий https://www.severcart.org/blog/all/list_direcory_content_with_python/

https://pypi.org/project/webdavclient/ Добавить функционал выбора (удалять после перемещения и тд как в freefilesync)

сделать чтобы DISK работали на macos

  • Логи px4 filesync
  • Ротация логов filesync
  • Csv для бд filesync
  • Ротация логов filesync
  • Что если при переименовании такой файл уже сцществует?
  • Нужно ли качать если файл уже переименован и есть

что если файл filesync сможет забирать еще и почту???

https://tproger.ru/translations/python-gui-pyqt/

https://pythonworld.ru/gui/pyqt5-firstprograms.html https://pythonworld.ru/gui/pyqt5-menustoolbars.html https://pythonworld.ru/gui/pyqt5-layout.html https://pythonworld.ru/gui/pyqt5-eventssignals.html https://pythonworld.ru/gui/pyqt5-dialogs.html https://pythonworld.ru/gui/pyqt5-widgets.html https://pythonworld.ru/gui/pyqt5-widgets2.html https://pythonworld.ru/gui/pyqt5-dragdrop.html https://pythonworld.ru/gui/pyqt5-painting.html https://pythonworld.ru/gui/pyqt5-customwidgets.html https://pythonworld.ru/gui/pyqt5-tetris.html

import my_webdav.urn as ur

path = "/dasfa/пывп/вф"
dir = False

u = ur.Urn(path, dir)

print(u)

print(u.filename())
import my_webdav.urn as ur

path = "/dasfa/пывп/вф"
dir = True

u = ur.Urn(path, dir)

print(u)
print(u.filename())
<?xml version="1.0" encoding="utf-8"?>
<FreeFileSync XmlType="GUI" XmlFormat="14">
    <Compare>
        <Variant>TimeAndSize</Variant>
        <Symlinks>Exclude</Symlinks>
        <IgnoreTimeShift/>
    </Compare>
    <Synchronize>
        <Variant>TwoWay</Variant>
        <DetectMovedFiles>false</DetectMovedFiles>
        <DeletionPolicy>RecycleBin</DeletionPolicy>
        <VersioningFolder Style="Replace"/>
    </Synchronize>
    <Filter>
        <Include>
            <Item>*</Item>
        </Include>
        <Exclude>
            <Item>/.fseventsd/</Item>
            <Item>/.Spotlight-V100/</Item>
            <Item>/.Trashes/</Item>
            <Item>*/.DS_Store</Item>
            <Item>*/._*</Item>
        </Exclude>
        <TimeSpan Type="None">0</TimeSpan>
        <SizeMin Unit="None">0</SizeMin>
        <SizeMax Unit="None">0</SizeMax>
    </Filter>
    <FolderPairs>
        <Pair>
            <Left>/Users/smirart/github/filesync</Left>
            <Right>/Users/smirart/Desktop/untitled folder 2</Right>
        </Pair>
    </FolderPairs>
    <Errors Ignore="false" Retry="0" Delay="5"/>
    <LogFolder/>
    <PostSyncCommand Condition="Completion"/>
    <Gui>
        <MiddleGridView>Action</MiddleGridView>
    </Gui>
</FreeFileSync>

About

Sync a group of files w difficult access (PX4 logs, FlirDuo images & videos)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 98.9%
  • Shell 1.1%