Skip to content

Commit 2eaea5d

Browse files
authored
Merge pull request #94 from MrWaloo/beta-interpreteur
Beta interpreteur
2 parents 9572389 + bb3fb4e commit 2eaea5d

5 files changed

Lines changed: 58 additions & 33 deletions

File tree

core/class/script.class.php

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -228,18 +228,31 @@ public function execute($_options = null) {
228228
if ($this->getType() == 'info' && isset(script::$_requet_cache[$request])) {
229229
return script::$_requet_cache[$request];
230230
}
231-
$cmd = 'sudo chmod +x ' . explode(' ', $request)[0] . ' 2>/dev/null;';
232-
if (strpos($request, '.php') !== false) {
233-
$cmd .= 'php ' . $request;
234-
} elseif (strpos($request, '.rb') !== false) {
235-
$cmd .= 'ruby ' . $request;
236-
} elseif (strpos($request, '.py') !== false) {
237-
$cmd .= 'python ' . $request;
238-
} elseif (strpos($request, '.pl') !== false) {
239-
$cmd .= 'perl ' . $request;
240-
} else {
241-
$cmd .= $request;
231+
$first_element = explode(' ', $request)[0];
232+
$from_path = false;
233+
$use_shebang = false;
234+
if (is_readable($first_element)) {
235+
$env_path = explode(PATH_SEPARATOR, getenv('PATH'));
236+
$from_path = in_array(dirname($first_element), $env_path);
237+
if (!$from_path) {
238+
$shebang = file_get_contents($first_element, false, null, 0, 3);
239+
$use_shebang = $shebang == '#!/';
240+
}
241+
if (!is_executable($first_element)) {
242+
$cmd = 'sudo chmod +x ' . $first_element . ' 2>/dev/null;';
243+
}
244+
}
245+
$interpreters = [
246+
'.php' => 'php',
247+
'.py' => 'python',
248+
'.pl' => 'perl',
249+
'.rb' => 'ruby'
250+
];
251+
$extension = substr($first_element, strrpos($first_element, '.', -4));
252+
if (isset($interpreters[$extension]) && !$from_path && !$use_shebang) {
253+
$cmd .= $interpreters[$extension] . ' ';
242254
}
255+
$cmd .= $request;
243256
$request_shell = new com_shell($cmd . ' 2>&1');
244257
if (isset($_options['speedAndNoErrorReport']) && $_options['speedAndNoErrorReport'] == true) {
245258
$request_shell->setBackground(true);

desktop/js/script.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function addCmdToTable(_cmd) {
106106
tr += '<span class="subType" subType="' + init(_cmd.subType) + '"></span>'
107107
tr += '</td>'
108108

109-
tr += '<td class="tdRequest">'
109+
tr += '<td class="tdRequest" colspan="2">'
110110
tr += '<div class="btn-group" role="group">'
111111
tr += '<span class="input-group" style="margin-top : 5px;">'
112112
tr += '<a style="width:30px" class="btn btn-default browseScriptFile btn-xs roundedLeft" title="{{Parcourir}}"><i class="far fa-folder-open"></i></a>'
@@ -116,8 +116,12 @@ function addCmdToTable(_cmd) {
116116
tr += '<textarea style="height : 95px;margin-top:5px;" class="cmdAttr form-control input-sm" data-l1key="configuration" data-l2key="request"></textarea>'
117117
tr += '</td>'
118118

119-
tr += '<td class="tdOptions">'
120-
tr += '<div class="requestTypeConfig" data-type="http">'
119+
tr += '<td class="tdOptions" style="display : none;">'
120+
121+
//tr += '<div class="requestTypeConfig" data-type="script">'
122+
//tr += '</div>'
123+
124+
tr += '<div class="requestTypeConfig" data-type="http" style="display : none;">'
121125
tr += '<center>'
122126
tr += '<input type="checkbox" class="cmdAttr" data-l1key="configuration" data-l2key="noSslCheck" />{{Vérifier SSL}} '
123127
tr += '<input type="checkbox" class="cmdAttr" data-l1key="configuration" data-l2key="allowEmptyResponse" style="margin-left : 20px;"/>{{Retour vide}} '
@@ -184,7 +188,8 @@ function addCmdToTable(_cmd) {
184188
tr += '</div>'
185189
tr += '</div>'
186190
tr += '</div>'
187-
tr += '</td>'
191+
192+
tr += '</td>' // tdOptions
188193

189194
tr += '<td>'
190195
tr += '<label class="checkbox-inline"><input type="checkbox" class="cmdAttr" data-l1key="isVisible" checked/>{{Afficher}}</label> '

desktop/php/script.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
<th style="width: 70px;">{{Type}}</th>
162162
<th style="width: 300px;">{{Requête}}</th>
163163
<th style="width: 360px;">{{Paramètres}}</th>
164-
<th style="min-width:260px;width:400px">{{Options}}</th>
164+
<th style="min-width:120px;width:260px">{{Options}}</th>
165165
<th style="width: 100px;">{{Etat}}</th>
166166
<th style="min-width:80px;width:100px;">{{Actions}}</th>
167167
</tr>

docs/fr_FR/changelog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99
- Support des images d'équipement personnalisées (Jeedom 4.5)
1010

11+
# xx/07/2025
12+
13+
- Correction de l'erreur d'affichage des options pour un type "HTTP" lors de la création d'une commande alors que le type "script" est sélectionné à ce moment.
14+
- Traitement différent pour les commandes de type Script : le forçage de l'interpréteur selon une règle propre au plugin et qui est incompatible avec certains systèmes (python3 sous Debian 11+) est conditionné afin que le script soit lancé comme s'il l'était dans un shell sauf si le forçage de l'interpréteur est nécessaire.
15+
- Mise à jour de la documentation et petites corrections de celle-ci
16+
1117
# 01/07/2024
1218

1319
- Correction de bug

docs/fr_FR/index.md

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,23 @@ Vous retrouvez ici la liste des commandes :
3838
- **Nom** : Ce champ contient le nom que vous souhaitez donner à votre commande/information.
3939
- **Icône** : Ce champ permet d’associer une icône à votre nom (dans ce cas Jeedom remplace le nom par l’icône dans le Dashboard).
4040
- **Type de script** :
41-
- Le type **http** : permet d’envoyer une requête vers un équipement externe sans forcément attendre un retour de cette commande. L’exemple qui servira de support au type http sera la configuration d’une requête vers une Vera pour allumer une lumière.
4241
- Le type **script** : sert principalement à lancer des scripts internes à Jeedom. L’exemple qui servira de support au type script sera la configuration du script de monitoring température du raspberry.
42+
- Le type **http** : permet d’envoyer une requête vers un équipement externe sans forcément attendre un retour de cette commande. L’exemple qui servira de support au type http sera la configuration d’une requête vers une Vera pour allumer une lumière.
4343
- Le type **XML** : permet de rapatrier des informations encodées en XML depuis un équipement distant. L’exemple qui servira de support au type XML sera la configuration du script pour interroger un Eco-Device.
4444
- Le type **JSON** : permet de rapatrier des informations encodées en JSON depuis un équipement distant. L’exemple qui servira de support au type JSON sera la configuration du script pour interroger Sickbeard (ou XBMC).
4545
- **le type** et le **sous-type**
4646
- Le champ **requête**
47-
- Ce champ doit contenir la requête en elle-même, ou le chemin du script si le champ "type de script" est script. Le bouton "parcourir" : permet de sélectionner le fichier contenu dans le dossier interne à Jeedom.
47+
- Ce champ doit contenir la requête en elle-même, ou le chemin du script si le champ "type de script" est script. Le bouton "parcourir" permet de sélectionner le fichier contenu dans le dossier interne à Jeedom.
4848

49-
> Ce dossier est accessible en SSH dans ``/var/www/html/plugins/script/data/``. Pour info, la commande SSH pour attribuer les droits ``www-data`` à un fichier est : ``sudo chown www-data:www-data NOMDUSCRIPT.EXTENSION``. A savoir que pour exécuter un script, celui-ci doit avoir les droits www-data.
49+
> Ce dossier est accessible en SSH dans ``/var/www/html/plugins/script/data/``. Pour info, la commande SSH pour que ``www-data`` soit le propriétaire d'un fichier est : ``sudo chown www-data:www-data NOMDUSCRIPT.EXTENSION``. A savoir que pour exécuter un script, celui-ci doit appartenir à ``www-data``.
5050

5151
- Le bouton **Editer** : permet d’éditer à l’aide d’un éditeur de code interne un des fichiers contenus dans le répertoire permettant l’accès au code du fichier.
5252
- Le bouton **Nouveau** : permet de créer un fichier de commande.
5353

54-
> Ne pas oublier de saisir le nom du fichier ainsi que son extension complète sous peine de voir votre superbe script ne pas fonctionner. Sans extension Jeedom ne saura pas reconnaître le langage associé à votre fichier. CF : Généralité
54+
> Ne pas oublier de saisir le nom du fichier ainsi que son extension complète sous peine de voir votre superbe script ne pas fonctionner. Sans extension Jeedom ne saura pas reconnaître le langage associé à votre fichier. Il est possible de contourner ce fonctionnement en précisant l'interpréteur dans la ligne shebang ou en plaçant l'interpréteur en première position de la ligne de commande, ce point est détaillé plus loin.
55+
5556
- Le bouton **Supprimer** : permet de supprimer un fichier de commande.
57+
5658
- Le champ **Options** : Champ avec des options variables suivant le choix du type de script.
5759
- **unité** : unité de la donnée (peut être vide).
5860
- **min/max** : bornes de la donnée (peuvent être vides).
@@ -61,11 +63,13 @@ Vous retrouvez ici la liste des commandes :
6163

6264
> **Important**
6365
>
64-
> Il faut éviter, autant que possible, dans le chemin du script ou dans les paramètres de celui-ci les caractères spéciaux. Les caractères autorisés étant : les chiffres, les lettres (majuscule ou minuscule)
66+
> Il faut éviter les caractères spéciaux, autant que possible, dans le chemin du script ou dans les paramètres de celui-ci. Les caractères autorisés étant : les chiffres, les lettres (majuscule ou minuscule)
6567
6668
> **Important**
6769
>
68-
> Vous pouvez dans le champs requete (pour http, json, xml) mettre du json, il faut juste le faire preceder de `json::`, exemple `json::{"clef":"valeur"}`
70+
> Dans le champs requête (pour http, json, xml), vous pouvez mettre du json, il faut juste le faire précéder de `json::`, exemple `json::{"clef":"valeur"}`
71+
72+
# Le choix HTTP
6973

7074
![exemple](../images/exemple.png)
7175

@@ -190,27 +194,24 @@ Action : Lancez le script, via un équipement virtuel, lié à votre script !
190194

191195
Le plus sympa mais pas le plus simple à expliquer.
192196

193-
**Prérequis : savoir développer un script en php, python, perl ou ruby.**
197+
**Prérequis : savoir développer un script**
194198

195199
>**IMPORTANT**
196200
>
197-
> L'extension de votre script doit absolument correspondre à son type. En effet Jeedom se base sur l'extension du script pour l'exécutable à lancer
198-
>
199-
> Si le nom de votre fichier ne contient pas :
200-
>
201-
> - .php .py .pl .rb
202-
>
201+
> - Si le script en première position de la ligne de commande contient une ligne shebang, le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne (shebang).
202+
> - Si le premier élément de la ligne de commande est un exécutable reconnu par le système, par exemple `/usr/bin/python3`, le plugin script lancera un shell qui exécutera cette ligne de commande.
203+
> - Si le script en première position de la ligne de commande ne contient pas de ligne shebang ET que le premier élément de la ligne de commande n'est pas un exécutable reconnu par le système, l'extension de votre script doit absolument correspondre à son type. En effet le plugin script se base alors sur l'extension du script pour l'exécutable à lancer.
203204
204-
Le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne ( shebang ).
205-
Exemple :
205+
Dans ce dernier cas, si le nom de votre fichier ne termine pas par .php .py .pl ou .rb, le plugin script lancera un shell qui l’exécutera comme en ligne de commande.
206206

207-
```bash
207+
Exemples de ligne shebang :
208+
209+
```
208210
#!/bin/csh -f
209211
#!/bin/ksh
210212
#!/usr/bin/env python3
211213
#!/usr/bin/env php
212214
#!/usr/bin/env node
213-
etc ...
214215
```
215216

216217
Le script de monitoring température du Raspberry va servir d’exemple pour l’utilisation du type de script : Script

0 commit comments

Comments
 (0)