Форум сайта python.su
0
Здравствуйте, уважаемые!
В общем господа помогите. Не пойму. Дали тестовое задание:
Необходимо написать программный модуль на Python, который запускается из командной строки и принимает на вход:
1) регулярное выражение
2) имя сетевого интерфейса
далее модуль:
1) открывает определенный интерфейс на прослушивание (“сниферит”)
2) отлавливает протокол HTTP и распространяет на заголовок протокола рег. выражение.
В результате работы программы необходимо получить файл, в котором будут сохраняться искомые по рег. выражениям значения заголовков НТТР. Лог-файл может быть вида:
======================================
<Cookie: JSESSIONID
A31283D5C6BD39698167CB118725EA7; atlassian.xsrf.token=B9AF-O05Z-O0X…>
GET /jira/browse/KPS-269 HTTP/1.1
Host: 192.168.167.169:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID
A31283D5C6BD39698167CB118725EA7; atlassian.xsrf.token=B9AF-O05Z-O0XQ-UM4Z|c6225f16a613a59f9ec1f6a239e6d8f50fcf30a5|lin; __utma=1.2127329068.1404892476.1404892476.1404892476.1; __utmc=1; __utmz=1.1404892476.1.1.utmcsr
direct)|utmccn
direct)|utmcmd
none)
Connection: keep-alive
Cache-Control: max-age=0
======================================
Написал такой код говорят это не сниффер. Но поидее в лог пишет то что нужно.
# -*- coding: utf-8 -*- import socket import signal import argparse import sys import re import os ROOT = os.path.abspath(os.path.dirname(__file__)) class Sniffer: def __init__(self, regex='', host='', port=80): self.host = host self.port = port self.regex = regex def activate_server(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: print("Launching HTTP server on ", self.host, ":", self.port) self.socket.bind((self.host, self.port)) # self.socket.connect((self.host, self.port)) except Exception as e: print ("Warning: Could not aquite port:", self.port, "\n") print ("I will try a higher port") # store to user provideed port locally for later (in case 8080 fails) user_port = self.port self.port = 8080 try: print("Launching HTTP server on ", self.host, ":", self.port) self.socket.bind((self.host, self.port)) # self.socket.connect((self.host, self.port)) except Exception as e: print("ERROR: Failed to acquire sockets for ports ", user_port, " and 8080. ") print("Try running the Server in a privileged user mode.") self.shutdown() sys.exit(1) print ("Server successfully acquired the socket with port:", self.port) print ("Press Ctrl+C to shut down the server and exit.") self._wait_for_connections() def shutdown(self): try: print("Shutting down the server") s.socket.shutdown(socket.SHUT_RDWR) except Exception as e: print("Warning: could not shut down the socket. Maybe it was already closed?", e) def _wait_for_connections(self): QUEUE = 3 while True: print ("Awaiting New connection") self.socket.listen(QUEUE) conn, addr = self.socket.accept() # string, addr = self.socket.recv(1024) # string = bytes.decode(string) print("Got connection from:", addr) data = conn.recv(1024) string = bytes.decode(data) regexp_result = re.search(self.regex, string) if regexp_result: start_finding_str = data.rfind('\n', 0, regexp_result.regs[0][0]) + 1 end_finding_str = data.find('\n', start_finding_str) - 1 finding_str = re.sub(r'^(.{100}).*$', '\g<1>...', data[start_finding_str:end_finding_str]) f = open(ROOT + "\log.txt", 'a') f.write('<' + finding_str + '>\n') f.write(data) f.write('\n=================================================\n') f.close() def graceful_shutdown(sig, dummy): s.shutdown() sys.exit(1) signal.signal(signal.SIGINT, graceful_shutdown) def create_parser(): parser = argparse.ArgumentParser() parser.add_argument('-re', '--regex', nargs='?', default='') parser.add_argument('-ht', '--host', nargs='?', default='') parser.add_argument('-pt', '--port', nargs='?', default=80) return parser if __name__ == '__main__': parser = create_parser() namespace = parser.parse_args(sys.argv[1:]) try: remote_ip = socket.gethostbyname(namespace.host) except socket.gaierror: print 'Hostname could not be resolved. Exiting' sys.exit() s = Sniffer(regex=namespace.regex, host=remote_ip, port=namespace.port) s.activate_server()
Офлайн
6
Офлайн
0
Спасибо попробую разобраться.
От новых ответов не отказываюсь. Может у кого возникнет желание более подробно объяснить или конкретно на данном примере.
Отредактировано StimuL (Июль 16, 2014 17:19:09)
Офлайн