Если в httpd.conf включено определение имен хостов (HostNameLookups on), в лог записываются не ip адреса клиентов, а имена хостов. Включать определение имен хостов не рекомендуется, так как ухудшает производительность веб-сервера. Гораздо лучше определять имена хостов клиентов (если это требуется для анализа) при обработке логов.
Для определения имени хоста по ip адресу модуле socket есть функция gethostbyaddr(). Она возвращает кортеж, состоящий из основного имени хоста, списка дополнительных имен и списка дополнительных ip адресов.
Для установки пассивного или активного телекоммуникационного оборудования обычно используют шкаф телекоммуникационный напольный. Обычно он используется для создания узлов коммуникации в офисах. Также его используют провайдеры для создания домовых сетей. При покупке у вас должен быть: выбор размеров, простота установки и разбора, возможность объединения нескольких шкафов, наличие перфорации для установления вентиляции, наличие мелких принадлежностей (кабеля, блоки, полки, панели и.т.п.).
>>>> import socket
>>>> host = socket.gethostbyaddr('194.109.137.226')
>>>> host
('fang.python.org', [], ['194.109.137.226'])
Если узнать имя хоста не удалось, возбуждается исключение:
>>>> socket.gethostbyaddr('172.16.0.1')
Traceback (most recent call last):
..File "<stdin>", line 1, in ?
socket.herror: (11004, 'host not found')
>>>>
Так как в логе обычно присутствует не один запрос с данного ip адреса, нет смысла каждый раз определять имя хоста с помощью вызова функции gethostbyaddr(). Можно заполнять словарь определенными соответствиями и сначала пробовать искать в нем, а уже потом вызывать функцию. А так как имена хостов меняются редко, можно завести текстовый файл (или базу данных) и хранить информацию в нем. Тогда имена хостов, определенные во время сессии, используются в последующих сессиях, что сильно уменьшает время обработки. Неудачные попытки определения имени также имеет смысл записывать в словарь, чтобы во время текущей сессии больше не пытаться распознать данный адрес. Суммируя все выше сказанное, приведем фрагмент скрипта для определения имени хоста:
import socket
dns = {}
bad_ip = {}
# открываем файл с именами хостов для добавления
names = open('names.txt', 'a+')
# заполняем словарь уже известными именами
for i in names.readlines():
dns[i.split()[0]] = i.split()[1]
if dns.has_key(ip):
# если адрес присутствует в словаре, присваиваем найденное имя
host = dns[ip]
elif bad_ip.has_key(ip):
# если ранее не удалось определить имя - используем ip
host = bad_ip[ip]
else:
try:
# пытаемся определить имя
host = socket.gethostbyaddr(ip)[0]
# записываем его в словарь и в файл
dns[ip] = host
names.write('%s %s\n' % (ip, host))
except:
# определить имя не удалось - используем ip
# и записываем его в словарь неопределяемых ip адресов
host = ip
bad_ip[ip] = ip
Примечание: словарь "неопределяемых" адресов ведется только в течении сессии и в файл не записывается (а вдруг в следующий раз повезет?). Если имя определить не удалось, в качестве имени берется ip адрес.