"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardHeader, CardTitle } from "./ui/card" import { Progress } from "./ui/progress" import { Badge } from "./ui/badge" import { XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area } from "recharts" import { Cpu, MemoryStick, Thermometer, Users, Activity, Server, Zap } from "lucide-react" interface SystemData { cpu_usage: number memory_usage: number memory_total: number memory_used: number temperature: number uptime: string load_average: number[] hostname: string node_id: string timestamp: string } interface VMData { vmid: number name: string status: string cpu: number mem: number maxmem: number disk: number maxdisk: number uptime: number } const cpuData = [ { time: "00:00", value: 45 }, { time: "04:00", value: 52 }, { time: "08:00", value: 78 }, { time: "12:00", value: 65 }, { time: "16:00", value: 82 }, { time: "20:00", value: 58 }, { time: "24:00", value: 43 }, ] const memoryData = [ { time: "00:00", used: 12.5, available: 19.5 }, { time: "04:00", used: 14.2, available: 17.8 }, { time: "08:00", used: 18.7, available: 13.3 }, { time: "12:00", used: 16.3, available: 15.7 }, { time: "16:00", used: 21.1, available: 10.9 }, { time: "20:00", used: 15.8, available: 16.2 }, { time: "24:00", used: 13.2, available: 18.8 }, ] export function SystemOverview() { const [systemData, setSystemData] = useState(null) const [vmData, setVmData] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const fetchSystemData = async () => { try { console.log("[v0] Fetching system data from Flask server...") const response = await fetch("http://localhost:8008/api/system", { method: "GET", headers: { Accept: "application/json", "Content-Type": "application/json", }, }) console.log("[v0] Response status:", response.status) console.log("[v0] Response headers:", Object.fromEntries(response.headers.entries())) if (!response.ok) { const errorText = await response.text() console.log("[v0] Error response body:", errorText) throw new Error(`HTTP error! status: ${response.status}, body: ${errorText}`) } const contentType = response.headers.get("content-type") console.log("[v0] Content-Type:", contentType) if (!contentType || !contentType.includes("application/json")) { const responseText = await response.text() console.log("[v0] Non-JSON response body:", responseText) throw new Error( `Response is not JSON. Content-Type: ${contentType}, Body: ${responseText.substring(0, 200)}...`, ) } const responseText = await response.text() console.log("[v0] Raw response text:", responseText) let data try { data = JSON.parse(responseText) } catch (parseError) { console.log("[v0] JSON parse error:", parseError) console.log("[v0] Failed to parse:", responseText.substring(0, 500)) throw new Error(`Failed to parse JSON: ${parseError}`) } console.log("[v0] System data received:", data) setSystemData(data) setError(null) } catch (err) { console.error("[v0] Error fetching system data:", err) setError(err instanceof Error ? err.message : "Unknown error") setSystemData({ cpu_usage: 67.3, memory_usage: 49.4, memory_total: 32.0, memory_used: 15.8, temperature: 52, uptime: "15d 7h 23m", load_average: [1.23, 1.45, 1.67], hostname: "proxmox-01", node_id: "pve-node-01", timestamp: new Date().toISOString(), }) } } const fetchVMData = async () => { try { console.log("[v0] Fetching VM data from Flask server...") const response = await fetch("http://localhost:8008/api/vms", { method: "GET", headers: { Accept: "application/json", "Content-Type": "application/json", }, }) console.log("[v0] VM Response status:", response.status) console.log("[v0] VM Response headers:", Object.fromEntries(response.headers.entries())) if (!response.ok) { const errorText = await response.text() console.log("[v0] VM Error response body:", errorText) throw new Error(`HTTP error! status: ${response.status}, body: ${errorText}`) } const contentType = response.headers.get("content-type") console.log("[v0] VM Content-Type:", contentType) if (!contentType || !contentType.includes("application/json")) { const responseText = await response.text() console.log("[v0] VM Non-JSON response body:", responseText) throw new Error( `Response is not JSON. Content-Type: ${contentType}, Body: ${responseText.substring(0, 200)}...`, ) } const responseText = await response.text() console.log("[v0] VM Raw response text:", responseText) let data try { data = JSON.parse(responseText) } catch (parseError) { console.log("[v0] VM JSON parse error:", parseError) console.log("[v0] VM Failed to parse:", responseText.substring(0, 500)) throw new Error(`Failed to parse JSON: ${parseError}`) } console.log("[v0] VM data received:", data) setVmData(Array.isArray(data) ? data : []) } catch (err) { console.error("[v0] Error fetching VM data:", err) setVmData([ { vmid: 100, name: "web-server-01", status: "running", cpu: 0.45, mem: 8589934592, maxmem: 17179869184, disk: 53687091200, maxdisk: 107374182400, uptime: 1324800, }, { vmid: 101, name: "database-server", status: "running", cpu: 0.23, mem: 4294967296, maxmem: 8589934592, disk: 26843545600, maxdisk: 53687091200, uptime: 864000, }, { vmid: 102, name: "backup-server", status: "stopped", cpu: 0, mem: 0, maxmem: 4294967296, disk: 10737418240, maxdisk: 21474836480, uptime: 0, }, { vmid: 103, name: "test-server", status: "stopped", cpu: 0, mem: 0, maxmem: 2147483648, disk: 5368709120, maxdisk: 10737418240, uptime: 0, }, ]) } } useEffect(() => { const loadData = async () => { setLoading(true) await Promise.all([fetchSystemData(), fetchVMData()]) setLoading(false) } loadData() const interval = setInterval(loadData, 15000) return () => clearInterval(interval) }, []) const vmStats = { total: vmData.length, running: vmData.filter((vm) => vm.status === "running").length, stopped: vmData.filter((vm) => vm.status === "stopped").length, lxc: 0, // Por ahora no tenemos datos de LXC separados } const getTemperatureStatus = (temp: number) => { if (temp < 60) return { status: "Normal", color: "bg-green-500/10 text-green-500 border-green-500/20" } if (temp < 75) return { status: "Warm", color: "bg-yellow-500/10 text-yellow-500 border-yellow-500/20" } return { status: "Hot", color: "bg-red-500/10 text-red-500 border-red-500/20" } } if (loading) { return (
{[...Array(4)].map((_, i) => (
))}
) } if (!systemData) { return (

Error loading system data

{error &&

{error}

}
) } const tempStatus = getTemperatureStatus(systemData.temperature) return (
{/* Key Metrics Cards */}
CPU Usage
{systemData.cpu_usage}%

Real-time from system

Memory Usage
{systemData.memory_used} GB

{systemData.memory_usage}% of {systemData.memory_total} GB

Temperature
{systemData.temperature}°C
{tempStatus.status}

System temperature

Active VMs
{vmStats.running}
{vmStats.running} Running {vmStats.stopped > 0 && ( {vmStats.stopped} Stopped )}

Total: {vmStats.total} VMs configured

{/* Charts Section */}
CPU Usage (24h) Memory Usage (24h)
{/* System Information */}
System Information
Hostname: {systemData.hostname}
Version: PVE 8.1.3
Kernel: 6.5.11-7-pve
Architecture: x86_64
Active Sessions
Web Console: 3 active
SSH Sessions: 1 active
API Calls: 247/hour
Power & Performance
Power State: Running
Load Average: {systemData.load_average.map((avg) => avg.toFixed(2)).join(", ")}
Uptime: {systemData.uptime}
) }