// // ServerInfo.swift // iKeyMon // // Created by tracer on 30.03.25. // struct ServerInfo: Decodable { var hostname: String var ipAddresses: [String] // var processor: String var cpuCores: Int // var virtualization: String var serverTime: String var uptime: String // var sshFingerprint: String var processCount: Int var apacheVersion: String var phpVersion: String var mysqlVersion: String? var mariadbVersion: String? var ports: [ServicePort]? var load: Load var memory: Memory var swap: Memory var diskSpace: DiskSpace } extension ServerInfo { static let placeholder = ServerInfo( hostname: "keyhelp.lab.24unix.net", ipAddresses: ["192.168.99.44", "2a03:..."], // processor: "Common processor (arm64)", cpuCores: 8, // virtualization: "QEMU", serverTime: "Sunday, March 30, 2025 at 08:01 PM (Europe/Berlin)", uptime: "6 Days / 7 Hours / 16 Minutes", // sshFingerprint: "Ed25519 / ECDSA / RSA", processCount: 123, apacheVersion: "2.4", phpVersion: "8.4", ports: [], load: Load( minute1: 0.42, minute5: 0.31, minute15: 0.29, percent: 10.5, cpuCount: 4, level: "low" ), memory: Memory(free: 1234, used: 4567, total: 123456, percent: 23.45), swap: Memory(free: 1234, used: 4567, total: 123456, percent: 23.45), diskSpace: DiskSpace(free: 1234, used: 4567, total: 123456, percent: 23.45) ) var cpuLoadDetail: String { "1min: \(load.minute1), 5min: \(load.minute5), 15min: \(load.minute15) (\(load.level))" } } extension ServerInfo { init(from response: ServerResponse) { self.hostname = response.meta.hostname self.ipAddresses = response.meta.ipAddresses self.serverTime = response.meta.serverTime let u = response.meta.uptime self.uptime = "\(u.days) Days / \(u.hours) Hours / \(u.minutes) Minutes" self.cpuCores = response.utilization.load.cpuCount self.processCount = response.utilization.processCount self.apacheVersion = response.components.apache self.phpVersion = response.components.php self.mysqlVersion = response.components.mysql ?? "" self.mariadbVersion = response.components.mariadb ?? "" self.ports = response.ports self.load = response.utilization.load self.memory = response.utilization.memory self.swap = response.utilization.swap self.diskSpace = response.utilization.diskSpace } }