Предисловие
Для личных нужд дома поднял VSphere, на котором кручу виртуальный маршрутизатор и Ubuntu сервер в качестве медиа-сервера и еще кучи всяких вкусняшек, и этот сервер должен быть доступен из Интернет. Но проблема в том, что мой провайдер дает статику за деньги, которым всегда можно найти более полезное применение. Поэтому я пользовался связкой ddclient + cloudflare.
Все было хорошо, пока ddclient не перестал работать. Немного поковыряв его, я понял что пришло время костылей и велосипедов, так как времени на поиск проблемы стало уходить слишком много. В итоге все вылилось в небольшой демон, который просто работает, а мне больше и не надо.
Кому интересно – добро пожаловать под кат.
Используемые инструменты и как «это» работает
Итак первым делом я узнал на сайте cloudflare, все что нужно знать об
В общем за основу был взят враппер
Взял один из примеров для обновления DNS и добавил использование файла конфигурации и возможность обновлять несколько A записей в пределах зоны и естественно неограниченное количество зон.
Логика следующая:
- Скрипт получает из файла конфигурации список зон и проходит по ним в цикле
- В каждой зоне скрипт проходит в цикле по каждой DNS записи типа А или АААА и сверяет Public 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