#!/usr/bin/env python3 """ POPRAVEN SERVER - So azhuriranje na postoechki zapisi i detalni informacii """ from flask import Flask, request, jsonify import json import sqlite3 from datetime import datetime, timedelta import os import socket app = Flask(__name__) DB_FILE = "lan_logs_fixed.db" LOG_DIR = "received_data_fixed" def init_database(): """Kreiraј pobolshana baza""" os.makedirs(LOG_DIR, exist_ok=True) conn = sqlite3.connect(DB_FILE) c = conn.cursor() # Tabela za kompjuteri (SEGA so edinstveno ime) c.execute('''CREATE TABLE IF NOT EXISTS computers (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, user TEXT, ip TEXT, os TEXT, first_seen TIMESTAMP, last_seen TIMESTAMP)''') # Tabela za history (site podatoci) c.execute('''CREATE TABLE IF NOT EXISTS computer_history (id INTEGER PRIMARY KEY AUTOINCREMENT, computer_id INTEGER, cpu_usage REAL, ram_usage REAL, disk_usage REAL, process_count INTEGER, timestamp TIMESTAMP, FOREIGN KEY(computer_id) REFERENCES computers(id))''') # Tabela za procesi (so vremenska oznaka) c.execute('''CREATE TABLE IF NOT EXISTS computer_processes (id INTEGER PRIMARY KEY AUTOINCREMENT, computer_id INTEGER, pid INTEGER, name TEXT, cpu_percent REAL, memory_mb REAL, username TEXT, timestamp TIMESTAMP, FOREIGN KEY(computer_id) REFERENCES computers(id))''') conn.commit() conn.close() print(f"✅ Database created: {DB_FILE}") @app.route('/receive', methods=['POST']) def receive_data(): try: data = request.json if not data: return jsonify({"error": "No data"}), 400 info = data['info'] computer_name = info['computer_name'] timestamp = datetime.now() conn = sqlite3.connect(DB_FILE) c = conn.cursor() # Proveri dali kompjuterot veќe postoi c.execute("SELECT id FROM computers WHERE name = ?", (computer_name,)) result = c.fetchone() if result: # Kompjuterot postoi - azhuriraј go computer_id = result[0] c.execute('''UPDATE computers SET user = ?, ip = ?, os = ?, last_seen = ? WHERE id = ?''', (info['user'], info['ip_address'], info['os'], timestamp.isoformat(), computer_id)) else: # Nov kompjuter - dodadi go c.execute('''INSERT INTO computers (name, user, ip, os, first_seen, last_seen) VALUES (?, ?, ?, ?, ?, ?)''', (computer_name, info['user'], info['ip_address'], info['os'], timestamp.isoformat(), timestamp.isoformat())) computer_id = c.lastrowid # Dodadi vo history c.execute('''INSERT INTO computer_history (computer_id, cpu_usage, ram_usage, disk_usage, process_count, timestamp) VALUES (?, ?, ?, ?, ?, ?)''', (computer_id, info['cpu_usage'], info['ram_usage'], info['disk_usage'], len(data.get('processes', [])), info['timestamp'])) # Zachuvaj gi procesite for proc in data.get('processes', []): c.execute('''INSERT INTO computer_processes (computer_id, pid, name, username, timestamp) VALUES (?, ?, ?, ?, ?)''', (computer_id, proc.get('pid'), proc.get('name'), proc.get('user'), info['timestamp'])) conn.commit() conn.close() # Zachuvaj vo JSON save_json_file(data) print(f"[{timestamp.strftime('%H:%M:%S')}] 📥 {computer_name}: " f"CPU {info['cpu_usage']}% | RAM {info['ram_usage']}%") return jsonify({ "status": "success", "message": f"Data saved for {computer_name}", "computer_id": computer_id, "timestamp": timestamp.isoformat() }) except Exception as e: print(f"[-] Greshka: {e}") return jsonify({"error": str(e)}), 500 def save_json_file(data): """Zachuvaj vo JSON""" info = data['info'] computer_name = info['computer_name'] date_str = datetime.now().strftime("%Y%m%d") # Kreiraј folder za kompjuterot computer_dir = os.path.join(LOG_DIR, computer_name) os.makedirs(computer_dir, exist_ok=True) # Fajl za denes filepath = os.path.join(computer_dir, f"{date_str}.json") # Dodadi vo postoechki fajl ili kreiraј nov if os.path.exists(filepath): with open(filepath, 'r', encoding='utf-8') as f: existing_data = json.load(f) else: existing_data = [] # Dodadi nov zapis existing_data.append({ "timestamp": info['timestamp'], "data": info, "processes_count": len(data.get('processes', [])) }) # Zachuvaj with open(filepath, 'w', encoding='utf-8') as f: json.dump(existing_data, f, indent=2, ensure_ascii=False) @app.route('/') def dashboard(): """Glaven dashboard so site kompjuteri""" conn = sqlite3.connect(DB_FILE) c = conn.cursor() # Zemaj gi site kompjuteri c.execute('''SELECT name, user, ip, os, first_seen, last_seen FROM computers ORDER BY last_seen DESC''') computers = [] for row in c.fetchall(): # Presmetaj kolku zapisi ima vo poslednite 24 chasa c.execute('''SELECT COUNT(*) FROM computer_history WHERE computer_id = (SELECT id FROM computers WHERE name = ?) AND timestamp > datetime('now', '-24 hours')''', (row[0],)) recent_logs = c.fetchone()[0] # Zemaj gi poslednite 5 zapisi za CPU/RAM c.execute('''SELECT cpu_usage, ram_usage, timestamp FROM computer_history WHERE computer_id = (SELECT id FROM computers WHERE name = ?) ORDER BY timestamp DESC LIMIT 5''', (row[0],)) recent_metrics = c.fetchall() # Presmetaj prosek avg_cpu = sum(m[0] for m in recent_metrics) / len(recent_metrics) if recent_metrics else 0 avg_ram = sum(m[1] for m in recent_metrics) / len(recent_metrics) if recent_metrics else 0 computers.append({ 'name': row[0], 'user': row[1], 'ip': row[2], 'os': row[3], 'first_seen': row[4], 'last_seen': row[5], 'recent_logs': recent_logs, 'avg_cpu': round(avg_cpu, 1), 'avg_ram': round(avg_ram, 1), 'status': 'online' if (datetime.now() - datetime.fromisoformat(row[5])).seconds < 60 else 'offline' }) conn.close() # Generiraј HTML html = ''' LAN Log Server - Fixed Dashboard

