Tuto : recevoir logs plugins et scenario dans notification

Hello
Pour ceux qui comme moi veulent tout faire via cette monstrueuse app … et en attendant qu’une solution soit donnée … j’ai fait cette petite bidouille vite fait pour avoir les logs appli et scénario au travers de JC

  1. Créer un virtuel nommé ici vLogManage contenant
  • une info virtuel de type autre : plugin
  • un action virtuel de type liste : listPlugins liée à l’info virtuel plugin
  • une info virtuel de type autre : scenario
  • un action virtuel de type liste : listScenario liée à l’info virtuel scenario

Ce virtuel va permettre d’avoir la liste des logs des scénarios et plugins et de pouvoir demander à les envoyer par notification à JC

  1. Créer un scénario schédulé tous les jours pour constituer la liste des logs plugins et scénario nommé ici :
    sGetPluginLog
    Il s’agit d’un scénario en bloc code PHP
$scenario->setlog('Start build list of plugins / scenario log files');
//Get the list of plugins log file
$listPluginLogFile=explode("\n", shell_exec('ls -l /var/www/html/log/ | awk \'{print $9}\''));
$listPlugins='';
foreach($listPluginLogFile as $plugin){
  	if (!(IsNullOrEmptyString($plugin))) {
      	if (strlen($listPlugins) > 0) {
          	$listPlugins .= ';';
        }
  		$listPlugins .=$plugin .'|' . $plugin;
    }
}
$scenario->setlog('		* list active scenario : ' . $listPlugins);
$cmdPluginsList=cmd::byString('#[Infra][vLogManage][listPlugins]#');
$cmdPluginsList->setConfiguration('listValue',$listPlugins);
$cmdPluginsList->save();

//get list of active scenario
$listScenario='';
foreach(scenario::all() as $sc){
  if ($sc->getIsActive()) {
    	if (strlen($listScenario) > 0) {
          	$listScenario .= ';';
        }
    	$listScenario .= 'scenario' . $sc->getId(). '.log|'.$sc->getName();
  }
}
$scenario->setlog('		* list active scenario : ' . $listScenario);
$cmdScenarioList=cmd::byString('#[Infra][vLogManage][listScenario]#');
$cmdScenarioList->setConfiguration('listValue',$listScenario);
$cmdScenarioList->save();
                   
                   
//Refresh list for equipement JC
$eqJC=eqLogic::byString('#[Infra][Jeeconnect Chris]#');
$eqJC->getConfig(true,true);

$scenario->setlog('End build list of plugins / scenario log files');

function IsNullOrEmptyString($str){
  return (!isset($str) || trim($str) === '');
}

Une ligne importante est :

//Refresh list for equipement JC
$eqJC=eqLogic::byString('#[Infra][Jeeconnect Chris]#');
$eqJC->getConfig(true,true);

Elle permet le rafraichissement de ton équipement JC

Ne pas oublier de scheduler le script tous les jours à l’heure désirée

A cette étape il est bon de tester le script en appuyant sur executer … le résultat doit être visible dans le virtuel créer précédemment … les 2 commandes select doivents être alimentées . exemple select listPlugins

  1. Créer le scénario qui va envoyer les logs via notification ici nommé sSendLogsToJC
    Il s’agit d’un scénario en bloc code PHP
$tags = $scenario->getTags();
$cmdName = $tags['#cmdName#'];

if (!(IsNullOrEmptyString($cmdName))) {
  	$logPath='/var/www/html/log/';
  	
    $value=executeCommande($cmdName,$scenario);
  	$valueTitle=$value;
    if (stringContains($value,'scenario')) {
        $logPath .='scenarioLog/';
      	$sc=scenario::byId(str_replace('scenario','',$value));
      	$valueTitle=$sc->getName();
      
    }

    $scenario->setLog('	 input : ' . $cmdName . '| logs path : ' . $logPath);

  	$sendMsgKO=true;
  	$nbLine=40;
    while($sendMsgKO) {
        $message = shell_exec('tail -n '. $nbLine . ' ' . $logPath . $value);
        $content_length=mb_strlen($title . $message,'8bit');

        if ($content_length <= 3000) {
          	$sendMsgKO=false;
        }
      	$nbLine = $nbLine - 1;
    }
  

  	$title = '<b><u>Log : </u></b>' . $valueTitle;
  
  	//chris => met le nom de l equipement JC qui doit recevoir la notification
  	//Notification => met le nom de la notification que tu veux déclencher
    sendJeedomConnectMessage($scenario,'chris','Notification','',$title,$message);
}

