{"id":197,"date":"2015-09-24T13:01:26","date_gmt":"2015-09-24T11:01:26","guid":{"rendered":"http:\/\/www.e-jim.be\/blog\/?p=197"},"modified":"2015-09-24T13:01:26","modified_gmt":"2015-09-24T11:01:26","slug":"utiliser-lapi-ovh-pour-se-faire-un-dyndns-maison","status":"publish","type":"post","link":"https:\/\/e-jim.be\/blog\/index.php\/2015\/09\/24\/utiliser-lapi-ovh-pour-se-faire-un-dyndns-maison\/","title":{"rendered":"Utiliser l&rsquo;API OVH pour se faire un dyndns maison"},"content":{"rendered":"<p class=\"\">Il se trouve que j&rsquo;ai <del>un<\/del> des\u00a0 serveurs \u00e0 la maison, derri\u00e8re une connexion grand public, \u00e0 adresse IP variable.<br \/>\nCela signifie que d\u00e8s que le routeur est red\u00e9marr\u00e9 ou perd sa connexion, je risque de changer d&rsquo;adresse IP et mes enregistrement DNS vers mamaison.e-jim.be ne seront plus valables et cela m&#8217;emp\u00eachera de me connecter \u00e0 mon serveur.<\/p>\n<p class=\"\">J&rsquo;ai donc mis en place un petit script PHP que mon serveur vient d\u00e9clencher toutes les heures (t\u00e2che cron).<br \/>\nVoici comment j&rsquo;ai proc\u00e9d\u00e9, si jamais \u00e7a peut servir \u00e0 quelqu&rsquo;un.<\/p>\n<p><!--more--><\/p>\n<h1 class=\"\">1. Obtenir les clefs d&rsquo;application\/d\u2019utilisateur<\/h1>\n<p class=\"\">Depuis la mise en place de leur API RESTful (rempla\u00e7ant une API SoAP), OVH ne permet plus de ce connecter directement avec ses identifiants OVH, mais uniquement avec des tokens pr\u00e9-g\u00e9n\u00e9r\u00e9s, \u00e0 l&rsquo;aide desquels on pourra signer les requ\u00eates faite via l&rsquo;API.<\/p>\n<p class=\"\">Pour g\u00e9n\u00e9rer un token pour votre script, rendez-vous sur https:\/\/eu.api.ovh.com\/createToken\/ et remplissez le formulaire avec votre identifiant OVH, votre mot de passe, le nom du script et sa description.<br \/>\nVous devrez \u00e9galement pr\u00e9ciser la dur\u00e9e de validit\u00e9 des tokens et les autorisations qu&rsquo;ils portent:<br \/>\nDans les autorisation, j&rsquo;ai donn\u00e9 au script les droits de lecture (GET), \u00e9criture (POST), modification (PUT) et suppression (DELETE) sur tous mes domaines (donc au chemin \/domain*).<\/p>\n<figure id=\"attachment_199\" aria-describedby=\"caption-attachment-199\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/e-jim.be\/blog\/wp-content\/uploads\/2015\/09\/2015-09-24-11_22_10-OVH-Developers-_-Discover-OVH-products-API-functions-OVH.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-199\" src=\"http:\/\/www.e-jim.be\/blog\/wp-content\/uploads\/2015\/09\/2015-09-24-11_22_10-OVH-Developers-_-Discover-OVH-products-API-functions-OVH-300x222.png\" alt=\"Cr\u00e9ation de token + Autorisations\" width=\"300\" height=\"222\" \/><\/a><figcaption id=\"caption-attachment-199\" class=\"wp-caption-text\">Cr\u00e9ation de token + Autorisations<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_200\" aria-describedby=\"caption-attachment-200\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/e-jim.be\/blog\/wp-content\/uploads\/2015\/09\/2015-09-24-11_41_39-OVH-Developers-_-Discover-OVH-products-API-functions-OVH.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-200\" src=\"http:\/\/www.e-jim.be\/blog\/wp-content\/uploads\/2015\/09\/2015-09-24-11_41_39-OVH-Developers-_-Discover-OVH-products-API-functions-OVH-300x275.png\" alt=\"La r\u00e9ponse \u00e0 la requ\u00eate\" width=\"300\" height=\"275\" \/><\/a><figcaption id=\"caption-attachment-200\" class=\"wp-caption-text\">La r\u00e9ponse \u00e0 la requ\u00eate<\/figcaption><\/figure>\n<h1 class=\"\">2. Obtenir l&rsquo;ID du record DNS \u00e0 modifier<\/h1>\n<p class=\"\">La requ\u00eate devant \u00eatre pass\u00e9e avec l&rsquo;ID de l&rsquo;enregistrement DNS, il faut obtenir cette valeur avant de faire les changements.<br \/>\nOn peut l&rsquo;obtenir en faisant une requ\u00eate GET sur https:\/\/eu.api.ovh.com\/1.0\/domain\/zone\/NOMDEVOTREZONE\/record?subDomain=SOUSDOMAINE, en rempla\u00e7ant NOMDEVOTREZONE et SOUSDOMAINE par les valeurs qui correspondent \u00e0 votre cas (pour moi, e-jim.be et mamaison, respectivement).<\/p>\n<p class=\"\">On peut aussi faire cette requ\u00eate manuellement sur https:\/\/api.ovh.com\/console , ce que j&rsquo;ai fait parce que je n&rsquo;avais qu&rsquo;un sous-domaine \u00e0 traiter et que l&rsquo;ID de l&rsquo;enregistrement ne va jamais changer (sauf \u00e0 le supprimer et le re-cr\u00e9er).<\/p>\n<h1 class=\"\">3. Le script \u00e0 proprement parler<\/h1>\n<p>Et voil\u00e0 le script que j&rsquo;utilise. Il est donc plac\u00e9 sur un serveur ext\u00e9rieur et appel\u00e9 par mon serveur-maison chaque heure.<br \/>\nNotez que je ne suis pas dev et donc j&rsquo;ai fait quelques trucs pas tr\u00e8s propres gr\u00e2ce \u00e0 la m\u00e9thode La , j&rsquo;en ai conscience:<\/p>\n<ul>\n<li>tout est en proc\u00e9dural<\/li>\n<li>au lieu d&rsquo;utiliser l&rsquo;extension curl de php, dont je ne connaissais pas l&rsquo;existence, je fais un exec sur le curl du syst\u00e8me et utilise le retour du shell. Niveau performance, \u00e7a doit \u00eatre d\u00e9gueu. Mais pour un script appel\u00e9 une fois par heure, l&rsquo;impact est nul.<\/li>\n<li>mes variable et fonctions sont nomm\u00e9es sans suivre la moindre constance (parfois en fran\u00e7ais, parfois en anglais, parfois en CamelCase, parfois pas, etc&#8230;)<\/li>\n<li>il est peu flexible\/g\u00e9n\u00e9rique<\/li>\n<\/ul>\n<p>En cas de changement d&rsquo;IP, il enverra un mail avec l&rsquo;ancienne et le nouvelle ip \u00e0 l&rsquo;adresse VOTRE_MAIL indiqu\u00e9e \u00e0 la ligne 71.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"\">\/\/L'ID du record peut \u00eatre obtenu en faisant une requ\u00eate GET sur https:\/\/eu.api.ovh.com\/1.0\/domain\/zone\/NOMDEVOTREZONE\/record?subDomain=SOUSDOMAINE\n\/\/On peut aussi faire cette requ\u00eate manuellement sur https:\/\/api.ovh.com\/console\n\n\n\/\/fonction pour les requ\u00eates vers l'API. Par d\u00e9faut, elle demande les infos sur le sous-domaine (TTL, target, Type d'enregistrement,...). Modifier pour mettre votre ID comme d\u00e9crit ci-dessus\n\nfunction requeteAPIOVH($url = \"https:\/\/eu.api.ovh.com\/1.0\/domain\/zone\/NOM_DE_VOTRE_ZONE\/record\/ID_DE_VOTRE_ENREGISTREMENT\", $action = \"GET\", $data=\"\")\n\n\n\n{\n\n\t$applicationKey=\"DONNEES_OBTENUES_AU_POINT_1\";\n\t$applicationSecret=\"DONNEES_OBTENUES_AU_POINT_1\";\n\t$ConsumerKey=\"DONNEES_OBTENUES_AU_POINT_1\";\n\t$endpoint_name=\"DNS-Change3\";\n\n\n\t$timestamp=time();\n\t$prehash=$applicationSecret.\"+\".$ConsumerKey.\"+\".$action.\"+\".$url.\"++\".$timestamp;\n\t$hash=sha1($prehash);\n\t$signature=\"$1$\".$hash;\n\n\t$options_Curl=\" -H 'X-Ovh-Application:\".$applicationKey.\"'\";\n\t$options_Curl.=\" -H 'X-Ovh-Timestamp:\".$timestamp.\"'\";\n\t$options_Curl.=\" -H 'X-Ovh-Signature:\".$signature.\"'\";\n\t$options_Curl.=\" -H 'X-Ovh-Consumer:\".$ConsumerKey.\"'\";\n\t$options_Curl.=\" \".$url;\n\n\tif ($action == \"GET\")\n\t{\n\t\t$commande=\"curl \".$options_Curl;\n\t}\n\telseif ($action == \"PUT\")\n\t{\n\t\t$commande=\"curl -X PUT -d \".$data.\" \".$options_Curl;\n\t\tprint_r($commande);\n\t}\n\n\u00a0\u00a0\u00a0     elseif ($action == \"POST\")\n\u00a0\u00a0\u00a0     {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     if ($data == \"\")\n                {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     $commande=\"curl -X POST \".$options_Curl;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     print_r($commande);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0         }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     else\n                {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     $commande=\"curl -X POST -d \".$data.\" \".$options_Curl;\n    \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_r($commande);\n\u00a0\u00a0\u00a0\u00a0        \u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 }\n\n\t$output=array(); \/juste pour \u00e9viter les warning du parser PHP\n\texec($commande, $output);\n\n\t$resultat=json_decode($output[0], true);\n\tprint_r($resultat);\n\treturn $resultat;\n}\n\n\nif (isset($_SERVER['HTTP_X_FORWARDED_FOR']))\n    $IP = $_SERVER['HTTP_X_FORWARDED_FOR'];\n    elseif(isset($_SERVER['HTTP_CLIENT_IP']))\n    $IP = $_SERVER['HTTP_CLIENT_IP'];\n    else\n    $IP = $_SERVER['REMOTE_ADDR'];\n\necho \"IP = \".$IP.\". Et puis c'est tout\\r\\n\";\n\n$OLD_IP =requeteAPIOVH()['target'];\necho \"L'ancienne IP \u00e9tait \".$OLD_IP;\n\n\nif ($IP == $OLD_IP)\n{\necho \" \\r\\nL'ip n'a pas change.\";\n}\nelse {\n    echo \"\\r\\nL'IP a change\";\n    mail(\"VOTRE-MAIL\",\"L'IP de la maison a chang\u00e9\",\"info du script IP maison\\r\\nIP \u00e9tait:\".$OLD_IP.\"\\r\\nIP est:\".$IP);\n\n\trequeteAPIOVH (\"https:\/\/eu.api.ovh.com\/1.0\/domain\/zone\/NOM_DE_VOTRE_ZONE\/record\/ID_DE_VOTRE_ENGISTREMENT\", \"PUT\", \"target=\".$IP);\n\u00a0    \u00a0\u00a0 requeteAPIOVH (\"https:\/\/eu.api.ovh.com\/1.0\/domain\/zone\/e-jim.be\/refresh\", \"POST\");\n\techo \"\\r\\nL'IP a \u00e9t\u00e9 modifi\u00e9e dans le DNS\";\n}\n\nexit(0);\n\n<\/pre>\n<p class=\"\">Le tout est sauv\u00e9 sur un script sur mon serveur web ext\u00e9rieur, sous un nom cryptique pour \u00e9viter qu&rsquo;il ne soit appel\u00e9 par erreur. (oui, il existe d&rsquo;autre solutions, mais \u00e7a me suffit comme \u00ab\u00a0s\u00e9curit\u00e9\u00a0\u00bb).<\/p>\n<h1 class=\"\">C\u00f4t\u00e9 maison<\/h1>\n<p class=\"\">J&rsquo;ai cette ligne dans cron:<\/p>\n<p class=\"\">0 * * * * \/usr\/bin\/curl https:\/\/e-jim.be\/NOM_DE_MON_SCRIPT.php<\/p>\n<p class=\"\">et c&rsquo;est tout.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il se trouve que j&rsquo;ai un des\u00a0 serveurs \u00e0 la maison, derri\u00e8re une connexion grand public, \u00e0 adresse IP variable. Cela signifie que d\u00e8s que le routeur est red\u00e9marr\u00e9 ou perd sa connexion, je risque de changer d&rsquo;adresse IP et mes enregistrement DNS vers mamaison.e-jim.be ne seront plus valables et cela m&#8217;emp\u00eachera de me connecter [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-197","post","type-post","status-publish","format-standard","hentry","category-bidouille"],"_links":{"self":[{"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/posts\/197"}],"collection":[{"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":0,"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"wp:attachment":[{"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/e-jim.be\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}