###################################################################################### ## Script Update_DDNS_OVH.ps1 ## Pure PowerShell, no external modules required ## Orig auth & date : The Nerd Cat 09/2021 ## Refactored by : mj and AI ## Added TLS 1.2 (minimum required for api calls), IPv6, OVH api URL and debug info. ## Needs one script and one pair of CREDS per subdomain ! ###################################################################################### # Variables - Setup part $WORK_DIR = "C:\WORKDIR" $LOGIN_OVH = "votre_login_dynhost@domaine.tld" $PWD_OVH = "votre_mot_de_passe_dynhost" $URL_OVH = "sousdomaine.domaine.tld" ### No need to edit below ### # Forcer l'utilisation de TLS 1.2 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Variables - IP Wan (IPv4 et IPv6) $ipv4_url = "https://api.ipify.org" $ipv6_url = "https://api6.ipify.org" $webclient = New-Object System.Net.WebClient # Regex IP (IPv4 et IPv6) $ipv4_pattern = "^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$" $ipv6_pattern = "^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$" # Regex IPv6 simple (peut être amélioré pour plus de précision) # Fonction pour mettre à jour OVH function Update-OVHDDNS { param( [string]$ip, [string]$ip_type ) Write-Host "Mise à jour de l'adresse $ip_type chez OVH : $ip" $securepasswd = ConvertTo-SecureString $PWD_OVH -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($LOGIN_OVH, $securepasswd) $majurl = "https://dns.eu.ovhapis.com/nic/update?system=dyndns&hostname=$($URL_OVH)&myip=$($ip)" try { $result = Invoke-WebRequest -Uri $majurl -Credential $cred -UseBasicParsing Write-Host "Mise à jour OVH réussie pour $ip_type. Réponse OVH : $($result.Content)" Set-Content -Path "$WORK_DIR\maj_${ip_type}_ip.txt" -Value $ip } catch { Write-Error "Erreur lors de la mise à jour OVH pour $ip_type : $($_.Exception.Message)" Write-Error "Détails de l'erreur : $($_.Exception | Format-List -Force | Out-String)" } } # Vérification de l'espace de travail if (!(Test-Path $WORK_DIR)) { Write-Host "L'espace de travail n'existe pas, création..." New-Item $WORK_DIR -ItemType Directory Set-Content -Path "$WORK_DIR\maj_ipv4_ip.txt" -Value "0.0.0.0" Set-Content -Path "$WORK_DIR\maj_ipv6_ip.txt" -Value "::" # Valeur par défaut pour IPv6 } # Traitement IPv4 try { $WANIPv4 = $webclient.DownloadString($ipv4_url).Trim() if ($WANIPv4 -match $ipv4_pattern) { $IPv4 = Get-Content -Path "$WORK_DIR\maj_ipv4_ip.txt" -ErrorAction SilentlyContinue if (-not $IPv4) { $IPv4 = "0.0.0.0" } if ($WANIPv4 -ne $IPv4) { Write-Host "** Votre adresse IPv4 a changé **" Write-Host "Nouvelle IPv4 : $WANIPv4" Write-Host "Ancienne IPv4 : $IPv4" Update-OVHDDNS -ip $WANIPv4 -ip_type "ipv4" } else { Write-Host "Votre adresse IPv4 n'a pas changé." } } else { Write-Warning "L'adresse IPv4 récupérée ($WANIPv4) n'est pas au bon format." } } catch { Write-Warning "Impossible de récupérer l'adresse IPv4 publique : $($_.Exception.Message)" } # Traitement IPv6 try { $WANIPv6 = $webclient.DownloadString($ipv6_url).Trim() if ($WANIPv6 -match $ipv6_pattern) { $IPv6 = Get-Content -Path "$WORK_DIR\maj_ipv6_ip.txt" -ErrorAction SilentlyContinue if (-not $IPv6) { $IPv6 = "::" } if ($WANIPv6 -ne $IPv6) { Write-Host "** Votre adresse IPv6 a changé **" Write-Host "Nouvelle IPv6 : $WANIPv6" Write-Host "Ancienne IPv6 : $IPv6" Update-OVHDDNS -ip $WANIPv6 -ip_type "ipv6" } else { Write-Host "Votre adresse IPv6 n'a pas changé." } } else { Write-Warning "L'adresse IPv6 récupérée ($WANIPv6) n'est pas au bon format." } } catch { Write-Warning "Impossible de récupérer l'adresse IPv6 publique : $($_.Exception.Message)" }