Project

General

Profile

Actions

Anomalie #1384

closed

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

Added by Matthieu Coudert over 4 years ago. Updated over 4 years ago.

Status:
Fermé
Priority:
Normal
Category:
Core
Target version:
Start date:
01/25/2020
Due date:
% Done:

100%

Estimated time:
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.

Actions #1

Updated by Johan Cwiklinski over 4 years ago

  • Category set to Core
  • Assignee set to Johan Cwiklinski
  • Target version set to 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).

Actions #2

Updated by Johan Cwiklinski over 4 years ago

  • Description updated (diff)
Actions #3

Updated by Johan Cwiklinski over 4 years ago

  • Status changed from Nouveau to 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 ;)

Actions #4

Updated by Matthieu Coudert over 4 years ago

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).

Actions #6

Updated by Matthieu Coudert over 4 years ago

Ç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

Actions #7

Updated by Johan Cwiklinski over 4 years ago

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

Actions #8

Updated by Matthieu Coudert over 4 years ago

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.

Actions #9

Updated by Johan Cwiklinski over 4 years ago

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.

Actions #10

Updated by Matthieu Coudert over 4 years ago

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 ?

Actions #11

Updated by Johan Cwiklinski over 4 years ago

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.

Actions #12

Updated by Matthieu Coudert over 4 years ago

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.

Actions #13

Updated by Johan Cwiklinski over 4 years ago

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()).

Actions #14

Updated by Matthieu Coudert over 4 years ago

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

Actions #15

Updated by Johan Cwiklinski over 4 years ago

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);
Actions #16

Updated by Matthieu Coudert over 4 years ago

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

Actions #17

Updated by Johan Cwiklinski over 4 years ago

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).

Actions #18

Updated by Johan Cwiklinski over 4 years ago

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).

Actions #19

Updated by Johan Cwiklinski over 4 years ago

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) ?

Actions #20

Updated by Matthieu Coudert over 4 years ago

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 ?

Actions #21

Updated by Johan Cwiklinski over 4 years ago

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.

Actions #22

Updated by Johan Cwiklinski over 4 years ago

  • Status changed from In Progress to Résolu
  • % Done changed from 0 to 100
Actions #23

Updated by Johan Cwiklinski over 4 years ago

  • Status changed from Résolu to Fermé
Actions

Also available in: Atom PDF