Creation automatique d'ID?

Pour info complémentaire, j’ai rajouté hier un nouveau scenario, mais le probleme était présent bien avant
Ce scenario est plus que basic

Je n’ai donc bien que 2 scenarios, rien de plus
Merci

une autre idée:

  • prendre un backup jeedom
  • reset la machine et réinstallé complétement l’os
  • installer jeedom
  • restaurer le backup

au cas où il y a un couac dans les id généré par sql ca devrait « effacer » le problème.

Hummm … en effet c’est a essayé…
MAIS a vrai dire nous avons changé recemment la machine (RPi >> mini PC) en utilisant cette méthode. On a recupéré la sauvegarde du RPi et on l’a restauré sur le mini PC après une install « propre » et « vierge » de Jeedom… Peut etre la source du probleme ?

non je ne crois pas, c’est toujours comme cela qu’on fait pour migrer de machine

C’est ce que j’avais cru comprendre
Mais du coup, mystere autour de ces créations/suppressions d’ID …
C’est pour l’instant pas super critique mais c’est pas top

Je cherche, car c’est un phénomène que j’ai un temps constaté à moindre échelle sans pouvoir en cerner la cause.

Une idée comme ça pour surveiller ce qui se passe. J’ai un peu cherché, mais je ne suis pas encore assez familier avec le fonctionnement interne de Jeedom pour mettre le doigt dessus. Si j’ai bien compris, c’est le core qui se charge de la lecture/écriture en base de données (le contraire m’inquiéterais). Du coup, en identifiant dans le code la fonction chargée de la gestion de la base de données, on doit pouvoir modifier le code pour ajouter temporairement un log à chaque écriture dans la table cmd. Ne serait-ce que pour faire un echo dans un fichier temporaire. Au point où on est… Non ?

J’ai aussi pensé à l’utilisation de triggers directement dans la base de données, mais, pour ma part, sans connaissance poussée de la gestion de la bdd par Jeedom, je ne le sens pas (surtout que la machine sur laquelle j’ai constaté le phénomène est une machine en production).

Je propose ce bloc code pour un scénario à lancer toutes les minutes pendant 24h afin d’essayer d’intercepter les commandes créées puis supprimées.

$backupdir = '/var/www/html/zzzbackuperasecmd';
$backupfile = '/jeedomcmd.lst';
$cmdlistold = array();
$cmdlistnew = array();

if (!is_dir($backupdir)) {
  $scenario->setLog('Création du répertoire ' . $backupdir);
  mkdir($backupdir, 0775);
}
if (file_exists($backupdir . $backupfile)) {
  $scenario->setLog('Récupération de la liste dans ' . $backupdir . $backupfile);
  $jeedomcmd = fopen($backupdir . $backupfile, 'r');
  while (($buffer = fgets($jeedomcmd)) !== false) {
    $buffer = trim($buffer,"\n");
    $cmdlistold[] = $buffer;
  }
  fclose($jeedomcmd);
}

foreach(cmd::all() as $cmd) {
  $scenario->setLog('bdd ' . $cmd->getId() . ' : ' . $cmd->getHumanName());
  $cmdlistnew[] = $cmd->getId() . ' : ' . $cmd->getHumanName();
}

$cmdlistdiff = array_diff($cmdlistnew, $cmdlistold);
$cmdlistnew = array_merge($cmdlistold, $cmdlistdiff);
asort($cmdlistnew,SORT_NUMERIC);

$jeedomcmd = fopen($backupdir . $backupfile, 'w+');
foreach($cmdlistnew AS $ligne) {
  $scenario->setLog('bck ' . $ligne);
  fputs($jeedomcmd,$ligne."\n");
}
fclose($jeedomcmd);

Le résultat est dans le fichier /var/www/html/zzzbackuperasecmd/jeedomcmd.lst

1 « J'aime »

