summaryrefslogtreecommitdiff
path: root/day4/task3
diff options
context:
space:
mode:
Diffstat (limited to 'day4/task3')
-rw-r--r--day4/task3/client.py77
-rw-r--r--day4/task3/db.py68
-rw-r--r--day4/task3/server.py53
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()