|
import os
|
|
import re
|
|
import fitz
|
|
from typing import List
|
|
|
|
def extract_text_from_pdf(file_path: str) -> str:
|
|
"""
|
|
Extracts plain text from a PDF file using PyMuPDF.
|
|
"""
|
|
doc = fitz.open(file_path)
|
|
text = ""
|
|
for page in doc:
|
|
text += page.get_text()
|
|
return text
|
|
|
|
def read_log_file(file_path: str) -> str:
|
|
"""
|
|
Reads a .log or .txt file and returns its content as text.
|
|
"""
|
|
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
return f.read()
|
|
|
|
def detect_log_format(text: str) -> str:
|
|
"""
|
|
Detects the log format using basic pattern matching.
|
|
Returns one of: 'syslog', 'json', 'cef', or 'unknown'.
|
|
"""
|
|
if re.search(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", text):
|
|
return "syslog"
|
|
elif re.search(r"\{.*\}", text):
|
|
return "json"
|
|
elif "CEF:" in text:
|
|
return "cef"
|
|
else:
|
|
return "unknown"
|
|
|
|
def parse_uploaded_files(files: List[str]) -> str:
|
|
"""
|
|
Accepts a list of uploaded files, extracts content from each,
|
|
and returns all logs as one combined string.
|
|
"""
|
|
all_logs = ""
|
|
for file_obj in files:
|
|
file_path = file_obj.name
|
|
|
|
if file_path.endswith('.pdf'):
|
|
all_logs += extract_text_from_pdf(file_path) + "\n"
|
|
elif file_path.endswith(('.log', '.txt')):
|
|
all_logs += read_log_file(file_path) + "\n"
|
|
|
|
return all_logs
|
|
|