Forord
Til personlige behov derhjemme har jeg sat VSphere op, hvor jeg kører en virtuel router og en Ubuntu-server som medieserver samt en masse lækre ting, og denne server skal være tilgængelig fra internettet. Problemet er, at min udbyder tager penge for statisk IP, hvilket altid kan bruges mere fornuftigt. Derfor har jeg brugt en kombination af ddclient + cloudflare.
Alt gik godt, indtil ddclient stoppede med at fungere. Efter at have rodet lidt med det, indså jeg, at det var tid til provisoriske løsninger, da jeg brugte for meget tid på at finde problemet. I sidste ende resulterede det i en lille daemon, der bare fungerer, og det er alt, hvad jeg har brug for.
Til dem, der er interesserede – velkommen til at læse videre.
Værktøjer der blev brugt og hvordan 'dette' fungerer
Så det første jeg gjorde var at finde alt, hvad jeg skulle vide om cloudflare på deres hjemmeside. Og jeg var allerede ved at implementere det hele i Python (efter at have mødt Python, bruger jeg det oftere til enkle opgaver eller når jeg hurtigt skal lave en prototype), da jeg pludselig stødte på en næsten færdig implementering.
Generelt tog jeg udgangspunkt i en wrapper .
Jeg tog et af eksemplerne til opdatering af DNS og tilføjede brugen af en konfigurationsfil og mulighed for at opdatere flere A-poster inden for zonen samt naturligvis et ubegribelig antal zoner.
Logikken er følgende:
- Scriptet henter fra konfigurationsfilen en liste over zoner og gennemgår dem i en løkke.
- I hver zone gennemgår scriptet løbende hver DNS-post af typen A eller AAAA og sammenligner den offentlige IP med posten.
- Hvis IP'en er forskellig — ændres den, hvis ikke springes iterationen over, og der gås videre til den næste.
- Venter i den tid, der er angivet i konfigurationen.
Installation og konfiguration
Måske kunne man også lave en .deb-pakke, men det er ikke mit stærkeste område, og det er heller ikke så svært.
Jeg har ret detaljeret beskrevet processen i README.md på .
Men for en sikkerheds skyld vil jeg kort beskrive det på russisk:
- Sørg for, at du har installeret python3 og python3-pip; hvis ikke, så installer det (i Windows installeres python3-pip sammen med Python).
- Klone eller download repository.
- Installer de nødvendige afhængigheder.
python3 -m pip install -r requirements.txt - Kør installationsscriptet.
Til Linux:chmod +x install.sh sudo ./install.shFor Windows: windows_install.bat
- Rediger konfigurationsfilen.
Til Linux:sudoedit /etc/zen-cf-ddns.confTil Windows:
Åbn filen zen-cf-ddns.conf i mappen, hvor du installerede scriptet.
Dette er en almindelig JSON-fil, hvor indstillingerne ikke er komplicerede – jeg har specifikt beskrevet to forskellige zoner som eksempel.
Hvad gemmer sig bag installerne?
install.sh til Linux:
- En bruger oprettes til at køre dæmonen, uden oprettelse af hjemmebibliotek og loginmulighed.
sudo useradd -r -s /bin/false zen-cf-ddns - Der oprettes en fil til logning i /var/log/
- Vi gør den nyligt oprettede bruger til ejer af logfilen
- Filerne kopieres til deres steder (konfiguration i /etc, eksekverbar fil i /usr/bin, tjenestefil i /lib/systemd/system)
- Tjenesten aktiveres
windows_install.bat til Windows:
- Kopierer den eksekverbare fil og konfigurationsfilen til den angivne mappe af brugeren
- Opretter en opgave i planlæggeren til at køre scriptet ved systemstart
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Efter ændring af konfigurationen skal scriptet genstartes, i Linux er det simpelt og velkendt:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
For Windows må du dræbe pythonw-processen og genstarte scriptet (jeg har ikke lyst til at skrive en tjeneste til Windows i C#):
taskkill /im pythonw.exeInstallation og opsætning er nu afsluttet, brug den i velgående.
For dem der ønsker at se ikke den pæneste Python-kode, her er den .
MIT-licens, så gør hvad du vil med dette gode.
P.S.: Jeg forstår, at det blev lidt klodset, men den klarer sin opgave strålende.
UPD: 11.10.2019 17:37
Jeg fandt endnu et problem, og hvis nogen kan hjælpe med at løse det – ville jeg være meget taknemmelig.
Problemet er, at hvis man installerer afhængigheder uden sudo python -m pip install -r …, så vil modulerne ikke være synlige for tjenestebrugeren, og jeg ønsker ikke at tvinge brugerne til at installere modulet med sudo, det virker heller ikke rigtigt.
Hvordan gør man det korrekt, så det ser pænt ud?
UPD: 11.10.2019 19:16 Problemet er løst ved brug af venv.
Der er sket flere ændringer. En ny release kommer snart.
Kilde: habr.com
