Úvod
Pre osobné potreby doma som spustil VSphere, na ktorom spravujem virtuálny router a server Ubuntu ako mediálny server a ešte množstvo ďalších vecí, a tento server by mal byť prístupný z internetu. Ale problém je, že môj poskytovateľ ponúka statickú IP za peniaze, ktoré by sa dali využiť na užitočnejšie účely. Preto som používal kombináciu ddclient + cloudflare.
Všetko bolo v poriadku, pokiaľ ddclient prestal fungovať. Trochu som ho skúmal a zistil som, že prišiel čas na núdzové riešenia, pretože hľadanie problému začalo zaberať príliš veľa času. Nakoniec to vyústilo do malého démona, ktorý jednoducho funguje, a to je presne to, čo potrebujem.
Kto má záujem – vitajte pod katom.
Použité nástroje a ako "to" funguje
Tak najprv som na stránke cloudflare zistil všetko, čo potrebujem vedieť o . A už som sa chystal realizovať všetko na Pythone (po zoznámení sa s Pythonom, ho čoraz častejšie používam na nejaké jednoduché úlohy alebo keď potrebujem rýchlo vytvoriť prototyp), keď som narazil na prakticky hotovú realizáciu.
Celkom na základe bola použitá obálka .
Vzali sme jeden z príkladov na aktualizáciu DNS a pridali sme použitie konfiguračného súboru a možnosť aktualizovať niekoľko A záznamov v rámci zóny a prirodzene aj neobmedzený počet zón.
Logika je nasledovná:
- Skript získa zo súboru konfigurácie zoznam zón a prejde ich cyklom
- V každej zóne skript prechádza cyklom cez každú DNS záznam typu A alebo AAAA a porovnáva verejnú IP s týmto záznamom
- Ak sa IP líši — mení ho, ak nie, preskočí iteráciu cyklu a prejde na ďalšiu
- Zaspí na čas uvedený v konfiguračnom súbore
Inštalácia a nastavenie
Asi by sa dalo spraviť aj .deb balík, ale v tomto nie som silný, a nie je to až také zložité.
Celý proces som podrobne opísal v README.md na .
Ale pre každý prípad to opíšem po rusky všeobecne:
- Uistite sa, že máte nainštalovaný python3 a python3-pip, ak nie — nainštalujte (v systéme Windows sa python3-pip inštaluje spolu s Pythonom)
- Klónujte alebo stiahnite repozitár
- Nainštalujte potrebné závislosti.
python3 -m pip install -r requirements.txt - Spustite inštalačný skript
Pre Linux:chmod +x install.sh sudo ./install.shPre Windows: windows_install.bat
- Upravte konfiguračný súbor
Pre Linux:sudoedit /etc/zen-cf-ddns.confPre Windows:
Otvorte súbor zen-cf-ddns.conf v priečinku, do ktorého ste nainštalovali skript.
Toto je bežný JSON súbor, nastavenia nie sú zložité – špeciálne som popísal ako príklad 2 rôzne zóny v ňom.
Čo sa skrýva za inštalátormi?
install.sh pre Linux:
- Vytvára sa používateľ pre spustenie démona, bez vytvorenia domovského adresára a možnosti prihlásenia.
sudo useradd -r -s /bin/false zen-cf-ddns - Vytvára sa súbor pre zápis logu v /var/log/
- Robíme vlastníkom súboru logu nedávno vytvoreného používateľa
- Súbory sa kopírujú na svoje miesto (konfiguračný súbor do /etc, spustiteľný súbor do /usr/bin, súbor služby do /lib/systemd/system)
- Služba sa aktivuje
windows_install.bat pre Windows:
- Kopíruje spustiteľný súbor a konfiguračný súbor do priečinka zvoleného používateľom
- Vytvára úlohu v plánovači na spúšťanie skriptu pri štarte systému
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Po zmene konfigurácie je potrebné skript reštartovať, v Linuxe je to jednoduché a známe:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
pre Windows bude potrebné ukončiť proces pythonw a znovu spustiť skript (veľmi sa mi nechce písať službu pre Windows v C#):
taskkill /im pythonw.exeNa tomto sa inštalácia a nastavenie dokončili, používajte to k šťastiu.
Pre tých, ktorí chcú vidieť nie veľmi pekný kód v Pythone, tu je .
Licencia MIT, takže s týmto materiálom robte, čo chcete.
P.S.: Chápem, že to vyšlo trochu kostrbato, ale so svojou úlohou si poradí skvele.
UPD: 11.10.2019 17:37
Našiel som ešte 1 problém a ak by mi niekto poradil, ako ho vyriešiť – bol by som veľmi vďačný.
Problém je v tom, že ak nainštalujete závislosti bez sudo python -m pip install -r …, tak moduly nebudú viditeľné z používateľskej služby a nechcem nútiť používateľov inštalovať moduly cez sudo, čo nie je správne.
Ako správne to urobiť, aby to bolo pekné?
UPD: 11.10.2019 19:16 Problém bol vyriešený použitím venv.
Objavilo sa niekoľko zmien. Nové vydanie bude čoskoro.
Zdroj: habr.com
