From ce17eacde37c124abe07288ae1453b5b658f8ff2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Apr 2019 15:01:38 +0400 Subject: =?UTF-8?q?=D0=A7=D0=B5=D1=82=D0=B2=D0=B5=D1=80=D1=82=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=BD=D1=8C,=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/client.py | 72 +++++++++++++++++++++++++++++++++++++++++++++ day4/task3/db.py | 57 ++++++++++++++++++++++++++++++++++++ day4/task3/server.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 day4/task3/client.py create mode 100644 day4/task3/db.py create mode 100644 day4/task3/server.py (limited to 'day4/task3') diff --git a/day4/task3/client.py b/day4/task3/client.py new file mode 100644 index 0000000..7f5c298 --- /dev/null +++ b/day4/task3/client.py @@ -0,0 +1,72 @@ +import socket +from time import sleep +import struct +import json + + +def pack_data(data): + encoded = data.encode() + return struct.pack('I', len(encoded)) + encoded + + +def get_data(connection): + buffer = b'' + while len(buffer) < 4: + data = connection.recv(4 - len(buffer)) + if not data: + raise ConnectionError('Connection was closed') + + buffer += data + + size_packed, buffer = buffer[:4], buffer[4:] + if not size_packed: + raise ConnectionError('Connection was closed') + + (size,) = struct.unpack('I', size_packed) + data = connection.recv(size - len(buffer)) + return buffer + data + + +def parse_data(data): + data = json.loads(data.decode()) + arr = [f'Найдено {len(data)} совпадений:'] + for error in data: + arr.append(f"[{error['date']}][{error['type']}][{error['module']}][{error['id']}] {error['text']}") + return '\n'.join(arr) + + +HOST, PORT = ADDR = 'localhost', 6001 + +cnt = 0 +sock = socket.socket() +while cnt < 10: + try: + cnt += 1 + sock.connect(ADDR) + + except ConnectionRefusedError: + print('Не удалось подключиться к серверу. Следующая попытка через 3 секунды...') + sleep(3) + + else: + del cnt + break +else: + print('Не удалось подключиться к серверу через 10 попыток.\nОстанавливаемся...') + sock.close() + quit() + + +while True: + try: + data = input('Введите модуль для поиска:\n') + + except KeyboardInterrupt: + break + + else: + sock.sendall(pack_data(data)) + response = get_data(sock) + print(parse_data(response)) + +sock.close() diff --git a/day4/task3/db.py b/day4/task3/db.py new file mode 100644 index 0000000..15eba02 --- /dev/null +++ b/day4/task3/db.py @@ -0,0 +1,57 @@ +import re +from datetime import datetime + +f = open('otrs_error.log') + +matcher = re.compile(r'\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\] (?P.*)') + +db = [] + +lines = f.readlines() +f.close() +for line in lines: + line = line.strip() + match = re.match(matcher, line) + + if match: + date = datetime.strptime(match.group('date'), '%c') + module = match.group('module') + + db.append({ + 'date': date, + 'type': match.group('type'), + 'module': module, + 'id': match.group('id'), + 'text': match.group('text') + }) + + else: + print(f'Ошибка при разборе строки:\n{line}') + + +def search_by_date(hour, minute=None, second=None, data=None): + arr = [] + print(f'filtering by h={hour}, m={minute}, s={second}, data="{data}"') + for err in db: + if err['date'].hour == int(hour): + if minute is not None: + if second is not None: + if err['date'].minute == int(minute) and err['date'].second == int(second): + if data in err['module']: + _ = err.copy() + _['date'] = _['date'].ctime() + arr.append(_) + else: + if err['date'].minute == int(minute): + if data in err['module']: + _ = err.copy() + _['date'] = _['date'].ctime() + arr.append(_) + + else: + if data in err['module']: + _ = err.copy() + _['date'] = _['date'].ctime() + arr.append(_) + + return arr diff --git a/day4/task3/server.py b/day4/task3/server.py new file mode 100644 index 0000000..b3cb619 --- /dev/null +++ b/day4/task3/server.py @@ -0,0 +1,82 @@ +import socket +import struct +from db import search_by_date +import re +import json + + +def pack_data(data): + encoded = data.encode() + return struct.pack('I', len(encoded)) + encoded + + +def handle_request(data): + match = re.match(r'(\d+):?(\d+)?:?(\d+)?-(.*)', data) + if match: + *date, msg = match.groups() + return pack_data(json.dumps(search_by_date(*date, msg))) + + else: + print('String not matched.') + return pack_data(json.dumps([])) + + +def get_data(connection): + buffer = b'' + while len(buffer) < 4: + data = connection.recv(4 - len(buffer)) + if not data: + raise ConnectionError('Connection was closed') + + buffer += data + + size_packed, buffer = buffer[:4], buffer[4:] + if not size_packed: + raise ConnectionError('Connection was closed') + + (size,) = struct.unpack('I', size_packed) + data = connection.recv(size - len(buffer)) + return buffer + data + + +def handle_connection(connection, address): + while True: + try: + data = get_data(connection) + + except ConnectionResetError: + print(f'Connection with {address[0]} was unexpectedly closed') + break + + except ConnectionError: + print(f'Connection with {address[0]} was ended') + break + + except KeyboardInterrupt: + raise KeyboardInterrupt() + + else: + if not data: + print(f'Connection with {address[0]} was ended') + break + response = handle_request(data.decode()) + connection.sendall(response) + + +HOST, PORT = ADDR = '0.0.0.0', 6001 +sock = socket.socket() +sock.bind(ADDR) +sock.listen(5) + +while True: + print('Listening for new connections...') + try: + connection, address = sock.accept() + print(f'Got a connection from {address[0]}') + handle_connection(connection, address) + + except KeyboardInterrupt: + print('Stopping server...') + sock.close() + print('Server stopped') + break -- cgit v1.2.3 From 588cdffdc1f527fac5a7bdd934008882e3efc70d Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Apr 2019 20:12:14 +0400 Subject: =?UTF-8?q?=D0=A3=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/client.py | 14 +++++++------- day4/task3/db.py | 54 +++++++++++++++++++++------------------------------- day4/task3/server.py | 9 +++++++-- 3 files changed, 36 insertions(+), 41 deletions(-) (limited to 'day4/task3') diff --git a/day4/task3/client.py b/day4/task3/client.py index 7f5c298..49663c8 100644 --- a/day4/task3/client.py +++ b/day4/task3/client.py @@ -28,14 +28,10 @@ def get_data(connection): def parse_data(data): - data = json.loads(data.decode()) - arr = [f'Найдено {len(data)} совпадений:'] - for error in data: - arr.append(f"[{error['date']}][{error['type']}][{error['module']}][{error['id']}] {error['text']}") - return '\n'.join(arr) + return json.loads(data.decode()) -HOST, PORT = ADDR = 'localhost', 6001 +HOST, PORT = ADDR = 'localhost', 6000 cnt = 0 sock = socket.socket() @@ -67,6 +63,10 @@ while True: else: sock.sendall(pack_data(data)) response = get_data(sock) - print(parse_data(response)) + arr = parse_data(response) + + print(f'Найдено {len(arr)} совпадений:') + for line in arr: + print(line) sock.close() diff --git a/day4/task3/db.py b/day4/task3/db.py index 15eba02..f4cbd0b 100644 --- a/day4/task3/db.py +++ b/day4/task3/db.py @@ -1,4 +1,5 @@ import re +import bisect from datetime import datetime f = open('otrs_error.log') @@ -17,41 +18,30 @@ for line in lines: date = datetime.strptime(match.group('date'), '%c') module = match.group('module') - db.append({ - 'date': date, - 'type': match.group('type'), - 'module': module, - 'id': match.group('id'), - 'text': match.group('text') - }) + db.append((date.hour, date.minute, date.second, module, line)) else: print(f'Ошибка при разборе строки:\n{line}') +db.sort() + + def search_by_date(hour, minute=None, second=None, data=None): - arr = [] - print(f'filtering by h={hour}, m={minute}, s={second}, data="{data}"') - for err in db: - if err['date'].hour == int(hour): - if minute is not None: - if second is not None: - if err['date'].minute == int(minute) and err['date'].second == int(second): - if data in err['module']: - _ = err.copy() - _['date'] = _['date'].ctime() - arr.append(_) - else: - if err['date'].minute == int(minute): - if data in err['module']: - _ = err.copy() - _['date'] = _['date'].ctime() - arr.append(_) - - else: - if data in err['module']: - _ = err.copy() - _['date'] = _['date'].ctime() - arr.append(_) - - return arr + low = [hour] + high = [hour] + if minute is not None: + low.append(minute) + high.append(minute) + + if second is not None: + low.append(second) + high.append(second + 1) + else: + high.append(60) + else: + high.append(60) + + left = bisect.bisect_left(db, tuple(low)) + right = bisect.bisect_left(db, tuple(high)) + return [t[4] for t in db[left:right] if data in t[3]] diff --git a/day4/task3/server.py b/day4/task3/server.py index b3cb619..f4e5ebe 100644 --- a/day4/task3/server.py +++ b/day4/task3/server.py @@ -3,6 +3,7 @@ import struct from db import search_by_date import re import json +import time def pack_data(data): @@ -14,7 +15,11 @@ def handle_request(data): match = re.match(r'(\d+):?(\d+)?:?(\d+)?-(.*)', data) if match: *date, msg = match.groups() - return pack_data(json.dumps(search_by_date(*date, msg))) + + t = time.time() + found = search_by_date(*map(lambda i: int(i) if i is not None else i, date), msg) + print(f'Search took {time.time() - t} seconds') + return pack_data(json.dumps(found)) else: print('String not matched.') @@ -63,7 +68,7 @@ def handle_connection(connection, address): connection.sendall(response) -HOST, PORT = ADDR = '0.0.0.0', 6001 +HOST, PORT = ADDR = '0.0.0.0', 6000 sock = socket.socket() sock.bind(ADDR) sock.listen(5) -- cgit v1.2.3 From 4a3db50d7df0f636ef824637d33330543e9044b2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 24 Apr 2019 20:42:29 +0400 Subject: =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D1=80=D0=B5=D1=82=D1=8C=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/client.py | 77 ++++++++++++++++++++++++++++++---------------------- day4/task3/db.py | 68 ++++++++++++++++++++++++++++++++-------------- day4/task3/server.py | 53 ++++++++++++++++++++++-------------- 3 files changed, 125 insertions(+), 73 deletions(-) (limited to 'day4/task3') diff --git a/day4/task3/client.py b/day4/task3/client.py index 49663c8..18bb2b1 100644 --- a/day4/task3/client.py +++ b/day4/task3/client.py @@ -4,6 +4,10 @@ import struct import json +HOST, PORT = ADDR = 'localhost', 6000 +DATATYPE_SIZE = 4 # int + + def pack_data(data): encoded = data.encode() return struct.pack('I', len(encoded)) + encoded @@ -11,14 +15,15 @@ def pack_data(data): def get_data(connection): buffer = b'' - while len(buffer) < 4: - data = connection.recv(4 - len(buffer)) + # Считываем размер пакета + while len(buffer) < DATATYPE_SIZE: + data = connection.recv(DATATYPE_SIZE - len(buffer)) if not data: raise ConnectionError('Connection was closed') buffer += data - size_packed, buffer = buffer[:4], buffer[4:] + size_packed, buffer = buffer[:DATATYPE_SIZE], buffer[DATATYPE_SIZE:] if not size_packed: raise ConnectionError('Connection was closed') @@ -31,42 +36,50 @@ def parse_data(data): return json.loads(data.decode()) -HOST, PORT = ADDR = 'localhost', 6000 +def try_connect(): + cnt = 0 + sock = socket.socket() + while cnt < 10: + try: + cnt += 1 + sock.connect(ADDR) -cnt = 0 -sock = socket.socket() -while cnt < 10: - try: - cnt += 1 - sock.connect(ADDR) + except ConnectionRefusedError: + print('Не удалось подключиться к серверу. Следующая попытка через 3 секунды...') + sleep(3) - except ConnectionRefusedError: - print('Не удалось подключиться к серверу. Следующая попытка через 3 секунды...') - sleep(3) + else: + return sock else: - del cnt - break -else: - print('Не удалось подключиться к серверу через 10 попыток.\nОстанавливаемся...') - sock.close() - quit() + print('Не удалось подключиться к серверу через 10 попыток.\nОстанавливаемся...') + sock.close() + return -while True: - try: - data = input('Введите модуль для поиска:\n') +def main(): + sock = try_connect() + if sock is None: + quit() - except KeyboardInterrupt: - break + while True: + try: + data = input('Введите модуль для поиска:\n') - else: - sock.sendall(pack_data(data)) - response = get_data(sock) - arr = parse_data(response) + except KeyboardInterrupt: + break + + else: + sock.sendall(pack_data(data)) + response = get_data(sock) + arr = parse_data(response) + + print(f'Найдено {len(arr)} совпадений:') + for line in arr: + print(line) + + sock.close() - print(f'Найдено {len(arr)} совпадений:') - for line in arr: - print(line) -sock.close() +if __name__ == '__main__': + main() diff --git a/day4/task3/db.py b/day4/task3/db.py index f4cbd0b..c23e9fb 100644 --- a/day4/task3/db.py +++ b/day4/task3/db.py @@ -2,30 +2,9 @@ import re import bisect from datetime import datetime -f = open('otrs_error.log') - -matcher = re.compile(r'\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\] (?P.*)') db = [] -lines = f.readlines() -f.close() -for line in lines: - line = line.strip() - match = re.match(matcher, line) - - if match: - date = datetime.strptime(match.group('date'), '%c') - module = match.group('module') - - db.append((date.hour, date.minute, date.second, module, line)) - - else: - print(f'Ошибка при разборе строки:\n{line}') - - -db.sort() - def search_by_date(hour, minute=None, second=None, data=None): low = [hour] @@ -45,3 +24,50 @@ def search_by_date(hour, minute=None, second=None, data=None): left = bisect.bisect_left(db, tuple(low)) right = bisect.bisect_left(db, tuple(high)) return [t[4] for t in db[left:right] if data in t[3]] + + +def open_log(path): + try: + f = open(path) + + except FileNotFoundError: + print('Файл с логом не обнаружен') + return + + except PermissionError: + print('Файл с логом не доступен для чтения') + return + + return f + + +# Возвращает значение успешности инициализации базы данных +def init(path) -> bool: + f = open_log(path) + if f is None: + return False + + matcher = re.compile(r'\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\]\[(?P.*?)\] (?P.*)') + + lines = f.readlines() + f.close() + for line in lines: + line = line.strip() + match = re.match(matcher, line) + + if match: + try: + date = datetime.strptime(match.group('date'), '%c') + except ValueError: + print(f'Ошибка при разборе строки (Неверный формат даты):\n{line}') + continue + + module = match.group('module') + + db.append((date.hour, date.minute, date.second, module, line)) + + else: + print(f'Ошибка при разборе строки:\n{line}') + + db.sort() + return True diff --git a/day4/task3/server.py b/day4/task3/server.py index f4e5ebe..3aea050 100644 --- a/day4/task3/server.py +++ b/day4/task3/server.py @@ -6,6 +6,10 @@ import json import time +HOST, PORT = ADDR = '0.0.0.0', 6000 +DATATYPE_SIZE = 4 # int + + def pack_data(data): encoded = data.encode() return struct.pack('I', len(encoded)) + encoded @@ -28,14 +32,15 @@ def handle_request(data): def get_data(connection): buffer = b'' - while len(buffer) < 4: - data = connection.recv(4 - len(buffer)) + # Считываем размер пакета + while len(buffer) < DATATYPE_SIZE: + data = connection.recv(DATATYPE_SIZE - len(buffer)) if not data: raise ConnectionError('Connection was closed') buffer += data - size_packed, buffer = buffer[:4], buffer[4:] + size_packed, buffer = buffer[:DATATYPE_SIZE], buffer[DATATYPE_SIZE:] if not size_packed: raise ConnectionError('Connection was closed') @@ -68,20 +73,28 @@ def handle_connection(connection, address): connection.sendall(response) -HOST, PORT = ADDR = '0.0.0.0', 6000 -sock = socket.socket() -sock.bind(ADDR) -sock.listen(5) - -while True: - print('Listening for new connections...') - try: - connection, address = sock.accept() - print(f'Got a connection from {address[0]}') - handle_connection(connection, address) - - except KeyboardInterrupt: - print('Stopping server...') - sock.close() - print('Server stopped') - break +def main(): + sock = socket.socket() + sock.bind(ADDR) + sock.listen(5) + + while True: + print('Listening for new connections...') + try: + connection, address = sock.accept() + print(f'Got a connection from {address[0]}') + handle_connection(connection, address) + + except KeyboardInterrupt: + print('Stopping server...') + sock.close() + print('Server stopped') + break + + +if __name__ == '__main__': + success = db.init('otrs_error.log') + if not success: + print('Не удалось инициализировать базу данных. Завершаем работу...') + else: + main() -- cgit v1.2.3