Synchronizace s Google diskem

Založil Petr Blažíček, 11. 03. 2020, 12:19:28

Předchozí téma - Další téma

Petr Blažíček

Komfortního GoogleDisc klienta jako pro Windows stále nemáme - i když upřímně řečeno ta inovace v podobě Zálohování a synchronizace je natolik revoluční, že na ni nějak nestačím. Všiml jsem si, že se na GDrive vytvoří nový objekt/adresář, do kterého se zálohuje vybraný obsah na lokálu. Pro každý počítač nový. Doma se naopak vytvoří zrcadlo vzdáleného obsahu. To je přesně způsob, jakým si to vůbec nepředstavuju.
Já bych to chtěl tak, že bez toho, abych jakkoli upravoval adresářovou strukturu (šmatal na nastavení, pozn. red.), měl bych k dispozici stejné dokumenty na Sid notebooku v Concorde nad Atlantikem jako na Bullseye desktopu v loveckém zámečku za Prahou, na Buster desktopu ve svém letním sídle i na Windows 10 workstation na pav. č. 13.
K tomu mi dopomáhej... To je taky problém. Solidní a použitelný CLI klient grive2 už je u Google považován za nedůvěryhodný. Naštěstí jich vzniklo více, např. drive - a tomu jsem tento úkol svěřil. Takže nainstalovat - nastavit.
Myslím, že většina z vás používá nebo má aspoň nainstalovaný C kompilátor gcc, stejně jako verzovací systém Git, kdyby snad ne:
# apt install build-essential git
A samozřejmě jazyk Go, ve kterém je klent napsán.

# tar -C /usr/local -xzf gox.xx.xx.linux-amd64.tar.gz
$ mkdir go

Nový adresář je Go Workplace a jelikož co můžeš udělat v $HOME... Cestu přidáme podmíněně do $PATH v souboru .profile:

# set GOLANG PATH if workplace exists
if [ -d "$HOME/go" ] ; then
    GOPATH="$HOME/go"
    PATH="/usr/local/go/bin:$GOPATH:$GOPATH/bin:$PATH"
fi

Po restartu:
$ go get -u github.com/odeke-em/drive/drive-google
To sestavení trvá poměrně dlouho - nejlépe je obout galoše a zajít naproti do výčepu na žejdlík až dva.
Pokud vše proběhlo v pořádku, můžeme pokračovat. Podotýkám, že nehodlám cokoli měnit v adresářové struktuře, takže kořenový adresář virtuálního disku je v $HOME.

$ cd ~
$ drive-google init

Tady zkopírujte odkaz na OAuth2 přihlášení, vložte do prohlížeče a výsledný token zkopírujte a vložte zpět do terminálu, kde je očekáván. V pohodě? Tak můžeme testovat. Nejdříve ovšem vytvoříme konfigurační soubor - kdo pracuje s Gitem, bude jako doma - hlavně proto, že celý klient hodně okoukal chování od Gitu. Vzorový soubor .driverc - klasicky do $HOME:

[pull/push]
exclude-ops=delete
#no-prompt=true

Jde mi pouze o adresář Documents (nebo Dokumenty - to záleží na vkusu každého... však víte. ovšem kdo používá plnou lokalizaci, může se setkat s problémy - o tom později) - vycházím ze situace, že na vašem Google disku se o adresáři Documents zatím nic neví. Vytvoříme zálohu:
$ drive-google push Documents
Teď by to chtělo, aby to tak nějak samo...
Aby to chodilo samo chci každopádně hodit na krk nějaké mnohem vyšší vrstvě, než je např. systemd. Přesně tak - desktop environment ať se stará. V mém případě jednoznačně XFCE, však ono se to u ostatních nebude o mnoho lišit. Jestli jsem něco nezměnil na cloudu by se mohlo kontrolovat při každém startu počítače, jednoduchý skriptík gdrive-pull.sh:

cd ~/
notify-send -t 15000 -i /usr/share/icons/gnome/256x256/status/gnome-netstatus-rx.png "Google drive sync =>"
drive-google pull Documents

A na kontrolu změn na lokálu další miniskript gdrive-push.sh:

cd ~/
notify-send -t 15000 -i /usr/share/icons/gnome/256x256/status/gnome-netstatus-tx.png "Google drive sync <="
drive-google push Documents
#/sbin/shutdown -P now

