Skip to content

Commit

Permalink
add log, code cleaning, add option for maxtry
Browse files Browse the repository at this point in the history
  • Loading branch information
Mips2648 committed Nov 28, 2024
1 parent d08357f commit 194eb5a
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 170 deletions.
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@ test.php
core/config/common.config.php
plugins
sftp-config.json
.vscode/settings.json
.vscode/sftp.json
.vscode
10 changes: 4 additions & 6 deletions 3rdparty/networks_ping.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ private function pingExec($_mode = 'ip') {
$ttl = escapeshellcmd($this->ttl);
$host = escapeshellcmd($this->host);
if ($_mode == 'arp') {
$exec_string = 'sudo arping -c 10 -C 1 -w 500000 ' . $host . ' 2> /dev/null';
$exec_string = 'sudo arping -c 1 -C 1 -w 10 ' . $host . ' 2> /dev/null';
} else {
$exec_string = 'sudo ping -n -c 1 -t ' . $ttl . ' ' . $host . ' 2> /dev/null';
}
exec($exec_string, $output, $return);
$output = array_values(array_filter($output));
if (!empty($output[1])) {
if (count($output) >= 5) {
$response = preg_match("/time(?:=|<)(?<time>[\.0-9]+)(?:|\s)(?<unit>[mu]?s(ec)?)/", $output[count($output)-4], $matches);
$response = preg_match("/time(?:=|<)(?<time>[\.0-9]+)(?:|\s)(?<unit>[mu]?s(ec)?)/", $output[count($output) - 4], $matches);
if ($response > 0 && isset($matches['time'])) {
$latency = $matches['time'];
if (isset($matches['unit'])) {
Expand All @@ -72,8 +72,8 @@ private function pingExec($_mode = 'ip') {
$latency /= 1000;
}
}
}
}
}
}
}
return $latency;
}
Expand All @@ -89,6 +89,4 @@ private function pingPort() {
}
return $latency;
}

}
?>
161 changes: 70 additions & 91 deletions core/class/networks.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,46 +21,25 @@
require_once dirname(__FILE__) . '/../php/networks.inc.php';

