ddns-myaddr-updater/root/app/ddns-myaddr.py

53 lines
2.1 KiB
Python

import requests
import time
import os
import logging
from datetime import datetime, timedelta
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Variables
ip_version = os.getenv('DDNS_MYADDR_IP_VERSION') # 'ipv4' ou 'ipv6'
key = os.getenv('DDNS_MYADDR_KEY') # Récupère clé
check_interval = 15 * 60 # Intervalle de vérification de 15 minutes
no_update_limit = timedelta(days=30) # Limite de 30 jours
def get_public_ip():
if ip_version == 'ipv6':
response = requests.get('https://api64.ipify.org') # Appel pour IPv6
else:
response = requests.get('https://api.ipify.org') # Appel pour IPv4
return response.text.strip()
def update_ip(ip):
url = 'https://myaddr.tools/update'
data = {'ip': ip, 'key': key}
response = requests.post(url, data=data)
return response.text
if __name__ == '__main__':
try:
last_ip = None
last_update_time = datetime.now()
while True:
public_ip = get_public_ip()
current_time = datetime.now()
if public_ip != last_ip: # Vérifie si l'IP a changé
result = update_ip(public_ip)
logging.info(f"IP mise à jour : {public_ip}, Réponse : {result}")
last_ip = public_ip # Met à jour l'IP
last_update_time = current_time # Réinitialise le temps
elif current_time - last_update_time > no_update_limit: # Vérifie si 1 mois sans mise à jour
result = update_ip(public_ip)
logging.info(f"Aucune mise à jour depuis un mois, IP envoyée : {public_ip}, Réponse : {result}")
last_update_time = current_time # Réinitialise le temps
else:
logging.info(f"Aucune mise à jour, l'IP reste la même : {public_ip}")
time.sleep(check_interval) # Pause de 15 minutes
except KeyboardInterrupt:
logging.info("Arrêt en cours...")