logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 15-12-2020 19:36:37

Joube31
Membre
Inscription : 19-03-2018

[Résolu] Bash avec test conditionnel

Bonjour,

Je souhaite créer un bash avec un test conditionnel.

L'idée est d'éteindre mon PC en fonction d'une variable binaire que je récupère via un lien http de la forme suivante :

https://maSuperAPIquiRoxeDuPoney.com/Ap … 56789=cmd1 

Est-ce possible ? si oui comment ?

Merci

Edit de la modération : modification du lien histoire de laisser le forum visible aux moins de 18 ans tongue

Dernière modification par Joube31 (16-12-2020 21:06:07)

Hors ligne

#2 15-12-2020 19:45:15

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Salut smile

Oui, ça doit être possible.

curl permet de récupérer une page internet que tu dois pouvoir lire avec des outils genre sed ou awk (il y a peut-être d'autres outils en fonction du type de donnée que revoit ton lien genre jq si ça retourne du json) et éteindre le PC à l'aide d'un simple poweroff en fonction d'un test sur la page en question.

Un petit exemple d'un script bash qui joue avec une API en json smile

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#3 15-12-2020 20:14:05

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

je sèche un peu ce n'est pas de mon niveau. je vais chercher avec les infos que tu m'as donné
Merci :-)

Hors ligne

#4 15-12-2020 20:54:37

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Pour commencer, si tu donnais le retour d'un appel à ton API. Tu peux le récupérer en ligne de commande avec curl, genre

curl https://masuperapiquiroxeduponey.com/Api.php?apikey=123456789=cmd1


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#5 15-12-2020 21:03:01

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

voila le retour que j'ai:

user@server:/etc$ curl https://xxxx.com/core/api/jeeApi.php?apikey=123456789=cmd&id=1
[4] 27685
[5] 27686
user@server:/etc$ {"jsonrpc":"2.0","id":99999,"error":{"code":1,"message":"Requ\u00eate invalide. Version JSON-RPC invalide : "}}
[4]   Done                    curl https://xxxx.com/core/api/jeeApi.php?apikey=123456789OK
[5]   Done                    type=cmd




Si j'ouvre le lien sous chrome j'ai juste "1" ou "0" afficher en haut a gauche

Merci

Dernière modification par Joube31 (15-12-2020 21:07:49)

Hors ligne

#6 15-12-2020 21:21:50

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Donc, la réponse est du json-rpc (protocole que je ne connaissait pas wink ).Là, ça semble te retourner une erreur.

C'est un appel à l'API de jeedom (histoire d'essayer de trouver de la doc pour t'aider wink ) ?

Edit : oui, ça y ressemble fort, et on y lit une histoire d'encodage de paramètres

Doc de Jeedom a écrit :

Info/Action commande

Voici l’URL = http://#IP_JEEDOM#/core/api/jeeApi.php?apikey=#APIKEY#&type=cmd&id=#ID#

    id : correspond à l’id de ce que vous voulez piloter ou duquel vous souhaitez recevoir des informations.

Le plus simple pour avoir cette URL est d’aller sur la page Analyse → Résumé domotique, de chercher la commande puis d’ouvrir sa configuration avancée (l’icône “engrenage”) et là, vous allez voir une URL qui contient déjà tout ce qu’il faut en fonction du type et du sous-type de la commande.

    Note

    Il est possible pour le champs #ID# de passer plusieurs commandes d’un coup. Pour cela, il faut passer un tableau en json (ex %5B12,58,23%5D, à noter que [ et ] doivent être encodés d’où les %5B et %5D). Le retour de Jeedom sera un json.

    Note

    Les paramètres doivent être encodés pour les url, Vous pouvez utiliser un outil, ici.



J'aurais donc tendance à penser qu'il faut encoder les paramètres de l'URL avec l'outil en lien.

Edit 2 : la commande devient donc

