diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md
index a44ddcf..7ab27c2 100644
--- a/docs/fr_FR/changelog.md
+++ b/docs/fr_FR/changelog.md
@@ -6,6 +6,12 @@
- Support des images d'équipement personnalisées (Jeedom 4.5)
+# xx/06/2025
+
+- Ajout de la possibilité de ne pas forcer l'interpréteur selon une règle propre à Jeedom et qui est incompatible avec certains systèmes (python3 sous Debian 11+).
+- 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.
+- Mise à jour de la documentation et petites corrections de celle-ci
+
# 01/07/2024
- Correction de bug
diff --git a/docs/fr_FR/index.md b/docs/fr_FR/index.md
index 1d2d16e..c413a17 100644
--- a/docs/fr_FR/index.md
+++ b/docs/fr_FR/index.md
@@ -38,21 +38,23 @@ Vous retrouvez ici la liste des commandes :
- **Nom** : Ce champ contient le nom que vous souhaitez donner à votre commande/information.
- **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).
- **Type de script** :
- - 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.
- 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.
+ - 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.
- 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.
- 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).
- **le type** et le **sous-type**
- Le champ **requête**
- - 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.
+ - 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.
- > 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.
+ > 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``.
- 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.
- Le bouton **Nouveau** : permet de créer un fichier de commande.
- > 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é
+ > 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 cochant la case "Interpréteur shebang", ce point est détaillé plus loin.
+
- Le bouton **Supprimer** : permet de supprimer un fichier de commande.
+
- Le champ **Options** : Champ avec des options variables suivant le choix du type de script.
- **unité** : unité de la donnée (peut être vide).
- **min/max** : bornes de la donnée (peuvent être vides).
@@ -61,11 +63,13 @@ Vous retrouvez ici la liste des commandes :
> **Important**
>
-> 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)
+> 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)
> **Important**
>
-> 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"}`
+> 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"}`
+
+# Le choix HTTP

