Blount / Cheky

Alerte mail et RSS pour Leboncoin.fr
GNU General Public License v3.0
154 stars 46 forks source link

changement de owner sur synology #4

Closed neovega closed 10 years ago

neovega commented 10 years ago

Sur synology, le cron est forcement lancé sous le user "root". Lorque check.php est lancé, à la fin on appelle la fonction save(Alert $alert) (dans app/models/mail/storage.php). Cette fonction crée un nouveau fichier xxx.csv.new qui recoit les alertes updatées et ce fichier ecrase ensuite le xxx.csv original. Ceci implique que le nouveau fichier appartient désormais au user root et non plus au user nobody ; et donc la page des alertes n'est plus accessible... Y a-t-il une raison spécifique à ce codage ? J'ai modifié la fonction comme suit et tout fonctionne :

    $alerts = $this->fetchAll();
    $fopen = fopen($this->_filename, "w");    #"a" devient "w"
    flock($fopen, LOCK_EX);
    #$fpNewFile = fopen($this->_filename.".new", "w"); #on ne crée pas le nouveau fichier
    #flock($fpNewFile, LOCK_EX);

    fputcsv($fopen, $this->_header, ",", '"');
    $updated = false;
    foreach ($alerts AS $a) {
        if ($a->id == $alert->id) {
            $a = $alert;
            $updated = true;
        }
        fputcsv($fopen, $a->toArray(), ",", '"'); #on ecrit directement dans le cvs
    }
    if (!$updated && !$alert->id) {
        $alert->id = sha1(uniqid());
        fputcsv($fopen, $alert->toArray(), ",", '"'); #idem
    }

    #fclose($fpNewFile); #pas besoin de fermer puisqu'on ne l'a pas créé
    fclose($fopen);
    #rename($this->_filename.".new", $this->_filename); #pas besoin de renommer

Qu'en pensez-vous ? Neo

Blount commented 10 years ago

Oui, il y a une raison. Ceci permet de garantir que le fichier final ne sera pas corrompu. Par exemple, si durant la sauvegarde des alertes il y a un crash (ex: coupure de courant), le fichier ne contiendra qu'une parti des alertes. Dans certain cas, le LOCK ne fonctionne pas (si un programme ne prend pas compte). Dans ce cas, deux programmes peuvent se retrouver à modifier en même temps le fichier (cron + interface web par exemple). En faisant ainsi, le cron aura le dernier mot.

Pour conclure, je n'ai pas trop travailler avec les fichiers justement pour ce problème d'utilisation en parallèle. Je pense migrer vers un stockage en base de données (en gardant toutefois la compatibilité avec le stockage en fichier).

Pour ton cron, tu es sur de ne pas pouvoir modifier le propriétaire ? Synology ne permet pas d'accès en ligne de commande ? (je ne connais pas)

neovega commented 10 years ago

Ok, c'est une bonne raison. Sur le Synology, on peut toujours bidouiller, en modifiant par exemple la crontab par un script au demarrage. Mais à chaque mise à jour, il faut intervenir à nouveau... Je vais tenter d'ajouter un chown à la fin de la fonction de la sauvegarde, c'est peut etre une meilleure solution...

neovega commented 10 years ago

chown + chgrp testé et validé. J'ai donc rétabli la fonction d'origine et j'y ai ajouté les 2 lignes suivantes après le rename :

    chown($this->_filename,"nobody");
    chgrp($this->_filename,"nobody");

neo.

ghost commented 10 years ago

bonjour, est-ce que cela va etre integre a la version telechargeable ou faut-il le modifier a chaque MAJ ?

merci, green

neovega commented 10 years ago

Salut,

Je pense que le owner et le group peuvent varier suivant le système sur lequel on installe LBCAlerte (je dis peut etre une bêtise, je ne suis pas assez calé, mais il me semble que chez certains ca peut etre www-data). Il faudrait alors compléter la fonction en lisant le owner et le groupe du fichier csv initial via un fileowner() et un filegroup() et ensuite réassigner les 2 valeurs au nouveau fichier. Blount, tu en penses quoi ?

Blount commented 10 years ago