curl https://xxxx.com/core/api/jeeApi.php%3Fapikey%3D123456789%3Dcmd%26id%3D1


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#7 15-12-2020 22:02:21

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

OK bien vu, ça a l'air de mieux fonctionner, car je n'ai plus d'erreur. mais pas plus d'info :

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>
 




merci de ton aide :-)

Hors ligne

#8 15-12-2020 22:08:00

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Ah ben si, tu sais que ça n'est pas la bonne URL wink Il y a l'air d'avoir une typo dans tes paramètres, ça doit prendre cette forme là

apikey=#APIKEY#&type=cmd&id=#ID#

Il y a donc des & entre chaque paramètre, et tu as mis un = entre les paramètre apikey et  type smile Edit : le bon paramètre qui est type, et sa valeur cmd tongue Edit : donc, en fait, c'est qu'il manque &type avant =cmd wink

Edit : pour t'aider au mieux, ça serait bien de mettre à chaque fois la commande curl que tu utilises par copié/collé afin de s'assurer de ce genre de problème, en masquant ta clé d'API et le domaine (évite les X, ça envoi sur des sites bizarres tongue ) comme tu l'as fait plus haut.


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#9 16-12-2020 06:00:22

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

Bonjour, alors j'ai refais quelques essais:

user@server:~$ curl [url]https://mondomaine.dns0.jeedom.com/core/api/jeeApi.php?apikey=123456789&type=cmd&id=3431[/url]
[1] 14945
[2] 14946
user@server:~$ {"jsonrpc":"2.0","id":99999,"error":{"code":1,"message":"Requ\u00eate invalide. Version JSON-RPC invalide : "}}



Donc ça c'est l'url que me fourni jeedom (je ne l'ai pas encodé) si je l'ouvre sous Chrome ça fonctionne une page blanche s'affiche avec le texte "1" uniquement (Valeur de ma variable)

Si je change l'id en 3430 à la place de 3431 j'ai exactement le même résultat sous curl. par contre sous chrome une page blanche s'affiche avec le texte "Aucune commande correspondant à l'ID : 3430" ce qui est logique car aucune commande info n'existe sur jeedom.

Je pense que le lien est bon et qu'il ne faut l'encoder QUE si il y a plusieurs commandes or moi il n'y a qu'une seule commande la "3431"

si on doit encoder le lien on le fais à partir du "?" si oui avec curl j'ai le résultat "No such file or directory"


Merci :-)

Dernière modification par Joube31 (16-12-2020 06:01:05)

Hors ligne

#10 16-12-2020 08:49:34

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Joube31 a écrit :

Je pense que le lien est bon et qu'il ne faut l'encoder QUE si il y a plusieurs commandes or moi il n'y a qu'une seule commande la "3431"

Personellement, je lis 2 notes de suite, indépendantes l'une de l'autre, et la deuxième t'indique que les URL doivent de toute façon être encodées.


Joube31 a écrit :

si on doit encoder le lien on le fais à partir du "?" si oui avec curl j'ai le résultat "No such file or directory"


De ce que je lis sur ce tuto, le paramètre inclue le ?. Maintenant, pourquoi ça ne fonctionne pas ??? scratchhead.gif

De toute façon, ton problème se découpe en 3 étapes :

  1. Récupérer la données via l'API Jeedom, et là c'est plus un problème de Jeedom que de bash (il y a peut-être des finesses avec curl, mais a priori avec une requête GET ça devrait passer)

  2. Parser l'état de ton capteur, la manière de s'y prendre dépend du type de donnée, et de ce que je comprends tu pars sur du HTML (il y aurait moyen de récupérer du JSON-RPC si tu envois du JSON-RPC)

  3. Lancer poweroff en fonction de cette donnée avec un test bash



Je pense qu'on peut facilement t'aider pour les étapes 2 et 3. Pour la 1, il faudrait peut-être voir sur le forum Jeedom ?

Je peux essayer d'en installer un en local pour faire des essais, mais pas avant ce week-end hmm


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#11 16-12-2020 11:29:24

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

