Udv,

On 09/22/2016 18:26, Molnár Péter wrote:
Hello!
En be szoktam allitani egy kvotat, ami felett a levelkuldes
sajnos sikertelen, helyes adatokkal is.
S ezt hogyan, mivel?


Nem kulonosebben komplikalt, amde cserebe fapados. Az MTA nagyjabol lenyegtelen, a lenyeg, hogy SQL-bol veszi az azonositashoz az adatokat.

A normal, kvota nelkuli lekerdezes ehhez olyan, hogy:

{crypteq{$2}{\\{sha1\\}${lookup mysql{SELECT user_md5 from user WHERE user_name='${local_part:$1}' AND user_domain='${domain:$1}'}{$value}fail}}} \
        } {yes}{no}}"

(ebbol azonnal nyilvanvalo harom dolog: az egyik, hogy eximet hasznalok, a masik, hogy nemreg tertem at md5-rol sha1 hash-ekre, a harmadik, hogy lusta vagyok).

Ehhez csak egy mozdulat beletenni olyat, hogy AND valid=1, nyilvan a semat es modositani kell hozza, valahogy igy:

> alter table user add column valid int default 1;

Ha ez megvan, akkor ideje kimazsolazni a logokbol, hogy mely felhasznalok kuldenek levelet, es ezt rogziteni:

$ for i in `grep esmtpsa /var/log/exim/mainlog | awk '{print$5}'`; do echo "insert into senders values (now(), '$i');" | mysql <parameterek>; done

amint ez megvan, innentol kezdve mar csak egy mozdulat sorrendezni, hogy kik voltak a nagy levelkuldok:

> select distinct sender, count(sender) as s from senders where ts>=date_add(now(), interval -1 hour) group by sender having s>30 order by s desc;

Ugord at ezt a bekezdest, ha vilagos. Ha nem, akkor a fenti query ket oszlopot es nulla vagy tobb sort ad vissza. Az elsoben a felhasznalok nevet (distinct sender), amivel azonositjak magukat, a masodikban egy darabszamot (count sender as s), ahanyszor az elmult oraban (where ts >= az elmult egy ora) levelet kuldtek. A listaban csak azok szerepelnek, akik legalabb 31 levelet kuldtek az elmult oraban (having s>30). A lista a level darabszam szerint csokkeno sorrendben van (order by s desc). Ez utobbi irrelevans a script szamara, ez az embernek erdekes aki mondjuk kezzel is akarja neha futtatni ezt az egy parancsot, hogy lassa mi a szitu.

A 31 egy gyakorlati uton megallapitott szam. Amennyiben per-user akarod megallapitani, vagy subselect-et kell hasznalni, vagy scriptelni kell felhasznalonkent a fenti lekerdezest. A script szempontjabol amugy a masodik oszlop is full felesleges es egyszerubb az elet, ha nincs is ott.

Innentol mar csak egy mozdulat egy scriptbe tenni az egeszet es kiegesziteni:

for i in `<az elozo query eredmenye>`; do echo "update user set valid=0 where user_name='$i';" | mysql <parameterek>; done

Ennyi.  tada.wav.

Nehany eszrevetel:

- cron-ba ne felejtsd el beletenni, hogy a nullazott felhasznalokat idonkent visszaengedd (update valid=1)

- az, hogy milyen gyakran akarod futtatni a scriptet attol fugg, mekkora a levelforgalmad (a grep nagy file-okon cpu intenziv)

- ergo minel nagyobb a levelforgalmad, annal gyakrabban akarod futtatni, de ekkor tegyel bele egyeb szuroket is: peldaul csak az utolso tizezer soron futtatni: tail -n 10000 | grep ... mert ilyenkor kisebb mennyiseget kell a grep-nek atnyalaznia

- ha megfigyeled, nincs rogzitve az idopontja annak, valaki mikor lett kitiltva. Ez lehet, hogy nalad problema, nalam nem olyan jelentos, hogy foglalkozzak vele.

Ha kerdes van, batran.

udv
adam


--


udv
Adam
_______________________________________________
Techinfo mailing list
Techinfo@lista.sulinet.hu
Fel- és leiratkozás: http://lista.sulinet.hu/mailman/listinfo/techinfo
Illemtan: http://www.szag.hu/illemtan.html
Ügyfélszolgálat FAQ: http://sulinet.niif.hu/

válasz