Envoi requête http de jeedom vers machine externe

Bonjour,

Je bute sur un problème en apparence plutôt simple, mais je ne trouve pas la solution.

J’ai une requête http qui me permet d’activer ou désactiver certains paramètres de mon enregistreur Dahua.

Je souhaite automatiser l’exécution de cette requête via jeedom.

J’ai essayé plusieurs méthodes après avoir lu des tas de messages sur la communauté et de documentations :

Méthode 1 : via plugin script
J’ai testé une commande script type http :


Ca fonctionne pas (quand je teste, ça m’indique que « Action exécutée avec succès » mais le paramètre ne se met pas à jour)

Méthode 2 : via un code dans un scénario
Voilà le code essayé :

$req = 'curl -i -XPOST "http://admin:xxxxxxxx@78.xxx.xxx.125/cgi-bin/configManager.cgi?action=setConfig&MotionDetect[3].Enable=false" ';
$scenario->setLog('DEBUG REQUETTE : '.$req);
$output0 = shell_exec($req);
$scenario->setLog('DEBUG RETOUR : '.$output0);

Le scénario se lance bien mais le paramètre ne change pas. Voilà le log :

[2021-09-06 11:32:29][SCENARIO] Start : Scenario lance manuellement.
[2021-09-06 11:32:29][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-09-06 11:32:29][SCENARIO] Exécution d'un bloc code
[2021-09-06 11:32:29][SCENARIO] DEBUG REQUETTE : curl -i -XPOST "http://admin:xxxxxxxx@78.xxx.xxx.125/cgi-bin/configManager.cgi?action=setConfig&MotionDetect[3].Enable=false"
[2021-09-06 11:32:29][SCENARIO] DEBUG RETOUR : HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to 3F0xxxxxxxx3BC", qop="auth", nonce="9xxxxx493", opaque="343f83a7xxxxxxadd51756882f221dabe"
Connection: close
Set-Cookie:secure; HttpOnly
CONTENT-LENGTH: 0
[2021-09-06 11:32:29][SCENARIO] Fin correcte du scénario

Méthode 3 : via une commande info dans un virtuel

Voilà, rien de tout ça ne fonctionne (même chose avec l’IP interne)
Une idée?

Merci

Quentin

Bonjour,

Cette façon de passer les credentials est vraiment préhistorique et absolument pas sécurisée (même si c’était de l’https) donc vous pourriez complétement désactiver l’utilisation d’un login / password et ca serait pareil.

Cependant, en réalité le navigateur est sensé prendre ces informations de l’url et les passer en « http basic auth », ce qui est géré par les champs « utilisateur » et « mot de passe » du plugin script (solution 1).

solution 2 pourra fonctionner également mais seulement si vous passer par une basic auth (user:pswd encodé en base64 et passé en header) explicite (comme la solution 1 donc).
en l’état cela ne fonctionne pas car je pense que curl en fait un digest auth ce que manifestement votre serveur dahua ne supporte pas.
mais cette solution n’apporte aucun avantage par rapport à la solution 1 qui est plus « clé en main ».

Donc conclusion: reprenez votre solution 1 et testez en utilisant les champs utilisateur/mot de passe.
Si cela ne fonctionne pas il faudra vous renseigner pour savoir quel mécanisme d’authentification est implémenter sur dahua

edit: j’ai oublié d’expliquer: en l’état cela ne peut pas fonctionner car dans la chaine user:pswd il y a un :
Ce caractère c’est en théorie la fin du hostname, ce qui suit est un numéro de port (optionnel) donc impossible de l’avoir là, il devrait être encodé.

1 « J'aime »

bonjour,

Une base parmi d’autres :

$login='toto';$passwd='0123456';
$ip = '192.168.0.248';

$request_http = new com_http('http://'.$ip.'/api/v1/production/inverters',"$login","$passwd");
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$ret = $request_http->exec();

bonne journée

1 « J'aime »

@olive Excellent, ça marche! Merci beaucoup!

Quand même pour répondre à @Mips : dans le script, passer le login et le mdp via les champs dédiés ne fonctionne pas pour mon cas (même en les retirant du « préfixe » de l’IP évidemment).

Pour les modes d’authentification de Dahua, la doc de l’API indique qu’il accepte les 2 :

Ce que je ne comprends pas, c’est qu’effectivement en lançant le scénario avec le script que j’ai indiqué plus haut, le retour semble en effet signifier que le serveur attend une auth digest et non basic, alors qu’en passant cette méthode de http://user:password@ip/… ça fonctionne, hors c’est bien une auth basique.

Bref, en tout cas le script proposé par olive fonctionne c’est parfait, merci encore.

Quentin

ou le browser les envoi en digest auth et pas en basic auth contrairement à ce que je pensais (ca peut dépendre du browser aussi) ce qui expliquerait cela.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.