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.
Mateusz Mazurek
chwilunia… czy ja dobrze widze że ta binarka z crona bedzie odpalana z uprawnieniem superużytkownika?
Hmm, fakt:P nie powinno tak być!
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
„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?
Ja osobiście pierwsze widzę :(
Ż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:
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ą:
Działa perfecto: 07-2020r.
Dzięki! Na bank się przyda komuś!
A jak usuwać starsze pliki niż 7 dni i opróżniać kosz ?
Niestety nie zagłębiałem się w to :(