Projet

Général

Profil

Actions

Anomalie #1384

fermé

problèmes de lancement de cron/reminder.php en ligne de commande

Ajouté par Matthieu Coudert il y a presque 5 ans. Mis à jour il y a presque 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
Core
Version cible:
Début:
25/01/2020
Echéance:
% réalisé:

100%

Temps estimé:
Version utilisée:

Description

Bonjour,
je fais partie d'une association qui utilise Galette depuis plusieurs années, en étant hébergé chez Tuxfamily.
De mémoire je n'ai jamais vu la fonction de rappel automatique des échéances de cotisation fonctionner. Comme je viens de faire une mise à jour vers la 0.9.3, je me suis dit que c'était le moment de regarder comment faire fonctionner tout ça.
Dans la documentation de galette, l'activation de la fonction fait référence à la mise en place d'une tâche cron, ce qui est un premier point bloquant : notre hébergeur utilise une autre méthode que passer par une crontab : les cron jobs (https://faq.tuxfamily.org/Cron/Fr)
Donc avant de soumettre une demande de cron job, que j'envisage de faire sous forme de script bash, je tente, dans une session en ssh, l'exécution de la commande donnée dans la doc de galette.

Or j'obtiens des messages d'erreur :
- si je tente la commande en entrant le chemin absolu, dans mon cas : /usr/bin/php -f /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php
j'obtiens :

PHP Warning:  require_once(../includes/galette.inc.php): failed to open stream: No such file or directory in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44
PHP Fatal error:  require_once(): Failed opening required '../includes/galette.inc.php' (include_path='.:/usr/share/php') in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44

- si je me place dans le répertoire cron et que je lance : /usr/bin/php -f reminder.php
j'obtiens :
PHP Notice:  Undefined variable: login in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error:  Uncaught Error: Call to a member function logCron() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
  thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257

Est-ce un bug ?
Est-ce que je n'utilise pas la bonne méthode ?
Existe-t-il un moyen de contourner cela ?

Merci d'avance pour toute aide.

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Catégorie mis à Core
  • Assigné à mis à Johan Cwiklinski
  • Version cible mis à 0.9.3.1

Matthieu Coudert a écrit :

Dans la documentation de galette, l'activation de la fonction fait référence à la mise en place d'une tâche cron, ce qui est un premier point bloquant : notre hébergeur utilise une autre méthode que passer par une crontab : les cron jobs (https://faq.tuxfamily.org/Cron/Fr)

L'appellation « tâche cron » est à prendre dans un sens générique ; il s'agit "juste" d'un script qui peut être exécuté en ligne de commande, et par extension depuis n'importe quel système qui comme celui de TF (le comportement est le même que cron : s'il y a une sortie, la tâche est en échec, le script respecte cette logique).

Donc avant de soumettre une demande de cron job, que j'envisage de faire sous forme de script bash, je tente, dans une session en ssh, l'exécution de la commande donnée dans la doc de galette.

Or j'obtiens des messages d'erreur :
- si je tente la commande en entrant le chemin absolu, dans mon cas : /usr/bin/php -f /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php
j'obtiens :
PHP Warning: require_once(../includes/galette.inc.php): failed to open stream: No such file or directory in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44
PHP Fatal error: require_once(): Failed opening required '../includes/galette.inc.php' (include_path='.:/usr/share/php') in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44

OK, il faudrait que je corrige le chemin vers ce fichier.

- si je me place dans le répertoire cron et que je lance : /usr/bin/php -f reminder.php
j'obtiens :
PHP Notice: Undefined variable: login in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error: Uncaught Error: Call to a member function logCron() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257

Est-ce un bug ?
Est-ce que je n'utilise pas la bonne méthode ?
Existe-t-il un moyen de contourner cela ?

C'est un bug, oui ; je vais regarder. Sinon, oui, ce sont les bonnes méthodes (la première aussi est un bug).

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Description mis à jour (diff)

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Statut changé de Nouveau à In Progress

Voici le correctif à appliquer : https://github.com/galette/galette/pull/44/commits/414b8541807719e7c75e2649043dbad158c4dad4

J'ai également lancé l'appel de ce script dans les tests ; je ne peux pas tester l'envoi en lui-même ; mais ça évitera au moins ce genre de désagréments ;)

Mis à jour par Matthieu Coudert il y a presque 5 ans

Bonjour,
la correction sur le chemin de fichier a bien fonctionné, maintenant les deux méthodes renvoient la même erreur :

PHP Notice: Undefined variable: container in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257

Merci aussi pour la précision sur les cron jobs (en lisant mieux la doc de tuxfamily je comprend qu'il s'agit juste de la restriction de cron pour ne proposer que la possibilité d'exécuter des fichiers).

Mis à jour par Matthieu Coudert il y a presque 5 ans

Ça ne fonctionne pas encore :

PHP Notice:  Undefined variable: container in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error:  Uncaught Error: Call to a member function get() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
  thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257

Mis à jour par Johan Cwiklinski il y a presque 5 ans

La ligne qui inclut le fichier dependencies.php est elle bien présente ?
Je ne reproduit pas du tout ; je penche pour un match non appliqué. Le mieux, c'est de récupérer le fichier complet ici https://raw.githubusercontent.com/galette/galette/7695512980402f0d469dc6ca61ad8d15807599e3/galette/cron/reminder.php

Mis à jour par Matthieu Coudert il y a presque 5 ans

le problème n'a pas l'air de se trouver dans ce fichier, car même avec le fichier donné en lien, le même message d'erreur persiste.

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Vérifie que tu as bien appliqué les deux patchs dans leur intégralité, et qu'il n'y a pas d'erreur de syntaxe dans les fichiers modifiés, ces erreurs sont fréquentes lors de modifications à la main de fichiers.

Mis à jour par Matthieu Coudert il y a presque 5 ans

J'ai vérifié, je ne vois pas quelle erreur dans les copier-coller j'aurai pu faire.
Est-il possible de me donner les liens vers les fichiers complets includes/dependencies.php includes/main.inc.php et includes/galette.inc.php comme ça a été fait avec cron/reminder.php pour être sûr ?

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Les fichiers sont tous sur cette branche :
https://github.com/galette/galette/tree/hotfix/0.9.3.1/galette

Puis tu vas sur le fichier voulu, et tu utilises le bouton "raw" Pour avoir le code source.

Mis à jour par Matthieu Coudert il y a presque 5 ans

Après avoir remplacé les quatre fichiers par ceux de la branche ça avait changé de message :

localhost - 2020-01-26 20:14:44 - 4 - Lang fr_FR does not exist, switching to default.
PHP Notice:  Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151

mais c'était une erreur due au fait que les versions GALETTE_VERSION et GALETTE_DB_VERSION étaient différents, et rendaient l'accès à notre galette impossible.

En remettant les versions respectivement à v0.9.3 et 0.930 le message de mon commentaire #6 contenant "Undefined variable: container" revient à l'identique.

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Ha OK ! En effet, la vérification de la version n'est pas effectuée correctement, et le script ne renvoie rien dans ce cas là (entre autres)...

J'en suis rendu de mon côté à des problèmes de requêtes SQL (instance sous PostgreSQL) pour le moment :/

Dans le fichier galette.inc.php, les lignes suivantes sont à déplacer :

if ($cron) {
    $container->get('login')->logCron(basename($argv[0], '.php'));
}

Il faut les remettre dans cron/reminder.php avant le if (!$container->get('login')->isCron()).

Mis à jour par Matthieu Coudert il y a presque 5 ans

Avec la modification, c'est toujours en erreur, mais avec un message différent (toutefois les premières lignes sont celles de mon commentaire #12) :

localhost - 2020-01-27 07:44:44 - 4 - Lang fr_FR does not exist, switching to default.
PHP Notice:  Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151
PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function Galette\Repository\Reminders::__construct(), 0 passed in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 68 and exactly 1 expected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Repository/Reminders.php:73
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(68): Galette\Repository\Reminders->__construct()
#1 {main}
  thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Repository/Reminders.php on line 73

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Matthieu Coudert a écrit :

Avec la modification, c'est toujours en erreur, mais avec un message différent (toutefois les premières lignes sont celles de mon commentaire #12) :
[...]

En effet, j'avais corrigé cette erreur fatale en local :

diff --git a/galette/lib/Galette/Repository/Reminders.php b/galette/lib/Galette/Repository/Reminders.php
index 4024c092..20cda164 100644
--- a/galette/lib/Galette/Repository/Reminders.php
+++ b/galette/lib/Galette/Repository/Reminders.php
@@ -70,7 +70,7 @@ class Reminders
      *
      * @param array $selected Selected types for sending
      */
-    public function __construct($selected)
+    public function __construct($selected = null)
     {
         if (isset($selected) && is_array($selected)) {
             $this->selected = array_map('intval', $selected);

Mis à jour par Matthieu Coudert il y a presque 5 ans

Nouvelle erreur :

localhost - 2020-01-27 13:00:53 - 4 - Lang fr_FR does not exist, switching to default.
PHP Notice:  Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151
PHP Fatal error:  Uncaught Slim\Exception\ContainerValueNotFoundException: Identifier "hist" is not defined. in /home/gullarverne/galette.linuxarverne.org-web/htdocs/vendor/slim/slim/Slim/Container.php:105
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(75): Slim\Container->get('hist')
#1 {main}
  thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/vendor/slim/slim/Slim/Container.php on line 105

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Un autre correctif :
https://github.com/galette/galette/commit/b404c7b9aba9905bd8cdfc4f98bf7cd94cf14e12

Le correctif en commentaire 15 est inclus.
Je n'ai pas encore trouvé pour la notice (mais ce ne devrait pas être bloquant).

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Je n'ai pas d'environnement de test en mesure d'envoyer des courriels (j'ai même du ajouter une notion de timeout pour ne pas glander 5 minutes à chaque test :D) ; et sur le branche hotfix/0.9.3.1, l'envoi des reminders semble fonctionner en ligne de commande (PHP 7.3, comme chez TF).

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Quant à au problème « Undefined index: fr_FR » ; je ne comprends pas trop qui se passe, et je ne l'ai pas en local. Mais j'ai aussi d'autres correctifs (tout ceux de la branche hotfix/0.9.3.1).
Pas de soucis sur la version web (il faut certainement passer en mode debug et consulter les logs pour en être sûr) ?

Mis à jour par Matthieu Coudert il y a presque 5 ans

On en voit la fin !
Ça affichait encore des messages d'erreur :

PHP Notice:  Undefined variable: error_detected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 90
PHP Warning:  count(): Parameter must be an array or an object that implements Countable in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 90
PHP Notice:  Undefined variable: error_detected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 107
PHP Warning:  count(): Parameter must be an array or an object that implements Countable in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 107

J'ai tenté un ajout :
$error_detected = array();
à la ligne 76 de cron/reminder.php
Je viens de recevoir un mail "Votre adhésion arrive à terme" sur l'adhérent fictif que j'avais créé pour tester, donc ça a fonctionné \o/

Reste à voir pourquoi cette variable n'était pas définie.

Est-ce que la notice « Undefined index: fr_FR » est considérée comme une erreur par les cron jobs de tuxfamilly ? Si oui, dois-je rediriger vers /dev/null pour ne pas recevoir de mail à chaque exécution ?

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Matthieu Coudert a écrit :

On en voit la fin !

Oui :D

Ça affichait encore des messages d'erreur :
[...]
J'ai tenté un ajout : [...] à la ligne 76 de cron/reminder.php

Bien vu.

Je viens de recevoir un mail "Votre adhésion arrive à terme" sur l'adhérent fictif que j'avais créé pour tester, donc ça a fonctionné \o/

Reste à voir pourquoi cette variable n'était pas définie.

Elles l'étaient dans une version précédente ; ça a été supprimé, mais pas remis d'équerre à cet endroit :/

Est-ce que la notice « Undefined index: fr_FR » est considérée comme une erreur par les cron jobs de tuxfamilly ? Si oui, dois-je rediriger vers /dev/null pour ne pas recevoir de mail à chaque exécution ?

Toute sortie du script cron enverra un mail. Pour contrer ce problème, oui, rediriger la sortie standdard sur /dev/null sera une solution. Le risque, c'est de louper de vraies qui seraient affichées en sortie standard (et non comme elles le devraient en sortie erreur) ; ça peut malheureusement arriver (j'en ai corrigé 2 pour le script des reminders :D).

Aurais-tu la possibilité de mener quelques tests sur cette notice ? Il faudrait voir si tu as ce problème en ayant configuré Galette et l'adhérent en anglais et en français ? (genre galette fr, adh : fr => KO - galette en, adh fr => OK, ...).

Je suppose que les fichiers de langue sont bien présents, et que ton interface est bien traduite lorsque tu changes ? Est-ce que tu peux vérifier que les droits semblent cohérents sur ces derniers.

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Statut changé de In Progress à Résolu
  • % réalisé changé de 0 à 100

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Statut changé de Résolu à Fermé
Actions

Formats disponibles : Atom PDF