Ready to build sysinfo route screen
This commit is contained in:
virtweb_backend
virtweb_frontend/src
@ -14,6 +14,7 @@ import { LoginRoute } from "./routes/auth/LoginRoute";
|
||||
import { AuthApi } from "./api/AuthApi";
|
||||
import { IsoFilesRoute } from "./routes/IsoFilesRoute";
|
||||
import { ServerApi } from "./api/ServerApi";
|
||||
import { SysInfoRoute } from "./routes/SysInfoRoute";
|
||||
|
||||
interface AuthContext {
|
||||
signedIn: boolean;
|
||||
@ -35,6 +36,7 @@ export function App() {
|
||||
signedIn || ServerApi.Config.auth_disabled ? (
|
||||
<Route path="*" element={<BaseAuthenticatedPage />}>
|
||||
<Route path="iso" element={<IsoFilesRoute />} />
|
||||
<Route path="sysinfo" element={<SysInfoRoute />} />
|
||||
<Route path="*" element={<NotFoundRoute />} />
|
||||
</Route>
|
||||
) : (
|
||||
|
@ -10,7 +10,100 @@ export interface ServerConfig {
|
||||
|
||||
let config: ServerConfig | null = null;
|
||||
|
||||
export interface ServerInfo {}
|
||||
export interface ServerSystemInfo {
|
||||
hypervisor: HypervisorInfo;
|
||||
system: SystemInfo;
|
||||
}
|
||||
|
||||
interface HypervisorInfo {
|
||||
type: string;
|
||||
hyp_version: number;
|
||||
lib_version: number;
|
||||
capabilities: string;
|
||||
free_memory: number;
|
||||
hostname: string;
|
||||
node: {
|
||||
cpu_model: string;
|
||||
memory_size: number;
|
||||
number_of_active_cpus: number;
|
||||
cpu_frequency_mhz: number;
|
||||
number_of_numa_cell: number;
|
||||
number_of_cpu_socket_per_node: number;
|
||||
number_of_core_per_sockets: number;
|
||||
number_of_threads_per_sockets: number;
|
||||
};
|
||||
}
|
||||
|
||||
interface SystemInfo {
|
||||
IS_SUPPORTED: boolean;
|
||||
SUPPORTED_SIGNALS: string[];
|
||||
MINIMUM_CPU_UPDATE_INTERVAL: {
|
||||
secs: number;
|
||||
nanos: number;
|
||||
};
|
||||
global_cpu_info: GlobalCPUInfo;
|
||||
cpus: CpuCore[];
|
||||
physical_core_count: number;
|
||||
total_memory: number;
|
||||
free_memory: number;
|
||||
available_memory: number;
|
||||
used_memory: number;
|
||||
total_swap: number;
|
||||
free_swap: number;
|
||||
used_swap: number;
|
||||
components: SysComponent;
|
||||
users: [];
|
||||
disks: DiskInfo[];
|
||||
networks: [];
|
||||
uptime: number;
|
||||
boot_time: number;
|
||||
load_average: SysLoadAverage;
|
||||
name: string;
|
||||
kernel_version: string;
|
||||
os_version: string;
|
||||
long_os_version: string;
|
||||
distribution_id: string;
|
||||
host_name: string;
|
||||
}
|
||||
|
||||
interface GlobalCPUInfo {
|
||||
cpu_usage: number;
|
||||
name: string;
|
||||
vendor_id: string;
|
||||
brand: string;
|
||||
frequency: number;
|
||||
}
|
||||
|
||||
interface CpuCore {
|
||||
cpu_usage: number;
|
||||
name: string;
|
||||
vendor_id: string;
|
||||
brand: string;
|
||||
frequency: number;
|
||||
}
|
||||
|
||||
interface SysComponent {
|
||||
temperature: number;
|
||||
max: number;
|
||||
critical: number;
|
||||
label: string;
|
||||
}
|
||||
|
||||
interface DiskInfo {
|
||||
DiskKind: "HDD" | "SSD";
|
||||
name: string;
|
||||
file_system: number[];
|
||||
mount_point: string;
|
||||
total_space: number;
|
||||
available_space: number;
|
||||
is_removable: boolean;
|
||||
}
|
||||
|
||||
interface SysLoadAverage {
|
||||
one: number;
|
||||
five: number;
|
||||
fifteen: number;
|
||||
}
|
||||
|
||||
export class ServerApi {
|
||||
/**
|
||||
@ -36,7 +129,7 @@ export class ServerApi {
|
||||
/**
|
||||
* Get server information
|
||||
*/
|
||||
static async SystemInfo(): Promise<ServerInfo> {
|
||||
static async SystemInfo(): Promise<ServerSystemInfo> {
|
||||
return (
|
||||
await APIClient.exec({
|
||||
method: "GET",
|
||||
|
26
virtweb_frontend/src/routes/SysInfoRoute.tsx
Normal file
26
virtweb_frontend/src/routes/SysInfoRoute.tsx
Normal file
@ -0,0 +1,26 @@
|
||||
import React from "react";
|
||||
import { ServerApi, ServerSystemInfo } from "../api/ServerApi";
|
||||
import { AsyncWidget } from "../widgets/AsyncWidget";
|
||||
|
||||
export function SysInfoRoute(): React.ReactElement {
|
||||
const [info, setInfo] = React.useState<ServerSystemInfo>();
|
||||
|
||||
const load = async () => {
|
||||
setInfo(await ServerApi.SystemInfo());
|
||||
};
|
||||
|
||||
return (
|
||||
<AsyncWidget
|
||||
load={load}
|
||||
loadKey={1}
|
||||
build={() => <SysInfoRouteInner info={info!} />}
|
||||
errMsg="Failed to load system info"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export function SysInfoRouteInner(p: {
|
||||
info: ServerSystemInfo;
|
||||
}): React.ReactElement {
|
||||
return <>todo</>;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import { mdiDisc, mdiHome, mdiLanPending } from "@mdi/js";
|
||||
import { mdiDisc, mdiHome, mdiInformation, mdiLanPending } from "@mdi/js";
|
||||
import Icon from "@mdi/react";
|
||||
import {
|
||||
Box,
|
||||
@ -54,6 +54,11 @@ export function BaseAuthenticatedPage(): React.ReactElement {
|
||||
uri="/iso"
|
||||
icon={<Icon path={mdiDisc} size={1} />}
|
||||
/>
|
||||
<NavLink
|
||||
label="Sysinfo"
|
||||
uri="/sysinfo"
|
||||
icon={<Icon path={mdiInformation} size={1} />}
|
||||
/>
|
||||
</List>
|
||||
<div style={{ flex: 1 }}>
|
||||
<Outlet />
|
||||
|
Reference in New Issue
Block a user