Bon j'ai trouvé l'erreur.

Il fallait écrire :

Curl "liencompletsansencodage"

Avec les doubles côtes en début et à la fin!

On avance ?
Merci de ton aide

Hors ligne

#12 16-12-2020 12:13:11

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Bon, étape 1 OK smile

Ça donne quoi le retour de curl, histoire de passer à l'étape 2 ?

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#13 16-12-2020 18:02:33

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

Voila le résultat de la commande curl:

user@server:~$ curl "https://mondomaine.dns0.jeedom.com/core/api/jeeApi.php?apikey=123456789&type=cmd&id=3431"
0user@server:~$



On voit bien le "0" en début de deuxième ligne, si je passe l'info à 1 ça marche également.

J'ai essayé de faire quelques essais pour le test conditionnel mais ça ne fonctionne pas  sad

#!/bin/sh

state= curl "https://mondomaine.dns0.jeedom.com/core/api/jeeApi.php?apikey=123456789&type=cmd&id=3431"
echo "$state"

#state="0"

if [[ "$state" == "0"]]; then
     echo "Power OFF"
else
    echo "Power ON"
fi
 



1 Le résultat est toujours le même "Power ON" malgré que la variable passe bien à 0 et 1

2 Si je décommente la 3ème ligne le test if fonctionne bien et le résultat passe à "Power OFF"

Merci de ton aide :-)

Hors ligne

#14 16-12-2020 19:02:44

macisa
Membre
Inscription : 25-01-2020

Re : [Résolu] Bash avec test conditionnel

Peut être une erreur de syntaxe

adresse que l'on peut mettre dans une variable IP_publique afin de l'exploiter dans un script :

IP_publique=`curl ifconfig.me`

Hors ligne

#15 16-12-2020 19:06:19

vv222
Administrateur
Lieu : Bretagne
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : [Résolu] Bash avec test conditionnel

Ça :

#!/bin/sh

et ça :

if [[ "$state" == "0"]]; then

ce n’est pas compatible.

Cette forme de test est spécifique à Bash, et posera des soucis avec le shebang demandant l’interprétation par un shell respectant le standard POSIX.

---

Une proposition de correction de ce script :

#!/bin/sh
set -o errexit

# Récupération de l’état souhaité depuis l’API
STATE=$(curl "https://mondomaine.dns0.jeedom.com/core/api/jeeApi.php?apikey=123456789&type=cmd&id=3431")

# Choix de l‘action à effectuer en fonction du retour de l’API
if [ "$STATE" -eq 0 ]; then
    ACTION="Power OFF"
else
    ACTION="Power ON"
fi

# Exécution de l’action programmée
echo "$ACTION"

exit 0



Une alternative utilisant case plutôt que if :

#!/bin/sh
set -o errexit

# Récupération de l’état souhaité depuis l’API
STATE=$(curl "https://mondomaine.dns0.jeedom.com/core/api/jeeApi.php?apikey=123456789&type=cmd&id=3431")

# Choix de l‘action à effectuer en fonction du retour de l’API
case "$STATE" in
    (0) ACTION="Power OFF" ;;
    (1) ACTION="Power ON" ;;
esac

# Exécution de l’action programmée
echo "$ACTION"

exit 0


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

#16 16-12-2020 19:28:20

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel

Joube31 a écrit :

Voila le résultat de la commande curl:

Je ne vois pas le retour, du coup, on ne sait pas si ça renvoi du HTML hmm

P.S. : je vais passer ça sur le forum programmation wink


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#17 16-12-2020 19:49:54

Joube31
Membre
Inscription : 19-03-2018

Re : [Résolu] Bash avec test conditionnel

Merci à tous pour votre aide, ca fonctionne :-)

Hors ligne

#18 16-12-2020 19:53:16

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : [Résolu] Bash avec test conditionnel


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

Pied de page des forums