Page 1 sur 1

[Ex] DynHost OVH

Posté : jeu. 05 avr. 2018 12:43
par ZDS
Bonjour à tous !
  • 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é,
Vous savez qu'il est assez chiant de devoir à chaque fois dire aux gens "Attends, je vais voir c'est quoi mon IP". C'est tout de même plus simple d'avoir sous la main un truc du genre "chezmoi.machin.fr" au lieu d'une IP qui change tout le temps (ou je sais, principe de base d'un DynHost ^^). Et si vous avez déjà utilisé No-IP.com, vous savez aussi combien c'est rébarbatif de devoir valider ses adresses tous les mois...

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

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
Archive ZIP avec les toutes les ressources annexes (include, icones, etc...) :
DynHost [SRC].zip
(30.19 Kio) Téléchargé 529 fois

Exécutable compilé, prêt à l'usage :
DynHost [EXE].zip
(538.72 Kio) Téléchargé 582 fois

A bientôt !