class networks extends eqLogic {
/* * *************************Attributs****************************** */

public static $_widgetPossibility = array('custom' => true);

/* * ***********************Methode static*************************** */

public static function dependancy_info() {
$return = array();
$return['log'] = 'networks_update';
$return['progress_file'] = '/tmp/dependancy_networks_in_progress';
$return['state'] = 'ok';
if (exec('which etherwake | wc -l') == 0 || exec('which wakeonlan | wc -l') == 0) {
if (exec(" dpkg --get-selections | grep -v deinstall | grep -E 'wakeonlan|etherwake' | wc -l") != 2) {
$return['state'] = 'nok';
}
}
return $return;
}

public static function dependancy_install() {
log::remove(__CLASS__ . '_update');
return array('script' => dirname(__FILE__) . '/../../resources/install_#stype#.sh ' . jeedom::getTmpFolder('networks') . '/dependance', 'log' => log::getPathToLog(__CLASS__ . '_update'));
}
/* * ***********************Method static*************************** */

public static function update() {
foreach (self::byType('networks') as $networks) {
/** @var networks */
foreach (self::byType('networks', true) as $networks) {
$autorefresh = $networks->getConfiguration('autorefresh');
if ($networks->getIsEnable() == 1 && $autorefresh != '') {
try {
$c = new Cron\CronExpression($autorefresh, new Cron\FieldFactory);
if ($c->isDue()) {
try {
$networks->ping();
} catch (Exception $exc) {
log::add('networks', 'error', __('Erreur pour ', __FILE__) . $networks->getHumanName() . ' : ' . $exc->getMessage());
}
if ($autorefresh == '') continue;

try {
$c = new Cron\CronExpression($autorefresh, new Cron\FieldFactory);
if ($c->isDue()) {
try {
$networks->ping();
} catch (Exception $exc) {
log::add('networks', 'error', __('Erreur pour ', __FILE__) . $networks->getHumanName() . ' : ' . $exc->getMessage());
}
} catch (Exception $exc) {
log::add('networks', 'error', __('Expression cron non valide pour ', __FILE__) . $networks->getHumanName() . ' : ' . $autorefresh);
}
} catch (Exception $exc) {
log::add('networks', 'error', __('Expression cron non valide pour ', __FILE__) . $networks->getHumanName() . ' : ' . $autorefresh);
}
}
}
Expand All @@ -69,6 +48,16 @@ public static function update() {

/* * *********************Méthodes d'instance************************* */

public function preInsert() {
$this->setConfiguration('pingMode', 'ip');
}

public function preUpdate() {
if ($this->getConfiguration('ip') == '') {
throw new Exception(__('L\'adresse IP ne peut être vide', __FILE__));
}
}

public function preSave() {
if ($this->getConfiguration('autorefresh') == '') {
$this->setConfiguration('autorefresh', '* * * * *');
Expand Down Expand Up @@ -96,7 +85,7 @@ public function postSave() {
$ping->setName(__('Statut', __FILE__));
$ping->setOrder(1);
$ping->setTemplate('dashboard', 'line');
$ping->setConfiguration('repeatEventManagement','never');
$ping->setConfiguration('repeatEventManagement', 'never');
}
$ping->setType('info');
$ping->setSubType('binary');
Expand All @@ -118,33 +107,33 @@ public function postSave() {
$latency->setUnite('ms');
$latency->save();

$addresseIP = $this->getCmd(null, 'addresseIP');
if (!is_object($addresseIP)) {
$addresseIP = new networksCmd();
$addresseIP->setLogicalId('addresseIP');
$addresseIP->setIsVisible(1);
$addresseIP->setName(__('addresseIP', __FILE__));
$addresseIP->setOrder(3);
}
$addresseIP->setType('info');
$addresseIP->setSubType('string');
$addresseIP->setEqLogic_id($this->getId());
$addresseIP->save();
$addresseIP->event($this->getConfiguration('ip', ''));

$addresseMAC = $this->getCmd(null, 'addresseMAC');
if (!is_object($addresseMAC)) {
$addresseMAC = new networksCmd();
$addresseMAC->setLogicalId('addresseMAC');
$addresseMAC->setIsVisible(1);
$addresseMAC->setName(__('addresseMAC', __FILE__));
$addresseMAC->setOrder(4);
}
$addresseMAC->setType('info');
$addresseMAC->setSubType('string');
$addresseMAC->setEqLogic_id($this->getId());
$addresseMAC->save();
$addresseMAC->event($this->getConfiguration('mac'), '');
$addressIP = $this->getCmd(null, 'addresseIP');
if (!is_object($addressIP)) {
$addressIP = new networksCmd();
$addressIP->setLogicalId('addresseIP');
$addressIP->setIsVisible(1);
$addressIP->setName(__('addresseIP', __FILE__));
$addressIP->setOrder(3);
}
$addressIP->setType('info');
$addressIP->setSubType('string');
$addressIP->setEqLogic_id($this->getId());
$addressIP->save();
$addressIP->event($this->getConfiguration('ip', ''));

$addressMAC = $this->getCmd(null, 'addresseMAC');
if (!is_object($addressMAC)) {
$addressMAC = new networksCmd();
$addressMAC->setLogicalId('addresseMAC');
$addressMAC->setIsVisible(1);
$addressMAC->setName(__('addresseMAC', __FILE__));
$addressMAC->setOrder(4);
}
$addressMAC->setType('info');
$addressMAC->setSubType('string');
$addressMAC->setEqLogic_id($this->getId());
$addressMAC->save();
$addressMAC->event($this->getConfiguration('mac'), '');

$wol = $this->getCmd(null, 'wol');
if ($this->getConfiguration('mac') == '' || $this->getConfiguration('broadcastIP') == '') {
Expand All @@ -165,29 +154,23 @@ public function postSave() {
}
}

public function preUpdate() {
if ($this->getConfiguration('ip') == '') {
throw new Exception(__('L\'adresse IP ne peut être vide', __FILE__));
}
}

public function ping() {
if ($this->getConfiguration('ip') == '') {
return;
}
$changed = false;
$ping = new networks_Ping($this->getConfiguration('ip'), $this->getConfiguration('ttl', 255));
if ($this->getConfiguration('pingMode', 'ip') == 'port') {
$pingMode = $this->getConfiguration('pingMode', 'ip');
if ($pingMode == 'port') {
$ping->setPort($this->getConfiguration('port', 80));
}
$latency_time = $ping->ping($this->getConfiguration('pingMode', 'ip'));
if ($latency_time === false) {
$latency_time = $ping->ping($this->getConfiguration('pingMode', 'ip'));
}
if ($latency_time === false) {

$maxTry = max(min(10, $this->getConfiguration('maxTry', 3)), 1);
do {
log::add(__CLASS__, 'debug', '[' . getmypid() . ']' . __('Tentative de ping sur : ', __FILE__) . $this->getHumanName());
$latency_time = $ping->ping($pingMode);
usleep(100);
$latency_time = $ping->ping($this->getConfiguration('pingMode', 'ip'));
}
} while ($latency_time === false && --$maxTry > 0);

if ($this->getConfiguration('notifyifko') == 1) {
if ($latency_time === false) {
message::add('networks', __('Echec du ping sur : ', __FILE__) . $this->getHumanName(), '', 'pingFailed' . $this->getId());
Expand All @@ -198,33 +181,31 @@ public function ping() {
}
}
if ($latency_time !== false) {
$changed = $this->checkAndUpdateCmd('ping', 1) || $changed;
$changed = $this->checkAndUpdateCmd('latency', $latency_time) || $changed;
log::add(__CLASS__, 'debug', '[' . getmypid() . ']' . __('Ping réussi sur : ', __FILE__) . $this->getHumanName());
$this->checkAndUpdateCmd('ping', 1);
$this->checkAndUpdateCmd('latency', $latency_time);
} else {
$changed = $this->checkAndUpdateCmd('ping', 0) || $changed;
$changed = $this->checkAndUpdateCmd('latency', -1) || $changed;
}
if ($changed) {
$this->refreshWidget();
log::add(__CLASS__, 'debug', '[' . getmypid() . ']' . __('Ping échoué sur : ', __FILE__) . $this->getHumanName());
$this->checkAndUpdateCmd('ping', 0);
$this->checkAndUpdateCmd('latency', -1);
}
}

/* * **********************Getteur Setteur*************************** */
}

class networksCmd extends cmd {
/* * *************************Attributs****************************** */

public static $_widgetPossibility = array('custom' => true);

/* * ***********************Methode static*************************** */
/* * ***********************Method static*************************** */

/* * *********************Methode d'instance************************* */
/* * *********************Method d'instance************************* */

public function execute($_options = array()) {
if ($this->getType() == 'info') {
return;
}
/** @var networks */
$eqLogic = $this->getEqLogic();
if ($this->getLogicalId() == 'wol') {
$f = new \Phpwol\Factory();
Expand Down Expand Up @@ -253,6 +234,4 @@ public function execute($_options = array()) {
$eqLogic->ping();
}
}

/* * **********************Getteur Setteur*************************** */
}
10 changes: 9 additions & 1 deletion desktop/php/networks.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,15 @@
</select>
</div>
</div>
<div class="form-group pingMode ip">
<div class="form-group">
<label class="col-sm-4 control-label">{{Maximum de tentatives en cas d'échec}}
<sup><i class="fas fa-question-circle tooltips" title="{{Entre 1 & 10. Par défaut 3.}}"></i></sup>
</label>
<div class="col-sm-6">
<input type="number" class="eqLogicAttr form-control" data-l1key="configuration" data-l2key="maxTry" placeholder="{{3}}" />
</div>
</div>
<div class=" form-group pingMode ip">
<label class="col-sm-4 control-label">{{TTL}}</label>
<div class="col-sm-6">
<input type="number" class="eqLogicAttr form-control" data-l1key="configuration" data-l2key="ttl" />
Expand Down
8 changes: 7 additions & 1 deletion docs/fr_FR/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,17 @@
>
>Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte
# 29/11/2024

- Ajout de log en mode DEBUG lors des tentatives de ping
- Ajout d'une configuration pour choisir le nombre maximum d'essai en cas d'échec
- Jeedom 4.4 requis

# 08/01/2024

- Préparation pour jeedom 4.4
- Correction de bugs
- Optimisation de la gestion des unitées
- Optimisation de la gestion des unités

# 17/10/2022

Expand Down
55 changes: 20 additions & 35 deletions docs/fr_FR/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,51 +4,36 @@ Ce plugin permet de faire un ping ou un wake-on-lan sur un équipement réseau.

# Configuration du plugin

Après téléchargement du plugin, il suffit juste d’activer celui-ci, il n’y a aucune configuration à ce niveau.

![networks](../images/networks.PNG)
Après téléchargement du plugin, il suffit juste d’activer celui-ci et d'installer les dépendances, il n’y a aucune configuration à ce niveau.

# Configuration des équipements

La configuration des équipements Networks est accessible à partir du menu plugin :

![networks2](../images/networks2.PNG)

Voilà à quoi ressemble la page du plugin Networks (ici avec déjà 1 équipement) :

![networks3](../images/networks3.PNG)

Une fois que vous cliquez sur l’un d’eux, vous obtenez :

![networks4](../images/networks4.PNG)

Vous retrouvez ici toute la configuration de votre équipement :

- **Nom de l’équipement Networks** : nom de votre équipement Networks,
- **Objet parent** : indique l’objet parent auquel appartient l’équipement,
- **Catégorie** : les catégories de l’équipement (il peut appartenir à plusieurs catégories),
- **Activer** : permet de rendre votre équipement actif,
- **Visible** : rend votre équipement visible sur le Dashboard,
- **Adresse IP** : adresse IP sur laquelle faire le ping,
- **Adresse MAC (wol)** : adresse MAC pour le wake-on-lan,
- **Broadcast IP (wol)** : adresse IP de broadcast du réseau pour envoyer le wake-on-lan,
- **Méthode de ping** : Choix de la méthode de ping : IP (normal), ARP (à privilégier pour les smartphones et périphériques qui s'endorment), PORT (pour tester si un port est ouvert)
- **TTL** : Time-to-live, les valeurs peuvent être :
- 0 : même hôte
- 1 : même sous-réseaux
- 32 : même site
- 64 : même région
- 128 : même continent
- 256 : aucune limite
- **Nom de l’équipement** : nom de votre équipement Networks,
- **Objet parent** : indique l’objet parent auquel appartient l’équipement,
- **Catégorie** : les catégories de l’équipement (il peut appartenir à plusieurs catégories),
- **Activer** : permet de rendre votre équipement actif,
- **Visible** : rend votre équipement visible sur le Dashboard,
- **Adresse IP** : adresse IP sur laquelle faire le ping,
- **Adresse MAC (wol)** : adresse MAC pour le wake-on-lan,
- **Broadcast IP (wol)** : adresse IP de broadcast du réseau pour envoyer le wake-on-lan,
- **Méthode de ping** : Choix de la méthode de ping : *IP* (normal), *ARP* (à privilégier pour les smartphones et périphériques qui s'endorment), *PORT* (pour tester si un port est ouvert)
- **Maximum de tentatives en cas d'échec**: Nombre maximum entre 1 et 10 de tentatives en cas d'échec. En cas de réussite, le plugin s'arrête immédiatement.
- **TTL** : Seulement si méthode *IP*. Time-to-live, les valeurs peuvent être :
- 0 : même hôte
- 1 : même sous-réseaux
- 32 : même site
- 64 : même région
- 128 : même continent
- 256 : aucune limite
Si vous avez une erreur de type 'Time to live exceeded' , il faut augmenter cette valeur. Si vide, alors le paramètre vaut 255. A noter que sur certaines configuration (Docker par exemple) le 255 n'est pas autorisé il faut donc diminuer cette valeur.
- **Port** : Port sur lequel faire le ping si vous êtes en mode ping sur un port (exemple : 8080 pour 192.168.0.12:8080),
- **Auto-actualisation (cron)** : cron définissant la fréquence du ping,

En-dessous vous retrouvez la liste des commandes :

- **Nom** : le nom affiché sur le Dashboard,
- **Afficher** : permet d’afficher la donnée sur le Dashboard,
- **Tester** : permet de tester la commande.
- **Port** : Port sur lequel faire le ping si vous êtes en mode ping sur un port (exemple : 8080 pour 192.168.0.12:8080),
- **Auto-actualisation (cron)** : cron définissant la fréquence du ping,

> **Note**
>
Expand Down
Loading

0 comments on commit 194eb5a

Please sign in to comment.