@@ -195,13 +199,11 @@ Le plus sympa mais pas le plus simple à expliquer.
>**IMPORTANT**
>
> 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
->
-> Si le nom de votre fichier ne contient pas :
->
-> - .php .py .pl .rb
->
-Le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne ( shebang ).
+Si le nom de votre fichier ne contient pas :
+- .php .py .pl .rb
+
+ou si la case "Interpréteur shebang" est cochée, le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne (shebang).
Exemple :
```bash
From 090debbbfe24a67ab0b921a19f0166d17624ed70 Mon Sep 17 00:00:00 2001
From: Michel F <80367602+MrWaloo@users.noreply.github.com>
Date: Fri, 27 Jun 2025 01:37:36 +0200
Subject: [PATCH 2/5] Delete version.py
---
data/version.py | 5 -----
1 file changed, 5 deletions(-)
delete mode 100644 data/version.py
diff --git a/data/version.py b/data/version.py
deleted file mode 100644
index 059312b..0000000
--- a/data/version.py
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-
-print(sys.version)
\ No newline at end of file
From 7fbd5d3c5c21dcaab29b0810d25f1c352ab1ca27 Mon Sep 17 00:00:00 2001
From: Michel F <80367602+MrWaloo@users.noreply.github.com>
Date: Mon, 7 Jul 2025 22:32:23 +0200
Subject: [PATCH 3/5] =?UTF-8?q?Adaptations=20suite=20=C3=A0=20la=20remarqu?=
=?UTF-8?q?e=20pertinante=20de=20=20kwizer15?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/class/script.class.php | 10 +++++-----
desktop/js/script.js | 2 +-
docs/fr_FR/changelog.md | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/core/class/script.class.php b/core/class/script.class.php
index 9cf727e..0bef87c 100644
--- a/core/class/script.class.php
+++ b/core/class/script.class.php
@@ -229,14 +229,14 @@ public function execute($_options = null) {
return script::$_requet_cache[$request];
}
$cmd = 'sudo chmod +x ' . explode(' ', $request)[0] . ' 2>/dev/null;';
- $force_interpreter = $this->getConfiguration('doNotForceInterpreter', '0') == '0';
- if ($force_interpreter && strpos($request, '.php') !== false) {
+ $use_shebang = $this->getConfiguration('useShebang', '0') == '1';
+ if (!$use_shebang && strpos($request, '.php') !== false) {
$cmd .= 'php ' . $request;
- } elseif ($force_interpreter && strpos($request, '.rb') !== false) {
+ } elseif (!$use_shebang && strpos($request, '.rb') !== false) {
$cmd .= 'ruby ' . $request;
- } elseif ($force_interpreter && strpos($request, '.py') !== false) {
+ } elseif (!$use_shebang && strpos($request, '.py') !== false) {
$cmd .= 'python ' . $request;
- } elseif ($force_interpreter && strpos($request, '.pl') !== false) {
+ } elseif (!$use_shebang && strpos($request, '.pl') !== false) {
$cmd .= 'perl ' . $request;
} else {
$cmd .= $request;
diff --git a/desktop/js/script.js b/desktop/js/script.js
index d532da8..d1f4bab 100644
--- a/desktop/js/script.js
+++ b/desktop/js/script.js
@@ -113,7 +113,7 @@ function addCmdToTable(_cmd) {
tr += '
'
tr += '
'
tr += '
'
- tr += '
'
diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md
index 7ab27c2..46c74b0 100644
--- a/docs/fr_FR/changelog.md
+++ b/docs/fr_FR/changelog.md
@@ -6,7 +6,7 @@
- Support des images d'équipement personnalisées (Jeedom 4.5)
-# xx/06/2025
+# xx/07/2025
- Ajout de la possibilité de ne pas forcer l'interpréteur selon une règle propre à Jeedom et qui est incompatible avec certains systèmes (python3 sous Debian 11+).
- 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.
From ea69d4e17c467b5c162ec3e92e732feb61d40356 Mon Sep 17 00:00:00 2001
From: Michel F <80367602+MrWaloo@users.noreply.github.com>
Date: Fri, 18 Jul 2025 01:09:05 +0200
Subject: [PATCH 4/5] =?UTF-8?q?Adaptations=20suite=20=C3=A0=20la=20remarqu?=
=?UTF-8?q?e=20de=20Lo=C3=AFc?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/class/script.class.php | 28 ++++++++++++++++++++--------
desktop/js/script.js | 23 +++++++++++++----------
docs/fr_FR/changelog.md | 2 +-
docs/fr_FR/index.md | 17 ++++++++---------
4 files changed, 42 insertions(+), 28 deletions(-)
diff --git a/core/class/script.class.php b/core/class/script.class.php
index 0bef87c..45e1b51 100644
--- a/core/class/script.class.php
+++ b/core/class/script.class.php
@@ -228,16 +228,28 @@ public function execute($_options = null) {
if ($this->getType() == 'info' && isset(script::$_requet_cache[$request])) {
return script::$_requet_cache[$request];
}
- $cmd = 'sudo chmod +x ' . explode(' ', $request)[0] . ' 2>/dev/null;';
- $use_shebang = $this->getConfiguration('useShebang', '0') == '1';
- if (!$use_shebang && strpos($request, '.php') !== false) {
+ $first_element = explode(' ', $request)[0];
+ $use_shebang = false;
+ $from_path = false;
+ if (file_exists($first_element)) {
+ $env_path = explode(PATH_SEPARATOR, getenv('PATH'));
+ $from_path = in_array(dirname($first_element), $env_path);
+ if (!$from_path) {
+ $shebang = trim(file_get_contents($first_element, false, null, 0, 3));
+ $use_shebang = $shebang == '#!/';
+ }
+ if (!is_executable($first_element)) {
+ $cmd = 'sudo chmod +x ' . $first_element . ' 2>/dev/null;';
+ }
+ }
+ if (!$from_path && !$use_shebang && substr($request, -4) === '.php') {
$cmd .= 'php ' . $request;
- } elseif (!$use_shebang && strpos($request, '.rb') !== false) {
- $cmd .= 'ruby ' . $request;
- } elseif (!$use_shebang && strpos($request, '.py') !== false) {
- $cmd .= 'python ' . $request;
- } elseif (!$use_shebang && strpos($request, '.pl') !== false) {
+ } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.pl') {
$cmd .= 'perl ' . $request;
+ } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.py') {
+ $cmd .= 'python ' . $request;
+ } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.rb') {
+ $cmd .= 'ruby ' . $request;
} else {
$cmd .= $request;
}
diff --git a/desktop/js/script.js b/desktop/js/script.js
index d1f4bab..962fc61 100644
--- a/desktop/js/script.js
+++ b/desktop/js/script.js
@@ -33,9 +33,15 @@ $("#table_cmd tbody").delegate(".cmdAttr[data-l1key=configuration][data-l2key=re
if ($(this).value() == 'script') {
$(this).closest('tr').find('.browseScriptFile').show()
$(this).closest('tr').find('.editScriptFile').show()
+
+ $(this).closest('tr').find('.tdRequest').attr('colspan', '2')
+ $(this).closest('tr').find('.tdOptions').hide()
} else {
$(this).closest('tr').find('.browseScriptFile').hide()
$(this).closest('tr').find('.editScriptFile').hide()
+
+ $(this).closest('tr').find('.tdRequest').attr('colspan', '1')
+ $(this).closest('tr').find('.tdOptions').show()
}
})
@@ -100,7 +106,7 @@ function addCmdToTable(_cmd) {
tr += ''
tr += '
'
tr += '{{Afficher}} '
diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md
index 46c74b0..0126f16 100644
--- a/docs/fr_FR/changelog.md
+++ b/docs/fr_FR/changelog.md
@@ -8,8 +8,8 @@
# xx/07/2025
-- Ajout de la possibilité de ne pas forcer l'interpréteur selon une règle propre à Jeedom et qui est incompatible avec certains systèmes (python3 sous Debian 11+).
- 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.
+- 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.
- Mise à jour de la documentation et petites corrections de celle-ci
# 01/07/2024
diff --git a/docs/fr_FR/index.md b/docs/fr_FR/index.md
index c413a17..ee1a2b7 100644
--- a/docs/fr_FR/index.md
+++ b/docs/fr_FR/index.md
@@ -51,7 +51,7 @@ Vous retrouvez ici la liste des commandes :
- 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.
- Le bouton **Nouveau** : permet de créer un fichier de commande.
- > 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 cochant la case "Interpréteur shebang", ce point est détaillé plus loin.
+ > 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.
- Le bouton **Supprimer** : permet de supprimer un fichier de commande.
@@ -194,25 +194,24 @@ Action : Lancez le script, via un équipement virtuel, lié à votre script !
Le plus sympa mais pas le plus simple à expliquer.
-**Prérequis : savoir développer un script en php, python, perl ou ruby.**
+**Prérequis : savoir développer un script**
>**IMPORTANT**
>
-> 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
+> - 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).
+> - 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.
+> - 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 laligne 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.
-Si le nom de votre fichier ne contient pas :
-- .php .py .pl .rb
+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.
-ou si la case "Interpréteur shebang" est cochée, le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne (shebang).
-Exemple :
+Exemples de ligne shebang :
-```bash
+```
#!/bin/csh -f
#!/bin/ksh
#!/usr/bin/env python3
#!/usr/bin/env php
#!/usr/bin/env node
-etc ...
```
Le script de monitoring température du Raspberry va servir d’exemple pour l’utilisation du type de script : Script
From bb3fb4ecdfe11fff0a9dcb5a101563e5f3d30abf Mon Sep 17 00:00:00 2001
From: Michel F <80367602+MrWaloo@users.noreply.github.com>
Date: Sun, 20 Jul 2025 16:38:03 +0200
Subject: [PATCH 5/5] =?UTF-8?q?Am=C3=A9liorations=20du=20code?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/class/script.class.php | 26 +++++++++++++-------------
docs/fr_FR/index.md | 2 +-
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/core/class/script.class.php b/core/class/script.class.php
index 45e1b51..80bf844 100644
--- a/core/class/script.class.php
+++ b/core/class/script.class.php
@@ -229,30 +229,30 @@ public function execute($_options = null) {
return script::$_requet_cache[$request];
}
$first_element = explode(' ', $request)[0];
- $use_shebang = false;
$from_path = false;
- if (file_exists($first_element)) {
+ $use_shebang = false;
+ if (is_readable($first_element)) {
$env_path = explode(PATH_SEPARATOR, getenv('PATH'));
$from_path = in_array(dirname($first_element), $env_path);
if (!$from_path) {
- $shebang = trim(file_get_contents($first_element, false, null, 0, 3));
+ $shebang = file_get_contents($first_element, false, null, 0, 3);
$use_shebang = $shebang == '#!/';
}
if (!is_executable($first_element)) {
$cmd = 'sudo chmod +x ' . $first_element . ' 2>/dev/null;';
}
}
- if (!$from_path && !$use_shebang && substr($request, -4) === '.php') {
- $cmd .= 'php ' . $request;
- } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.pl') {
- $cmd .= 'perl ' . $request;
- } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.py') {
- $cmd .= 'python ' . $request;
- } elseif (!$from_path && !$use_shebang && substr($request, -3) === '.rb') {
- $cmd .= 'ruby ' . $request;
- } else {
- $cmd .= $request;
+ $interpreters = [
+ '.php' => 'php',
+ '.py' => 'python',
+ '.pl' => 'perl',
+ '.rb' => 'ruby'
+ ];
+ $extension = substr($first_element, strrpos($first_element, '.', -4));
+ if (isset($interpreters[$extension]) && !$from_path && !$use_shebang) {
+ $cmd .= $interpreters[$extension] . ' ';
}
+ $cmd .= $request;
$request_shell = new com_shell($cmd . ' 2>&1');
if (isset($_options['speedAndNoErrorReport']) && $_options['speedAndNoErrorReport'] == true) {
$request_shell->setBackground(true);
diff --git a/docs/fr_FR/index.md b/docs/fr_FR/index.md
index ee1a2b7..373e198 100644
--- a/docs/fr_FR/index.md
+++ b/docs/fr_FR/index.md
@@ -200,7 +200,7 @@ Le plus sympa mais pas le plus simple à expliquer.
>
> - 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).
> - 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.
-> - 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 laligne 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.
+> - 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.
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.