🖥️ LAN Log Server - Fixed Dashboard

Connected Computers: ''' + str(len(computers)) + '''

Server IP: ''' + socket.gethostbyname(socket.gethostname()) + ''':5555

Connected Computers

''' for comp in computers: html += f'''
{comp['name']}
👤 User: {comp['user']}
🌐 IP: {comp['ip']}
💻 OS: {comp['os']}
⏰ Last seen: {datetime.fromisoformat(comp['last_seen']).strftime('%H:%M:%S')}
● {comp['status'].upper()}
{comp['avg_cpu']}%
CPU
{comp['avg_ram']}%
RAM
{comp['recent_logs']}
Logs (24h)
''' html += '''
×

Computer Details

👤 User:

🌐 IP:

💻 OS:

📅 First Seen:

⏰ Last Seen:

📊 Total Logs:

Performance History

Time CPU % RAM % Disk % Processes

Recent Processes

PID Name User Time

Performance Chart

''' return html @app.route('/api/computer/') def get_computer_details(computer_name): """Dobi site detalni informacii za eden kompjuter""" conn = sqlite3.connect(DB_FILE) c = conn.cursor() # Osnovni informacii c.execute('''SELECT id, name, user, ip, os, first_seen, last_seen FROM computers WHERE name = ?''', (computer_name,)) computer_data = c.fetchone() if not computer_data: conn.close() return jsonify({"error": "Computer not found"}), 404 computer_id = computer_data[0] # Broj na site zapisi c.execute('SELECT COUNT(*) FROM computer_history WHERE computer_id = ?', (computer_id,)) total_logs = c.fetchone()[0] # Site history zapisi c.execute('''SELECT cpu_usage, ram_usage, disk_usage, process_count, timestamp FROM computer_history WHERE computer_id = ? ORDER BY timestamp DESC LIMIT 100''', (computer_id,)) history = [] for row in c.fetchall(): history.append({ 'cpu_usage': row[0], 'ram_usage': row[1], 'disk_usage': row[2], 'process_count': row[3], 'timestamp': row[4] }) # Posledni procesi c.execute('''SELECT pid, name, username, timestamp FROM computer_processes WHERE computer_id = ? ORDER BY timestamp DESC LIMIT 50''', (computer_id,)) recent_processes = [] for row in c.fetchall(): recent_processes.append({ 'pid': row[0], 'name': row[1], 'username': row[2], 'timestamp': row[3] }) conn.close() return jsonify({ 'computer': { 'id': computer_data[0], 'name': computer_data[1], 'user': computer_data[2], 'ip': computer_data[3], 'os': computer_data[4], 'first_seen': computer_data[5], 'last_seen': computer_data[6], 'total_logs': total_logs }, 'history': history, 'recent_processes': recent_processes }) @app.route('/ping') def ping(): return jsonify({ 'status': 'alive', 'server_time': datetime.now().isoformat() }) def get_local_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) local_ip = s.getsockname()[0] s.close() return local_ip except: return "127.0.0.1" if __name__ == '__main__': init_database() local_ip = get_local_ip() print("\n" + "=" * 70) print("🚀 FIXED LAN LOG SERVER") print("=" * 70) print(f"🌐 Server IP: {local_ip}:5555") print(f"📊 Dashboard: http://{local_ip}:5555/") print(f"📊 Alternative: http://localhost:5555/") print(f"🏥 Health check: http://{local_ip}:5555/ping") print("\n📡 Data will be grouped by computer name") print("✅ Each computer appears only once") print("✅ Click on computer to see all collected data") print("=" * 70 + "\n") app.run(host='0.0.0.0', port=5555, debug=False)