#!/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 = '''
Connected Computers: ''' + str(len(computers)) + '''
Server IP: ''' + socket.gethostbyname(socket.gethostname()) + ''':5555
👤 User:
🌐 IP:
💻 OS:
📅 First Seen:
⏰ Last Seen:
📊 Total Logs:
| Time | CPU % | RAM % | Disk % | Processes |
|---|
| PID | Name | User | Time |
|---|