Python. Анализ журнала аутентификации почтового сервера.

Журнал аутентификации почтового сервера выглядит следующим образом:

Jan 29 08:32:47 email xinetd[5984]: START: pop-3 pid=9006 from=192.168.1.10
Jan 29 08:32:47 email popa3d[9006]: pam_tcb(popa3d:auth): Authentication passed for ivanovii from (uid=0)
Jan 29 08:32:47 email xinetd[5984]: EXIT: pop-3 pid=9006 duration=0(sec)

* представлены записи журнала для одной сессии

Задача состоит в следующем по запросу проверить с каких адресов подключался пользователь, чтоб забрать почту или обратное, с каких ящиков забирали почту с указного ip. Для решения этих задач был написан скрипт на python.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Скрипт для поиска в логе авторизации /var/log/auth.
 
В поле "Введите значение поиска:" необходимо задать.
    либо логин пользователя, будет поиск по сессиям с данным логином.
    либо ip, будет поиск по сессиям с данным ip.
 
Скрипт сам определяет, что задано для поиска: логин или ip либо что то непонятное.
 
Вывод поиска:
    Время: Jan 29 08:32:47 ip: 192.168.1.10 пользователь: ivanovii
"""
 
import re 
 
baza_ip_user={} 
 
def analiz_stroki_ip(line,ip_input):
 
	"""Функция анализирующая строки журнала
	когда в поиске задан ip"""
 
    if line.split()[5] == "START:":
        pid_re = re.compile("pid=([0-9][0-9][0-9][0-9][0-9]?)") 
        reg_ip = re.compile("[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]") 
        ip_find = reg_ip.findall(line) 
        for i in ip_find:
            if i == ip_input:
                for i in pid_re.findall(line):
                    pid = i
                    baza_ip_user[pid]=[ip_input,line.split()[0],line.split()[1],line.split()[2]]
    elif line.split()[6] == "Authentication":
        pid_re = re.compile("popa3d\[([0-9][0-9][0-9][0-9][0-9]?)")
        user = line.split()[9]
        for i in pid_re.findall(line):
                pid = i
                if pid in baza_ip_user:
                    info = baza_ip_user.get(pid)
                    info.append(user)
                    baza_ip_user[pid]=info
                    all_info = baza_ip_user.get(pid)
                    print "Время:",all_info[1],all_info[2],all_info[3],\
                          "ip:",all_info[0],\
                          "пользователь:",all_info[4]
                    del baza_ip_user[pid]
 
def analiz_stroki_user(line,user_input):
 
	"""Функция анализирующая строки журнала
	когда в поиске задано имя"""
 
    if line.split()[5] == "START:":
        pid_re = re.compile("pid=([0-9][0-9][0-9][0-9][0-9]?)")
        reg_ip = re.compile("[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]")
        ip_find = reg_ip.findall(line)
        for i in ip_find:
            ip_input = i
            for i in pid_re.findall(line):
                pid = i
                baza_ip_user[pid]=[ip_input,line.split()[0],line.split()[1],line.split()[2]]
    elif line.split()[6] == "Authentication":
        pid_re = re.compile("popa3d\[([0-9][0-9][0-9][0-9][0-9]?)")
        user = line.split()[9]
        for i in pid_re.findall(line):
                pid = i
                if pid in baza_ip_user:
                    info = baza_ip_user.get(pid)
                    info.append(user)
                    baza_ip_user[pid]=info
                    all_info = baza_ip_user.get(pid)
                    if all_info[4] == user_input:
                        print "Время:",all_info[1],all_info[2],all_info[3],\
                              "ip:",all_info[0],\
                              "пользователь:",all_info[4]
                        del baza_ip_user[pid]
                    else:
                        del baza_ip_user[pid]
 
def main():
	""" Главная функция, скармливает построчно журнал необходимой функции.
	Сама, по средствам регулярных выражений определяет что необходимо искать."""
 
    log_file = open("/var/log/auth","r")
    reg_ip = re.compile("[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]")
    reg_user = re.compile("[A-za-z0-9]+")
 
    input_name=raw_input("Введите значение поиска:")
    if re.match(reg_ip,input_name)<>None:
        for line in log_file:
            analiz_stroki_ip(line,input_name)
 
    elif re.match(reg_user,input_name)<>None:
        for line in log_file:
            analiz_stroki_user(line,input_name)
    else:
        print "Введено неверное значение, перезапустите скрипт и повторите ввод!"
 
main()

В результате при запуске данного скрипта и значениях поиска либо ivanovii, либо 192.168.1.10 будет получен следующий результат:

Время: Jan 29 08:32:47 ip: 192.168.1.10 пользователь: ivanovii