Index: server_fix.py
===================================================================
--- server_fix.py	(revision 640ed89213ad0086dc8379de00b8d102057ead1f)
+++ server_fix.py	(revision 640ed89213ad0086dc8379de00b8d102057ead1f)
@@ -0,0 +1,918 @@
+"""
+FIXED SYSMON SERVER - Corrected API endpoints and database
+"""
+
+from flask import Flask, request, jsonify, render_template, send_from_directory
+import sqlite3
+import json
+from datetime import datetime, timedelta
+import threading
+import time
+from collections import defaultdict
+import os
+import re
+
+app = Flask(__name__)
+
+def init_database():
+    """Inicializiraј ja bazata so site polinja"""
+    conn = sqlite3.connect('sysmon_server.db', check_same_thread=False)
+    cursor = conn.cursor()
+
+    # KREIRAJ NOVA BAZA - DELETE OLD ONE FIRST
+    cursor.execute("DROP TABLE IF EXISTS sysmon_events")
+    cursor.execute("DROP TABLE IF EXISTS windows_events")
+    cursor.execute("DROP TABLE IF EXISTS system_info")
+    cursor.execute("DROP TABLE IF EXISTS processes")
+    cursor.execute("DROP TABLE IF EXISTS threats")
+    cursor.execute("DROP TABLE IF EXISTS computers")
+
+    # Kreiraј tabela za eventi so site polinja
+    cursor.execute('''
+        CREATE TABLE sysmon_events (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            event_id INTEGER,
+            event_type TEXT,
+            timestamp TEXT,
+            computer TEXT,
+            
+            -- Process Creation (Event ID 1)
+            process_name TEXT,
+            process_path TEXT,
+            command_line TEXT,
+            process_user TEXT,
+            parent_process TEXT,
+            parent_command TEXT,
+            current_directory TEXT,
+            hashes TEXT,
+            
+            -- Network Connection (Event ID 3)
+            source_ip TEXT,
+            source_port INTEGER,
+            dest_ip TEXT,
+            dest_port INTEGER,
+            protocol TEXT,
+            network_initiated TEXT,
+            
+            -- DNS Query (Event ID 22)
+            dns_query TEXT,
+            dns_results TEXT,
+            dns_status TEXT,
+            dns_process TEXT,
+            
+            -- File Create (Event ID 11)
+            file_path TEXT,
+            file_hash TEXT,
+            
+            -- DLL Loaded (Event ID 7)
+            dll_loaded TEXT,
+            dll_signed TEXT,
+            
+            -- Raw data
+            raw_data TEXT,
+            received_at TEXT
+        )
+    ''')
+
+    # Kreiraј tabela za Windows events
+    cursor.execute('''
+        CREATE TABLE windows_events (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            event_id INTEGER,
+            log_name TEXT,
+            source TEXT,
+            timestamp TEXT,
+            computer TEXT,
+            level TEXT,
+            message TEXT,
+            user TEXT,
+            process_name TEXT,
+            process_path TEXT,
+            file_created TEXT,
+            file_deleted TEXT,
+            file_modified TEXT,
+            service_name TEXT,
+            service_action TEXT,
+            login_user TEXT,
+            login_ip TEXT,
+            login_type TEXT,
+            raw_data TEXT,
+            received_at TEXT
+        )
+    ''')
+
+    # Kreiraј tabela za system info
+    cursor.execute('''
+        CREATE TABLE system_info (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            computer TEXT,
+            user TEXT,
+            os TEXT,
+            cpu_usage REAL,
+            ram_usage REAL,
+            disk_usage REAL,
+            timestamp TEXT,
+            received_at TEXT
+        )
+    ''')
+
+    # Kreiraј tabela za procesi SO EXE_PATH
+    cursor.execute('''
+        CREATE TABLE processes (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            pid INTEGER,
+            name TEXT,
+            user TEXT,
+            cpu_percent REAL,
+            memory_mb REAL,
+            cmdline TEXT,
+            exe_path TEXT,
+            timestamp TEXT,
+            computer TEXT,
+            received_at TEXT
+        )
+    ''')
+
+    # Kreiraј tabela za threats
+    cursor.execute('''
+        CREATE TABLE threats (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            computer TEXT,
+            threat_type TEXT,
+            level TEXT,
+            description TEXT,
+            details TEXT,
+            timestamp TEXT,
+            resolved BOOLEAN DEFAULT 0
+        )
+    ''')
+
+    # Kreiraј tabela za computers
+    cursor.execute('''
+        CREATE TABLE computers (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            computer_name TEXT UNIQUE,
+            user TEXT,
+            ip_address TEXT,
+            os TEXT,
+            last_seen TEXT,
+            total_events INTEGER DEFAULT 0,
+            status TEXT DEFAULT 'online'
+        )
+    ''')
+
+    # Kreiraј indeksi
+    cursor.execute('CREATE INDEX idx_computer ON sysmon_events(computer)')
+    cursor.execute('CREATE INDEX idx_event_type ON sysmon_events(event_type)')
+    cursor.execute('CREATE INDEX idx_timestamp ON sysmon_events(timestamp)')
+    cursor.execute('CREATE INDEX idx_dns_query ON sysmon_events(dns_query)')
+    cursor.execute('CREATE INDEX idx_process_name ON sysmon_events(process_name)')
+
+    conn.commit()
+    conn.close()
+    print("✅ Database initialized successfully with ALL columns")
+
+def get_db_connection():
+    """Vrati database connection"""
+    conn = sqlite3.connect('sysmon_server.db', check_same_thread=False)
+    conn.row_factory = sqlite3.Row
+    return conn
+
+# Site drugi funkcii se isti kako predhodno...
+# (kopiraј gi site funkcii od prethodniot kod)
+
+# FIXED API ENDPOINTS - koristi gi tochnite endpoints
+@app.route('/api/detailed_events')
+def api_detailed_events():
+    """Vrati detalni eventi"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    limit = request.args.get('limit', 50, type=int)
+
+    cursor.execute('SELECT * FROM sysmon_events ORDER BY timestamp DESC LIMIT ?', (limit,))
+    events = []
+
+    for row in cursor.fetchall():
+        event = dict(row)
+        event['display_text'] = format_event_for_display(row)
+        events.append(event)
+
+    conn.close()
+
+    return jsonify({
+        "events": events,
+        "count": len(events)
+    })
+
+@app.route('/api/dns_queries')
+def api_dns_queries():
+    """Vrati DNS queries"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    limit = request.args.get('limit', 100, type=int)
+
+    cursor.execute('''
+        SELECT timestamp, computer, dns_query, dns_results, dns_process
+        FROM sysmon_events 
+        WHERE dns_query != '' AND dns_query IS NOT NULL
+        ORDER BY timestamp DESC 
+        LIMIT ?
+    ''', (limit,))
+
+    dns_queries = []
+    for row in cursor.fetchall():
+        query = dict(row)
+        dns_queries.append(query)
+
+    conn.close()
+
+    return jsonify({
+        "dns_queries": dns_queries,
+        "count": len(dns_queries)
+    })
+
+@app.route('/api/process_creations')
+def api_process_creations():
+    """Vrati process creations"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    limit = request.args.get('limit', 100, type=int)
+
+    cursor.execute('''
+        SELECT timestamp, computer, process_name, command_line, process_user
+        FROM sysmon_events 
+        WHERE event_id = 1 AND process_name != ''
+        ORDER BY timestamp DESC 
+        LIMIT ?
+    ''', (limit,))
+
+    processes = []
+    for row in cursor.fetchall():
+        proc = dict(row)
+        processes.append(proc)
+
+    conn.close()
+
+    return jsonify({
+        "process_creations": processes,
+        "count": len(processes)
+    })
+
+@app.route('/api/network_connections')
+def api_network_connections():
+    """Vrati network connections"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    limit = request.args.get('limit', 100, type=int)
+
+    cursor.execute('''
+        SELECT timestamp, computer, process_name, dest_ip, dest_port
+        FROM sysmon_events 
+        WHERE event_id = 3 AND dest_ip != ''
+        ORDER BY timestamp DESC 
+        LIMIT ?
+    ''', (limit,))
+
+    connections = []
+    for row in cursor.fetchall():
+        conn_data = dict(row)
+        connections.append(conn_data)
+
+    conn.close()
+
+    return jsonify({
+        "network_connections": connections,
+        "count": len(connections)
+    })
+
+@app.route('/api/stats')
+def api_stats():
+    """Vrati statistika"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    cursor.execute("SELECT COUNT(*) FROM sysmon_events")
+    total_events = cursor.fetchone()[0]
+
+    cursor.execute("SELECT COUNT(DISTINCT computer) FROM sysmon_events")
+    total_computers = cursor.fetchone()[0]
+
+    cursor.execute("SELECT COUNT(*) FROM computers WHERE status = 'online'")
+    online_computers = cursor.fetchone()[0]
+
+    cursor.execute("SELECT COUNT(*) FROM sysmon_events WHERE dns_query != ''")
+    total_dns = cursor.fetchone()[0]
+
+    cursor.execute("SELECT COUNT(*) FROM sysmon_events WHERE event_id = 1")
+    total_processes = cursor.fetchone()[0]
+
+    cursor.execute("SELECT COUNT(*) FROM sysmon_events WHERE event_id = 3")
+    total_connections = cursor.fetchone()[0]
+
+    conn.close()
+
+    return jsonify({
+        "total_events": total_events,
+        "total_computers": total_computers,
+        "online_computers": online_computers,
+        "dns_queries": total_dns,
+        "process_creations": total_processes,
+        "network_connections": total_connections,
+        "timestamp": datetime.now().isoformat()
+    })
+
+@app.route('/api/computers')
+def api_computers():
+    """Return list of computers"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    cursor.execute('''
+        SELECT c.*, 
+               COUNT(e.id) as event_count,
+               MAX(e.timestamp) as last_event
+        FROM computers c
+        LEFT JOIN sysmon_events e ON c.computer_name = e.computer
+        GROUP BY c.computer_name
+        ORDER BY c.last_seen DESC
+    ''')
+
+    computers = []
+    for row in cursor.fetchall():
+        computer = dict(row)
+        computers.append(computer)
+
+    conn.close()
+
+    return jsonify({
+        "computers": computers,
+        "count": len(computers)
+    })
+
+@app.route('/api/dns')
+def api_dns():
+    """Return DNS queries"""
+    conn = get_db_connection()
+    cursor = conn.cursor()
+
+    limit = request.args.get('limit', 100, type=int)
+
+    cursor.execute('''
+        SELECT timestamp, computer, dns_query, dns_results, process_name
+        FROM sysmon_events 
+        WHERE dns_query IS NOT NULL AND dns_query != ''
+        ORDER BY timestamp DESC 
+        LIMIT ?
+    ''', (limit,))
+
+    dns_queries = [dict(row) for row in cursor.fetchall()]
+
+    # Get top queried domains
+    cursor.execute('''
+        SELECT dns_query, COUNT(*) as query_count
+        FROM sysmon_events 
+        WHERE dns_query IS NOT NULL AND dns_query != ''
+        GROUP BY dns_query
+        ORDER BY query_count DESC
+        LIMIT 10
+    ''')
+
+    top_domains = [dict(row) for row in cursor.fetchall()]
+
+    conn.close()
+
+    return jsonify({
+        "dns_queries": dns_queries,
+        "top_domains": top_domains,
+        "count": len(dns_queries)
+    })
+
+@app.route('/ping', methods=['GET'])
+def ping():
+    """Ping endpoint"""
+    return jsonify({
+        "message": "pong",
+        "status": "ok",
+        "server": "Fixed Sysmon Server",
+        "time": datetime.now().isoformat()
+    }), 200
+
+@app.route('/')
+def dashboard():
+    """Dashboard so popraveni API endpoints"""
+    return render_template('dashboard_fixed.html')
+
+# HTML template so popraveni API calls
+dashboard_fixed_html = '''<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Sysmon Dashboard - Fixed</title>
+    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
+    <style>
+        body { background-color: #f5f7fa; }
+        .card { margin-bottom: 20px; box-shadow: 0 2px 4px rgba(0,0,0,.05); }
+        .stat-card { border-left: 4px solid; }
+        .event-item { padding: 10px; border-left: 3px solid; margin-bottom: 5px; background: white; }
+        .event-dns { border-left-color: #3498db; }
+        .event-process { border-left-color: #2ecc71; }
+        .event-network { border-left-color: #e74c3c; }
+        .tab-content { padding-top: 20px; }
+    </style>
+</head>
+<body>
+    <nav class="navbar navbar-dark bg-dark">
+        <div class="container-fluid">
+            <span class="navbar-brand">
+                <i class="fas fa-shield-alt"></i> Sysmon Dashboard
+            </span>
+            <span class="navbar-text" id="currentTime"></span>
+        </div>
+    </nav>
+
+    <div class="container-fluid mt-3">
+        <!-- Stats -->
+        <div class="row mb-3">
+            <div class="col-md-2">
+                <div class="card stat-card border-left-primary">
+                    <div class="card-body">
+                        <h6>Total Events</h6>
+                        <h3 id="totalEvents">0</h3>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-2">
+                <div class="card stat-card border-left-success">
+                    <div class="card-body">
+                        <h6>Computers</h6>
+                        <h3><span id="onlineComputers">0</span>/<span id="totalComputers">0</span></h3>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-2">
+                <div class="card stat-card border-left-info">
+                    <div class="card-body">
+                        <h6>DNS Queries</h6>
+                        <h3 id="dnsCount">0</h3>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-2">
+                <div class="card stat-card border-left-warning">
+                    <div class="card-body">
+                        <h6>Processes</h6>
+                        <h3 id="processCount">0</h3>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-2">
+                <div class="card stat-card border-left-danger">
+                    <div class="card-body">
+                        <h6>Network</h6>
+                        <h3 id="networkCount">0</h3>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-2">
+                <div class="card stat-card border-left-secondary">
+                    <div class="card-body">
+                        <h6>Last Update</h6>
+                        <h6 id="lastUpdate">Just now</h6>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Tabs -->
+        <ul class="nav nav-tabs">
+            <li class="nav-item">
+                <a class="nav-link active" data-bs-toggle="tab" href="#events">
+                    <i class="fas fa-list"></i> All Events
+                </a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" data-bs-toggle="tab" href="#dns">
+                    <i class="fas fa-globe"></i> DNS
+                </a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" data-bs-toggle="tab" href="#processes">
+                    <i class="fas fa-cogs"></i> Processes
+                </a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" data-bs-toggle="tab" href="#network">
+                    <i class="fas fa-wifi"></i> Network
+                </a>
+            </li>
+        </ul>
+
+        <div class="tab-content">
+            <!-- Events Tab -->
+            <div id="events" class="tab-pane active">
+                <div class="card">
+                    <div class="card-header">
+                        <h5>Recent Events</h5>
+                    </div>
+                    <div class="card-body">
+                        <div id="eventsList">Loading...</div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- DNS Tab -->
+            <div id="dns" class="tab-pane">
+                <div class="card">
+                    <div class="card-header">
+                        <h5>DNS Queries</h5>
+                    </div>
+                    <div class="card-body">
+                        <table class="table table-sm">
+                            <thead>
+                                <tr>
+                                    <th>Time</th>
+                                    <th>Computer</th>
+                                    <th>Domain</th>
+                                    <th>Results</th>
+                                    <th>Process</th>
+                                </tr>
+                            </thead>
+                            <tbody id="dnsTable">
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Processes Tab -->
+            <div id="processes" class="tab-pane">
+                <div class="card">
+                    <div class="card-header">
+                        <h5>Process Executions</h5>
+                    </div>
+                    <div class="card-body">
+                        <table class="table table-sm">
+                            <thead>
+                                <tr>
+                                    <th>Time</th>
+                                    <th>Computer</th>
+                                    <th>Process</th>
+                                    <th>User</th>
+                                    <th>Command</th>
+                                </tr>
+                            </thead>
+                            <tbody id="processesTable">
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Network Tab -->
+            <div id="network" class="tab-pane">
+                <div class="card">
+                    <div class="card-header">
+                        <h5>Network Connections</h5>
+                    </div>
+                    <div class="card-body">
+                        <table class="table table-sm">
+                            <thead>
+                                <tr>
+                                    <th>Time</th>
+                                    <th>Computer</th>
+                                    <th>Process</th>
+                                    <th>Destination</th>
+                                    <th>Port</th>
+                                </tr>
+                            </thead>
+                            <tbody id="networkTable">
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Bootstrap JS -->
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
+    
+    <script>
+        // Popraveni API endpoints
+        const API_ENDPOINTS = {
+            stats: '/api/stats',
+            events: '/api/detailed_events',
+            dns: '/api/dns_queries',
+            processes: '/api/process_creations',
+            network: '/api/network_connections',
+            computers: '/api/computers'
+        };
+        
+        $(document).ready(function() {
+            updateTime();
+            loadAllData();
+            setInterval(loadAllData, 10000);
+            setInterval(updateTime, 1000);
+        });
+        
+        function updateTime() {
+            $('#currentTime').text(new Date().toLocaleString());
+        }
+        
+        function loadAllData() {
+            loadStats();
+            loadEvents();
+            loadDNS();
+            loadProcesses();
+            loadNetwork();
+        }
+        
+        function loadStats() {
+            $.get(API_ENDPOINTS.stats, function(data) {
+                $('#totalEvents').text(data.total_events);
+                $('#totalComputers').text(data.total_computers);
+                $('#onlineComputers').text(data.online_computers);
+                $('#dnsCount').text(data.dns_queries);
+                $('#processCount').text(data.process_creations);
+                $('#networkCount').text(data.network_connections);
+                $('#lastUpdate').text(new Date().toLocaleTimeString());
+            });
+        }
+        
+        function loadEvents() {
+            $.get(API_ENDPOINTS.events + '?limit=20', function(data) {
+                let html = '';
+                data.events.forEach(event => {
+                    let badge = '';
+                    let text = '';
+                    
+                    if (event.event_id === 22 && event.dns_query) {
+                        badge = '<span class="badge bg-info me-2">DNS</span>';
+                        text = `Query: <strong>${event.dns_query}</strong> → ${event.dns_results || 'No results'} (Process: ${event.dns_process || 'Unknown'})`;
+                    }
+                    else if (event.event_id === 1 && event.process_name) {
+                        badge = '<span class="badge bg-success me-2">PROCESS</span>';
+                        const procName = event.process_name.split('\\').pop();
+                        text = `Process: <strong>${procName}</strong> | User: ${event.process_user || 'Unknown'} | Cmd: ${event.command_line ? event.command_line.substring(0, 80) + '...' : 'N/A'}`;
+                    }
+                    else if (event.event_id === 3 && event.dest_ip) {
+                        badge = '<span class="badge bg-danger me-2">NETWORK</span>';
+                        const procName = event.process_name ? event.process_name.split('\\').pop() : 'Unknown';
+                        text = `Connection: <strong>${procName}</strong> → ${event.dest_ip}:${event.dest_port}`;
+                    }
+                    else {
+                        badge = `<span class="badge bg-secondary me-2">${event.event_type}</span>`;
+                        text = event.event_type;
+                    }
+                    
+                    html += `
+                        <div class="event-item">
+                            <div class="small text-muted">${formatTime(event.timestamp)} | ${event.computer}</div>
+                            <div>${badge} ${text}</div>
+                        </div>
+                    `;
+                });
+                $('#eventsList').html(html);
+            });
+        }
+        
+        function loadDNS() {
+            $.get(API_ENDPOINTS.dns + '?limit=20', function(data) {
+                let html = '';
+                data.dns_queries.forEach(query => {
+                    const process = query.dns_process ? query.dns_process.split('\\').pop() : 'Unknown';
+                    html += `
+                        <tr>
+                            <td>${formatTime(query.timestamp)}</td>
+                            <td>${query.computer}</td>
+                            <td><strong>${query.dns_query}</strong></td>
+                            <td>${query.dns_results || 'N/A'}</td>
+                            <td>${process}</td>
+                        </tr>
+                    `;
+                });
+                $('#dnsTable').html(html);
+            });
+        }
+        
+        function loadProcesses() {
+            $.get(API_ENDPOINTS.processes + '?limit=20', function(data) {
+                let html = '';
+                data.process_creations.forEach(proc => {
+                    const processName = proc.process_name ? proc.process_name.split('\\').pop() : 'Unknown';
+                    html += `
+                        <tr>
+                            <td>${formatTime(proc.timestamp)}</td>
+                            <td>${proc.computer}</td>
+                            <td><strong>${processName}</strong></td>
+                            <td>${proc.process_user || 'N/A'}</td>
+                            <td><small>${proc.command_line ? proc.command_line.substring(0, 80) + '...' : 'N/A'}</small></td>
+                        </tr>
+                    `;
+                });
+                $('#processesTable').html(html);
+            });
+        }
+        
+        function loadNetwork() {
+            $.get(API_ENDPOINTS.network + '?limit=20', function(data) {
+                let html = '';
+                data.network_connections.forEach(conn => {
+                    const processName = conn.process_name ? conn.process_name.split('\\').pop() : 'Unknown';
+                    html += `
+                        <tr>
+                            <td>${formatTime(conn.timestamp)}</td>
+                            <td>${conn.computer}</td>
+                            <td>${processName}</td>
+                            <td>${conn.dest_ip}</td>
+                            <td>${conn.dest_port}</td>
+                        </tr>
+                    `;
+                });
+                $('#networkTable').html(html);
+            });
+        }
+        
+        function formatTime(timestamp) {
+            if (!timestamp) return 'N/A';
+            const date = new Date(timestamp);
+            return date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
+        }
+    </script>
+</body>
+</html>
+'''
+
+# Dodadi gi site funkcii sto nedostavaat (od prethodniot kod)
+def update_computer_status(computer_name, user, ip_address, os_info):
+    conn = get_db_connection()
+    cursor = conn.cursor()
+    try:
+        cursor.execute('''
+            INSERT OR REPLACE INTO computers 
+            (computer_name, user, ip_address, os, last_seen, status)
+            VALUES (?, ?, ?, ?, ?, ?)
+        ''', (computer_name, user, ip_address, os_info, datetime.now().isoformat(), 'online'))
+        conn.commit()
+    except Exception as e:
+        print(f"Error updating computer status: {e}")
+    finally:
+        conn.close()
+
+def parse_sysmon_event_data(event_data):
+    result = {}
+    result['process_name'] = event_data.get('Image', '')
+    result['command_line'] = event_data.get('CommandLine', '')
+    result['process_user'] = event_data.get('User', '')
+    result['parent_process'] = event_data.get('ParentImage', '')
+    result['dns_query'] = event_data.get('QueryName', '')
+    result['dns_results'] = event_data.get('QueryResults', '')
+    result['dns_process'] = event_data.get('Image', '')
+    result['source_ip'] = event_data.get('SourceIp', '')
+    result['dest_ip'] = event_data.get('DestinationIp', '')
+    result['dest_port'] = event_data.get('DestinationPort', '')
+    result['file_path'] = event_data.get('TargetFilename', '')
+    return result
+
+def format_event_for_display(row):
+    event_id = row['event_id']
+    if event_id == 22 and row['dns_query']:
+        return f"DNS Query: {row['dns_query']} → {row['dns_results'] or 'No results'} (Process: {row['dns_process'] or 'Unknown'})"
+    elif event_id == 1 and row['process_name']:
+        proc_name = row['process_name'].split('\\')[-1] if '\\' in row['process_name'] else row['process_name']
+        return f"Process: {proc_name} | User: {row['process_user'] or 'Unknown'}"
+    elif event_id == 3 and row['dest_ip']:
+        proc_name = row['process_name'].split('\\')[-1] if row['process_name'] and '\\' in row['process_name'] else row['process_name'] or 'Unknown'
+        return f"Network: {proc_name} → {row['dest_ip']}:{row['dest_port']}"
+    return f"Event {event_id}: {row['event_type']}"
+
+@app.route('/receive_data', methods=['POST'])
+def receive_data():
+    try:
+        data = request.json
+        if not data:
+            return jsonify({"error": "No data"}), 400
+
+        computer_name = data.get("metadata", {}).get("computer", "Unknown")
+        user = data.get("metadata", {}).get("user", "Unknown")
+
+        conn = get_db_connection()
+        cursor = conn.cursor()
+
+        events_inserted = 0
+
+        # Update computer
+        system_info = data.get("system_info", {})
+        update_computer_status(
+            computer_name,
+            user,
+            system_info.get("ip_address", "Unknown"),
+            system_info.get("os", "Unknown")
+        )
+
+        # Save sysmon events
+        if "sysmon_events" in data:
+            for event in data["sysmon_events"]:
+                try:
+                    event_data = event.get("data", {})
+                    parsed = parse_sysmon_event_data(event_data)
+
+                    cursor.execute('''
+                        INSERT INTO sysmon_events 
+                        (event_id, event_type, timestamp, computer,
+                         process_name, command_line, process_user, parent_process,
+                         dns_query, dns_results, dns_process,
+                         source_ip, dest_ip, dest_port, file_path,
+                         raw_data, received_at)
+                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+                    ''', (
+                        event.get("event_id"),
+                        event.get("event_type"),
+                        event.get("timestamp"),
+                        event.get("computer"),
+                        parsed['process_name'],
+                        parsed['command_line'],
+                        parsed['process_user'],
+                        parsed['parent_process'],
+                        parsed['dns_query'],
+                        parsed['dns_results'],
+                        parsed['dns_process'],
+                        parsed['source_ip'],
+                        parsed['dest_ip'],
+                        parsed['dest_port'],
+                        parsed['file_path'],
+                        json.dumps(event_data),
+                        datetime.now().isoformat()
+                    ))
+                    events_inserted += 1
+                except Exception as e:
+                    print(f"Error inserting event: {e}")
+                    continue
+
+        # Save processes (bez exe_path)
+        if "processes" in data:
+            for proc in data["processes"]:
+                try:
+                    cursor.execute('''
+                        INSERT INTO processes 
+                        (pid, name, user, cpu_percent, memory_mb, cmdline, timestamp, computer, received_at)
+                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
+                    ''', (
+                        proc.get("pid"),
+                        proc.get("name"),
+                        proc.get("user"),
+                        proc.get("cpu_percent", 0),
+                        proc.get("memory_mb", 0),
+                        proc.get("cmdline", ""),
+                        datetime.now().isoformat(),
+                        computer_name,
+                        datetime.now().isoformat()
+                    ))
+                except Exception as e:
+                    print(f"Error inserting process: {e}")
+                    continue
+
+        conn.commit()
+        conn.close()
+
+        return jsonify({
+            "message": "OK",
+            "events_inserted": events_inserted
+        }), 200
+
+    except Exception as e:
+        return jsonify({"error": str(e)}), 500
+
+# Write template
+if not os.path.exists('templates'):
+    os.makedirs('templates')
+
+with open('templates/dashboard_fixed.html', 'w', encoding='utf-8') as f:
+    f.write(dashboard_fixed_html)
+
+if __name__ == '__main__':
+    # REINITIALIZE DATABASE
+    init_database()
+
+    print("\n" + "="*60)
+    print("🚀 FIXED SYSMON SERVER")
+    print("="*60)
+    print("📊 Dashboard: http://localhost:5555/")
+    print("📡 Correct API Endpoints:")
+    print("   - GET /api/detailed_events    - All events")
+    print("   - GET /api/dns_queries        - DNS queries")
+    print("   - GET /api/process_creations  - Process executions")
+    print("   - GET /api/network_connections - Network connections")
+    print("   - GET /api/stats              - Statistics")
+    print("   - POST /receive_data          - Receive client data")
+    print("\n✅ Database recreated with correct schema")
+    print("="*60)
+
+    app.run(host='0.0.0.0', port=5555, debug=True)