Je me demande s’il n’y a pas une incrémentation de l’ID de la table cmd lors d’une copy ou autre d’une class cmd, mais rien n’est inscrit dans la table des suppressions…

Un cmd::remove() fait obligatoirement un enregistrement dans l’historique des suppressions :

Pour moi, je seul moyen de savoir, serait de rajouter un log des queries dans DB::Prepare(), genre :

log::add('db_debug', 'info', $_query . json_encode($_params));

Bad

Oui @pommedapi c’est l’idée. C’est ce qu’il faut faire sans doute
Merci pour ton retour

Hello. La solution me semble interessante a mettre en oeuvre
Je vais la faire, car on ne sait jamais ca pourra nous donner une piste sans doute
Je te tiens au courant
Merci

1 « J'aime »

Hello @Bad . Ca c’est sympa comme solution
Peux tu m’en dire un peu plus, et me dire où mettre ce log (fichier, lignes avant/apres) dans la fonction DB::Prepare pour etre sur que je ne me trompe pas
Et peut on eventuellement créer un LOG specifique (dans un fichier specifique ?) car la somme des infos fait que parfois ca devient difficile a rechercher ensuite
Et puis, c’est du OneShot, histoire de comprendre d’où ca vient, et je remettrai le fichier d’origine
Merci en tout cas

A priori c est par ici ?

image

Hello
J’ai fait la manip, et en voici le résultat :
J’ai crée des infos dans mon virtuel qui s’appellent azertyXX.
azerty2 (76481) a été crée hier soir
et azerty3 (77334) a été crée ce matin
Mais aucune trace des ID crée entre les 2 et pourtant le scenario se déclenche bien toutes les minutes
Le mystere reste entier
jeedomcmd.log (53,6 Ko)

Hello,

Oui, tu peux insérer la ligne avant $stmt = self::getConnection()->prepare($_query);
Il ne faudra pas le laisser trop longtemps, ça doit cracher pas mal de logs.

Je ne pense pas que ce soit pertinent pour voir un changement…

Bad

Ce bloc code ne permet donc pas de voir des créations de commande.
Y-a-t-il réellement création de commande ou incrémentation parasite de l’id ?

Oki . Merci @Bad . Je vais essayé comme ca . On verra bien
Après modif du fichier, je suppose qu’il faut redemarrer Jeedom ou c’est pris en compte immédiatement ?

Hello @Jeandhom
Je ne sais pas, mais le fait que l’ID s’incremente autant n’est pas tres rassurant
J essaie la solution de @Bad pour voir
Merci a tous pour vos retours en tout cas. C’est sympa :slight_smile:

1 « J'aime »

Non pas besoin, dès que c’est sauvé, c’est pris en compte.

→ Je suis assez pris ce matin, je te propose de prendre 5 mins les logs (ca va se mettre dans le fichier de log db_debug), pendant lesquelles tu modifieras 2-3 équipement pour constater l’incrémentation d’ID, puis de retirer le changement dans la classe DB et de poster les logs ici.

Bad

OKi. Super. Je fais ca immediatement alors
Et je reviens avec le resultat dans quelques heures
Bonne journée

@Bad
J’ai modifié un peu pour permettre d ecrire dans un log specifique que je joins


|||$logFile = '/var/www/html/zzzbackuperasecmd/requetes.log';|
|---|---|---|
|||$dateTime = date('Y/m/d H:i:s');|
|||$logMessage = $dateTime;$_query . json_encode($_params) .\n;|
|||file_put_contents($logFile, $logMessage, FILE_APPEND);|

J’ai crée azerty5 et je le vois bien dans le log
Comme j’ai de la place sur mon systeme, je vais laisser tourner un peu car le phenomene n’est pas systematique
Et je vois ce qu’il faut chercher « insert into cmd… »
requetes.log (735,9 Ko)
Sinon si le LOG est trop gros, je filterai uniquement sur la table cmd
A suivre…
Merci