AlienVault OSSIM and USM Русский язык в custom functions

Столкнулся с этим при написании одного плагина, который обрабатывает лог полностью на русском языке. И дата там в таком формате: 1 июня 2017 г. 10:23:30. Прикольно.

Как сделать чтобы лог на русском обрабатывался правильно я уже здесь писал, например, в статье «OSSIM. Обзор». Надо просто дописать |encoding к строке с путем к файлу конфигурации плагина в /etc/ossim/config.cfg. В моем случае это |utf-8. Но вот строку с датой OSSIM/USM стандартной функцией normalize_date разумеется не обработает. Такой формат даты ему не понятен. Значит, надо делать custom function.

Делаем. Это просто. Передаем функции вырезанную regex строку с датой (после того как мы объявили кодировку плагина, строки скомпилируются как надо, и regex будет работать правильно) и обрабатываем её там. Ну, я выбрал просто замену названия месяца его номером по словарю.

Но, вот интересно, а в какой кодировке строка будет передана функции? А ни в какой. Не знает функция, в какой кодировке строка. И если вы просто начнете ее парсить, ни фига работать не будет. Сначала надо ее декодировать в юникод. И декодировать правильно. А для этого надо узнать кодировку плагина. Благо функции ссылка на объект известна, как self. В итоге это должно выглядеть так:

Start Function normalize_date_rus
# -*- coding: utf-8 -*-

from datetime import datetime

def normalize_date_rus( self, string = "" ):
    encoding = self.get('config','encoding') # НИКОГДА НЕ ЗАБЫВАЙ
    sdate=string.decode(encoding)
    monthes = {u"января":1, u"февраля":2, u"марта":3, u"апреля":4, u"мая":5, u"июня":6, u"июля":7, u"августа":8, u"сентября":9, u"октября":10, u"ноября":11, u"декабря":12}
    (sday,smonth,syear,smusor,stime) = sdate.split(' ')
    (s_hour,s_minute,s_second) = stime.split(':')
    date = datetime(year=int(syear), month=int(monthes[smonth]), day=int(sday), hour=int(s_hour), minute=int(s_minute), second=int(s_second)).isoformat(' ')

    return date

End Function

Это аналог стандартной функции normalize_date. Комментарий # -*- coding: utf-8 -*- в данном случае никакого смысла не имеет, это себе для памяти, что текст набран в utf-8. А вот строковые коннстанты в виде u"строка" — это важно.

Еще о custom functions вы можете почитать в заметке Дмитрия Шулинина на Хабре: Использование custom functions в парсерах OSSIM
или вот здесь: OSSIM. WMI плагины с хрустящей корочкой. Рецепт

В целом об использовании русского языка в AlienVault OSSIM/USM смотрите у меня в OSSIM. Обзор. Это самая точная информация 🙂

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s