OVH Cloud OVH Cloud

Au sujet de filter_innd.py

4 réponses
Avatar
Gaël
Bonjour,

Le serveur de news INN permet de filtrer les articles postés grâce au
script filter_innd.py.

Ce script utilise le module INN.
J'ai essayé d'utiliser dans ce script le module Python nntplib, je fait
donc l'import, puis lorsque je tente de faire une connexion n =
nntplib.NNTP(serveur, port, ...) cela bloque complètement mon serveur
INN (un kill -9 est nécessaire !).

PS : si je fait la même chose dans un autre script (indépendant d'INN),
avec les mêmes droits d'exécution, cela fonctionne.

Quelqu'un saurait il expliquer la chose, et éventuellement la résoudre ?

Merci

4 réponses

Avatar
jean-michel bain-cornu
Salut,
Gaël wrote:
Bonjour,

Le serveur de news INN permet de filtrer les articles postés grâce au
script filter_innd.py.

Ce script utilise le module INN.
J'ai essayé d'utiliser dans ce script le module Python nntplib, je fait
donc l'import, puis lorsque je tente de faire une connexion n =
nntplib.NNTP(serveur, port, ...) cela bloque complètement mon serveur
INN (un kill -9 est nécessaire !).

PS : si je fait la même chose dans un autre script (indépendant d'INN),
avec les mêmes droits d'exécution, cela fonctionne.

Quelqu'un saurait il expliquer la chose, et éventuellement la résoudre ?

Merci
D'après ce que je vois dans la doc, tu n'a pas à te connecter dans le

filter_innd.py.
Tu dois définir une classe (exemple: class Filter:) et enregistrer cette
classe comme étant le filtre auprès de INN. Ce sont les lignes :
import INN
myfilter = Filter()
INN.set_filter_hook(myfilter)
Après quoi la méthode "filter_art(self, art):" que tu auras pris soin de
coder dans ce filtre sera appelée à chaque nouveau message et devra
renvoyer None si elle veut conserver le message.
J'ai trouvé ça dans
http://www.eyrie.org/~eagle/software/inn/docs-2.3/hook-python.html et
c'est en engliche of course, mais pas très long et très explicite, avec
du code en exemple.
Si tu fais une connexion, le serveur étant déjà connecté (puisqu'il est
train de t'appeler), gageons que tu pars en étreinte fatale (dead lock)
avec à la longue une exception à la clé (mais c'est pas sûr).
Ceci dit ça n'a pas l'air mal, je me le garde pour les longues soirées
d'été.
A+
jm

Avatar
Gaël
D'après ce que je vois dans la doc, tu n'a pas à te connecter dans le
filter_innd.py.
Tu dois définir une classe (exemple: class Filter:) et enregistrer cette
classe comme étant le filtre auprès de INN. Ce sont les lignes :
import INN
myfilter = Filter()
INN.set_filter_hook(myfilter)
Après quoi la méthode "filter_art(self, art):" que tu auras pris soin de
coder dans ce filtre sera appelée à chaque nouveau message et devra
renvoyer None si elle veut conserver le message.


Oui d'accord, je l'utilise comme ça, mais (sauf erreur de ma part), cela
permet d'avoir les informations du message qui va être posté ... je
souhaiterais avant de l'accepter aller lire d'autres messages, et ça je
ne l'ai pas vu dans le module INN, d'où ma tentative d'utilisation de
nntplib.

Concrètement :
-je reçois un message
-je regarde si c'est un cancel (jusque là je sais faire), auquel cas, je
veux vérifier que le sender du cancel est le même que le sender du
message à annuler (ça je n'arrive pas).

Si tu fais une connexion, le serveur étant déjà connecté (puisqu'il est
train de t'appeler), gageons que tu pars en étreinte fatale (dead lock)
avec à la longue une exception à la clé (mais c'est pas sûr).


Oui peut-être, quoiqu'un serveur est généralement capable d'accepter
plusieurs connexions simultannées...

Ceci dit ça n'a pas l'air mal, je me le garde pour les longues soirées
d'été.
A+
jm



Avatar
jean-michel bain-cornu
Gaël wrote:

D'après ce que je vois dans la doc, tu n'a pas à te connecter dans le
filter_innd.py.
Tu dois définir une classe (exemple: class Filter:) et enregistrer
cette classe comme étant le filtre auprès de INN. Ce sont les lignes :
import INN
myfilter = Filter()
INN.set_filter_hook(myfilter)
Après quoi la méthode "filter_art(self, art):" que tu auras pris soin
de coder dans ce filtre sera appelée à chaque nouveau message et devra
renvoyer None si elle veut conserver le message.



Oui d'accord, je l'utilise comme ça, mais (sauf erreur de ma part), cela
permet d'avoir les informations du message qui va être posté ... je
souhaiterais avant de l'accepter aller lire d'autres messages, et ça je
ne l'ai pas vu dans le module INN, d'où ma tentative d'utilisation de
nntplib.

Concrètement :
-je reçois un message
-je regarde si c'est un cancel (jusque là je sais faire), auquel cas, je
veux vérifier que le sender du cancel est le même que le sender du
message à annuler (ça je n'arrive pas).
Aïe. Je comprends ton problème. A part mémoriser les infos concernant

tous les messages reçus, je ne vois pas. Mais si tu veux annuler à
posteriori un message qui a déjà été accepté lors d'un filtrage
précédent, je pense que ça ne peux pas être fait dans le cadre de ce filtre.

Si tu fais une connexion, le serveur étant déjà connecté (puisqu'il
est train de t'appeler), gageons que tu pars en étreinte fatale (dead
lock)
avec à la longue une exception à la clé (mais c'est pas sûr).



Oui peut-être, quoiqu'un serveur est généralement capable d'accepter
plusieurs connexions simultannées...
Effectivement ça paraît plausible. As-tu essayé de te connecter avec un

protocole de plus bas niveau ? On peut joindre par exemple un serveur de
mail en telnet ; peut-on faire pareil ? Une autre solution serait
peut-être de lancer un process python séparé, qui serait alors libre
d'éventuelles contraintes dûes à INN.

Ceci dit ça n'a pas l'air mal, je me le garde pour les longues soirées
d'été.
A+
jm





Avatar
Gaël
Gaël wrote:
Concrètement :
-je reçois un message
-je regarde si c'est un cancel (jusque là je sais faire), auquel cas,
je veux vérifier que le sender du cancel est le même que le sender du
message à annuler (ça je n'arrive pas).


Aïe. Je comprends ton problème. A part mémoriser les infos concernant
tous les messages reçus, je ne vois pas. Mais si tu veux annuler à
posteriori un message qui a déjà été accepté lors d'un filtrage
précédent, je pense que ça ne peux pas être fait dans le cadre de ce
filtre.


En fait je pense que si; mais je me suis peut être mal exprimé, mon
filtre determine(ra) "juste" si le message de cancel est acceptable ou
pas, en allant consulter l'en-tête du message à annuler.


Effectivement ça paraît plausible. As-tu essayé de te connecter avec un
protocole de plus bas niveau ? On peut joindre par exemple un serveur de
mail en telnet ; peut-on faire pareil ? Une autre solution serait
peut-être de lancer un process python séparé, qui serait alors libre
d'éventuelles contraintes dûes à INN.


Oui, je crois que je vais pencher vers la deuxième solution.

merci