Postfix‎ > ‎

Парсинг лога Postfix

$cat spamfind.py
#!/usr/bin/python
#-*- coding:utf-8 -*-

import os, gzip, subprocess

wh,gn,cn,rd = '\033[1;m','\033[1;32m','\033[1;36m','\033[1;31m' # раскраски

def Search(a):
    """Поиск спама в логе"""
    log = ['/var/log/mail.log','/var/log/mail.log.0'] # не gzip
    log_gz = ['/var/log/mail.log.1.gz','/var/log/mail.log.2.gz','/var/log/mail.log.3.gz','/var/log/mail.log.5.gz','/var/log/mail.log.4.gz','/var/log/mail.log.6.gz'] # gzip
    s = raw_input('Введите через пробел слова, по которым будем искать:'+'\n'+cn+'-> '+wh).split(' ')
    s.append(a)
    print ''.center(100, '_')+'\n'

    class gzopen(gzip.GzipFile): # создаём класс для работы с gzip-файлами
        def __enter__(self):
            if self.fileobj is None:
                raise ValueError("I/O operation on closed GzipFile object")
            return self
        def __exit__(self, *args):
            self.close()

    def grep(openf,logf): # разбираемся с gzip лог-файлами
        for files in logf:
            with openf(files) as file:
                f = []
                for line in file:
                    if all(ss in line for ss in s):
                        f.append(line)
                for i in f:
                    r = i.replace(', ', ' ').replace('  ', ' ').split(' ')
                    dt = gn+(' '.join(r[0:3]))+wh+' ' # подкрасим вывод даты
                    if (a == 'spam-'):
                        print dt+'SpamID: '+rd+r[16]+wh+'\n'+r[12]+cn+' -> '+wh+r[14]+'\n'
                    else:
                        print dt+(' '.join(r[3:]))

    grep(open,log)      # смотрим логи
    grep(gzopen,log_gz) # смотрим gzip-логи
    print ''.center(100, '_')

def SpamRelease():
    """Восстановление письма из спама"""
    s = raw_input('Введите SpamID:-> ').split(' ')
    for i in s:
        cmd = 'amavisd-release '+i
        p = subprocess.Popen(cmd, shell = True)
        p.communicate()

def WhList():
    """Добавление адресов в белый список"""
    s = raw_input('Введите адреса (например, mail@mail.com или *@mail.com) через пробел:'+'\n'+cn+'-> '+wh)
    with open('/etc/spamassassin/whitelist.cf', 'a') as f:
        f.write(' '+s)
        f.close()
        cmd = '/etc/init.d/spamassassin restart \n /etc/init.d/amavis restart'
        p = subprocess.Popen(cmd, shell = True)
        p.communicate()

def Menu():
    """Меню работы с программой"""
    loop = True
    while loop:
        print ("""
 1. Поиск письма в папке SPAM
 2. Фильтр FROM-TO
 3. Восстановить из папки SPAM
 4. Добавить адрес в white-list
 5. Выход
    """)
        response = raw_input(cn+'-> '+wh)
        if response == '1':     # Поиск письма в папке SPAM
            Search('spam-')
        elif response == '2':   # Фильтр FROM-TO
            Search('')
        elif response == '3':   # Восстановить из папки SPAM
            SpamRelease()
        elif response == '4':   # Добавить адрес в white-list
            WhList()
        elif response == '5':   # Выход
            loop = False
        else:
            print 'Неверно. Повторите ввод.'
Menu()
Скрипт универсальный для просмотра логов postfix и им можно пользоваться всем, хотя возможно и придётся в строке print dt+'SpamID: '+rd+r[16]+wh+'\n'+r[12]+cn+' -> '+wh+r[14]+'\n' поиграть с позициями r[16],r[12] и r[14].

Обсуждение здесь.
Comments