Prefazione
Per esigenze personali a casa ho attivato VSphere, su cui gestisco un router virtuale e un server Ubuntu come media server, insieme a diverse altre cosine interessanti, e questo server deve essere accessibile da Internet. Ma il problema è che il mio fornitore offre un indirizzo statico a pagamento, che potrei usare per scopi più utili. Perciò ho utilizzato una combinazione di ddclient + cloudflare.
Tutto andava bene, finché ddclient non ha smesso di funzionare. Dopo averci smanettato un po', ho capito che era il momento di ricorrere a soluzioni improvvisate, poiché cercare il problema richiedeva troppo tempo. Alla fine, tutto si è tradotto in un piccolo demone che funziona semplicemente, e per me non serve altro.
Chi è interessato è il benvenuto sotto il tag.
Strumenti utilizzati e come «questo» funziona
Quindi, per prima cosa, ho appreso dal sito di cloudflare tutto ciò che c'è da sapere su . E stavo per realizzarlo tutto in Python (dopo aver conosciuto Python, lo uso sempre più per compiti semplici o quando devo fare rapidamente un prototipo), quando mi sono imbattuto in una realizzazione praticamente pronta.
In generale, è stato preso come base il 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 percorre in ciclo ogni record DNS di tipo A o AAAA e confronta l'indirizzo IP pubblico con il record.
- Se l'IP è diverso, lo cambia; se è lo stesso, salta l'iterazione del ciclo e passa al successivo.
- Va in pausa per il tempo specificato nella configurazione.
Installazione e configurazione
Probabilmente si potrebbe fare anche un pacchetto .deb, ma non sono molto esperto in questo, e non è poi così complicato.
Ho descritto il processo in modo abbastanza dettagliato nel README.md sulla .
Ma per sicurezza lo descriverò in russo con parole 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 in cui hai installato lo script.
È un file JSON standard; per le impostazioni non c'è nulla di complicato – ho descritto come esempio 2 zone diverse in esso.
Cosa si nasconde dietro gli installer?
install.sh per Linux:
- Viene creato un utente per eseguire il demone, senza la creazione di una home directory e senza possibilità di login.
sudo useradd -r -s /bin/false zen-cf-ddns - Viene creato un file per la registrazione dei log in /var/log/
- Impostiamo il proprietario del file di log sull'utente appena creato.
- I file vengono copiati nelle loro posizioni (il config in /etc, il file eseguibile in /usr/bin, il file di 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 il config, lo script deve essere riavviato, 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 dovrai terminare il processo pythonw e rilanciare lo script (è troppo complicato per me scrivere un servizio in Windows in C#):
taskkill /im pythonw.exeL'installazione e la configurazione sono terminate, ora puoi utilizzarlo liberamente.
Per chi desidera vedere un codice Python non proprio elegante, ecco .
Licenza MIT, quindi sentitevi liberi di fare ciò che volete con questo.
P.S.: Capisco che risulta un po' un lavoro artigianale, ma sta svolgendo il suo compito egregiamente.
UPD: 11.10.2019 17:37
Ho trovato un altro problema e sarei molto grato se qualcuno potesse darmi una mano a risolverlo.
Il problema è che se installo le dipendenze senza sudo python -m pip install -r …, i moduli non saranno visibili per l'utente del servizio, e non vorrei costringere gli utenti a installare i moduli con sudo, neanche è giusto farlo.
Come si dovrebbe fare per rendere il tutto più presentabile?
UPD: 11.10.2019 19:16 Il problema è stato risolto utilizzando venv.
Ci sono stati alcuni cambiamenti. Un nuovo rilascio arriverà nei prossimi giorni.
Fonte: habr.com