$scenario->setlog('End  get last line of a plugin log');

function stringContains($string_1, $string_2) {
  if ((strtolower($string_1) == strtolower($string_2)) or 
      (strpos(strtolower($string_1),strtolower($string_2)) !== false ) or 
      (strpos(strtolower($string_2),strtolower($string_1)) !== false )) {
    return true;
  } else {
    return false;
  }
}

function executeCommande($commandName,$scenario=NULL) {
  try {
    $cmd=cmd::byString('#'.$commandName.'#');
    return $cmd->execCmd();
  } catch (Exception $e) {
    $erreur= $e->getMessage();
    $message=$scenario->getHumanName() . ' - erreur : ' . $e->getMessage();
    sendJeedomConnectMessage($scenario,'chris','Notification','','Erreur scenario : ' . $scenario->getName(),$message);
    throw $e;
  }
}

function sendJeedomConnectMessage($scenario,$destinataire,$notificationName,$attachedFile,$title,$message) {      
  $cmdJC;
  foreach(eqLogic::byType('JeedomConnect', true) as $eqLogic) {

    if (stringContains($eqLogic->getName(),$destinataire)) {
      $arrCmd=$eqLogic->getCmd('action',null,null,null);
      foreach($arrCmd as $cmd) {
        if (stringContains($cmd->getName(),$notificationName)) {
          $cmdJC=$cmd;
          break;
        }
      }
    }				

    if (is_object($cmdJC)) {
      break;
    }
  }

  if (is_object($cmdJC)) {
    if (is_array($attachedFile)) {
      $scenario->setLog('It is an array');
      $options = array('title' => $title, 'message'=>str_replace("\n","<br/>",$message),'files'=> $attachedFile);
    } else {
      $scenario->setLog('It is not an array');
      $options = array('title' => $title, 'message'=>str_replace("\n","<br/>",$message),'files'=> array($attachedFile));
    }

    $scenario->setLog('Options : ' . json_encode($options));
    $cmdJC->execCmd($options, $cache=0);
  } else {
    $scenario->setLog('Aucune commande notification jeedom connect trouvée pour le destinataire : ' . $destinataire . ' et le type de notification : ' . $notificationName);

  }
}

function IsNullOrEmptyString($str){
  return (!isset($str) || trim($str) === '');
}
  1. executer le script lorsqu’on click sur une des listes box … retour dans le virtuel … setting de chacune des commandes actions puis onglet configuration puis executer le scenario apres action sur la commande.
    Il faut luis passer en paramètre (tag) le nom de l’info associé

Exemple listPlugins

Exemple listScenario

  1. créer 2 widgets de type liste déroulante sous JC et les associées à l’équipement souhaité

Si tout va bien dans ton app JC mobile, tu as acces à l’ensemble des logs plugins et scenario et qd tu click tu dois recevoir sa log par notif

PS : il s’agit d’un exemple fonctionnel et certainement optimisable … mais ça fait le boulot

3 « J'aime »

Faut vraiment que je prenne le temps de mettre ça en place mais c’est tellement du chinois je ne m’y suis pas encore aventuré

lol normalement si tu suis pas à pas cela devrait se faire sans soucis

Pour aider et que ca soit plus simple,
Tu devrais en debut de chaque script cree des variable bien clair (nomEquipementJc, nomNotification , …) que tu utilises dans tes fonctions plus tard.

Commr ca celui qui veut utiliser les scripts n a pas besoin de tout parcourrir, mais uniquement regarder les 5 premieres lignes pour personnaliser les infos (et que sur ces 5 premieres lignes)

Je pense qu il y a qlq modif a faire que tu n as pas indiqué (jai lu en diag!)

tu as tout à fait raison mais mon code est factorisé dans dans des class que je consomme dans la plupart de mes scripts … du coup j’ai fait une adaptation pour une utilisation sans ces class … :slight_smile:
Après je suis dispo pour aider si besoin … et à l’écoute de corrections … :slight_smile:

méthode beaucoup plus simple disponible dans l’appli à partir de la version beta 0.23.4 ! :slight_smile:

thx

Merci encore pour votre travail à ts le 3

Gg …solution palliative en attendant que vous ayez du temps …merci à vous

1 « J'aime »