Pozor na poslední, zakomentovaný řádek - tady se dopustím malého hříchu - nechci zadávat heslo při vypínání počítače:
# chmod u+s /sbin/shutdown
Nejsme na serveru, tak z toho nebudeme dělat telenovelu.
Nyní můžeme skripty otestovat - Pokud máte něco v dokumentech na lokálu a na cloudu zatím nic, vyzkoušejte jako prvni gdrive-push.
Pokud je vše v pořádku, pull necháme automaticky spouštět na přihlášení - jak se to dělá není třeba popisovat, modří už vědí, nebo si to najdou. A pro push vytvoříme vypínací tlačítko. Opět všichni znají, nebo si najdou.
Ten návod by měl být komplexní, takže ještě něco, co do tohoto fóra sice nepatří - ale pro úplnost by mělo být uvedeno - kdyžtak samozřejmě odstraním. Jdeme na Vyndejsi.
Batch soubory a utility dávám do adresáře C:\Tools - jen pro ilustraci. Důležitá věc - záleží na antiviru, ale může se stát, že začne dávat do karantény Go moduly  - takže je lepší ho na tu chvilku vypnout. Tyhle věci budou potřeba: gcc kompilátor - při instalaci stačí zaškrtnout gcc a Add to path - víc není potřeba, Git a Golang.
Bude třeba přidat jednu syst. proměnnou: Win + R -> sysdm.cpl ,3 -> Proměnné prostředí + CGO_ENABLED=0 a přidat cesty do Path + C:\Tools + C:\Go\bin. A restart.
S výhodou použijeme Mingw terminál, který sebou přináší Git. Start -> Git Bash:
$ go get -u github.com/odeke-em/drive/cmd/drive
A zase můžeme jít v klidu na jedno.
Pokud je vše v pořádku, kýžený drive.exe soubor najdeme v %USERPROFILE%\go\bin.
Přesuneme ho do C:\Tools a všechny pomůcky můžeme klidně odinstalovat - nejlépe něčím, co zamete radioaktivní stopy v registrech, např. Revo uninstaller. Aktivujeme klienta:
$ drive init
A vyzkoušíme (viz verze pro linux). Synchronizační skripty budou identické jako v linuxu - až na ty drobný rozdíly. Konfigurační soubor .driverc můžeme normálně zkopírovat a umístit do $HOME, tj. %USERPROFILE%. Dokumenty ve Windows ovšem obsahují např. linky na adresáře a .ini soubory, které nás nezajímají - dokonce naopak, takže přibude soubor .driveignore přibližně s tímto obsahem:

# Ignore symlinks
Filmy
Hudba
Obrázky
desktop.ini

V C:\Tools vytvoříme batch soubory
gdrive-pull.bat:

@echo off
echo "******************************"
echo "**           Sync           **"
echo "** Google disc => Documents **"
echo "******************************"

drive pull %USERPROFILE%\Documents

a gdrive-push.bat:

@echo off
echo "******************************"
echo "**           Sync           **"
echo "** Documents => Google disc **"
echo "******************************"

drive push %USERPROFILE%\Documents
rem SHUTDOWN /s /f /t 0

Pull skript by se měl spouštět při startu Woken, takže ho po vyzkoušení přesuneme sem: Win + R -> shell:startup
Push skript - pro něj opět vytvoříme vypínací tlačítko. (Zástupce na ploše - velmi lihuprosté).
Až bude všechno běhat jak má, samozřejmě odkomentujeme poslední řádek u push skriptů a zkusíme v .driverc zakomentovat direktivu exclude-ops a naopak povolit no-prompt - pak se ovšem bude dít vůle Boží. Když na jednom compu vymažete dokument, zmizí i na dalších. Ovšem v tom je právě ta synchronizace, že? Nanejvýš důležité je jedno: Přibude-li nový stroj do synchro-skupiny, začněte se zakázaným mazáním obsahu. Jakmile se srovná s ostatními, je možno direktivu vypnout.
Taky je samozřejmě možné u všeho vypnout spouštění terminálu, aby všechno probíhalo diskrétně v ústraní.
A to by snad mělo být vše...

Edit:
Do těch skriptů bych přecejenom přidl úplně primitivní logiku - určitě se to vyplati.

gdrive-pull.sh:

file="$HOME/.drivestate"
state="push"
if [ -f "$file" ] ; then
    state=$(cat "$file")
fi

if [[ $state == "push" ]] ; then
    notify-send -t 15000 -i network-receive "Sync from Google disc..."
    drive-google pull $HOME/Documents && echo "pull" > $file
else
    notify-send -t 10000 -i dialog-warning "The last sync to Google disc may not have occurred !"
fi


gdrive-push.sh:

file="$HOME/.drivestate"
state="pull"
if [ -f "$file" ] ; then
    state=$(cat "$file")
fi

if [[ $state == "pull" ]] ; then
    notify-send -t 15000 -i network-transmit "Sync to Google disc..."
    drive-google push $HOME/Documents && echo "push" > $file && /sbin/shutdown -P now
else
    notify-send -t 10000 -i dialog-warning "The last sync from Google disc may not have occurred !"
fi


gdrive-pull.bat:

@ECHO OFF
SET file="%USERPROFILE%\.drivestate"
SET state="push"

IF EXIST %file% (SET /p state=<"%file%")

IF "%state%"=="push" (
ECHO "******************************"
ECHO "**           Sync           **"
ECHO "** Google disc => Documents **"
ECHO "******************************"
drive pull %USERPROFILE%\Documents
IF %ERRORLEVEL% EQU 0 ECHO pull>%file%
) ELSE (
ECHO "**********************************"
ECHO "**             Sync             **"
ECHO "** The last sync to Google disc **"
ECHO "** may not have occurred !!!!!! **"
ECHO "**********************************"
PAUSE
)


gdrive-push.bat:

@ECHO OFF
SET file="%USERPROFILE%\.drivestate"
SET state="pull"

IF EXIST %file% (SET /p state=<"%file%")

IF "%state%"=="pull" (
ECHO "******************************"
ECHO "**           Sync           **"
ECHO "** Documents => Google disc **"
ECHO "******************************"
drive push %USERPROFILE%\Documents
IF %ERRORLEVEL% EQU 0 ECHO push>%file%
) ELSE (
ECHO "************************************"
ECHO "**              Sync              **"
ECHO "** The last sync from Google disc **"
ECHO "** may not have occurred !!!!!!!! **"
ECHO "************************************"
PAUSE
)

SHUTDOWN /s /f /t 0