Prefácio
Para necessidades pessoais em casa, levantei o VSphere, no qual rodo um roteador virtual e um servidor Ubuntu como servidor de mídia, além de várias outras coisas interessantes, e esse servidor deve ser acessível pela Internet. Mas o problema é que meu provedor oferece IP fixo por um custo, que sempre pode ser melhor utilizado. Portanto, utilizei a combinação ddclient + cloudflare.
Tudo estava bem, até que o ddclient parou de funcionar. Depois de investigar um pouco, percebi que era hora de improvisações, pois o tempo gasto na busca pela solução estava se tornando excessivo. No final, tudo resultou em um pequeno daemon que simplesmente funciona, e é tudo que eu precisava.
Para quem tiver interesse – sejam bem-vindos ao post.
Ferramentas utilizadas e como "isso" funciona
Então, a primeira coisa que fiz foi aprender no site da cloudflare tudo o que precisava saber sobre . E já estava pronto para implementar tudo em Python (depois de conhecer o Python, tenho o usado cada vez mais para tarefas simples ou quando preciso rapidamente fazer um protótipo), quando de repente me deparei com uma implementação praticamente pronta.
Em resumo, foi utilizado como base o wrapper .
Peguei um dos exemplos para atualização do DNS e adicionei a utilização de um arquivo de configuração e a possibilidade de atualizar múltiplos registros A dentro de uma zona, além, é claro, da capacidade de lidar com um número ilimitado de zonas.
A lógica é a seguinte:
- O script obtém de um arquivo de configuração uma lista de zonas e itera sobre elas em um loop.
- Em cada zona, o script percorre em loop cada registro de DNS do tipo A ou AAAA e compara o IP público com o registro.
- Se o IP for diferente – ele o altera; se não, ignora a iteração do loop e passa para o próximo.
- Dorme por um tempo especificado na configuração.
Instalação e configuração
Provavelmente poderia ter feito um pacote .deb, mas não sou bom nisso, e também não é tão complicado.
O processo está descrito em detalhes no README.md na .
Mas, para garantir, descreverei em russo de forma geral:
- Certifique-se de que você tem python3 e python3-pip instalados; se não, instale (no Windows, python3-pip é instalado junto com o Python).
- Clone ou baixe o repositório.
- Instale as dependências necessárias.
python3 -m pip install -r requirements.txt - Execute o script de instalação.
Para Linux:chmod +x install.sh sudo ./install.shPara Windows: windows_install.bat
- Edite o arquivo de configuração.
Para Linux:sudoedit /etc/zen-cf-ddns.confPara Windows:
Abra o arquivo zen-cf-ddns.conf na pasta onde você instalou o script.
Este é um arquivo JSON comum; as configurações não são complicadas - escrevi como exemplo duas zonas diferentes nele.
O que está por trás dos instaladores?
install.sh para Linux:
- Um usuário é criado para executar o daemon, sem que um diretório inicial seja criado e sem possibilidade de login.
sudo useradd -r -s /bin/false zen-cf-ddns - Um arquivo para registro de log é criado em /var/log/
- Tornamos o proprietário do arquivo de log o usuário recém-criado
- Os arquivos são copiados para seus respectivos locais (configuração em /etc, arquivo executável em /usr/bin, arquivo de serviço em /lib/systemd/system)
- O serviço é ativado
windows_install.bat para Windows:
- Copia o arquivo executável e o arquivo de configuração para a pasta especificada pelo usuário
- Cria uma tarefa no agendador para executar o script na inicialização do sistema
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Após a alteração da configuração, o script precisa ser reiniciado, em Linux é simples e habitual:
sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status
para Windows será necessário finalizar o processo pythonw e reiniciar o script (realmente é uma chatice eu escrever um serviço em Windows em C#):
taskkill /im pythonw.exeCom isso, a instalação e configuração estão concluídas, aproveitem.
Para quem quer ver um código Python não tão bonito, aqui está .
Licença MIT, então façam o que quiserem com isso.
P.S.: Entendo que ficou um pouco improvisado, mas cumpre bem sua função.
UPD: 11.10.2019 17:37
Encontrei mais um problema, e se alguém puder me ajudar a resolvê-lo, ficarei muito grato.
O problema é que se instalar as dependências sem sudo python -m pip install -r …, os módulos não serão visíveis sob o usuário do serviço, e eu não gostaria de forçar os usuários a instalar módulos com sudo, além de que isso não está certo.
Como fazer isso corretamente, de forma elegante?
UPD: 11.10.2019 19:16 O problema foi resolvido utilizando venv.
Algumas mudanças foram feitas. Um novo lançamento será anunciado em breve.
Fonte: habr.com
