[Ex] DynHost OVH
Posté : jeu. 05 avr. 2018 12:43
Bonjour à tous !
Bref, une solution assez pratique est d'utiliser le mécanisme de DynHost fourni par OVH dans quasiment toutes ses offres, même minimalistes. L'avantage, c'est que si vous avez déjà un abonnement chez OVH, vous n'avez rien à payer en plus pour avoir cette fonctionnalité, et elle n'est pas limitée à trois pauvres adresses comme chez No-IP.com. L'inconvénient, c'est que les softs comme Bali ou DirectUpdate marchent assez mal avec, et que les Livebox Orange ne prennent pas en charge cela.
Pas de problème, il suffit d'utiliser le script ci-dessous ! Il s'agit d'un pooler qui fait appel à une API toute simple de chez OVH, tout en mettant à votre disposition une icone dans la barre de tray (un survol de l'icone permet de connaitre directement son IP publique). En le lançant au démarrage avec les paramètres qu'il faut, vous aurez ainsi une mise à jour périodique de votre DynHost.
Script :
Exemple d'appel :
Exécutable compilé, prêt à l'usage :
A bientôt !
- Pour tous ceux qui ont voulu piloter leur ordi à distance avec leur téléphone quand ils se font chier dans le bus,
- Ou pour ceux qui ont voulu pouvoir montrer à Mamie les films de vacances qui sont restés stockés sur leur NAS à la maison,
- Ou pour ceux qui ont un jour hébergé chez eux un serveur MineCraft modé,
Bref, une solution assez pratique est d'utiliser le mécanisme de DynHost fourni par OVH dans quasiment toutes ses offres, même minimalistes. L'avantage, c'est que si vous avez déjà un abonnement chez OVH, vous n'avez rien à payer en plus pour avoir cette fonctionnalité, et elle n'est pas limitée à trois pauvres adresses comme chez No-IP.com. L'inconvénient, c'est que les softs comme Bali ou DirectUpdate marchent assez mal avec, et que les Livebox Orange ne prennent pas en charge cela.
Pas de problème, il suffit d'utiliser le script ci-dessous ! Il s'agit d'un pooler qui fait appel à une API toute simple de chez OVH, tout en mettant à votre disposition une icone dans la barre de tray (un survol de l'icone permet de connaitre directement son IP publique). En le lançant au démarrage avec les paramètres qu'il faut, vous aurez ainsi une mise à jour périodique de votre DynHost.
Script :
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icones\DynHost.ico
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#NoTrayIcon
; Includes
#include <Array.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include "Include\Menus.au3"
; Compilation
DirCreate(".\Icones")
FileInstall(".\Icones\DynHost.ico", ".\Icones\DynHost.ico")
DirCreate(".\Icones\Controls")
FileInstall(".\Icones\Controls\Change.ico", ".\Icones\Controls\Change.ico")
FileInstall(".\Icones\Controls\OK.ico", ".\Icones\Controls\OK.ico")
FileInstall(".\Icones\Controls\KO.ico", ".\Icones\Controls\KO.ico")
; Constants
Global Const $SCRIPT_TITLE = "DynHost", $SCRIPT_ICON = "Icones\"&$SCRIPT_TITLE&".ico"
Global Const $SCRIPT_URL = "https://{user}:{pass}@www.ovh.com/nic/update?system=dyndns&hostname={host}"
; Command line parameters
Global $timeout = 5*60*1000, $host = "", $user = "", $pass = "", $ip = "Inconnue"
For $i = 1 To $CmdLine[0]-1
Switch StringUpper($CmdLine[$i])
Case "-TIMEOUT", "--T"
$timeout = Number($CmdLine[$i+1])
Case "-HOST", "--H"
$host = $CmdLine[$i+1]
Case "-USER", "--U"
$user = $CmdLine[$i+1]
Case "-PASS", "--P"
$pass = $CmdLine[$i+1]
EndSwitch
Next
; Parameters
If $host = "" Then _
$host = InputBox($SCRIPT_TITLE&" : 'hostname' non défini", _
"Veuillez renseigner la valeur du hostname à mettre à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "mondns.dns.monsite.fr")
If $host = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le 'hostname' n'est pas défini")
If $user = "" Then _
$user = InputBox($SCRIPT_TITLE&" : 'user' non défini", _
"Veuillez renseigner le compte utilisateur pour la mise à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "monsite.fr-mondns.dns")
If $user = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le compte utilisateur n'est pas défini")
If $pass = "" Then _
$pass = InputBox($SCRIPT_TITLE&" : 'pass' non défini", _
"Veuillez renseigner le mot de passe du compte pour la mise à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "P4ssw0rd!")
If $pass = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le mot de passe n'est pas défini")
; Tray elements
Global $tray_icon = _TrayIconCreate($SCRIPT_TITLE, $SCRIPT_ICON, -1, "_TrayCallBack")
Global $tray_menu = _TrayCreateContextMenu($tray_icon)
Global $tray_change = _TrayCreateItem("Configurer")
GUICtrlSetState($tray_change, 0x80) ; $GUI_DISABLE = 0x80
Global $tray_launch = _TrayCreateItem("Mettre à jour")
_TrayCreateItem("")
Global $tray_exit = _TrayCreateItem("Quitter")
; Execution
_TrayIconSetClick($tray_icon, 16+2)
_TrayIconSetState($tray_icon)
; Treatment
Global $stop = False, $trigger = True, $timer = TimerInit()
While Not $stop
; Event treatment
Switch GUIGetMsg()
Case 0
Sleep(1000)
Case $tray_exit
$stop = True
Case $tray_change
$timer = TimerInit()
Case $tray_launch
$trigger = True
EndSwitch
; Action trigger
If $trigger Or TimerDiff($timer) > $timeout Then
updateDNS($host, $user, $pass)
$trigger = False
$timer = TimerInit()
EndIf
WEnd
; Closure
_TrayIconDelete($tray_icon)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func updateDNS($host, $user, $pass)
Local $status = ""
; Init icon
_TrayIconSetIcon($tray_icon, "Icones\Controls\Change.ico")
_TrayIconSetToolTip($tray_icon, "IP : "&$ip&" > "&$host & @CRLF & "Date : "&date()&" (Timeout : "&timeout()&")" & @CRLF & "> Vérification en cours")
; Call URL
Local $url = StringReplace(StringReplace(StringReplace($SCRIPT_URL, "{host}", $host), "{user}", $user), "{pass}", $pass)
Local $data = InetRead($url, 1), $error = @error, $extended = @extended ; $INET_FORCERELOAD = 1
; Treat URL response
If $error Then
$status = @CRLF&"> Erreur générale #"&$error
Else
Local $ips = StringRegExp(BinaryToString($data), "\s(\d+\.\d+\.\d+\.\d+)$", 1)
If @error Or Not IsArray($ips) Then
$status = @CRLF&"> Erreur '"&StringLeft(BinaryToString($data),64)&"'"
Else
$ip = $ips[0]
EndIf
EndIf
Local $header = "IP : "&$ip&" > "&$host & @CRLF & "Date : "&date()&" (Timeout : "&timeout()&")"
_TrayIconSetIcon($tray_icon, $status="" ? "Icones\Controls\OK.ico" : "Icones\Controls\KO.ico")
_TrayIconSetToolTip($tray_icon, $header & $status)
EndFunc
Func date()
Return @MDAY&"/"&@MON&"/"&@YEAR&" "&@HOUR&":"&@MIN
EndFunc
Func timeout()
Local $units[6][2] = [[5], ["ms", 1000], ["s", 60], ["min", 60], ["h", 24], ["j", 0]]
Local $number = $timeout, $return = "aucun"
If $number > 0 Then
$return = ""
For $i = 1 To $units[0][0]
Local $unit = ($units[$i][1] = 0 ? $number : Mod($number, $units[$i][1]))
If $unit > 0 Then $return = $unit & $units[$i][0] & " " & $return
$number = ($units[$i][1] = 0 ? 0 : ($number - $unit) / $units[$i][1])
If $number = 0 Then ExitLoop
Next
EndIf
Return StringStripWS($return, 1+2+4)
EndFunc
#AutoIt3Wrapper_Icon=Icones\DynHost.ico
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#NoTrayIcon
; Includes
#include <Array.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include "Include\Menus.au3"
; Compilation
DirCreate(".\Icones")
FileInstall(".\Icones\DynHost.ico", ".\Icones\DynHost.ico")
DirCreate(".\Icones\Controls")
FileInstall(".\Icones\Controls\Change.ico", ".\Icones\Controls\Change.ico")
FileInstall(".\Icones\Controls\OK.ico", ".\Icones\Controls\OK.ico")
FileInstall(".\Icones\Controls\KO.ico", ".\Icones\Controls\KO.ico")
; Constants
Global Const $SCRIPT_TITLE = "DynHost", $SCRIPT_ICON = "Icones\"&$SCRIPT_TITLE&".ico"
Global Const $SCRIPT_URL = "https://{user}:{pass}@www.ovh.com/nic/update?system=dyndns&hostname={host}"
; Command line parameters
Global $timeout = 5*60*1000, $host = "", $user = "", $pass = "", $ip = "Inconnue"
For $i = 1 To $CmdLine[0]-1
Switch StringUpper($CmdLine[$i])
Case "-TIMEOUT", "--T"
$timeout = Number($CmdLine[$i+1])
Case "-HOST", "--H"
$host = $CmdLine[$i+1]
Case "-USER", "--U"
$user = $CmdLine[$i+1]
Case "-PASS", "--P"
$pass = $CmdLine[$i+1]
EndSwitch
Next
; Parameters
If $host = "" Then _
$host = InputBox($SCRIPT_TITLE&" : 'hostname' non défini", _
"Veuillez renseigner la valeur du hostname à mettre à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "mondns.dns.monsite.fr")
If $host = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le 'hostname' n'est pas défini")
If $user = "" Then _
$user = InputBox($SCRIPT_TITLE&" : 'user' non défini", _
"Veuillez renseigner le compte utilisateur pour la mise à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "monsite.fr-mondns.dns")
If $user = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le compte utilisateur n'est pas défini")
If $pass = "" Then _
$pass = InputBox($SCRIPT_TITLE&" : 'pass' non défini", _
"Veuillez renseigner le mot de passe du compte pour la mise à jour :"&@CRLF& _
"(Attention, la valeur doit être encodée pour les URL)", "P4ssw0rd!")
If $pass = "" Then _
Exit 0 * MsgBox(16, $SCRIPT_TITLE, "Le mot de passe n'est pas défini")
; Tray elements
Global $tray_icon = _TrayIconCreate($SCRIPT_TITLE, $SCRIPT_ICON, -1, "_TrayCallBack")
Global $tray_menu = _TrayCreateContextMenu($tray_icon)
Global $tray_change = _TrayCreateItem("Configurer")
GUICtrlSetState($tray_change, 0x80) ; $GUI_DISABLE = 0x80
Global $tray_launch = _TrayCreateItem("Mettre à jour")
_TrayCreateItem("")
Global $tray_exit = _TrayCreateItem("Quitter")
; Execution
_TrayIconSetClick($tray_icon, 16+2)
_TrayIconSetState($tray_icon)
; Treatment
Global $stop = False, $trigger = True, $timer = TimerInit()
While Not $stop
; Event treatment
Switch GUIGetMsg()
Case 0
Sleep(1000)
Case $tray_exit
$stop = True
Case $tray_change
$timer = TimerInit()
Case $tray_launch
$trigger = True
EndSwitch
; Action trigger
If $trigger Or TimerDiff($timer) > $timeout Then
updateDNS($host, $user, $pass)
$trigger = False
$timer = TimerInit()
EndIf
WEnd
; Closure
_TrayIconDelete($tray_icon)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func updateDNS($host, $user, $pass)
Local $status = ""
; Init icon
_TrayIconSetIcon($tray_icon, "Icones\Controls\Change.ico")
_TrayIconSetToolTip($tray_icon, "IP : "&$ip&" > "&$host & @CRLF & "Date : "&date()&" (Timeout : "&timeout()&")" & @CRLF & "> Vérification en cours")
; Call URL
Local $url = StringReplace(StringReplace(StringReplace($SCRIPT_URL, "{host}", $host), "{user}", $user), "{pass}", $pass)
Local $data = InetRead($url, 1), $error = @error, $extended = @extended ; $INET_FORCERELOAD = 1
; Treat URL response
If $error Then
$status = @CRLF&"> Erreur générale #"&$error
Else
Local $ips = StringRegExp(BinaryToString($data), "\s(\d+\.\d+\.\d+\.\d+)$", 1)
If @error Or Not IsArray($ips) Then
$status = @CRLF&"> Erreur '"&StringLeft(BinaryToString($data),64)&"'"
Else
$ip = $ips[0]
EndIf
EndIf
Local $header = "IP : "&$ip&" > "&$host & @CRLF & "Date : "&date()&" (Timeout : "&timeout()&")"
_TrayIconSetIcon($tray_icon, $status="" ? "Icones\Controls\OK.ico" : "Icones\Controls\KO.ico")
_TrayIconSetToolTip($tray_icon, $header & $status)
EndFunc
Func date()
Return @MDAY&"/"&@MON&"/"&@YEAR&" "&@HOUR&":"&@MIN
EndFunc
Func timeout()
Local $units[6][2] = [[5], ["ms", 1000], ["s", 60], ["min", 60], ["h", 24], ["j", 0]]
Local $number = $timeout, $return = "aucun"
If $number > 0 Then
$return = ""
For $i = 1 To $units[0][0]
Local $unit = ($units[$i][1] = 0 ? $number : Mod($number, $units[$i][1]))
If $unit > 0 Then $return = $unit & $units[$i][0] & " " & $return
$number = ($units[$i][1] = 0 ? 0 : ($number - $unit) / $units[$i][1])
If $number = 0 Then ExitLoop
Next
EndIf
Return StringStripWS($return, 1+2+4)
EndFunc
Exemple d'appel :
C:\Projects\PERSONNAL\AutoIt\DynHost\DynHost.au3 -timeout 120000 -host chezmoi.machin.fr
-user machin.fr-zds.chezmoi -pass P4ssw0rd!
-timeout
: nombre de millisecondes à attendre entre deux mises à jour du DynHost-host
: adresse à mettre à jour (doit avoir été définie dans votre manager OVH)-user
: identifiant d'un user pour mettre à jour l'adresse (doit avoir été défini dans votre manager OVH, et lié à l'adresse ci-dessus)-pass
: mot de passe du user défini ci-dessus
Exécutable compilé, prêt à l'usage :
A bientôt !