Предговор
За лични нужди у дома инсталирах VSphere, на който въртя виртуален рутер и сървър с Ubuntu в ролята на медиа-сървър, заедно с много други полезни неща, и този сървър трябва да бъде достъпен от интернет. Но проблемът е, че моят доставчик предлага статичен IP срещу заплащане, а винаги може да се намери по-полезно приложение за парите. Затова използвах комбинацията ddclient + cloudflare.
Всичко бе наред, докато ddclient не спря да работи. След малко разследване разбрах, че е време за шаблони и колелета, тъй като времето за търсене на проблема стана твърде много. В крайна сметка всичко прерасна в малък демон, който просто работи, а на мен не ми трябва нищо повече.
На интересуващите се – добре дошли под кат.
Използвани инструменти и как работи "то"
Така че на първо място научих на сайта на cloudflare всичко, което трябва да знам за . И вече бях започнал да го реализирам на Python (след запознаването с Python, все по-често го използвам за прости задачи или когато трябва бързо да направя прототип), когато изведнъж попаднах на почти готова реализация.
Общо взето, за основа беше взет враппер .
Взех един от примерите за обновление на DNS и добавих използване на конфигурационен файл и възможност за обновяване на няколко A записа в рамките на зоната и естествено неограничен брой зони.
Логиката е следната:
- Скриптът получава от конфигурационния файл списък със зони и минава през тях в цикъл.
- Във всяка зона скриптът минава в цикъл през всяка DNS запис типа A или 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 файл, по настройките няма нищо сложно – нарочно описах като пример 2 различни зони в него.
Какво се крие зад инсталаторите?
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
