Дипломная работа

от 20 дней
от 7 499 рублей

Курсовая работа

от 10 дней
от 1 499 рублей

Реферат

от 3 дней
от 529 рублей

Контрольная работа

от 3 дней
от 79 рублей
за задачу

Билеты к экзаменам

от 5 дней
от 89 рублей

 

Дипломная Система биллинга электронной почты в ОС Linux, на основе логов почтового сервиса Qmail - Исследование систем управления

  • Тема: Система биллинга электронной почты в ОС Linux, на основе логов почтового сервиса Qmail
  • Автор: Иван
  • Тип работы: Дипломная
  • Предмет: Исследование систем управления
  • Страниц: 94
  • ВУЗ, город: Казань
  • Цена(руб.): 4000 рублей

altText

Выдержка

бъем в байтах данного электронного сообщения и почтовый адрес отправителя. Кроме того, данная строка содержит «ключ», упомянутый выше. Следующая необходимая строка – это «May 1 04:40:40 saracen qmail: 1177980040.081236 starting delivery 13700: msg 2521483 to local comtat.ru-root@comtat.ru». В данной строке мы получаем условное время отправки, реально же это время когда данный сервер принял электронное сообщение, и почтовый адрес получателя электронного сообщения. Кроме того, данная строка опять содержит вышеупомянутый «ключ», и в свою очередь «ключ доставки», т.е. уникальный идентификатор по количеству пересылок сервисом электронных сообщений, соответственно адресам получателей – 13700. Последняя строка, содержащая строку – «May 1 04:40:40 saracen qmail: 1177980040.372603 delivery 13700: failure: Sorry,_no_mailbox_here_by_that_name._(#5.1.1)/», дает нам информацию, о времени когда сообщение было доставлено именно в почтовый адрес получателя, и подтверждение доставки: 1) success – письмо удачно доставлено; 2) differal, failure – письмо не было доставлено (причинами, по которым подтверждение доставки – отрицательное, могут являться: отсутствие данного почтового адреса среди всех адресов данного почтового сервиса, письмо является спамом и т.п.). Данная строка также содержит в себе «ключ доставки» – 13700.
Технология языка Perl – «Регулярные выражения», позволяет очень быстро находить строки, содержащие в себе текст «new msg», «end msg», «info msg», «starting delivery», «delivery» – без текста starting. Все необходимые данные записываются в таблицы, соответственно – new_msg, end_msg, info_msg, delivery, acknowledgment.
Решение задачи быстрой обработки данных
Для быстрой обработки данных в программе были реализовано следующие решение – использование технологии «Наборы данных» языка Java.
Технология «Наборы данных» позволяет выгружать в кэш-память данные большого объема, при этом используя относительно небольшую часть от общего объема кэш-памяти сервера. Данным образом мы реализуем простую схему: выгрузил все данные из БД в кэш-память, обработал, записал обработанные данные в БД. В отличие от схемы: SQL-запросом находим строку из одной таблицы, следующим запросом строку из другой таблицы и т.д. по каждой таблице, нам не приходится постоянно использовать запросы и нет необходимости постоянно считывать данные в БД и записывать данные в БД, или говоря иначе считывать данные с физического носителя и записывать на физический носитель. Естественно схема, в которой нам не приходиться постоянно что-то считывать с физического носителя и записывать в физический носитель, работает гораздо быстрее.
Схема, постоянного обращения к БД:


Схема разового обращения к БД:









ОПИСАНИЕ БАЗЫ ДАННЫХ
Схема базы данных
Ниже приведена схема базы данных, в которой хранится вся необходимая информация для осуществления биллинга, а также все статистические данные. Текущая база данных построена на основе реляционной модели.



Описание таблиц
Ниже приведен весь перечень таблиц в базе данных, во 2 столбце галочками отмечены таблицы не посредственно участвующие в программном комплексе:
ИМЯ ТАБЛИЦЫ
ОПИСАНИЕ
Aliases
Синонимы адресов
Archives
Архивные данные биллинга
Billings

Тарифицированные услуги
Conditions
Условия начисления услуги
Filters

Отфильтрованные данные
Logins

Клиентские логины
Logs
Архив Логинов
Nets
Список клиентских сетей
Operators
Операторы данной услуги
Prices

Словарь цен
Replaces
Интерфейсный словарь замен
Scales

Шкалы объема
Services

Словарь услуг
Tariffs

Словарь тарифов
Transfers

Исходные данные
Translates
Интерфейсный словарь переводов
Units
Словарь единиц измерения
new_msg

Данные из логов
end_msg

Данные из логов
info_msg

Данные из логов
Delivery

Данные из логов
Acknowledgment

Данные из логов

Таблица Logins
Данная таблица содержит перечень необходимой информации о клиенте (подробное описание на стр.38 в пункте Приложения):
user_id – код клиента;
record_id – счет клиента;
login_id(PK) – код Логинов клиента;
name – имя клиента;
address – имя почтового адреса или домена клиента;
login – логин клиента;
tariff_id – код тарифного плана клиента;
operation_date – дата редактирования/записи;
operation_user – оператор.
Таблица Tariffs
Данная таблица содержит весь перечень тарифных планов, по которым работают клиенты (подробное описание на стр.38 в пункте Приложения):
tariff_id(PK) – код тарифного плана клиента;
name – название тарифного плана;
rate_id – код курса.
Таблица Services
Данная таблица содержит весь перечень услуг, по соответствующему тарифному плану (подробное описание на стр.38 в пункте Приложения):
service_id(PK) - код услуги;
name – название услуги;
unit_id – код еденицы измерения;
condition_id – код условия начисления услуги.
Таблица Prices
Данная таблица содержит перечень всех цен по всем услугам, предоставляемым по определенным тарифным планам (подробное описание на стр.38 в пункте Приложения):
tariff_id(PK) – код тарифного плана;
service_id(PK) – код услуги;
price – цена.
Таблица Scales
Данная таблица содержит информацию о шкалах объема по предоставляемым услугам, в связи с тем, что речь идет о подсчете трафика (подробное описание на стр.39 в пункте Приложения):
tariff_id(PK) – код тарифного плана;
scale_id(PK) – код шкалы объема;
size – еденица шкалы объема;
service_id – код услуги.
Таблица Billings
Данная таблица содержит обсчитанные статистические данные по всем логинам клиентов (подробное описание на стр.39 в пункте Приложения):
billing_id(PK) – код строки, содержащей обсчитанные статистические данные биллинговой системы;
filter_id – код строки, содержащей отфильтрованные статистические данные биллинговой системы;
login_id – код логина клиента;
service_id – код услуги;
tariff_id – код тарифного плана клиента;
price – цена за еденицу услуги;
quantity – количество;
rate – курс;
cost – стоимость;
service_date – дата;
remark – комментарий;
operation_date – дата редактирования/записи;
operation_user – оператор.
Таблица Filters
Данная таблица содержит отфильтрованные статистические данные по всем логинам клиентов (подробное описание на стр.39 в пункте Приложения):
filter_id(PK) – код строки, содержащей отфильтрованные статистические данные биллинговой системы;
transfer_id – код строки, содержащей исходные данные биллинговой системы;
login_id – код логина клиента;
sender – имя почтового адреса или домена отправителя электронного сообщения;
recipient – имя почтового адреса или домена получателя электронного сообщения;
filter_date – дата;
size – объем электронного сообщения;
direction – направление;
operation_date – дата редактирования/записи;
operation_user – оператор.
Таблица Transfers
Данная таблица содержит исходные статистические данные биллинговой системы (подробное описание на стр.40 в пункте Приложения):
transfer_id(PK) – код строки, содержащей исходные данные биллинговой системы;
receipt_date – дата получения электронного письма;
sender – имя почтового адреса или домена отправителя;
transfer_date – дата пересылки электронного сообщения;
recipient – имя почтового адреса или домена почтового сообщения;
size – объем электронного сообщения;
count – количество электронных сообщений;
operation_date – дата редактирования/записи;
operation_user – оператор.
Таблица new_msg
Данная таблица содержит необходимую информацию из логов (подробное описание на стр.40 в пункте Приложения):
message_id(PK) – код строки, содержащей информацию о электронном сообщении;
new_msg – «уникальный ключ» электронного сообщения;
status – статус обработки данной строки системой биллинга;
position – позиция строки в файле, содержащей вышеперчисленную информацию.
Таблица end_msg
Данная таблица содержит необходимую информацию из логов (подробное описание на стр.40 в пункте Приложения):
message_id(PK) – код строки содержащей информацию о электронном сообщении;
end_msg – «уникальный ключ» электронного сообщения;
status – статус обработки данной строки системой биллинга;
position – позиция строки в файле, содержащей вышеперечисленную информацию.
Таблица info_msg
Данная таблица содержит необходимую информацию из логов (подробное описание на стр.40 в пункте Приложения):
message_id(PK) – код строки, содержащей информацию о электронном сообщении;
info_msg – «уникальный ключ» электронного сообщения;
size – объем электронного сообщения в байтах;
sender – имя почтового адреса или домена отправителя электронного сообщения;
status – статус обработки данной строки системой биллинга;
position – позиция строки в файле, содержащей вышеперечисленную информацию.
Таблица delivery
Данная таблица содержит необходимую информацию из логов (подробное описание на стр.41 в пункте Приложения):
message_id(PK) – код строки, содержащей информацию о электронном сообщении;
delivery – уникальный «ключ доставки» электронного сообщения;
msg_id – «уникальный ключ» электронного сообщения;
recipient – имя почтового адреса или домена получателя электронного сообщения;
transfer_date – дата пересылки электронного сообшения;
status – статус обработки данной строки системой биллинга;
position – позиция строки в файле, содержащей вышеперечисленную информацию.
Таблица acknowledgment
Данная таблица содержит необходимую информацию из логов (подробное описание на стр.41 в пункте Приложения):
message_id(PK) – код строки, содержащей информацию о электронном сообщении;
delivery_id – уникальный «ключ доставки» электронного сообщения;
acknowledgment – подтверждение удачной/не удачной доставки электронного сообщения;
receipt_date – дата доставки электронного сообщения;
status – статус обработки данной строки системой биллинга;
position – позиция строки в файле, содержащей вышеперчисленную информацию.

ОПИСАНИЕ АЛГОРИТМОВ
Скрипт move_maillog.pl
Данный скрипт выполнен в виде Perl-сценария, копирует последний файл логов в отдельную директорию, переименовывая его по текущей дате. Таким образом, данный скрипт решает кучу возможных проблем при обработке файлов, например, не будет ни одного файла с одинаковым названием и т.д.
Скрипт qmaillog_parser.pl
Данный скрипт выполнен в виде Perl-сценария. В специальной директории этот скрипт находит файлы, содержащие в своем имени текущую дату. Разархивирует эти файлы и начинает обработку файла с использованием технологии того же языка Perl – «Регулярные выражения». При помощи регулярных выражений, осуществляется поиск всех строк, содержащих определенный набор символов. При наличии определенного набора символов, строка обрабатывается и из этой строки скрипт получает определенные данные необходимые для системы биллинга. Если в строке нет ни одного необходимого набора символов, данная строка не подвергается обработке. Обработка строк, в свою очередь, тоже основывается на наличии определенных наборов символов, соответствующей каждой строке. Например, строка, которая содержит в себе набор символов «info_msg», также всегда содержит набор символов «bytes» – количество байт, и после данного набора символов действительно следует число, которое и обозначает объем данного электронного сообщения в байтах. Также в данной строке всегда присутствует набор символов «from» – от кого, после чего действительно следует имя почтового адреса или домена отправителя. И так для остальных строк. Все полученные данные записываются базе данных, в таблицы соответствующие определенным строкам, т.е. все данные, полученные из строки содержащей набор символов «info msg» – записываются в таблицу с аналогичным именем «info_msg», а данные из строки, содержащей набор символов «starting delivery» и «msg», в таблицу «delivery». Также в каждую таблицу записываются позиции первого символа строки в файле, из которой были взяты данные. После обработки файл удаляется.
Алгоритм программы Transfers
Данная программа написана на языке Java, с использованием технологии языка Java – «Наборы данных». Для реализации технологии «Наборы данных», создаются экземпляры классов, которые соответствуют таблицам, в которых содержатся все исходные данные. В коде программы написаны методы, которые достают все исходные данные. Эти методы возвращают списки, структура которых соответствует экземплярам классов, описанных выше.
Для организации коннекта к базе был создан класс, в котором реализованы два метода – метод инициализации коннекта к базе данных, который возвращает единственный параметр – коннект к базе данных. Все необходимые данные, такие как хост, порт и т.п., для организации коннекта считываются из «файла свойств» - database.properties. Второй метод – метод закрытия коннекта к базе данных, который в качестве параметра получает текущий коннект к базе.
Основной функцией данной программы является группировка всех исходных данных по каждому удачно доставленному или отправленному электронному сообщению. Таким образом, сначала реализуется класс DataGetters, который при помощи SQL-запросов, получает все данные, возвращая вышеописанные списки. Далее из списка, соответствующего таблице «new_msg», берется первый элемент. Данный элемент содержит в себе в том числе «уникальный ключ» сообщения и позицию первого символа строки в файле (условно назовем это позиция-1), из которой были взяты эти данные. Опираясь на эти данные, из списка, соответствующего таблице «end_msg», осуществляется поиск элемента или элементов. Данные элементы должны содержать в себе аналогичный «уникальный ключ» сообщения и позиции первых символов строк в файле, из которых были взяты (условно назовем это позиция-2). При этом позиция-2 должна быть ниже, чем позция-1, т.е. значение позиции-2 > позиции-1. Если позиции-2 соответствуют несколько элементов (условно назовем их позиция-2.1 и позиция-2.2 и позиция-2.3), то среди этих элементов выбирается тот, у которого значение позиции первого символа строки в файле, из которой были взяты данные, окажется меньше. Если поиск позиции-2 заканчивается неудачей, то происходит останов и берется следующий элемент из списка, соответствующего таблице «new_msg».
После определения позиции-1 и позиции-2, поиск продолжается в третьем списке, который соответствует таблице «info_msg». Поиск осуществляется по трем условиям:
«уникальный ключ» сообщения должен быть идентичен с тем, который был найден ранее;
позиция-3 (позиция первого символа строки из файла, из которой были взяты данные) должна быть выше позиции-1, т.е. числовые значения: позиция-3 > позиции-1;
позиция-3 должна быть ниже позиции-2, т.е. числовые значения позиция-3 < позиции-2.
Следует заметить, что данный элемент должен существовать и при его нахождении метод, будет возвращать все необходимые данные из этого элемента.
Поиск в четвертом списке, соответствующем таблице «delivery», ведется по трем вышеописанным условиям. А поиск в пятом списке отличается лишь тем, что вместо «уникального ключа» сообщения используется уникальный «ключ доставки». Также элементы в данных списках должны существовать.
Все функции поиска реализованы в отдельных методах в классе Transfers. Далее все необходимые данные из всех списков группируются в один элемент нового списка, который соответствует таблице Transfers в базе данных. Последним этапом является запись всех элементов в таблицу.
Кроме того, программа содержит в себе класс, организовывающий запись логов всех исключительных ситуаций, который в свою очередь обращается к «файлу свойств» dashing_deer.properties, в котором указан путь и файл, где должны писаться логи.
Алгоритм программы Filters
Данная программа написана на языке Java, также с использованием технологии «Наборы данных».
Основной функцией данной программы является фильтрация всех удачно полученных или отправленных электронных сообщений, по именам почтовых адресов или доменов клиентов.
Для реализации программа возвращает два списка соответствующие двум таблицам из базы данных:
список-1, соответствующий таблице Transfers, в которой находятся все исходные данные;
список-2, соответствующий таблице Logins, в которой находятся все данные по клиенту. В том числе имена почтовых адресов и доменов.
Из списка-1, берется первый элемент, из которого сначала берется имя почтового адреса или домена отправителя, если идентичный почтовый адрес или домен существует в базе данных таблице Logins, то после поиска найдется элемент из списка соответствующего таблице Logins. Если по имени почтового адреса или домена отправителя соответствий не найдено, то поиск осуществляется по имени почтового адреса или домена получателя электронного сообщения. В случае, когда оба поиска дают положительный результат, то данное электронное сообщение фильтруется по почтовому адресу или домену отправителя. Если имя почтового адреса или домена ни отправителя, ни получателя электронного сообщения не соответствуют ни одному из таблицы Logins, то данное электронное сообщение не проходит фильтрацию.
Таким образом, происходит фильтрация, в итоге которой, определяется принадлежность электронных писем клиентам и создается новый список, соответствующий таблице Filters. Новый список записывается в базу в таблицу Filters.
Для организации коннекта к базе данных, также реализован отдельный класс, с такими же методами, как и в программе Transfers, также берущий все необходимые данные из файла свойств database.properties.
Кроме того, также предусмотрен класс, реализующий написание логов о работе программы. Путь, где должен содержаться файл логов также указывается в файле свойств dashing_deer.properties.
Скрипт billings.pl
Данный скрипт написан на языке Perl. Функцией этого скрипта является расчет с клиентами по установленным тарифам и ценам, в соответствии с полученным и отправленным трафиком клиентами. Для реализации скрипт берет данные из таблицы Filters, Services, Prices, Tariffs и Scales. Каждое электронное письмо подвергается расчету и закладывается в исходную таблицу Billings, в виде статистических данных. После осуществления расчета с баланса клиентов снимается соответствующая сумма.



ЗАКЛЮЧЕНИЕ
В процессе работы было проведено детальное изучение исходных материалов, предшествовавшие этапу разработки системы биллинга электронной почты на операционной системе Linux на основе логов почтового сервиса Qmail.
При выполнении работы были получены следующие знания и получены следующие навыки:
Знание операционной системы Linux;
Были изучены руководящие документы по почтовому сервису Qmail;
Были подробно изучены логии почтового сервиса Qmail;
Была подробно изучена технология языка Perl – «Регулярные выражения»;
Была подробно изучена технология языка Java – «Наборы данных»;
Был получен опыт программирования в операционной системе Linux;
Был получен опыт применения разных языков программирования в одном комплексе программ для реализаций поставленной задачи;
Был получен опыт создания биллинговых систем.
Программа является комплексным решением по осуществлению биллинга клинетов сервиса электронной почты Qmail.
Разработанный программный комплекс соответствует всем выше предъявленным требованиям. В ходе тестирования и отладки установлено, что:
Программа верно производит расчет с клиентами соответственно полученным и отправленным ими трафиком в виде электронных сообщений;
Программа способна в очень короткие сроки обрабатывать большой объем данных, благодаря вышеупомянутым технологиям, использованным в коде;
В связи с тем, что быстродействие программы очень высокое, она отрабатывает за очень короткий промежуток времени (до 1 часа), что не затрудняет работу остальных систем сервера;
Для внедрения и использовании программы достаточно установить интерпретаторы языков Java и Perl. Также все необходимые настройки вынесены за код файла в специальные файлы;
Хранение данных осуществляется в базе данных MySQL, что позволяет хранить их на протяжении долгого периода времени;
Хранение данных в базе, построено на основе реляционной модели, что упрощает ряд действий над данными, в том числе поиск.
При создании программы были успешно преодолены следующие трудности:
Нехватка исходного материала для разработки пр

 

ПРИНИМАЕМ К ОПЛАТЕ