robomoderare tutto

Paolo Amoroso estasi@aioe.org
Sab 9 Dic 2006 15:30:21 CET


On Wednesday 06 December 2006 00:24, Marco d'Itri wrote:
> È un problema molto più grosso trovare qualcuno che scriva il software,
> volontari non ne ho visti. 

Ho cominciato a scrivere il software. Una prima versione, già funzionante, è 
qui: http://www.aioe.org/downloads/robomod-0.1.tar.gz e fa funzionare 
news://nntp.aioe.org/aioe.test.moderato (qualcuno, per favore, controlli che 
gli header seguano una semantica corretta).

Lo script riceve un singolo messaggio attraverso stdin, di solito passatogli 
da maildrop o procmail, lo analizza, eventualmente lo invia ad un news server 
(anche remoto) attraverso rnews dopo aver aggiunto l'header Approved. 

Per prima cosa, di ciascun messaggio è verificato se sia stato spedito a 
troppi gruppi (è configurabile il massimo numero di newsgroup in crosspost, 
in followup ed in crosspost senza followup); se sia troppo grande (dimensioni 
massime totali, dei soli header, del body); se contenga troppe linee bianche, 
quotate o vuote.

Poi lo script verifica il messaggio utilizzando *due* differenti banlist, una 
globale per tutti gruppi, obbligatoria, ed una facoltativa legata al singolo 
gruppo (che *deve* trovarsi in 
$config{'per_group_config_directory'}/nome_del_gruppo/banlist.conf )
La sintassi di questi due file è identica e purtoppo un po' complicata.

Ciascuna riga *vuota* o iniziante con un cancelletto (#) è considerata 
commento e saltata.
Tutte le altre righe devono essere composte da *sei* campi separati fra loro 
da "due punti" (:), l'ultimo dei quali è il commento esplicativo della 
regola. Es.

From:aioe:save:rnews:/tmp/aioe.rnews: Commento vario

La sintassi è questa:

regexp_header:regexp_value:action:arg1:arg2:Comment  

Dove:

regexp_header è una espressione regolare applicata sul *nome* dell'header 
oppure "BODY" se la ricerca deve essere effettuata sul corpo del messaggio.

regexp_value è una espressione regolare applicata al *contenuto* di ciascun 
header (o del body)

Se un header corrisponde a regexp_header ed il suo contenuto a regexp_value 
allora lo script esegue l'azione determinata da action passandogli due 
argomenti (arg1 e arg2).

	action	arg1		arg2

	log
                	syslog	string
                	file            file

        save
                	message directory
                	rnews	file
                	mbox       file
                	mail         address
                	maildir 	directory

        drop
                	syslog     string
	                file           file

        score
        	        ruleset	value

Dove:

log scrive la stringa "string" in un file od in syslog. In string,  esistono 
acune espressioi che vengono sostituite con alcuni header:
	%M = Message-ID
        %F = From
        %N = Newsgroups
        %P = Path
        %I = NNTP-Posting-Host

Esempio:
From:aioe:log:syslog:Message-ID %M logged:Logga il mid
From:aioe_log:file:/var/log/news/news.log:Logga in news.log

Se il log avviene in un file, questo è quanto viene loggato:

banlist_file:line action: arg2


save salva il messaggio in numerosi formati:
	message come singolo file nella directory indicata dal quinto campo
	maildir come un singolo file in "directory/new"
	rnews appende l'articolo in fondo a "file" (quinto campo) in formato rnews
	mbox appende l'articolo in fondo a "file" (quinto campo) in formato mbox
	mail invia per mail l'articolo all'indirizzo address (quinto campo)

Esempi:

.:.:save:rnews:/tmp/1.rnews:Salva tutto in rnews
.:.:save:mbox:/tmp/1.mbox:Salva in mbox
.:.:save:mail:freedom@aioe.org:Invia a me tutto

drop è identico a log, solo ovviamente respinge il messaggio.

score permette di creare regole arbitrarie e di assegnare loro un punteggio 
positivo o negativo. Se il peso totale di quella ciascuna supera 
$config{'score_banlist'}, il messaggio è respinto. Questo permette di 
implementare (semplici) condizioni (AND ed OR).

Esempi:

con $config{'score_banlist'} = 10;

From:Pirotti:score:pirotti:5:Assegna un valore di 5 alla regola "pirotti"
BODY:follonica:score:pirotti:6:Assegna un valore di 6 alla regola "pirotti"

Se un messaggio contiene nel From "Pirotti" e nel body "follonica", lo script 
lo respinge (6+5>10).

Altro esempio:

con $config{'score_banlist'} = 10;

BODY:Prospero|Follonica:score:pirotti:5:
BODY:Pirotti:score:pirotti:6:
BODY:merda:score:pirotti:-1:

Respinge tutti i messaggi che contengono nel body "Prospero" o "Follonica" (5 
punti alla regola pirotti), contengono anche "Pirotti" (altri 6 punti) e 
*non* contengono "merda" (se ci fosse, toglierebbe un punto e renderebbe il 
messaggio accettabile).

---------------

che ne pensate?

suggerimenti, proposte, idee... tutto va bene

peraltro, avrei bisogno di un po' di traffico per provare il programma (su 
aioe.test.moderato od altrove)

ciauuu



Maggiori informazioni sulla lista gcn-list