diff options
Diffstat (limited to 'day4')
| -rw-r--r-- | day4/task3/client.py | 77 | ||||
| -rw-r--r-- | day4/task3/db.py | 68 | ||||
| -rw-r--r-- | day4/task3/server.py | 53 |
3 files changed, 125 insertions, 73 deletions
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<date>.*?)\]\[(?P<type>.*?)\]\[(?P<module>.*?)\]\[(?P<id>.*?)\] (?P<text>.*)') 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<date>.*?)\]\[(?P<type>.*?)\]\[(?P<module>.*?)\]\[(?P<id>.*?)\] (?P<text>.*)') + + 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() |