Voorwoord
Voor persoonlijk gebruik thuis heb ik VSphere opgezet, waarop ik een virtuele router draai en een Ubuntu-server als mediaserver, samen met allerlei andere leuke dingen. Deze server moet toegankelijk zijn vanuit het internet. Maar het probleem is dat mijn provider statische IP's alleen tegen betaling biedt, wat ik altijd voor nuttiger doeleinden kan gebruiken. Daarom gebruikte ik de combinatie van ddclient + Cloudflare.
Alles ging goed, totdat ddclient stopte met werken. Na wat te hebben geknutseld, realiseerde ik me dat het tijd was voor enkele noodoplossingen en creatieve aanpassingen, omdat ik te veel tijd kwijt was aan het zoeken naar het probleem. Uiteindelijk resulteerde dit in een kleine daemon die gewoon werkt, en dat is alles wat ik nodig heb.
Wie geĆÆnteresseerd is ā welkom onder de 'cut'.
Gebruikte tools en hoe "dit" werkt
Dus als eerste leerde ik op de Cloudflare-website alles wat ik moest weten over . En ik was al bezig om alles in Python te implementeren (na kennisgemaakt te hebben met Python, gebruik ik het steeds vaker voor eenvoudige taken of wanneer ik snel een prototype moet maken), toen ik ineens een bijna kant-en-klare implementatie tegenkwam.
In het algemeen is de wrapper genomen als basis .
Ik nam een van de voorbeelden voor het bijwerken van DNS en voegde het gebruik van een configuratiebestand toe, evenals de mogelijkheid om meerdere A-records binnen een zone bij te werken en natuurlijk een onbeperkt aantal zones.
De logica is de volgende:
- Het script haalt een lijst van zones uit het configuratiebestand en doorloopt deze in een lus.
- In elke zone doorloopt het script elke DNS-record van type A of AAAA en vergelijkt het publieke IP met de record.
- Als het IP verschilt, wijzigt het het; als dat niet het geval is, overslaat het de iteratie van de lus en gaat het naar de volgende.
- Het script slaapt voor de tijd die in de configuratie is opgegeven.
Installatie en configuratie
Waarschijnlijk zou ik ook een .deb-pakket kunnen maken, maar daar ben ik niet goed in, en het is ook niet zo moeilijk.
Het proces heb ik vrij gedetailleerd beschreven in de README.md op .
Maar voor de zekerheid beschrijf ik het in het Russisch in algemene bewoordingen:
- Zorg ervoor dat je python3 en python3-pip hebt geĆÆnstalleerd; zo niet, installeer ze dan (op Windows wordt python3-pip samen met Python geĆÆnstalleerd).
- Clone of download de repository.
- Installeer de benodigde afhankelijkheden.
python3 -m pip install -r requirements.txt - Voer het installatiescript uit.
Voor Linux:chmod +x install.sh sudo ./install.shVoor Windows: windows_install.bat
- Bewerk het configuratiebestand.
Voor Linux:sudoedit /etc/zen-cf-ddns.confVoor Windows:
Open het bestand zen-cf-ddns.conf in de map waar je het script hebt geĆÆnstalleerd.
Dit is een gewone JSON-bestand, de instellingen zijn niet moeilijk - ik heb speciaal twee verschillende zones als voorbeeld beschreven.
Wat zit er achter de installers?
install.sh voor Linux:
- Een gebruiker wordt aangemaakt voor het draaien van de daemon, zonder thuisdirectory en zonder inlogmogelijkheden.
sudo useradd -r -s /bin/false zen-cf-ddns - Een bestand wordt aangemaakt voor het schrijven van logs in /var/log/
- We maken de net aangemaakte gebruiker eigenaar van het logbestand
- De bestanden worden op hun plek gekopieerd (config in /etc, uitvoerbaar bestand in /usr/bin, servicebestand in /lib/systemd/system)
- De service wordt geactiveerd
windows_install.bat voor Windows:
- Kopieert het uitvoerbare bestand en het configuratiebestand naar de door de gebruiker opgegeven map
- Maakt een taak in de planner om het script bij het opstarten van het systeem uit te voeren
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Na het wijzigen van de configuratie moet het script opnieuw worden opgestart, in Linux is dit eenvoudig en gebruikelijk:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
voor Windows zal ik het proces pythonw moeten beƫindigen en het script opnieuw starten (ik heb geen zin om een service onder Windows in C# te schrijven):
taskkill /im pythonw.exehiermee zijn de installatie en configuratie voltooid, gebruik het met plezier.
Voor degenen die de niet zo mooie Python-code willen bekijken, hier is .
MIT-licentie, dus doe ermee wat je wilt.
P.S.: Ik begrijp dat het een beetje onhandig is, maar het doet zijn werk uitstekend.
UPD: 11.10.2019 17:37
Ik heb nog 1 probleem gevonden, en als iemand kan helpen om het op te lossen - ik zou zeer dankbaar zijn.
Het probleem is dat als je afhankelijkheden installeert zonder sudo python -m pip install -r ..., dan zijn de modules niet zichtbaar onder de gebruikers van de service, en ik wil gebruikers niet verplichten om modules onder sudo te installeren, dat is ook niet juist.
Hoe kan ik het goed doen zodat het er mooi uitziet?
UPD: 11.10.2019 19:16 Het probleem is opgelost door gebruik te maken van venv.
Er zijn verschillende wijzigingen aangebracht. Een nieuwe release komt binnenkort.
Bron: habr.com
