Introduzione
Per uso personale a casa, ho installato VSphere, su cui gestisco un router virtuale e un server Ubuntu come media server e molte altre cose gustose, e questo server deve essere accessibile da Internet. Ma il problema è che il mio fornitore offre la connessione statica a pagamento, a cui posso sempre trovare un uso più utile. Quindi ho utilizzato un insieme di ddclient + cloudflare.
Tutto andava bene finché ddclient non ha smesso di funzionare. Dopo averlo esaminato un po', ho capito che era il momento di qualche soluzione d'emergenza e di creare dal nulla, poiché il tempo per trovare il problema era diventato troppo. Alla fine, tutto si è trasformato in un piccolo demone che semplicemente funziona, e io non ho bisogno di altro.
Chi è interessato è il benvenuto a proseguire.
Strumenti utilizzati e come funziona "questo"
Quindi, prima di tutto, ho scoperto sul sito di cloudflare tutto ciò che bisogna sapere su . E stavo già per implementare tutto in Python (dopo aver familiarizzato con Python, lo utilizzo sempre più per compiti semplici o quando devo creare rapidamente un prototipo), quando mi sono imbattuto in un'implementazione praticamente pronta.
In sostanza, ho preso come base un wrapper .
Ho preso uno degli esempi per l'aggiornamento del DNS e ho aggiunto l'uso di un file di configurazione e la possibilità di aggiornare più record A all'interno della zona e, naturalmente, un numero illimitato di zone.
La logica è la seguente:
- Lo script ottiene dal file di configurazione un elenco di zone e le attraversa in un ciclo
- In ogni zona, lo script attraversa in cicli ogni record DNS di tipo A o AAAA e confronta l'IP pubblico con il record
- Se l'IP è diverso, lo cambia; altrimenti, salta l'iterazione del ciclo e passa al successivo
- Si addormenta per il tempo specificato nel file di configurazione
Installazione e configurazione
Probabilmente si potrebbe creare anche un pacchetto .deb, ma non sono esperto in questo, e non è nemmeno così complicato.
Ho descritto il processo abbastanza dettagliatamente nel README.md su .
Ma per sicurezza, lo descriverò in russo in termini generali:
- Assicurati di avere installato python3 e python3-pip, se non ce l'hai — installali (su Windows python3-pip si installa insieme a Python)
- Clona o scarica il repository
- Installa le dipendenze necessarie.
python3 -m pip install -r requirements.txt - Esegui lo script di installazione
Per Linux:chmod +x install.sh sudo .\/install.shPer Windows: windows_install.bat
- Modifica il file di configurazione
Per Linux:sudoedit \/etc\/zen-cf-ddns.confPer Windows:
Apri il file zen-cf-ddns.conf nella cartella dove hai installato lo script.
Questo è un normale file JSON, le impostazioni non sono complicate: ho descritto come esempio 2 diverse aree in esso.
Cosa si nasconde dietro gli installer?
install.sh per Linux:
- Viene creato un utente per eseguire il demone, senza creare una directory home e senza possibilità di login.
sudo useradd -r -s /bin/false zen-cf-ddns - Viene creato un file per registrare i log in /var/log/
- Diventa proprietario del file di log l'utente appena creato
- I file vengono copiati nei loro luoghi (configurazione in /etc, file eseguibile in /usr/bin, file del servizio in /lib/systemd/system)
- Il servizio viene attivato
windows_install.bat per Windows:
- Copia il file eseguibile e il file di configurazione nella cartella specificata dall'utente
- Crea un'attività nel pianificatore per eseguire lo script all'avvio del sistema
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Dopo aver modificato la configurazione, è necessario riavviare lo script; in Linux è tutto semplice e familiare:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
Per Windows sarà necessario killare il processo pythonw e riavviare lo script (non mi va di scrivere un servizio per Windows in C#):
taskkill /im pythonw.exeCon questo la installazione e configurazione sono terminate, usatelo in salute.
Per chi vuole vedere non il codice Python più bello, ecco .
Licenza MIT, quindi fate con questo bene ciò che volete.
P.S.: Capisco che è venuto un po' rozzo, ma con il suo compito se la cava egregiamente.
UPD: 11.10.2019 17:37
Ho trovato un altro problema, e se qualcuno potesse suggerire come risolverlo, sarei molto grato.
Il problema è che se si installano le dipendenze senza sudo python -m pip install -r …, i moduli non saranno visibili dall'utente del servizio, e non mi piacerebbe costringere gli utenti a installare moduli sotto sudo, né è giusto farlo.
Come si può fare correttamente, per renderlo bello?
UPD: 11.10.2019 19:16 Il problema è stato risolto utilizzando venv.
Sono state apportate diverse modifiche. Un altro rilascio sarà pubblicato nei prossimi giorni.
Fonte: habr.com
