Предговор
За лични нужди у дома настроих VSphere, на който въртя виртуален рутер и Ubuntu сървър като медия-сървър, и още купища различни неща, и този сървър трябва да е достъпен от интернет. Но проблемът е, че моят доставчик предоставя статичен IP срещу заплащане, което винаги може да се използва по-полезно. Затова използвах комбинация от ddclient + cloudflare.
Всичко беше наред, докато ddclient не спря да работи. Малко поразпитах проблема и разбрах, че е време за 'костилки' и 'велосипеди', тъй като времето за търсене на проблема стана твърде много. В крайна сметка всичко се изля в малък демон, който просто работи, а на мен не ми трябва повече.
Който се интересува – добре дошъл под кат.
Използвани инструменти и как ‘това’ работи
Така че на първо място научих на сайта на cloudflare всичко, което трябва да знам за . И вече бях започнал да реализирам всичко на Python (след като се запознах с Python, все по-често го използвам за някои прости задачи или когато бързо ми трябва прототип), и изведнъж попаднах на практически готова реализация.
В общи линии основата беше вързана с врапър .
Взех един от примерите за обновление на DNS и добавих използването на конфигурационен файл и възможността да обновявам няколко A записи в рамките на зона и естествено неограничено количество зони.
Логиката е следната:
- Скриптът получава от конфигурационния файл списък със зони и преминава през тях в цикъл
- Във всяка зона скриптът преминава през всяка DNS запис от тип А или AAAA и сравнява публичния IP с записа
- Ако IP-то е различно — заменя го, ако не, пропуска итерацията на цикъла и преминава към следващата
- За момента, указан в конфигурацията
Инсталиране и настройка
Вероятно можех да направя и .deb пакет, но не съм много добър в това, а и не е толкова сложно.
Процесът доста подробно съм описал в README.md на .
Но за всеки случай ще опиша на български общо:
- Убедете се, че имате инсталиран python3 и python3-pip, ако нямате — инсталирайте (в Windows python3-pip се инсталира заедно с Python)
- Клонирайте или изтеглете репозитория
- Инсталирайте необходимите зависимости.
python3 -m pip install -r requirements.txt - Стартирайте инсталационния скрипт
За Linux:chmod +x install.sh sudo ./install.shЗа Windows: windows_install.bat
- Редактирайте конфигурационния файл
За Linux:sudoedit /etc/zen-cf-ddns.confЗа Windows:
Отворете файла zen-cf-ddns.conf в папката, където инсталирахте скрипта.
Това е обикновен JSON файл, няма нищо сложно в настройките – специално описах две различни зони за пример.
Какво се крие зад инсталаторите?
install.sh за Linux:
- Създава се потребител за стартиране на демона, без създаване на домашна директория и възможност за вход.
sudo useradd -r -s /bin/false zen-cf-ddns - Създава се файл за запис на лог в /var/log/
- Правим собственик на файла за лог наскоро създадения потребител.
- Копират се файловете по местата им (конфигурация в /etc, изпълним файл в /usr/bin, файл на услугата в /lib/systemd/system)
- Активира се услугата.
windows_install.bat за Windows:
- Копира изпълнимия файл и файла с конфигурацията в указаната от потребителя папка.
- Създава задача в планирача да стартира скрипта при стартиране на системата.
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
След промяна на конфигурацията скриптът трябва да се рестартира, в Linux всичко е просто и познато:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
за Windows ще трябва да убия процеса pythonw и да стартирам скрипта отново (много мързи да пиша услуга под Windows на C#):
taskkill /im pythonw.exeС това инсталацията и настройката приключват, ползвайте на здраве.
За тези, които искат да видят не най-красивия код на Python, ето .
Лицензия MIT, така че правете каквото искате с това добро.
P.S.: Разбирам, че се получи малко спретнато, но справя се с задачата на ура.
UPD: 11.10.2019 17:37
Намерен е още 1 проблем, и ако някой може да подсказва как да го реша — ще бъда много благодарен.
Проблемът е, че ако инсталирам зависимостите без sudo python -m pip install -r …, то от потребителя на услугата модулите няма да са видими, а не ми се иска да накарам потребителите да инсталират модулите с sudo, освен това не е правилно.
Как да направя правилно, за да изглежда красиво?
UPD: 11.10.2019 19:16 Проблемът е решен с използване на venv.
Получиха се няколко изменения. Очаквайте нова версия съвсем скоро.
Източник: habr.com
