[Ex] DynHost OVH

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 551
Enregistré le : jeu. 10 juin 2010 09:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

[Ex] DynHost OVH

#1

Message par ZDS » jeu. 05 avr. 2018 11:43

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é 18 fois

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

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !

Répondre