Загрузка данных


blacklist_ips = {"85.234.12.1"}

def parse_log_line(line: str) -> dict:
    parts = line.split()

    try:
        return {
            "ip": parts[0],
            "user": None if parts[2] == "-" else parts[2],
            "method": parts[5].strip('"'),
            "path": parts[6],
            "status_code": int(parts[-1])
        }
    except (ValueError, IndexError):
        return None


def is_suspicious(log_dict: dict, blacklist: set) -> bool:
    if log_dict["ip"] in blacklist:
        return True

    if log_dict["status_code"] in (401, 403):
        return True

    if log_dict["path"].startswith("/admin"):
        return True

    return False


def count_failed_logins(logs_list: list) -> dict:
    result = {}
    for log in logs_list:
        if log["status_code"] == 401:
            ip = log["ip"]
            result[ip] = result.get(ip, 0) + 1

    return result
test_line = '192.168.1.10 - - [10/Oct/2023:13:55:36] "GET /index.html HTTP/1.1" 401'
result = parse_log_line(test_line)


all_logs = []
with open("network_log.txt", "r", encoding="utf-8") as f:
    for line in f:

        line = line.strip()
        print("СЫРАЯ СТРОКА", line)
        if not line:
            continue
        parsed = parse_log_line(line)

        if parsed is None:
            print("СЫРАЯ СТРОКА", line)
            continue

        all_logs.append(parsed)

with open("suspicious_report.txt", "w", encoding="utf-8") as f:
    for log in all_logs:
        if is_suspicious(log, blacklist_ips):
            message = f"[ВНИМАНИЕ] IP: {log['ip']} | Путь: {log['path']} | Код: {log['status_code']}\n"
            f.write(message)

failed_logins = count_failed_logins(all_logs)

for ip, count in failed_logins.items():
    print(f"IP {ip}: {count} неудачных попыток входа")
print(all_logs)