вторник, 21 сентября 2010 г.

работа - скриптинг :)

Есть у меня набор скриптов, которые работают с трафиком. Сбор статистики с маршрутизатора, генерация отчетов, закрытие доступа в инет при превышении лимита и всё такое. Написаны давно, довольно коряво, но работают уже не один год :).
А тут взялся за них и переписал некоторые. Обработку лимитов, например. До этого было реализовано тупо в лоб - брались лимиты из таблицы в БД, по одному просматривались, для каждого адреса, указанного в лимитах, считался его трафик, потом сравнивался с лимитом и потом генерировался нужный acl для роутера, если надо было. Работало медленно, было разбито на два скрипта, которые запускались по очереди - один обрабатывал данные из базы и генерил команды второму, которых конфигурил роутер. А тут переписал все в один скрипт, который одним запросом к трем таблицам БД вытаскивает все адреса, которые превысили лимит и еще не заблокированы, потом генерит для них нужные acl-и. Потом вторым запросом вытаскивает все адреса, для которых лимит не превышен, но они заблочены и генерит для них опять-таки нужные acl-и. Потом все сгенерированные acl-и сливаются в один конфиг, который разом заливается в роутер. И все красиво и быстро :) Очень доволен проделанной работой.

А недавно перед этим переделал примерно так же запросы в скрипте, который считал трафик. Ранее он считал тупо перебирая ip, считая для них трафик, определяя, к какому подразделению он(ip) относится и суммируя трафик для подразделения и в итоге выводя мне данные по всем подразделениям. А теперь одним запросом вытаскиваю суммарный трафик для всех подразделений, потом вторым запросом вытаскиваю все адреса, которые не относятся ни к одному подразделению (такие периодически всплывают :)). Красота!

Теперь еще бы переделать таблицу трафика (которая самая здоровая), чтобы ip хранился не в тексте, а в бинарном виде - тогда запросы еще быстрее должны начать выполняться.

Вот пример запроса (вытаскивает трафик по подразделениям):


SELECT d.name, sum(l.t_in) as tin
FROM `cisco_router` as l
left join adamant.networks as n on (inet_aton(l.ip)&inet_aton(n.mask))=(inet_aton(n.mask)&inet_aton(n.adress))
left join adamant.departments as d on d.id=n.dep
where n.dep is not null 
and l.data>='2010-09-01' and l.data<='2010-09-30'
group by n.dep
order by d.name

Для меня это было достижение, написать такой :)

Комментариев нет:

Отправить комментарий