Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Inne Linux

Synchronizacja z Google Drive w Linuxie

Cześć,

dokładnie to co jest w tytule wpisu było mi potrzebne kilka dni temu, a skoro problem ten rozwiązałem to warto go tu opisać, bo proces może być dla kogoś ciekawy.

Potrzebowałem zrobić na linuxie (dokładniej Fedora 27) synchronizację jednostronną folderu lokalnego z folderem na Google Drive. Jednostronną tzn każdy plik jaki pojawił się w folderze lokalnym miał automatycznie znaleźć się w chmurze.

Użyłem do tego narzędzia gdrive – konsolowy klient do googledrive’a.

Zaczynamy zabawę

Ściągnijmy pierw binarkę ze strony którą podałem wyżej i przenieśmy ją do trochę bardziej odpowiedniego folderu niż 'Pobrane’. Nadajmy też prawa do wykonywania

sudo mv gdrive-linux-x64 /opt/gdrive-linux-x64
sudo chmod -x /opt/gdrive-linux-x64

Żeby łatwiej korzystać z tak uzyskanego programu zróbmy dowiązanie symboliczne do /usr/bin

sudo ln -s /opt/gdrive-linux-x64 /usr/bin/gdrive

daje to wygodę posiadania go w PATHie, tj nie trzeba od teraz podawać całej ścieżki do programu gdy chcę go wykonać tylko po prostu wpisuje „gdrive” i już ładnie można z tego korzystać.

Warto tu dodać że ściąganie gotowych binarek ze stron jest trochę nie bezpieczne.. Bo nigdy nie wiemy co w nich dokładnie jest. No ale tez nie popadajmy w paranoję.

Gdy mamy już program w PATHie to możemy się zalogować do Google Drive z CLI:

gdrive about

W wyniku tej komendy pojawi się link który należy kliknąć, wyrazić zgodę na dostęp tej aplikacji do chmury i kod który się pojawi po owej akceptacji dostępu – wkleić do konsoli.

No i po tym procesie można korzystać w konsoli z dysku google’a:

[mmazurek@mmazurek ~]$ gdrive about
User: Mateusz Mazurek, [email protected]
Used: 2.9 GB
Free: 13.2 GB
Total: 16.1 GB
Max upload size: 5.2 TB

Właściwa synchronizacja

Właściwa komenda do synchronizacji wygląda tak

gdrive sync upload /home/mmazurek/folder_zrodlowy/ fileId

małym problemem natomiast było dowiedzenie się czym jest „fileId” – tzn łatwo się domyśleć że to docelowy folder, ale skąd wziąć jego ID, poklikałem trochę po dysku Google, ale nie było w informacjach po prawej żadnego IDka.

Na szczęście gdrive umożliwia wylistowanie plików wraz z szukanym IDkiem

gdrive list

gdzie szukane ID jest pierwszą kolumną. Z ciekawostek to to ID jest też w linku jak udostępniamy coś – ale o tym dowiedziałem się już później.

Skoro mamy komendę to użyjmy cron’a (linuxowy harmonogram zadań) by zmusić system do kontrolnej synchronizacji. W tym celu wystarczy otworzyć plik

sudo nano /etc/cron.d/googledrive-sync

i zapisać tam

0 * * * * root /usr/bin/gdrive sync upload /home/mmazurek/folder_zrodlowy/ fileId >> /var/log/googlesync.log 2>&1

Co można przetłumaczyć jako „o każdej godzinie, której minuta jest zerem, każdego dnia, uruchom wskazany program i przekieruj całe jego wyjście do pliku w folderze /var/log” – czyli w godzinach 11:00, 12:00 itp

Plik logów zacznie zapełniać się podobnym wpisem:

Starting sync…
Collecting local and remote file information…
Found 38 local files and 38 remote files
Sync finished in 1.376734023s

I jeśli czytaliście wpis o otrzymaniu oprogramowania to wiecie że to słaba informacja, bo nawet daty nie ma a kolejne wywołania się zlewają ze sobą, napiszmy więc kawałek basha który opakuje to wywołanie:

#!/bin/bash
/usr/bin/date +%d-%m-%y/%H:%M:%S
/usr/bin/gdrive sync upload /home/mmazurek/folder_zrodlowy/ fileId
/usr/bin/echo -----

no i wystarczy zmienić wpis w cron’ie na:

0 * * * * root /opt/sync_gd.sh >> /var/log/googlesync.log 2>&1

uprzednio oczywiście zapisując ten kawałek basha w pliku /opt/sync_gd.sh i nadając mu prawa do wykonywania.

Teraz moje logi wyglądają tak:

09-02-19/17:00:01
Starting sync…
Collecting local and remote file information…
Found 38 local files and 38 remote files
Sync finished in 1.470085637s
-----
09-02-19/18:00:01
Starting sync…
Collecting local and remote file information…
Found 38 local files and 38 remote files
Sync finished in 1.368526734s
-----
09-02-19/19:00:01
Starting sync…
Collecting local and remote file information…
Found 38 local files and 38 remote files
Sync finished in 1.376734023s

Dzięki temu jestem w stanie zdebuggować ewentualnie co się zepsuło jeśli z jakiegoś powodu pliki przestaną się pojawiać w chmurze.

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

9 komentarzy
Inline Feedbacks
View all comments
zyx

chwilunia… czy ja dobrze widze że ta binarka z crona bedzie odpalana z uprawnieniem superużytkownika?

wołek

a może masz jakieś podpowiedzi jak 'naprawić’ działanie apki bo ostatnio rzuca błędem http 400 w/o body ale body jest puste

oskar

„Logowanie się przez Google w tej aplikacji jest tymczasowo wyłączone
Jeszcze nie zweryfikowaliśmy tej aplikacji pod kątem Logowania przez Google.”
Ktos miał taki problem?

Marek Wesołowski

Żeby działał należy paczkę deb rozpakować i podmienić skompilowany grive z własnymi ID:
z grive/src/main.cc zamieniamy w linii 49 i 50 odpowiednio:

const std::string default_id            = "129146822202-mfs98r8gs248g8c13e04jredgfpgq5l0.apps.googleusercontent.com" ;
const std::string default_secret        = "F8PCKbE6E8tIgMzxPRgpQU5i" ;

Oczywiście secret nie jest prawdziwy, ale tak to ma wyglądać. By zbudować pczakę trzeba kilka *-dev doinstalować, Nie ma znaczenia czy *deb czy kompilacja (zmieni się ścieżka co najwyżej)
Można również kompilować z flagą:

cmake .. "-DAPP_ID:STRING=<client_id>" "-DAPP_SECRET:STRING=<client_secret>"

Działa perfecto: 07-2020r.

Paweł

A jak usuwać starsze pliki niż 7 dni i opróżniać kosz ?