Et sans modifier le code PHP, tu as essayer la commande su ? Dans la tâche cron, au lieux de mettre la commande: php /var/www/etc... Tu mets: su nobody -c "php /var/www/etc.." Ou encore si cela ne fonctionne pas: su nobody -s /bin/bash -c "php /var/www/etc.." su permet de lancer une commande sous un autre utilisateur (avec root, tu choisi qui tu veux). Je ne connais pas Synology, mais si c'est du Linux, ça devrait le faire non ?

neovega commented 10 years ago

le problème avec le synology c'est que le fichier crontab est "nettoyé" à chaque reboot ou mise à jour et tout ce qui n'est pas planifié avec le user root disparait... Il faut donc réécrire le fichier cron à chaque reboot ; ce qui peut être fait avec un script lancé à chaque boot, mais il faudra refaire une manip lors d'une mise à jour car ce script ne se lancera plus tout seul... Bref, de la bidouille. Après, si la solution évoquée n'est pas implémentée dans LBCAlerte, pas de problème : la manip est facile à mettre en œuvre par tout le monde :

Blount commented 10 years ago

Je pense quand même qu'il est possible de le faire directement via le cron. Tu es sur que le "su" est supprimé ? C'est tout de même étrange.

Une autre solution est de mettre plusieurs commandes: php /var/ww/etc.../check.php && chown nobody /var/ww/etc.../var/config/*

Je vais voir pour modifier le code PHP. On ne sait jamais, d'autre pourrait être concerné par ce problème ;)

ghost commented 10 years ago

La modif de néo fonctionne pour moi pour le même problème avec syno

sinon,néo tu n'as pas de problème avec l envoi des emails avec la nouvelle version ?

j ai un truc bizarre: seules certaines alertes envoi des emails, les plus anciennes.

il y a une autre personne a qui ca fait ca.

merci

Blount commented 10 years ago

Je viens de faire une modif en remplaçant rename par deux autres fonctions. Tu peux checker ?

neovega commented 10 years ago

@Blount : Ok, la modif avec les 2 fonctions a la place du rename fonctionne.

@greenchap : si tu parle de la version Dev, j'ai pas encore testé. Je suis sur la Master 2.3 Je vais installer la version Dev et je te dirai.

neovega commented 10 years ago

@greenchap : version Dev installée et testée. Apparemment aucun problème avec les mails.

@Blount : je confirme que la modif fonctionne sur cette version.

lbmh commented 10 years ago

Je reviens après quelques jours d'absence. Je viens d'installer la dev d'il y a quatre heures sur mon Syno et les e-mails d'alertes ne partent toujours pas. Dois-je oui ou non avoir un cron qui lance le check.php ?

ghost commented 10 years ago

Peu importe comment tu lances check.php: cron ou web ou ligne de commande. Cela n a pas d incidence sur les emails envoyés... Ou pas

neovega commented 10 years ago

@lbmh : le test d'envoi de mail fonctionne ? Quel serveur de mail utilise-tu ? Moi je passe par Gmail et aucun problème à signaler.

lbmh commented 10 years ago

Bien sur l'envoi de mail fonctionne, aussi bien avec phpmail, qu'avec un smtp distant.

Le premier problème à résoudre c'est que le check.php ne produit rien

On Thu, Jan 23, 2014, at 1:04, neovega wrote:

[1]@lbmh : le test d'envoi de mail fonctionne ? Quel serveur de mail utilise-tu ? Moi je passe par Gmail et aucun problème à signaler.

Reply to this email directly or [2]view it on GitHub. [6378309__eyJzY29wZSI6Ik5ld3NpZXM6QmVhY29uIiwiZXhwaXJlcyI6MTcwNTk2ODI5M ywiZGF0YSI6eyJpZCI6MjM1NDI5NTB9fQ==--c1a6f5f800c9332dcc1905e058be4a391b 96b529.gif]

References

  1. https://github.com/lbmh
  2. https://github.com/Blount/LBCAlerte/issues/4#issuecomment-33083877
ghost commented 10 years ago

je suis dans la meme situation que lbmh, moi aussi le test mail fonctionne, les notifs fonctionnent mais avec smtp.free (teste egalement sur un autre site avec smtp.numericable):

mais check.php -> rien. de temps en temps bizaremment je recois des mails concernant mes deux plus vieilles alertes... je pige pas !