Wstęp
Dla osobistych potrzeb w domu uruchomiłem VSphere, na którym pracuję z wirtualnym routerem i serwerem Ubuntu jako serwerem multimedialnym oraz wieloma innymi przydatnymi rzeczami, a ten serwer musi być dostępny z Internetu. Problem w tym, że mój dostawca oferuje statyczny adres za opłatą, a te pieniądze można zawsze wykorzystać w bardziej użyteczny sposób. Dlatego korzystałem z połączenia ddclient + cloudflare.
Wszystko było w porządku, aż ddclient przestał działać. Trochę majstrując przy tym, zrozumiałem, że nadszedł czas na obejścia i kręcenie kół, ponieważ czas na poszukiwanie problemu stał się zbyt długi. Ostatecznie wszystko przerodziło się w mały demon, który po prostu działa, a więcej mi nie trzeba.
Kto jest zainteresowany – serdecznie zapraszam pod kat.
Używane narzędzia i sposób działania „tego”
Więc najpierw dowiedziałem się na stronie cloudflare wszystkiego, co muszę wiedzieć o . I już miałem zamiar wdrażać wszystko w Pythonie (po zapoznaniu się z Pythonem coraz częściej wykorzystuję go do prostych zadań lub gdy muszę szybko zrealizować prototyp), kiedy natknąłem się na niemal gotową implementację.
Generalnie jako podstawę wzięto wrapper .
Wziąłem jeden z przykładów do aktualizacji DNS i dodałem użycie pliku konfiguracyjnego oraz możliwość aktualizacji kilku rekordów A w ramach strefy oraz, oczywiście, nieograniczonej liczby stref.
Logika jest następująca:
- Skrypt pobiera z pliku konfiguracyjnego listę stref i przechodzi przez nie w pętli
- W każdej strefie skrypt przechodzi w pętli przez każdy rekord DNS typu A lub AAAA i porównuje publiczny adres IP z rekordem
- Jeśli IP się różni — zmienia go, jeśli nie, pomija iterację pętli i przechodzi do następnego
- Usypia na czas określony w konfiguracji
Instalacja i konfiguracja
Można by chyba stworzyć pakiet .deb, ale nie jestem w tym dobry, a poza tym nie jest to takie trudne.
Proces opisałem dość szczegółowo w README.md na .
Ale na wszelki wypadek opiszę to ogólnie po rosyjsku:
- Upewnij się, że masz zainstalowanego python3 i python3-pip, jeśli nie — zainstaluj (w Windows python3-pip jest instalowany razem z Pythonem)
- Sklonuj lub pobierz repozytorium
- Zainstaluj wymagane zależności.
python3 -m pip install -r requirements.txt - Uruchom skrypt instalacyjny
Dla Linux:chmod +x install.sh sudo ./install.shDla Windows: windows_install.bat
- Edytuj plik konfiguracyjny
Dla Linux:sudoedit /etc/zen-cf-ddns.confDla Windows:
Otwórz plik zen-cf-ddns.conf w folderze, do którego zainstalowałeś skrypt.
To jest standardowy plik JSON, w ustawieniach nie ma nic skomplikowanego – specjalnie opisałem jako przykład 2 różne strefy w nim.
Co kryje się za instalatorami?
install.sh dla systemu Linux:
- Tworzony jest użytkownik do uruchamiania demona, bez tworzenia domowego katalogu i możliwości logowania.
sudo useradd -r -s /bin/false zen-cf-ddns - Tworzony jest plik do zapisu logów w /var/log/
- Ustalamy właścicielem pliku loga niedawno utworzonego użytkownika
- Pliki są kopiowane na swoje miejsca (konfiguracja w /etc, plik wykonywalny w /usr/bin, plik usługi w /lib/systemd/system)
- Usługa jest aktywowana
windows_install.bat dla systemu Windows:
- Kopiuje plik wykonywalny i plik konfiguracyjny do wskazanej przez użytkownika folderu
- Tworzy zadanie w harmonogramie, aby uruchomić skrypt przy starcie systemu
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Po zmianie konfiguracji skrypt należy ponownie uruchomić, w Linuxie wszystko jest proste i znane:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
dla Windows będzie trzeba zabić proces pythonw i ponownie uruchomić skrypt (naprawdę nie chce mi się pisać usługi pod Windows w C#):
taskkill /im pythonw.exeNa tym instalacja i konfiguracja się kończy, korzystaj ze zdrowiem.
Dla tych, którzy chcą zobaczyć nieco brzydki kod Python, oto .
Licencja MIT, więc rób z tym, co chcesz.
P.S.: Rozumiem, że wyszło trochę chaotycznie, ale radzi sobie z zadaniem na medal.
UPD: 11.10.2019 17:37
Znalazłem jeszcze 1 problem i jeśli ktoś podpowie, jak go rozwiązać — będę bardzo wdzięczny.
Problem polega na tym, że jeśli zainstalować zależności bez sudo python -m pip install -r …, to z konta użytkownika usługi moduły nie będą widoczne, a nie chciałbym zmuszać użytkowników do instalowania modułów z użyciem sudo, bo to nie jest właściwe.
Jak poprawnie to zrobić, żeby było ładnie?
UPD: 11.10.2019 19:16 Problem rozwiązany dzięki użyciu venv.
Wprowadziło to kilka zmian. Kolejna wersja będzie wkrótce.
Źródło: habr.com
