Úvod
Pro osobní potřeby jsem na doma spustil VSphere, na kterém provozuji virtuální router a server Ubuntu jako mediální server a spoustu dalších užitečných aplikací, a tento server musí být dostupný z Internetu. Problém však je, že můj poskytovatel nabízí statickou IP za peníze, které by se daly lépe využít. Proto jsem používal kombinaci ddclient + cloudflare.
Všechno fungovalo dobře, dokud ddclient přestal pracovat. Po malém hrabání jsem pochopil, že nastal čas na improvizaci, protože hledání problému zabralo příliš mnoho času. Nakonec to vyústilo v malého démona, který jednoduše funguje, a to mi stačí.
Kdo má zájem – vítejte pod kat.
Používané nástroje a jak to funguje
Nejprve jsem se dozvěděl na stránkách cloudflare vše potřebné o . A už jsem se chystal implementovat všechno v Pythonu (po seznámení s Pythonem ho čím dál více používám pro nějaké jednoduché úkoly nebo když potřebuji rychle vytvořit prototyp), když jsem náhle narazil na prakticky hotovou implementaci.
Základem se stal wrapper .
Vzali jsme jeden z příkladů pro aktualizaci DNS a přidali použití konfiguračního souboru a možnost aktualizovat více A záznamů v rámci zóny a samozřejmě neomezené množství zón.
Logika je následující:
- Skript získá ze souboru s konfigurací seznam zón a prochází je v cyklu
- V každé zóně skript prochází v cyklu každou DNS záznam typu A nebo AAAA a porovná veřejnou IP s záznamem
- Pokud se IP liší – změní ji, pokud ne, přeskočí iteraci cyklu a přejde k následující.
- Usne na čas uvedený v konfiguraci.
Instalace a konfigurace
Asi by bylo možné vytvořit i .deb balíček, ale nejsem v tom silný, a není to tak složité.
Celý proces jsem podrobně popsal v README.md na .
Ale pro jistotu to shrnu v ruštině:
- Ujistěte se, že máte nainstalován python3 a python3-pip, pokud ne – nainstalujte je (v systému Windows se python3-pip instaluje společně s Pythonem).
- Naklonujte nebo stáhněte repozitář.
- Nainstalujte potřebné závislosti.
python3 -m pip install -r requirements.txt - Spusťte instalační skript.
Pro Linux:chmod +x install.sh sudo ./install.shPro Windows: windows_install.bat
- Upravte konfigurační soubor.
Pro Linux:sudoedit /etc/zen-cf-ddns.confPro Windows:
Otevřete soubor zen-cf-ddns.conf ve složce, kam jste skript nainstalovali.
To je obyčejný JSON soubor, nastavení není složité – speciálně jsem popsal dvě různé zóny jako příklad.
Co se skrývá za instalátory?
install.sh pro Linux:
- Vytváří se uživatel pro spuštění démonu, bez vytvoření domovského adresáře a možnosti přihlášení.
sudo useradd -r -s /bin/false zen-cf-ddns - Vytváří se soubor pro zápis logu do /var/log/
- Děláme vlastníkem souboru logu nedávno vytvořeného uživatele
- Souborové umístění se kopírují na správná místa (konfigurační soubor do /etc, spustitelný soubor do /usr/bin, soubor služby do /lib/systemd/system)
- Služba se aktivuje
windows_install.bat pro Windows:
- Kopíruje spustitelný soubor a konfigurační soubor do uživatelského zvoleného adresáře
- Vytváří úlohu v plánovači pro spuštění skriptu při startu systému
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Po změně konfigurace je potřeba skript restartovat, v Linuxu to je jednoduché a obvyklé:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
pro Windows bude potřeba zabít proces pythonw a skript znovu spustit (moc se mi nechce psát službu pro Windows v C#):
taskkill /im pythonw.exeTímto je instalace a nastavení hotové, používejte na zdraví.
Pro ty, kteří chtějí vidět ne moc hezký kód Pythonu, tady je .
Licenční smlouva MIT, takže s tímto kódem dělejte, co chcete.
P.S.: Chápu, že to dopadlo trochu kostrbatě, ale plní svůj úkol na jedničku.
UPD: 11.10.2019 17:37
Našel jsem ještě jeden problém, a pokud by někdo mohl poradit, jak ho vyřešit — budu velmi vděčný.
Problém je v tom, že pokud nainstaluji závislosti bez sudo python -m pip install -r …, moduly nebudou přístupné z uživatelského účtu služby, a nechtěl bych nutit uživatele instalovat moduly pod sudo, to by bylo špatně.
Jak to udělat správně, aby to vypadalo dobře?
UPD: 11.10.2019 19:16 Problém byl vyřešen použitím venv.
Vyšlo několik změn. Nová verze bude brzy.
Zdroj: habr.com
