Préface
Pour des besoins personnels, j'ai mis en place VSphere Ă la maison, sur lequel je fais tourner un routeur virtuel et un serveur Ubuntu en tant que serveur multimĂ©dia ainsi que plein d'autres choses intĂ©ressantes, et ce serveur doit ĂȘtre accessible depuis Internet. Le problĂšme, c'est que mon fournisseur impose des frais pour la connexion statique, que j'aimerais utiliser Ă des fins plus utiles. C'est pourquoi j'utilisais une combinaison de ddclient et cloudflare.
Tout allait bien jusqu'à ce que ddclient cesse de fonctionner. AprÚs un petit examen, j'ai compris qu'il était temps de bricoler, car chercher le problÚme devenait trop chronophage. Au final, cela a donné naissance à un petit démon qui fonctionne simplement, ce qui me suffit.
Pour ceux que cela intĂ©resse â bienvenue sous le capot.
Outils utilisés et comment « ça » fonctionne
Alors d'abord, je me suis renseignĂ© sur le site de cloudflare, tout ce que je devais savoir sur . Et j'Ă©tais dĂ©jĂ prĂȘt Ă tout implĂ©menter en Python (depuis que j'ai dĂ©couvert Python, je l'utilise de plus en plus pour des tĂąches simples ou quand je dois rapidement crĂ©er un prototype), quand je suis tombĂ© sur une implĂ©mentation presque prĂȘte.
En gros, j'ai pris comme base un wrapper .
J'ai pris un des exemples pour mettre à jour le DNS et ajouté l'utilisation d'un fichier de configuration ainsi que la possibilité de mettre à jour plusieurs enregistrements A dans une zone et, bien sûr, un nombre illimité de zones.
La logique est la suivante :
- Le script obtient de fichier de configuration une liste de zones et les parcourt en boucle
- Dans chaque zone, le script parcourt en boucle chaque enregistrement DNS de type A ou AAAA et compare l'IP publique Ă l'enregistrement
- Si l'IP diffÚre, il la change, sinon il passe à l'itération suivante de la boucle.
- Il fait une pause pour le temps indiqué dans le fichier de configuration
Installation et configuration
Il serait probablement possible de créer un paquet .deb, mais je ne suis pas trÚs compétent dans ce domaine, et ce n'est pas si compliqué.
J'ai décrit le processus assez en détail dans le README.md sur .
Mais au cas oĂč, je vais expliquer en russe de maniĂšre gĂ©nĂ©rale :
- Assurez-vous d'avoir installé python3 et python3-pip, sinon installez-les (sur Windows, python3-pip s'installe avec Python)
- Clonez ou téléchargez le dépÎt
- Installez les dépendances nécessaires.
python3 -m pip install -r requirements.txt - Exécutez le script d'installation
Pour Linux :chmod +x install.sh sudo . /install.shPour Windows : windows_install.bat
- Modifiez le fichier de configuration
Pour Linux :sudoedit /etc/zen-cf-ddns.confPour Windows :
Ouvrez le fichier zen-cf-ddns.conf dans le dossier oĂč vous avez installĂ© le script.
C'est un fichier JSON ordinaire, avec des paramÚtres simples - j'ai spécialement décrit comme exemple 2 zones différentes.
Que cache les installateurs ?
install.sh pour Linux :
- Un utilisateur est créé pour lancer le démon, sans création de répertoire personnel et sans possibilité de connexion.
sudo useradd -r -s /bin/false zen-cf-ddns - Un fichier est créé pour écrire des logs dans /var/log/
- Nous devenons le propriétaire du fichier log du nouvel utilisateur créé
- Les fichiers sont copiés à leurs emplacements respectifs (configuration dans /etc, fichier exécutable dans /usr/bin, fichier de service dans /lib/systemd/system)
- Le service est activé
windows_install.bat pour Windows :
- Il copie le fichier exécutable et le fichier de configuration dans le dossier spécifié par l'utilisateur
- Il crée une tùche dans le planificateur pour exécuter le script au démarrage du systÚme
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
AprĂšs avoir modifiĂ© la configuration, le script doit ĂȘtre redĂ©marrĂ©, sous Linux, c'est simple et habituel :
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
pour Windows, il faudra tuer le processus pythonw et redémarrer le script (je n'ai vraiment pas envie d'écrire un service sous Windows en C#) :
taskkill /im pythonw.exeVoilà , l'installation et la configuration sont terminées, utilisez-le en toute santé.
Pour ceux qui souhaitent voir un code Python pas trĂšs joli, le voici .
Licence MIT, donc faites ce que vous voulez avec ce bon.
P.S. : Je comprends que cela semble un peu bancal, mais il remplit sa tĂąche Ă merveille.
UPD : 11.10.2019 17:37
J'ai trouvé un autre problÚme, et si quelqu'un peut m'aider à le résoudre, je lui en serai trÚs reconnaissant.
Le problĂšme est que si vous installez des dĂ©pendances sans sudo python -m pip install -r âŠ, alors les modules ne seront pas visibles depuis l'utilisateur du service, et je ne voudrais pas forcer les utilisateurs Ă installer des modules avec sudo, ce n'est pas normal.
Comment faire correctement pour que ce soit joli ?
UPD : 11.10.2019 19:16 Le problÚme est résolu en utilisant venv.
Il y a eu plusieurs changements. Une nouvelle version sera disponible dans quelques jours.
Source : habr.com
