- Ping постов на факт доступа
- Помечаем те посты которые недоступны "НЕТ ДОСТУПА"
def get_log_list(base_url):
url = base_url.rstrip('/') + "/api/log"
try:
with urllib.request.urlopen(url, timeout=10) as resp:
data = json.loads(resp.read().decode('utf-8'))
return data.get("entries", [])
except Exception as e:
print(f"[ОШИБКА] Не удалось получить список с {base_url}: {e}")
return []
def filter_logs_by_date(entries, target_date):
pattern = re.compile(rf"imtf-nova.{re.escape(target_date)}.0.log")
return [e for e in entries if pattern.match(e.get("filename", ""))]
def find_current_log(entries):
return next((e for e in entries if e.get("filename") == "imtf-nova.log"), None)
def download_file(base_url, code, original_filename, output_dir, ip_label, suffix="", timeout=30):
if suffix:
base_name = f"{ip_label}{original_filename}"
name_parts = os.path.splitext(base_name)
new_filename = f"{name_parts[0]}"
else:
new_filename = f"{ip_label}_{original_filename}"
local_path = os.path.join(output_dir, new_filename)
if not OVERWRITE and os.path.exists(local_path):
print(f"[ПРОПУСК] {new_filename} уже существует")
return True, local_path
download_url = base_url.rstrip('/') + f"/api/log/download/{code}"
for attempt in range(2):
try:
req = urllib.request.Request(download_url)
with urllib.request.urlopen(req, timeout=timeout) as resp:
with open(local_path, 'wb') as f:
while chunk := resp.read(8192):
f.write(chunk)
print(f"[СКАЧАН] {new_filename} (с {base_url})")
return True, local_path
except Exception as e:
if attempt == 0:
print(f"[ПОВТОР] {new_filename}: {e}. Повторная попытка через 5 секунд...")
time.sleep(5)
else:
print(f"[ОШИБКА] {new_filename}: {e}")
return False, None
return False, None
def process_server(base_url, output_dir, target_date):
ip = get_ip_from_url(base_url)
ip_label = extract_variable_part(ip)
print(f"\n=== Обработка {base_url} (пост {ip_label}) ===")
entries = get_log_list(base_url)
if not entries:
return None
filtered = filter_logs_by_date(entries, target_date)
if filtered:
print(f"Найдено точных логов за {target_date}: {len(filtered)}")
success, local_path = download_file(base_url, filtered[0]["code"], filtered[0]["filename"],
output_dir, ip_label, timeout=RETRY_TIMEOUT)
if success:
return ip_label, local_path, "exact"
else:
print(f"Точный лог за {target_date} не найден. Пробуем скачать текущий imtf-nova.log")
current = find_current_log(entries)
if current:
success, local_path = download_file(base_url, current["code"], current["filename"],
output_dir, ip_label, suffix=target_date, timeout=RETRY_TIMEOUT)
if success:
return ip_label, local_path, "current"
else:
print(f"[ПРЕДУПРЕЖДЕНИЕ] На сервере {base_url} нет ни лога за дату, ни текущего imtf-nova.log")
return None
- Пропускать ПОСТЫ помеченные как "НЕТ ДОСТУПА"
- Начинаем поиск логов imtf-apvgk.{date}.0.log ; imtf-apvgk.{date}.1.log
- Если не найден не один вывести сообщение "НЕИСПРАВЕН"
- Если не найден imtf-apvgk.{date}.1.log просто продолжить штатную работы
- Если не найден imtf-nova.{date}.0.log сделать пометку, что imtf-nova.{date}.0.log не найден
- При скачивание логов помечать в название с кого поста скачен лог
- Сохранить все файлы в созданную папку "{date}.apvgk"
- Пропускать ПОСТЫ помеченные как "НЕТ ДОСТУПА"
- Начинаем поиск логов imtf-apvgk.{date}.0.log ; imtf-apvgk.{date}.1.log
- Если не найден imtf-nova.{date}.0.log сделать пометку, что imtf-nova.{date}.0.log не найден
- При скачивание логов помечать в название с кого поста скачен лог
- Сохранить все файлы в созданную папку "{date}.imtf-nova.{date}.0.log "
- Пропускать ПОСТЫ помеченные как "НЕТ ДОСТУПА"
- Начинаем поиск логов imtf-nova.log
- Если не найден не один вывести сообщение "НЕИСПРАВЕН"
- При скачивание логов помечать в название с кого поста скачен лог
- Сохранить все файлы в созданную папку "{date}.imtf-nova.log"
- Начать проверку всех скаченных логов imtf-apvgk.{date}.0.log и imtf-apvgk.{date}.1.log на события "Scenario '.+?' matched" или "Найдено совпадение - ВЫВОДИМ НА ТАБЛО"
- Подсчитать для каждого файла количество событий
- Сложить количество событий логов imtf-apvgk.{date}.0.log и imtf-apvgk.{date}.1.log, если они скачены с одного поста.
- Если события не найдены и значение равно 0, вывести 0
- Если события не найдены и значение равно 0 в логах ПОСТОВ 125 и 126 вывести пометку "Проверить"
- Итоговые значения файлов присвоить посту откуда они были скачены
- Начать проверку всех скаченных логов imtf-nova.{date}.0.log на события "Playing event Event"
- Подсчитать для каждого файла количество событий
- Если ничего не найдено проверить на событие "items=1"
- Подсчитать для каждого файла количество событий
- Если события 1 и 2 не найдены и значение равно 0, вывести 0
- Если события не найдены и значение равно 0 в логах ПОСТОВ 125 и 126 вывести пометку "Проверить"
- Итоговые значения файлов присвоить посту откуда они были скачены
- Начать проверку всех скаченных логов imtf-nova.{date}.0.log на события "Playing event Event", также проверять дату события
- Подсчитывать событие если ее дата совпадает заданной для каждого файла
- Если ничего не найдено проверить на событие "items=1" считывать событие если ее дата совпадает заданной
- Подсчитать для каждого файла количество событий
- Если события 1 и 2 не найдены или дата событий не совпадают с заданной вывести 0
- Если события не найдены и значение равно 0 в логах ПОСТОВ 125 и 126 вывести пометку "Проверить"
- Итоговые значения файлов присвоить посту откуда они были скачены
- По завершению подсчётов всех событий для каждого файла начать сравнение
- Сравнить количество событий логов imtf-apvgk и imtf-nova.{date}.0.log по постам
- Если значения событий равны пост помечать "ШТАТНО" и выводить количество событий
- Если значения событий imtf-apvgk больше imtf-nova.{date}.0.log то пост помечать "НЕКОРЕКТНАЯ РАБОТА"
- Если значения событий imtf-nova.{date}.0.log больше imtf-apvgk то пост помечать "ПЕРЕПРОВЕРИТЬ"
- Если imtf-nova.{date}.0.log поста отсутствует, то imtf-apvgk поста необходимо сравнить с imtf-nova.log этого поста
- Если значения событий imtf-apvgk больше imtf-nova.log то пост помечать "НЕКОРЕКТНАЯ РАБОТА. РУЧНАЯ ПРОВЕРКА"
- Проверять логи imtf-nova.{date}.0.log или imtf-nova.log на события с IP, если поста помечен "ШТАТНО"
- Начать проверку всех скаченных логов imtf-nova.{date}.0.log или imtf-nova.log на события "Playing event Event(connection=192.168.###.30"
- Начать проверку всех скаченных логов imtf-nova.{date}.0.log или imtf-nova.log на события "Playing event Event(connection=192.168.###.31"
- Начать проверку всех скаченных логов imtf-nova.{date}.0.log или imtf-nova.log на события "Playing event Event(connection=192.168.###.32"
- Если в файле найдены события "Playing event Event(connection=192.168.###.30" и "Playing event Event(connection=192.168.###.31", то количество "Playing event Event(connection=192.168.###.30" выводить с пометкой "Направление 1 ", а "Playing event Event(connection=192.168.###.31" выводить с пометкой "Направление 2 "
- Если в файле найдены события "Playing event Event(connection=192.168.###.31" и "Playing event Event(connection=192.168.###.32", то количество "Playing event Event(connection=192.168.###.31" выводить с пометкой "Направление 1 ", а "Playing event Event(connection=192.168.###.32" выводить с пометкой "Направление 2 "
- Если в файле не найдено, то выводить 0
Собрка финальной таблице все финальные