feat: finish the host-metrics plugin, move host status into core (B16)

This commit is contained in:
LukeGus committed 2026-09-24 11:21:23 -05:00
1 parent 14eb558b85
commit 0a3f05d99d
308 files changed
+53073 -8985

No files matched your search

-347
View File
@@ -1,347 +0,0 @@
import axios, { type AxiosRequestConfig } from "axios";
import {
handleApiError,
statsApi,
getRemoteStatsApi,
isElectron,
sshHostApi,
} from "@/main-axios";
import type { ServerMetrics, ServerStatus } from "@/main-axios";
import { getCachedServerStatuses } from "@/lib/hosts-request-cache";
import { resolveConnectionOrigin } from "@/lib/connection-origin";
import type { SSHHost } from "@/types/index";
import { createKeyedRequestCache } from "@/lib/keyed-request-cache";
// Metrics collection/viewer registration below (startMetricsPolling,
// registerMetricsViewer, etc.) is NOT origin-routed: the backend that
// receives the call must own the target host by numeric database id, and a
// synced host has a different numeric id in each database (only its
// syncId matches across them). Only the aggregate status read is merged
// across local + remote, same as tunnel status.
async function isRemoteSyncConnected(): Promise<boolean> {
if (!isElectron()) return false;
try {
const config = (await window.electronAPI?.invoke?.(
"get-remote-sync-config",
)) as { serverUrl?: string } | null;
return !!config?.serverUrl;
} catch {
return false;
}
}
type ApiConnectionLog = {
type: "info" | "success" | "warning" | "error";
stage: string;
message: string;
details?: Record<string, unknown>;
};
type ConnectErrorResponse = {
error?: string;
message?: string;
connectionLogs?: ApiConnectionLog[];
requires_totp?: boolean;
requires_warpgate?: boolean;
sessionId?: string;
prompt?: string;
url?: string;
securityKey?: string;
status?: string;
reason?: string;
};
// SERVER STATISTICS
// ============================================================================
const metricsCache = createKeyedRequestCache<ServerMetrics | null>(1_500, 100);
/**
* Progressive retry schedule for the background /status poll.
*
* Each entry describes one attempt's per-request timeout and the pause to
* observe before the next attempt. The pause on the last entry is `null`:
* after that final failure we surface the network error, which flows
* through the response interceptor + dbHealthMonitor (which decides
* between the degraded toast and the full-outage overlay based on whether
* any WebSocket is still alive).
*
* Sequence: try(2s) -> wait 3s -> try(5s) -> wait 5s -> try(8s) -> fail.
* Worst-case wall-clock = 23s, which fits inside the 30s ServerStatusContext
* poll cadence, so the next tick acts as the next retry without overlap.
*/
const STATUS_RETRY_SCHEDULE: ReadonlyArray<{
timeoutMs: number;
pauseAfterMs: number | null;
}> = [
{ timeoutMs: 2000, pauseAfterMs: 3000 },
{ timeoutMs: 5000, pauseAfterMs: 5000 },
{ timeoutMs: 8000, pauseAfterMs: null },
];
function isTransientStatusError(error: unknown): boolean {
if (!axios.isAxiosError(error)) return false;
if (error.response) {
// Definitive server response (even 5xx) is not something more retries
// will fix in a useful timeframe; bail out and report it normally.
return false;
}
const code = error.code;
if (!code) {
// No code + no response means classic network error (offline / DNS / TCP)
return true;
}
return (
code === "ECONNABORTED" ||
code === "ETIMEDOUT" ||
code === "ERR_NETWORK" ||
code === "ECONNREFUSED" ||
code === "ECONNRESET"
);
}
export async function getAllServerStatuses(): Promise<
Record<number, ServerStatus>
> {
return getCachedServerStatuses(async () => {
let lastError: unknown = null;
let localStatuses: Record<number, ServerStatus> = {};
let localHostIds: number[] | null = null;
if (isElectron()) {
try {
const response = await sshHostApi.get<SSHHost[]>("/db/host");
const defaultOrigin = await resolveConnectionOrigin({
connectionOrigin: null,
});
localHostIds = (response.data || [])
.filter(
(host) => (host.connectionOrigin ?? defaultOrigin) === "local",
)
.map((host) => host.id);
} catch {
// A host-list failure must not start local probes for hosts whose
// configured origin may be remote.
localHostIds = [];
}
}
for (let i = 0; i < STATUS_RETRY_SCHEDULE.length; i++) {
const { timeoutMs, pauseAfterMs } = STATUS_RETRY_SCHEDULE[i];
const isFinalAttempt = i === STATUS_RETRY_SCHEDULE.length - 1;
try {
const response = await statsApi.get("/status", {
timeout: timeoutMs,
...(localHostIds === null
? {}
: { params: { hostIds: localHostIds.join(",") } }),
// Silence per-attempt interceptor logging & health-monitor side
// effects on all attempts except the final one, so background
// blips don't look like real outages.
__silentRetry: !isFinalAttempt,
} as AxiosRequestConfig & { __silentRetry?: boolean });
localStatuses = response.data || {};
lastError = null;
break;
} catch (error) {
lastError = error;
if (!isTransientStatusError(error)) {
break;
}
if (pauseAfterMs === null) {
break;
}
await new Promise((resolve) => setTimeout(resolve, pauseAfterMs));
}
}
if (lastError) {
handleApiError(lastError, "fetch server statuses");
return {};
}
if (await isRemoteSyncConnected()) {
try {
const remoteResult = await getRemoteStatsApi().get("/status", {
timeout: 8000,
__silentRetry: true,
} as AxiosRequestConfig & { __silentRetry?: boolean });
return { ...localStatuses, ...(remoteResult.data || {}) };
} catch {
// remote unreachable this tick -- fall back to local-only statuses
}
}
return localStatuses;
});
}
export async function getServerStatusById(id: number): Promise<ServerStatus> {
try {
const response = await statsApi.get(`/status/${id}`);
return response.data;
} catch (error) {
handleApiError(error, "fetch server status");
throw error;
}
}
export async function getServerMetricsById(
id: number,
): Promise<ServerMetrics | null> {
return metricsCache.get(String(id), async () => {
try {
const response = await statsApi.get(`/metrics/${id}`, {
// Treat 404 as an expected "no metrics yet / disabled" signal rather
// than an error so we don't spam warn logs on the client.
validateStatus: (status) => status === 200 || status === 404,
});
if (response.status === 404) return null;
return response.data;
} catch (error) {
// If a 404 still slips through (e.g. intercepted before reaching here),
// swallow it quietly; everything else still flows through handleApiError.
if (axios.isAxiosError(error) && error.response?.status === 404) {
return null;
}
handleApiError(error, "fetch server metrics");
}
});
}
export async function startMetricsPolling(hostId: number): Promise<{
success: boolean;
requires_totp?: boolean;
sessionId?: string;
prompt?: string;
viewerSessionId?: string;
connectionLogs?: ApiConnectionLog[];
}> {
try {
const response = await statsApi.post(`/metrics/start/${hostId}`);
metricsCache.invalidate(String(hostId));
return response.data;
} catch (error: unknown) {
if (
axios.isAxiosError<ConnectErrorResponse>(error) &&
error.response?.data?.connectionLogs
) {
const data = error.response.data;
const errorWithLogs = new Error(
data.error || data.message || error.message,
);
Object.assign(errorWithLogs, {
connectionLogs: data.connectionLogs,
});
throw errorWithLogs;
}
handleApiError(error, "start metrics polling");
throw error;
}
}
export async function stopMetricsPolling(
hostId: number,
viewerSessionId?: string,
): Promise<void> {
try {
await statsApi.post(`/metrics/stop/${hostId}`, { viewerSessionId });
} catch (error) {
handleApiError(error, "stop metrics polling");
throw error;
}
}
export async function sendMetricsHeartbeat(
viewerSessionId: string,
): Promise<boolean> {
try {
const response = await statsApi.post(
"/metrics/heartbeat",
{ viewerSessionId },
{ validateStatus: (status) => status === 200 || status === 404 },
);
return response.status !== 404;
} catch (error) {
if (axios.isAxiosError(error) && error.response?.status === 404) {
return false;
}
handleApiError(error, "send metrics heartbeat");
throw error;
}
}
export async function registerMetricsViewer(hostId: number): Promise<{
success: boolean;
viewerSessionId?: string;
skipped?: boolean;
reason?: string;
}> {
try {
const response = await statsApi.post("/metrics/register-viewer", {
hostId,
});
metricsCache.invalidate(String(hostId));
return response.data;
} catch (error) {
handleApiError(error, "register metrics viewer");
throw error;
}
}
export async function unregisterMetricsViewer(
hostId: number,
viewerSessionId: string,
): Promise<void> {
try {
await statsApi.post("/metrics/unregister-viewer", {
hostId,
viewerSessionId,
});
} catch (error) {
handleApiError(error, "unregister metrics viewer");
throw error;
}
}
export async function submitMetricsTOTP(
sessionId: string,
totpCode: string,
): Promise<{
success: boolean;
viewerSessionId?: string;
}> {
try {
const response = await statsApi.post("/metrics/connect-totp", {
sessionId,
totpCode,
});
metricsCache.invalidate();
return response.data;
} catch (error) {
handleApiError(error, "submit metrics TOTP");
throw error;
}
}
export async function refreshServerPolling(): Promise<void> {
try {
await statsApi.post("/refresh");
} catch (error) {
console.warn("Failed to refresh server polling:", error);
}
}
export async function notifyHostCreatedOrUpdated(
hostId: number,
): Promise<void> {
try {
await statsApi.post("/host-updated", { hostId });
metricsCache.invalidate(String(hostId));
} catch (error) {
console.warn("Failed to notify stats server of host update:", error);
}
}
// ============================================================================
+190
View File
@@ -0,0 +1,190 @@
import axios, { type AxiosRequestConfig } from "axios";
import {
handleApiError,
getRemoteCoreApi,
isElectron,
sshHostApi,
} from "@/main-axios";
import type { ServerStatus } from "@/main-axios";
import { getCachedServerStatuses } from "@/lib/hosts-request-cache";
import { resolveConnectionOrigin } from "@/lib/connection-origin";
import type { SSHHost } from "@/types/index";
// Core's host status checks (/host/status). On the desktop app the aggregate
// read is merged across the local backend and the connected remote server.
async function isRemoteSyncConnected(): Promise<boolean> {
if (!isElectron()) return false;
try {
const config = (await window.electronAPI?.invoke?.(
"get-remote-sync-config",
)) as { serverUrl?: string } | null;
return !!config?.serverUrl;
} catch {
return false;
}
}
// HOST STATUS
// ============================================================================
/**
* Progressive retry schedule for the background /status poll.
*
* Each entry describes one attempt's per-request timeout and the pause to
* observe before the next attempt. The pause on the last entry is `null`:
* after that final failure we surface the network error, which flows
* through the response interceptor + dbHealthMonitor (which decides
* between the degraded toast and the full-outage overlay based on whether
* any WebSocket is still alive).
*
* Sequence: try(2s) -> wait 3s -> try(5s) -> wait 5s -> try(8s) -> fail.
* Worst-case wall-clock = 23s, which fits inside the 30s ServerStatusContext
* poll cadence, so the next tick acts as the next retry without overlap.
*/
const STATUS_RETRY_SCHEDULE: ReadonlyArray<{
timeoutMs: number;
pauseAfterMs: number | null;
}> = [
{ timeoutMs: 2000, pauseAfterMs: 3000 },
{ timeoutMs: 5000, pauseAfterMs: 5000 },
{ timeoutMs: 8000, pauseAfterMs: null },
];
function isTransientStatusError(error: unknown): boolean {
if (!axios.isAxiosError(error)) return false;
if (error.response) {
// Definitive server response (even 5xx) is not something more retries
// will fix in a useful timeframe; bail out and report it normally.
return false;
}
const code = error.code;
if (!code) {
// No code + no response means classic network error (offline / DNS / TCP)
return true;
}
return (
code === "ECONNABORTED" ||
code === "ETIMEDOUT" ||
code === "ERR_NETWORK" ||
code === "ECONNREFUSED" ||
code === "ECONNRESET"
);
}
export async function getAllServerStatuses(): Promise<
Record<number, ServerStatus>
> {
return getCachedServerStatuses(async () => {
let lastError: unknown = null;
let localStatuses: Record<number, ServerStatus> = {};
let localHostIds: number[] | null = null;
if (isElectron()) {
try {
const response = await sshHostApi.get<SSHHost[]>("/db/host");
const defaultOrigin = await resolveConnectionOrigin({
connectionOrigin: null,
});
localHostIds = (response.data || [])
.filter(
(host) => (host.connectionOrigin ?? defaultOrigin) === "local",
)
.map((host) => host.id);
} catch {
// A host-list failure must not start local probes for hosts whose
// configured origin may be remote.
localHostIds = [];
}
}
for (let i = 0; i < STATUS_RETRY_SCHEDULE.length; i++) {
const { timeoutMs, pauseAfterMs } = STATUS_RETRY_SCHEDULE[i];
const isFinalAttempt = i === STATUS_RETRY_SCHEDULE.length - 1;
try {
const response = await sshHostApi.get("/status", {
timeout: timeoutMs,
...(localHostIds === null
? {}
: { params: { hostIds: localHostIds.join(",") } }),
// Silence per-attempt interceptor logging & health-monitor side
// effects on all attempts except the final one, so background
// blips don't look like real outages.
__silentRetry: !isFinalAttempt,
} as AxiosRequestConfig & { __silentRetry?: boolean });
localStatuses = response.data || {};
lastError = null;
break;
} catch (error) {
lastError = error;
if (!isTransientStatusError(error)) {
break;
}
if (pauseAfterMs === null) {
break;
}
await new Promise((resolve) => setTimeout(resolve, pauseAfterMs));
}
}
if (lastError) {
handleApiError(lastError, "fetch server statuses");
return {};
}
if (await isRemoteSyncConnected()) {
try {
const remoteResult = await getRemoteCoreApi().get("/host/status", {
timeout: 8000,
__silentRetry: true,
} as AxiosRequestConfig & { __silentRetry?: boolean });
return { ...localStatuses, ...(remoteResult.data || {}) };
} catch {
// remote unreachable this tick -- fall back to local-only statuses
}
}
return localStatuses;
});
}
export async function getServerStatusById(id: number): Promise<ServerStatus> {
try {
const response = await sshHostApi.get(`/status/${id}`);
return response.data;
} catch (error) {
handleApiError(error, "fetch server status");
throw error;
}
}
export async function refreshServerPolling(): Promise<void> {
try {
await sshHostApi.post("/status/refresh");
} catch (error) {
console.warn("Failed to refresh status checks:", error);
}
}
export async function getStatusCheckSettings(): Promise<{
statusCheckInterval: number;
}> {
try {
const response = await sshHostApi.get("/status/settings");
return response.data;
} catch (error) {
handleApiError(error, "fetch status check settings");
}
}
export async function updateStatusCheckSettings(settings: {
statusCheckInterval: number;
}): Promise<void> {
try {
await sshHostApi.put("/status/settings", settings);
} catch (error) {
handleApiError(error, "update status check settings");
}
}
// ============================================================================
+1 -29
View File
@@ -1,32 +1,5 @@
import { authApi, handleApiError, statsApi } from "@/main-axios";
import { authApi, handleApiError } from "@/main-axios";
// GLOBAL MONITORING SETTINGS
// ============================================================================
export async function getGlobalMonitoringSettings(): Promise<{
statusCheckInterval: number;
metricsInterval: number;
}> {
try {
const response = await statsApi.get("/global-settings");
return response.data;
} catch (error) {
handleApiError(error, "fetch global monitoring settings");
}
}
export async function updateGlobalMonitoringSettings(settings: {
statusCheckInterval?: number;
metricsInterval?: number;
}): Promise<void> {
try {
await statsApi.post("/global-settings", settings);
} catch (error) {
handleApiError(error, "update global monitoring settings");
}
}
// ============================================================================
// LOG LEVEL SETTINGS
// ============================================================================
@@ -184,7 +157,6 @@ export type HostDefaults = {
socks5Username?: string;
socks5Password?: string;
credentialId?: number | null;
metricsEnabled?: boolean;
statusCheckEnabled?: boolean;
fontSize?: number;
fontFamily?: string;
+15 -178
View File
@@ -1,6 +1,6 @@
import { useState, useRef, useCallback, useEffect } from "react";
import { enabledHostProtocols, protocolPort } from "@/sidebar/host-protocols";
import { useSshAuthProviders } from "@/hooks/useSshAuthProviders";
import { ComponentSlot } from "@/shell/ActionSlot";
import { useIsMobile } from "@/hooks/use-mobile";
import { Button } from "@/components/button";
import { Card } from "@/components/card";
@@ -38,10 +38,6 @@ import {
getRecentActivity,
getCredentials,
resetRecentActivity,
getAllServerStatuses,
getServerMetricsById,
registerMetricsViewer,
sendMetricsHeartbeat,
getUserInfo,
getServiceLinks,
createServiceLink,
@@ -446,45 +442,12 @@ function QuickActionsCard({
);
}
function MetricBar({ label, value }: { label: string; value: number }) {
const color =
value >= 90
? "bg-red-500"
: value >= 70
? "bg-yellow-500"
: "bg-accent-brand";
const textColor =
value >= 90
? "text-red-400"
: value >= 70
? "text-yellow-400"
: "text-accent-brand";
return (
<div className="flex flex-col gap-0.5 w-16">
<div className="flex items-center justify-between">
<span className="text-[10px] text-muted-foreground">{label}</span>
<span className={`text-[10px] font-bold ${textColor}`}>
{value.toFixed(0)}%
</span>
</div>
<div className="h-0.5 bg-muted w-full">
<div className={`h-full ${color}`} style={{ width: `${value}%` }} />
</div>
</div>
);
}
export function HostStatusCard({
hosts,
hostMetrics,
onOpenTab,
statusLoading,
}: {
hosts: Host[];
hostMetrics: Map<
string,
{ cpu: number | null; ram: number | null; disk: number | null }
>;
onOpenTab: (host: Host, type: TabType) => void;
statusLoading?: boolean;
}) {
@@ -518,11 +481,6 @@ export function HostStatusCard({
: host.online
? "online"
: "offline";
const metrics = hostMetrics.get(host.id);
const cpu = metrics?.cpu ?? null;
const ram = metrics?.ram ?? null;
const disk = metrics?.disk ?? null;
const hasMetrics = cpu !== null || ram !== null || disk !== null;
return (
<div
key={i}
@@ -559,31 +517,14 @@ export function HostStatusCard({
</div>
</div>
<div className="flex shrink-0 items-center gap-3">
{availability === "online" && hasMetrics ? (
<div className="flex items-center gap-3">
{cpu !== null && (
<MetricBar label={t("dashboard.cpu")} value={cpu} />
)}
{ram !== null && (
<MetricBar label={t("dashboard.ram")} value={ram} />
)}
{disk !== null && (
<MetricBar label={t("dashboardTab.disk")} value={disk} />
)}
</div>
) : (
<div className="flex items-center gap-3">
<span className="text-[10px] text-muted-foreground w-16 text-center">
—
</span>
<span className="text-[10px] text-muted-foreground w-16 text-center">
—
</span>
<span className="text-[10px] text-muted-foreground w-16 text-center">
—
</span>
</div>
)}
{/* Plugins such as host metrics show live usage here. */}
<ComponentSlot
slotId="dashboard.hostMetrics"
props={{
hostId: Number(host.id),
online: availability === "online",
}}
/>
<span
className={`text-[10px] px-2 py-0.5 font-semibold border ${getStatusClasses(availability, statusScheme, "badge", statusLoading)}`}
>
@@ -609,7 +550,7 @@ export function HostStatusCard({
}
function isStatusCheckEnabled(host: Host): boolean {
return host.statsConfig?.statusCheckEnabled !== false;
return host.statusCheckEnabled !== false;
}
function RecentActivityCard({
@@ -843,7 +784,6 @@ function CardItem({
onOpenSingletonTab,
onOpenTab,
hosts,
hostMetrics,
uptimeFormatted,
versionText,
versionStatus,
@@ -871,10 +811,6 @@ function CardItem({
onOpenSingletonTab: (type: TabType, pendingEvent?: string) => void;
onOpenTab: (host: Host, type: TabType) => void;
hosts: Host[];
hostMetrics: Map<
string,
{ cpu: number | null; ram: number | null; disk: number | null }
>;
uptimeFormatted: string;
versionText: string;
versionStatus: "up_to_date" | "requires_update" | "beta" | "unknown";
@@ -970,7 +906,6 @@ function CardItem({
{slot.id === "host_status" && (
<HostStatusCard
hosts={hosts}
hostMetrics={hostMetrics}
onOpenTab={onOpenTab}
statusLoading={statusLoading}
/>
@@ -1103,10 +1038,6 @@ type PanelColumnProps = {
onOpenSingletonTab: (type: TabType, pendingEvent?: string) => void;
onOpenTab: (host: Host, type: TabType) => void;
hosts: Host[];
hostMetrics: Map<
string,
{ cpu: number | null; ram: number | null; disk: number | null }
>;
uptimeFormatted: string;
versionText: string;
versionStatus: "up_to_date" | "requires_update" | "beta" | "unknown";
@@ -1139,7 +1070,6 @@ function PanelColumn({
onOpenSingletonTab,
onOpenTab,
hosts,
hostMetrics,
uptimeFormatted,
versionText,
versionStatus,
@@ -1198,7 +1128,6 @@ function PanelColumn({
onOpenSingletonTab={onOpenSingletonTab}
onOpenTab={onOpenTab}
hosts={hosts}
hostMetrics={hostMetrics}
uptimeFormatted={uptimeFormatted}
versionText={versionText}
versionStatus={versionStatus}
@@ -1378,83 +1307,13 @@ export function DashboardTab({
const [credentialCount, setCredentialCount] = useState(0);
const [activeTunnelCount, setActiveTunnelCount] = useState(0);
const [activity, setActivity] = useState<RecentActivityItem[]>([]);
const [hostMetrics, setHostMetrics] = useState<
Map<string, { cpu: number | null; ram: number | null; disk: number | null }>
>(new Map());
const viewerSessionsRef = useRef<Map<number, string>>(new Map());
const sshAuthProviders = useSshAuthProviders();
const sshAuthProvidersRef = useRef(sshAuthProviders);
sshAuthProvidersRef.current = sshAuthProviders;
const statusCheckHosts = hosts.filter(isStatusCheckEnabled);
const fetchMetrics = useCallback(async (hostList: Host[]) => {
let statuses: Record<number, { status?: string }> = {};
try {
statuses = (await getAllServerStatuses()) as Record<
number,
{ status?: string }
>;
} catch {
/* best-effort */
}
const newSessions = new Map<number, string>(viewerSessionsRef.current);
const results = await Promise.all(
hostList.map(async (host) => {
const hostId = Number(host.id);
const knownStatus = statuses?.[hostId]?.status;
if (knownStatus === "offline") return null;
// Types that need a person or a browser sign-in cannot be polled.
const authOption = sshAuthProvidersRef.current.find(host.authType);
if (authOption && !authOption.supportsBackground) return null;
try {
const existing = newSessions.get(hostId);
if (existing && !(await sendMetricsHeartbeat(existing))) {
newSessions.delete(hostId);
}
if (!newSessions.has(hostId)) {
const reg = await registerMetricsViewer(hostId);
if (reg.skipped) return null;
if (reg.success && reg.viewerSessionId) {
newSessions.set(hostId, reg.viewerSessionId);
}
}
const metrics = await getServerMetricsById(hostId);
if (!metrics) return null;
return {
id: host.id,
cpu: metrics.cpu?.percent ?? null,
ram: metrics.memory?.percent ?? null,
disk: metrics.disk?.percent ?? null,
};
} catch {
return null;
}
}),
);
viewerSessionsRef.current = newSessions;
const map = new Map<
string,
{ cpu: number | null; ram: number | null; disk: number | null }
>();
for (const r of results) {
if (r) map.set(r.id, { cpu: r.cpu, ram: r.ram, disk: r.disk });
}
setHostMetrics(map);
}, []);
useEffect(() => {
let mounted = true;
const load = async () => {
const raw = await getSSHHosts().catch(() => []);
const mapped = raw.map(sshHostToHost);
const statusHosts = mapped.filter(isStatusCheckEnabled);
if (mounted) setHosts(mapped);
if (isVisible) {
fetchMetrics(statusHosts).catch(() => {});
}
if (mounted) setHosts(raw.map(sshHostToHost));
};
load();
@@ -1518,37 +1377,17 @@ export function DashboardTab({
};
}
const metricsInterval = setInterval(async () => {
const hostsInterval = setInterval(async () => {
if (document.visibilityState === "hidden") return;
const raw = await getSSHHosts().catch(() => []);
const mapped = raw.map(sshHostToHost);
const statusHosts = mapped.filter(isStatusCheckEnabled);
if (mounted) setHosts(mapped);
fetchMetrics(statusHosts).catch(() => {});
if (mounted) setHosts(raw.map(sshHostToHost));
}, 30000);
return () => {
mounted = false;
clearInterval(metricsInterval);
clearInterval(hostsInterval);
};
}, [fetchMetrics, isVisible]);
useEffect(() => {
if (!isVisible || viewerSessionsRef.current.size === 0) return;
const heartbeat = setInterval(async () => {
if (document.visibilityState === "hidden") return;
for (const [hostId, sessionId] of viewerSessionsRef.current) {
sendMetricsHeartbeat(sessionId)
.then((alive) => {
if (!alive && viewerSessionsRef.current.get(hostId) === sessionId) {
viewerSessionsRef.current.delete(hostId);
}
})
.catch(() => {});
}
}, 30000);
return () => clearInterval(heartbeat);
}, [hostMetrics, isVisible]);
}, [isVisible]);
const handleClearActivity = async () => {
try {
@@ -1705,7 +1544,6 @@ export function DashboardTab({
const columnProps = {
hosts,
hostMetrics,
uptimeFormatted,
versionText,
versionStatus,
@@ -1847,7 +1685,6 @@ export function DashboardTab({
{slot.id === "host_status" && (
<HostStatusCard
hosts={statusCheckHosts}
hostMetrics={hostMetrics}
onOpenTab={onOpenTab}
statusLoading={statusLoading}
/>
@@ -24,21 +24,6 @@ const METRIC_OPTIONS: { key: HostMetricKey; labelKey: string }[] = [
{ key: "processes", labelKey: "homepage.metricProcesses" },
];
function parseMetricsEnabled(statsConfig: unknown): boolean {
if (!statsConfig) return false;
try {
const cfg =
typeof statsConfig === "string" ? JSON.parse(statsConfig) : statsConfig;
if (typeof cfg === "object" && cfg !== null) {
const c = cfg as Record<string, unknown>;
return c.metricsEnabled !== false;
}
} catch {
// ignore
}
return false;
}
export function HostStatusEditForm({
config,
onChange,
@@ -57,7 +42,7 @@ export function HostStatusEditForm({
.then((all) =>
setHosts(
all
.filter((x) => parseMetricsEnabled(x.statsConfig))
.filter((x) => x.statusCheckEnabled !== false)
.map((x) => ({
id: String(x.id),
name: x.name,
@@ -8,12 +8,9 @@ import type {
WidgetComponentProps,
} from "@/types/homepage-types";
import { GRID_SIZE } from "@/types/homepage-types";
import {
getServerStatusById,
getServerMetricsById,
} from "@/api/host-metrics-status-api";
import { getServerStatusById } from "@/api/host-status-api";
import { getSSHHosts } from "@/api/ssh-host-management-api";
import type { ServerMetrics } from "@/main-axios";
import { ComponentSlot } from "@/shell/ActionSlot";
import { WidgetTitle } from "./WidgetTitle";
function getAccentColor(): string {
@@ -34,56 +31,6 @@ function migrateConfig(config: HostStatusConfig): HostMetricKey[] {
return metrics;
}
interface MetricBarProps {
label: string;
value: number | null;
sublabel?: string;
}
function MetricBar({ label, value, sublabel }: MetricBarProps) {
const pct = value ?? 0;
const color = pct > 90 ? "#ef4444" : pct > 70 ? "#f97316" : getAccentColor();
return (
<div className="flex flex-col gap-0.5">
<div className="flex justify-between text-[10px] text-muted-foreground">
<span>{label}</span>
<span className="text-right">
{value != null ? `${Math.round(pct)}%` : "N/A"}
{sublabel && <span className="ml-1 opacity-60">{sublabel}</span>}
</span>
</div>
<div className="h-1 bg-muted overflow-hidden">
<div
className="h-full transition-all"
style={{ width: `${pct}%`, background: color }}
/>
</div>
</div>
);
}
interface InfoRowProps {
label: string;
value: string | null | undefined;
}
function InfoRow({ label, value }: InfoRowProps) {
if (!value) return null;
return (
<div className="flex justify-between text-[10px] gap-2">
<span className="text-muted-foreground shrink-0">{label}</span>
<span className="text-foreground truncate text-right">{value}</span>
</div>
);
}
function formatBytes(n: number): string {
if (n >= 1073741824) return `${(n / 1073741824).toFixed(1)} GB`;
if (n >= 1048576) return `${(n / 1048576).toFixed(1)} MB`;
if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;
return `${n} B`;
}
function HostStatusWidget({
widget,
config,
@@ -94,7 +41,6 @@ function HostStatusWidget({
const [hostName, setHostName] = useState<string | null>(null);
const [online, setOnline] = useState<boolean | null>(null);
const [reachable, setReachable] = useState(false);
const [metrics, setMetrics] = useState<ServerMetrics | null>(null);
const needsMetrics = shownMetrics.length > 0;
@@ -125,15 +71,6 @@ function HostStatusWidget({
setReachable(false);
}
}
if (needsMetrics) {
try {
const m = await getServerMetricsById(hostId);
if (!cancelled) setMetrics(m);
} catch {
if (!cancelled) setMetrics(null);
}
}
};
poll();
@@ -141,7 +78,6 @@ function HostStatusWidget({
let intervalId: ReturnType<typeof setInterval> | null = null;
const start = () => {
if (intervalId !== null) return;
// Align with global status cadence; metrics do not need sub-10s when hidden.
intervalId = setInterval(() => {
if (document.visibilityState === "hidden") return;
void poll();
@@ -169,7 +105,7 @@ function HostStatusWidget({
stop();
document.removeEventListener("visibilitychange", onVisibility);
};
}, [hostId, needsMetrics]);
}, [hostId]);
if (!hostId) {
return (
@@ -196,16 +132,6 @@ function HostStatusWidget({
? t("common.reachable", { defaultValue: "Reachable" })
: t("common.offline");
const networkIfaces = metrics?.network?.interfaces ?? [];
const totalRx = networkIfaces.reduce((sum, iface) => {
const raw = iface.rxBytes ?? iface.rx ?? null;
return raw ? sum + parseFloat(raw) : sum;
}, 0);
const totalTx = networkIfaces.reduce((sum, iface) => {
const raw = iface.txBytes ?? iface.tx ?? null;
return raw ? sum + parseFloat(raw) : sum;
}, 0);
return (
<div className="flex flex-col w-full h-full overflow-hidden">
<WidgetTitle title={widget.title} icon={<Server size={11} />} />
@@ -231,132 +157,12 @@ function HostStatusWidget({
</span>
</div>
{/* Plugins such as host metrics fill in the live numbers. */}
{needsMetrics && (
<div className="flex flex-col gap-2">
{shownMetrics.includes("cpu") && (
<MetricBar
label={t("homepage.metricCpu")}
value={metrics?.cpu?.percent ?? null}
sublabel={
metrics?.cpu?.cores ? `${metrics.cpu.cores}c` : undefined
}
/>
)}
{shownMetrics.includes("memory") && (
<MetricBar
label={t("homepage.metricMemory")}
value={metrics?.memory?.percent ?? null}
sublabel={
metrics?.memory?.usedGiB != null &&
metrics?.memory?.totalGiB != null
? `${metrics.memory.usedGiB.toFixed(1)}/${metrics.memory.totalGiB.toFixed(1)} GiB`
: undefined
}
/>
)}
{shownMetrics.includes("disk") && (
<MetricBar
label={t("homepage.metricDisk")}
value={metrics?.disk?.percent ?? null}
sublabel={
metrics?.disk?.usedHuman && metrics?.disk?.totalHuman
? `${metrics.disk.usedHuman}/${metrics.disk.totalHuman}`
: undefined
}
/>
)}
{shownMetrics.includes("uptime") && (
<InfoRow
label={t("homepage.metricUptime")}
value={metrics?.uptime?.formatted ?? null}
/>
)}
{shownMetrics.includes("system") && metrics?.system && (
<div className="flex flex-col gap-0.5 border-t border-border/40 pt-1.5 mt-0.5">
<InfoRow
label={t("homepage.metricOs")}
value={metrics.system.os ?? null}
/>
<InfoRow
label={t("homepage.metricKernel")}
value={metrics.system.kernel ?? null}
/>
<InfoRow
label={t("homepage.metricHostname")}
value={metrics.system.hostname ?? null}
/>
</div>
)}
{shownMetrics.includes("network") && networkIfaces.length > 0 && (
<div className="flex flex-col gap-0.5 border-t border-border/40 pt-1.5 mt-0.5">
<div className="text-[10px] font-medium text-muted-foreground mb-0.5">
{t("homepage.metricNetwork")}
</div>
{networkIfaces.slice(0, 3).map((iface) => (
<div
key={iface.name}
className="flex justify-between text-[10px] gap-2"
>
<span className="text-muted-foreground shrink-0 truncate max-w-[60px]">
{iface.name}
</span>
<span className="text-foreground">
{iface.ip || iface.state}
</span>
</div>
))}
{(totalRx > 0 || totalTx > 0) && (
<div className="flex justify-between text-[10px] gap-2 mt-0.5">
<span className="text-muted-foreground">RX/TX</span>
<span className="text-foreground">
{formatBytes(totalRx)} / {formatBytes(totalTx)}
</span>
</div>
)}
</div>
)}
{shownMetrics.includes("processes") && metrics?.processes && (
<div className="flex flex-col gap-0.5 border-t border-border/40 pt-1.5 mt-0.5">
<div className="flex justify-between text-[10px]">
<span className="text-muted-foreground">
{t("homepage.metricProcesses")}
</span>
<span className="text-foreground">
{metrics.processes.total ?? "?"}{" "}
{t("homepage.metricProcessesTotal")}
{metrics.processes.running != null
? `, ${metrics.processes.running} ${t("homepage.metricProcessesRunning")}`
: ""}
</span>
</div>
{metrics.processes.top?.slice(0, 3).map((proc) => (
<div
key={proc.pid}
className="flex justify-between text-[10px] gap-2"
>
<span className="text-muted-foreground truncate max-w-[80px]">
{proc.command}
</span>
<span className="text-foreground shrink-0">
{proc.cpu}%
</span>
</div>
))}
</div>
)}
{needsMetrics && !metrics && online && (
<span className="text-[10px] text-muted-foreground/60 italic">
{t("homepage.metricsNotAvailable")}
</span>
)}
</div>
<ComponentSlot
slotId="homepage.hostMetrics"
props={{ hostId, shownMetrics, online: !!online }}
/>
)}
</div>
</div>
+28 -16
View File
@@ -10,7 +10,6 @@ import React, {
useState,
} from "react";
import { getAllServerStatuses, getSSHHosts } from "@/main-axios";
import { DEFAULT_STATS_CONFIG } from "@/types/stats-widgets";
import {
ServerStatusStore,
type ServerStatusEntry,
@@ -73,21 +72,7 @@ export function ServerStatusProvider({
const enabled = new Set<number>();
hosts.forEach((host) => {
const statsConfig = (() => {
try {
if (!host.statsConfig) return DEFAULT_STATS_CONFIG;
if (typeof host.statsConfig === "string") {
return JSON.parse(host.statsConfig);
}
return host.statsConfig;
} catch {
return DEFAULT_STATS_CONFIG;
}
})();
if (statsConfig.statusCheckEnabled !== false) {
enabled.add(host.id);
}
if (host.statusCheckEnabled !== false) enabled.add(host.id);
});
store.setEnabledHostIds(enabled);
@@ -322,3 +307,30 @@ export function useServerStatusMeta(): {
isLoading: store.getIsLoading(),
};
}
const noStatus = () => "";
/**
* One host's status for plugin views, which can render outside the app shell
* (a standalone window). Null there, and while the host has not been checked.
*/
export function useOptionalHostStatusEntry(hostId: number | undefined): {
status: StatusValue;
reason?: "host_key_changed";
} | null {
const store = useContext(StatusStoreContext);
const snapshot = useSyncExternalStore(
(onChange) =>
store && hostId !== undefined
? store.subscribeHost(hostId, onChange)
: () => {},
() => (store && hostId !== undefined ? store.getHostSnapshot(hostId) : ""),
noStatus,
);
if (!snapshot) return null;
const [status] = snapshot.split(":", 1);
if (!status) return null;
return snapshot.endsWith(":host_key_changed")
? { status: status as StatusValue, reason: "host_key_changed" }
: { status: status as StatusValue };
}
+1 -17
View File
@@ -268,7 +268,6 @@
"showDisk": "Show Disk Usage",
"addToFolder": "Add widget to folder",
"noHostSelected": "No host selected",
"metricsNotAvailable": "Metrics not available",
"selectHost": "Select a host...",
"displayedMetrics": "Displayed Metrics",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Uptime",
"metricSystem": "System",
"metricOs": "OS",
"metricKernel": "Kernel",
"metricHostname": "Hostname",
"metricNetwork": "Network",
"metricProcesses": "Processes",
"metricProcessesTotal": "total",
"metricProcessesRunning": "running",
"categoryMonitoring": "Monitoring",
"loading": "Loading...",
"allClear": "All clear",
@@ -771,10 +765,6 @@
"discardChanges": "Discard changes",
"movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"",
"editHostTooltip": "Edit host",
"statusChecks": "Status Checks",
"metricsCollection": "Metrics Collection",
"metricsInterval": "Metrics Collection Interval",
"metricsIntervalDesc": "How often to collect server statistics (5s - 1h)",
"behavior": "Behavior",
"themePreview": "Theme Preview",
"theme": "Theme",
@@ -1907,8 +1897,6 @@
"serverStats": "Server Stats",
"loadingServerStats": "Loading server stats...",
"noServerData": "No server data available",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Customize Dashboard",
"dashboardSettings": "Dashboard Settings",
"enableDisableCards": "Enable/Disable Cards",
@@ -1961,7 +1949,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Enter a valid web address",
"serviceLinksAddFailed": "Failed to add service link",
"disk": "Disk",
"viewServerDetails": "View server details"
},
"admin": {
@@ -2102,7 +2089,6 @@
"sessionTimeoutRange": "Min 1h · Max 720h",
"monitoringDefaults": "Monitoring Defaults",
"statusCheck": "Status Check",
"metrics": "Metrics",
"sec": "sec",
"logLevel": "Log Level",
"oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.",
@@ -2352,11 +2338,9 @@
"hostDefaultsSocks5Host": "Proxy Host / Port",
"hostDefaultsSocks5Username": "Proxy Username",
"hostDefaultsSocks5Password": "Proxy Password",
"hostDefaultsMetrics": "Host Metrics",
"hostDefaultsMetricsEnabled": "Enable Metrics",
"hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default",
"hostDefaultsStatusCheckEnabled": "Enable Status Check",
"hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default",
"hostDefaultsStatus": "Status Checks",
"hostDefaultsTerminal": "Terminal",
"hostDefaultsAutoTmux": "Auto-Tmux",
"hostDefaultsAutoTmuxDesc": "Run new hosts' terminals inside tmux so sessions survive disconnects (needs tmux on the host)",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Wys skyfgebruik",
"addToFolder": "Voeg widget by vouer",
"noHostSelected": "Geen gasheer gekies nie",
"metricsNotAvailable": "Metrieke nie beskikbaar nie",
"selectHost": "Kies 'n gasheer...",
"displayedMetrics": "Vertoonde Metrieke",
"metricCpu": "SVE",
@@ -276,13 +275,8 @@
"metricDisk": "Skyf",
"metricUptime": "Optyd",
"metricSystem": "Stelsel",
"metricOs": "OS",
"metricKernel": "Kern",
"metricHostname": "Gasheernaam",
"metricNetwork": "Netwerk",
"metricProcesses": "Prosesse",
"metricProcessesTotal": "totaal",
"metricProcessesRunning": "hardloop",
"categoryMonitoring": "Monitering",
"loading": "Laai tans...",
"allClear": "Alles duidelik",
@@ -775,10 +769,6 @@
"discardChanges": "Gooi veranderinge weg",
"movedToFolder": "Het {{count}} gasheer(s) na \"{{folder}} \" geskuif",
"editHostTooltip": "Wysig gasheer",
"statusChecks": "Statuskontroles",
"metricsCollection": "Metrieke-versameling",
"metricsInterval": "Metrieke Versamelingsinterval",
"metricsIntervalDesc": "Hoe gereeld om bedienerstatistieke in te samel (5s - 1u)",
"behavior": "Gedrag",
"themePreview": "Temavoorskou",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Bedienerstatistieke",
"loadingServerStats": "Laai bedienerstatistieke...",
"noServerData": "Geen bedienerdata beskikbaar nie",
"cpu": "SVE",
"ram": "RAM",
"customizeLayout": "Pasmaak Dashboard",
"dashboardSettings": "Dashboard-instellings",
"enableDisableCards": "Aktiveer/Deaktiveer Kaarte",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Voer 'n geldige webadres in",
"serviceLinksAddFailed": "Kon nie diensskakel byvoeg nie",
"disk": "Skyf",
"viewServerDetails": "Bekyk bedienerbesonderhede"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min 1 uur · Maks 720 uur",
"monitoringDefaults": "Monitering van Standaardwaardes",
"statusCheck": "Statuskontrole",
"metrics": "Metrieke",
"sec": "sek",
"logLevel": "Logvlak",
"enableGuacamole": "Aktiveer Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy-gasheer / -poort",
"hostDefaultsSocks5Username": "Proxy-gebruikersnaam",
"hostDefaultsSocks5Password": "Proxy-wagwoord",
"hostDefaultsMetrics": "Gasheermetrieke",
"hostDefaultsMetricsEnabled": "Aktiveer Metrieke",
"hostDefaultsMetricsEnabledDesc": "Versamel standaard SVE-, geheue- en ander statistieke op nuwe gashere",
"hostDefaultsStatusCheckEnabled": "Aktiveer Statuskontrole",
"hostDefaultsStatusCheckEnabledDesc": "Stem aanlyn/aflyn status op nuwe gashere by verstek",
"hostDefaultsTerminal": "Terminaal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "إظهار استخدام القرص",
"addToFolder": "إضافة أداة إلى المجلد",
"noHostSelected": "لم يتم تحديد أي مضيف",
"metricsNotAvailable": "المقاييس غير متوفرة",
"selectHost": "اختيار مضيف...",
"displayedMetrics": "المقاييس المعروضة",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "القرص",
"metricUptime": "وقت التشغيل",
"metricSystem": "النظام",
"metricOs": "نظام التشغيل",
"metricKernel": "النواة",
"metricHostname": "اسم المضيف",
"metricNetwork": "الشبكة",
"metricProcesses": "العمليات",
"metricProcessesTotal": "إجمالي",
"metricProcessesRunning": "قيد التشغيل",
"categoryMonitoring": "المراقبة",
"loading": "جار التحميل...",
"allClear": "كل شيء طبيعي",
@@ -775,10 +769,6 @@
"discardChanges": "تجاهل التغييرات",
"movedToFolder": "تم نقل {{count}} مضيف إلى \"{{folder}}\"",
"editHostTooltip": "تعديل المضيف",
"statusChecks": "فحوصات الحالة",
"metricsCollection": "جمع المقاييس",
"metricsInterval": "فترة جمع المقاييس",
"metricsIntervalDesc": "مدة جمع إحصائيات الخادم (5s - 1h)",
"behavior": "السلوك",
"themePreview": "معاينة السمة",
"theme": "السمة",
@@ -1899,8 +1889,6 @@
"serverStats": "إحصائيات الخادم",
"loadingServerStats": "جارٍ تحميل إحصائيات الخادم...",
"noServerData": "لا تتوفر بيانات الخادم",
"cpu": "المعالج",
"ram": "الذاكرة",
"customizeLayout": "تخصيص لوحة التحكم",
"dashboardSettings": "إعدادات لوحة التحكم",
"enableDisableCards": "تمكين/تعطيل البطاقات",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "أدخل عنوان ويب صالح",
"serviceLinksAddFailed": "فشل في إضافة رابط الخدمة",
"disk": "القرص",
"viewServerDetails": "عرض تفاصيل الخادم"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "الحد الأدنى 1 ساعة · الحد الأقصى 720 ساعة",
"monitoringDefaults": "إعدادات المراقبة الافتراضية",
"statusCheck": "فحص الحالة",
"metrics": "مقاييس",
"sec": "ثانية",
"logLevel": "مستوى السجل",
"enableGuacamole": "تمكين Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "مضيف الوكيل / المنفذ",
"hostDefaultsSocks5Username": "اسم مستخدم الوكيل",
"hostDefaultsSocks5Password": "كلمة مرور الوكيل",
"hostDefaultsMetrics": "مقاييس المضيف",
"hostDefaultsMetricsEnabled": "تمكين المقاييس",
"hostDefaultsMetricsEnabledDesc": "جمع إحصائيات المعالج والذاكرة وغيرها على المضيفين الجدد افتراضيًا",
"hostDefaultsStatusCheckEnabled": "تمكين فحص الحالة",
"hostDefaultsStatusCheckEnabledDesc": "استطلاع حالة الاتصال أو الانفصال على المضيفين الجدد افتراضيًا",
"hostDefaultsTerminal": "الطرفية",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Показване на използването на диска",
"addToFolder": "Добавяне на джаджа към папката",
"noHostSelected": "Няма избран хост",
"metricsNotAvailable": "Показателите не са налични",
"selectHost": "Изберете хост...",
"displayedMetrics": "Показани показатели",
"metricCpu": "Процесор",
@@ -276,13 +275,8 @@
"metricDisk": "Диск",
"metricUptime": "Време на работа",
"metricSystem": "Система",
"metricOs": "ОС",
"metricKernel": "Ядро",
"metricHostname": "Име на хост",
"metricNetwork": "Мрежа",
"metricProcesses": "Процеси",
"metricProcessesTotal": "общо",
"metricProcessesRunning": "бягане",
"categoryMonitoring": "Мониторинг",
"loading": "Зареждане...",
"allClear": "Всичко е чисто",
@@ -775,10 +769,6 @@
"discardChanges": "Отхвърляне на промените",
"movedToFolder": "Преместих {{count}} хост(ове) в „{{folder}}“",
"editHostTooltip": "Редактиране на хоста",
"statusChecks": "Проверки на състоянието",
"metricsCollection": "Колекция от показатели",
"metricsInterval": "Интервал на събиране на показатели",
"metricsIntervalDesc": "Колко често да се събира статистика за сървъра (5 секунди - 1 час)",
"behavior": "Поведение",
"themePreview": "Преглед на темата",
"theme": "Тема",
@@ -1899,8 +1889,6 @@
"serverStats": "Статистика на сървъра",
"loadingServerStats": "Зареждане на статистиката на сървъра...",
"noServerData": "Няма налични данни от сървъра",
"cpu": "Процесор",
"ram": "RAM памет",
"customizeLayout": "Персонализиране на таблото за управление",
"dashboardSettings": "Настройки на таблото за управление",
"enableDisableCards": "Активиране/деактивиране на карти",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Въведете валиден уеб адрес",
"serviceLinksAddFailed": "Добавянето на линк към услугата не бе успешно",
"disk": "Диск",
"viewServerDetails": "Преглед на подробности за сървъра"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Мин. 1 ч. · Макс. 720 ч.",
"monitoringDefaults": "Мониторинг на настройки по подразбиране",
"statusCheck": "Проверка на състоянието",
"metrics": "Метрики",
"sec": "сек",
"logLevel": "Ниво на лога",
"enableGuacamole": "Активиране на гуакамоле",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Прокси хост / порт",
"hostDefaultsSocks5Username": "Потребителско име на прокси",
"hostDefaultsSocks5Password": "Парола за прокси сървър",
"hostDefaultsMetrics": "Метрики на хоста",
"hostDefaultsMetricsEnabled": "Активиране на показатели",
"hostDefaultsMetricsEnabledDesc": "Събиране на CPU, памет и други статистически данни за нови хостове по подразбиране",
"hostDefaultsStatusCheckEnabled": "Активиране на проверка на състоянието",
"hostDefaultsStatusCheckEnabledDesc": "По подразбиране се задава онлайн/офлайн статус на анкетата за нови хостове",
"hostDefaultsTerminal": "Терминал",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "ডিস্ক ব্যবহার দেখান",
"addToFolder": "ফোল্ডারে উইজেট যোগ করুন",
"noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি",
"metricsNotAvailable": "মেট্রিক্স উপলব্ধ নেই",
"selectHost": "একজন হোস্ট নির্বাচন করুন...",
"displayedMetrics": "প্রদর্শিত মেট্রিক্স",
"metricCpu": "সিপিইউ",
@@ -276,13 +275,8 @@
"metricDisk": "ডিস্ক",
"metricUptime": "আপটাইম",
"metricSystem": "সিস্টেম",
"metricOs": "ওএস",
"metricKernel": "কার্নেল",
"metricHostname": "হোস্টনাম",
"metricNetwork": "নেটওয়ার্ক",
"metricProcesses": "প্রক্রিয়া",
"metricProcessesTotal": "মোট",
"metricProcessesRunning": "দৌড়ানো",
"categoryMonitoring": "পর্যবেক্ষণ",
"loading": "লোড হচ্ছে...",
"allClear": "সব পরিষ্কার",
@@ -775,10 +769,6 @@
"discardChanges": "পরিবর্তনগুলি বাতিল করুন",
"movedToFolder": "{{count}} হোস্ট(গুলি) \"{{folder}} \" এ সরানো হয়েছে",
"editHostTooltip": "হোস্ট সম্পাদনা করুন",
"statusChecks": "অবস্থা যাচাই",
"metricsCollection": "মেট্রিক্স সংগ্রহ",
"metricsInterval": "মেট্রিক্স সংগ্রহের ব্যবধান",
"metricsIntervalDesc": "কত ঘন ঘন সার্ভার পরিসংখ্যান সংগ্রহ করতে হবে (৫ সেকেন্ড - ১ ঘণ্টা)",
"behavior": "আচরণ",
"themePreview": "থিম প্রিভিউ",
"theme": "থিম",
@@ -1899,8 +1889,6 @@
"serverStats": "সার্ভার পরিসংখ্যান",
"loadingServerStats": "সার্ভারের পরিসংখ্যান লোড হচ্ছে...",
"noServerData": "কোন সার্ভার ডেটা উপলব্ধ নেই",
"cpu": "সিপিইউ",
"ram": "রাম",
"customizeLayout": "ড্যাশবোর্ড কাস্টমাইজ করুন",
"dashboardSettings": "ড্যাশবোর্ড সেটিংস",
"enableDisableCards": "কার্ডগুলি সক্রিয়/নিষ্ক্রিয় করুন",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "একটি বৈধ ওয়েব ঠিকানা লিখুন",
"serviceLinksAddFailed": "পরিষেবা লিঙ্ক যোগ করতে ব্যর্থ হয়েছে",
"disk": "ডিস্ক",
"viewServerDetails": "সার্ভারের বিবরণ দেখুন"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "সর্বনিম্ন ১ ঘণ্টা · সর্বোচ্চ ৭২০ ঘণ্টা",
"monitoringDefaults": "ডিফল্ট নিরীক্ষণ",
"statusCheck": "অবস্থা যাচাই",
"metrics": "মেট্রিক্স",
"sec": "সেকেন্ড",
"logLevel": "লগ স্তর",
"enableGuacamole": "গুয়াকামোল সক্রিয় করুন",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "প্রক্সি হোস্ট / পোর্ট",
"hostDefaultsSocks5Username": "প্রক্সি ব্যবহারকারীর নাম",
"hostDefaultsSocks5Password": "প্রক্সি পাসওয়ার্ড",
"hostDefaultsMetrics": "হোস্ট মেট্রিক্স",
"hostDefaultsMetricsEnabled": "মেট্রিক্স সক্ষম করুন",
"hostDefaultsMetricsEnabledDesc": "ডিফল্টরূপে নতুন হোস্টগুলিতে সিপিইউ, মেমরি এবং অন্যান্য পরিসংখ্যান সংগ্রহ করুন।",
"hostDefaultsStatusCheckEnabled": "স্ট্যাটাস চেক সক্ষম করুন",
"hostDefaultsStatusCheckEnabledDesc": "নতুন হোস্টগুলিতে ডিফল্টরূপে অনলাইন/অফলাইন স্ট্যাটাস পোল করুন।",
"hostDefaultsTerminal": "টার্মিনাল",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Mostra l'ús del disc",
"addToFolder": "Afegeix el widget a la carpeta",
"noHostSelected": "No s'ha seleccionat cap amfitrió",
"metricsNotAvailable": "Mètriques no disponibles",
"selectHost": "Seleccioneu un amfitrió...",
"displayedMetrics": "Mètriques mostrades",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disc",
"metricUptime": "Temps de funcionament",
"metricSystem": "Sistema",
"metricOs": "Sistema operatiu",
"metricKernel": "Nucli",
"metricHostname": "Nom d'amfitrió",
"metricNetwork": "Xarxa",
"metricProcesses": "Processos",
"metricProcessesTotal": "total",
"metricProcessesRunning": "corrent",
"categoryMonitoring": "Monitorització",
"loading": "S'està carregant...",
"allClear": "Tot clar",
@@ -775,10 +769,6 @@
"discardChanges": "Descarta els canvis",
"movedToFolder": "S'han mogut {{count}} amfitrions a \"{{folder}}\"",
"editHostTooltip": "Edita l'amfitrió",
"statusChecks": "Comprovacions d'estat",
"metricsCollection": "Col·lecció de mètriques",
"metricsInterval": "Interval de recopilació de mètriques",
"metricsIntervalDesc": "Amb quina freqüència s'han de recopilar estadístiques del servidor (5 segons - 1 hora)",
"behavior": "Comportament",
"themePreview": "Vista prèvia del tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Estadístiques del servidor",
"loadingServerStats": "S'estan carregant les estadístiques del servidor...",
"noServerData": "No hi ha dades del servidor disponibles",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalitza el tauler de control",
"dashboardSettings": "Configuració del tauler de control",
"enableDisableCards": "Activa/Desactiva les targetes",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Introduïu una adreça web vàlida",
"serviceLinksAddFailed": "No s'ha pogut afegir l'enllaç del servei",
"disk": "Disc",
"viewServerDetails": "Veure els detalls del servidor"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Mín 1 h · Màx 720 h",
"monitoringDefaults": "Monitorització dels valors predeterminats",
"statusCheck": "Comprovació d'estat",
"metrics": "Mètriques",
"sec": "segons",
"logLevel": "Nivell de registre",
"enableGuacamole": "Activa el guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Amfitrió/port del proxy",
"hostDefaultsSocks5Username": "Nom d'usuari del proxy",
"hostDefaultsSocks5Password": "Contrasenya del servidor intermediari",
"hostDefaultsMetrics": "Mètriques de l'amfitrió",
"hostDefaultsMetricsEnabled": "Activa les mètriques",
"hostDefaultsMetricsEnabledDesc": "Recopila la CPU, la memòria i altres estadístiques dels nous amfitrions per defecte",
"hostDefaultsStatusCheckEnabled": "Activa la comprovació d'estat",
"hostDefaultsStatusCheckEnabledDesc": "Sondeja l'estat en línia/fora de línia dels nous amfitrions per defecte",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Zobrazit využití disku",
"addToFolder": "Přidat widget do složky",
"noHostSelected": "Nebyl vybrán žádný hostitel",
"metricsNotAvailable": "Metriky nejsou k dispozici",
"selectHost": "Vyberte hostitele...",
"displayedMetrics": "Zobrazené metriky",
"metricCpu": "Procesor",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Doba provozuschopnosti",
"metricSystem": "Systém",
"metricOs": "OS",
"metricKernel": "Jádro",
"metricHostname": "Název hostitele",
"metricNetwork": "Síť",
"metricProcesses": "Procesy",
"metricProcessesTotal": "celkový",
"metricProcessesRunning": "běh",
"categoryMonitoring": "Monitorování",
"loading": "Načítání...",
"allClear": "Všechno čisté",
@@ -775,10 +769,6 @@
"discardChanges": "Zahodit změny",
"movedToFolder": "Přesunuto {{count}} hostitelů do „{{folder}}“",
"editHostTooltip": "Upravit hostitele",
"statusChecks": "Kontroly stavu",
"metricsCollection": "Sbírka metrik",
"metricsInterval": "Interval sběru metrik",
"metricsIntervalDesc": "Jak často shromažďovat statistiky serveru (5 s - 1 h)",
"behavior": "Chování",
"themePreview": "Náhled motivu",
"theme": "Téma",
@@ -1899,8 +1889,6 @@
"serverStats": "Statistiky serveru",
"loadingServerStats": "Načítání statistik serveru...",
"noServerData": "Nejsou k dispozici žádná data serveru",
"cpu": "Procesor",
"ram": "BERAN",
"customizeLayout": "Přizpůsobit řídicí panel",
"dashboardSettings": "Nastavení řídicího panelu",
"enableDisableCards": "Povolit/Zakázat karty",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Zadejte platnou webovou adresu",
"serviceLinksAddFailed": "Nepodařilo se přidat odkaz na službu",
"disk": "Disk",
"viewServerDetails": "Zobrazit podrobnosti o serveru"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min. 1h · Max. 720h",
"monitoringDefaults": "Výchozí nastavení monitorování",
"statusCheck": "Kontrola stavu",
"metrics": "Metriky",
"sec": "sekunda",
"logLevel": "Úroveň protokolu",
"enableGuacamole": "Povolit guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy hostitel / port",
"hostDefaultsSocks5Username": "Uživatelské jméno proxy serveru",
"hostDefaultsSocks5Password": "Heslo proxy serveru",
"hostDefaultsMetrics": "Metriky hostitele",
"hostDefaultsMetricsEnabled": "Povolit metriky",
"hostDefaultsMetricsEnabledDesc": "Ve výchozím nastavení shromažďovat statistiky CPU, paměti a další statistiky na nových hostitelích",
"hostDefaultsStatusCheckEnabled": "Povolit kontrolu stavu",
"hostDefaultsStatusCheckEnabledDesc": "Ve výchozím nastavení zobrazovat stav online/offline na nových hostitelích",
"hostDefaultsTerminal": "Terminál",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Vis diskforbrug",
"addToFolder": "Tilføj widget til mappe",
"noHostSelected": "Ingen vært valgt",
"metricsNotAvailable": "Målinger er ikke tilgængelige",
"selectHost": "Vælg en vært...",
"displayedMetrics": "Viste målinger",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Oppetid",
"metricSystem": "System",
"metricOs": "OS",
"metricKernel": "Kernen",
"metricHostname": "Værtsnavn",
"metricNetwork": "Netværk",
"metricProcesses": "Processer",
"metricProcessesTotal": "total",
"metricProcessesRunning": "løb",
"categoryMonitoring": "Overvågning",
"loading": "Indlæser...",
"allClear": "Alt klart",
@@ -775,10 +769,6 @@
"discardChanges": "Kassér ændringer",
"movedToFolder": "Flyttede {{count}} vært(er) til \"{{folder}}\"",
"editHostTooltip": "Rediger vært",
"statusChecks": "Statuskontroller",
"metricsCollection": "Metriksamling",
"metricsInterval": "Interval for indsamling af metrikker",
"metricsIntervalDesc": "Hvor ofte skal serverstatistik indsamles (5 sekunder - 1 time)",
"behavior": "Opførsel",
"themePreview": "Temaforhåndsvisning",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Serverstatistik",
"loadingServerStats": "Indlæser serverstatistik...",
"noServerData": "Ingen serverdata tilgængelige",
"cpu": "CPU",
"ram": "VÆDDER",
"customizeLayout": "Tilpas dashboard",
"dashboardSettings": "Dashboardindstillinger",
"enableDisableCards": "Aktivér/deaktiver kort",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Indtast en gyldig webadresse",
"serviceLinksAddFailed": "Kunne ikke tilføje tjenestelink",
"disk": "Disk",
"viewServerDetails": "Se serveroplysninger"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min. 1 time · Maks. 720 timer",
"monitoringDefaults": "Overvågning af standardindstillinger",
"statusCheck": "Statuskontrol",
"metrics": "Målinger",
"sec": "sek.",
"logLevel": "Logniveau",
"enableGuacamole": "Aktivér guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy-vært / -port",
"hostDefaultsSocks5Username": "Proxy-brugernavn",
"hostDefaultsSocks5Password": "Proxy-adgangskode",
"hostDefaultsMetrics": "Værtsmålinger",
"hostDefaultsMetricsEnabled": "Aktivér metrikker",
"hostDefaultsMetricsEnabledDesc": "Indsaml som standard CPU-, hukommelses- og andre statistikker på nye værter",
"hostDefaultsStatusCheckEnabled": "Aktivér statuskontrol",
"hostDefaultsStatusCheckEnabledDesc": "Afstem online/offline status på nye værter som standard",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Festplattennutzung anzeigen",
"addToFolder": "Widget zum Ordner hinzufügen",
"noHostSelected": "Kein Host ausgewählt",
"metricsNotAvailable": "Metriken nicht verfügbar",
"selectHost": "Host auswählen...",
"displayedMetrics": "Angezeigte Metriken",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Festplatte",
"metricUptime": "Betriebszeit",
"metricSystem": "System",
"metricOs": "Betriebssystem",
"metricKernel": "Kernel",
"metricHostname": "Hostname",
"metricNetwork": "Netzwerk",
"metricProcesses": "Prozesse",
"metricProcessesTotal": "gesamt",
"metricProcessesRunning": "laufend",
"categoryMonitoring": "Überwachung",
"loading": "Wird geladen...",
"allClear": "Alles in Ordnung",
@@ -775,10 +769,6 @@
"discardChanges": "Änderungen verwerfen",
"movedToFolder": "{{count}} Host(s) nach „{{folder}}“ verschoben",
"editHostTooltip": "Host bearbeiten",
"statusChecks": "Statusprüfungen",
"metricsCollection": "Metrikerfassung",
"metricsInterval": "Metrikerfassungsintervall",
"metricsIntervalDesc": "Wie oft Serverstatistiken erfasst werden sollen (5s - 1h)",
"behavior": "Verhalten",
"themePreview": "Designvorschau",
"theme": "Design",
@@ -1899,8 +1889,6 @@
"serverStats": "Server-Statistiken",
"loadingServerStats": "Server-Statistiken werden geladen...",
"noServerData": "Keine Serverdaten verfügbar",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Dashboard anpassen",
"dashboardSettings": "Dashboard-Einstellungen",
"enableDisableCards": "Karten aktivieren/deaktivieren",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Geben Sie eine gültige Webadresse ein",
"serviceLinksAddFailed": "Hinzufügen des Service-Links fehlgeschlagen",
"disk": "Datenträger",
"viewServerDetails": "Serverdetails anzeigen"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min. 1 Std. · Max. 720 Std.",
"monitoringDefaults": "Überwachungsvoreinstellungen",
"statusCheck": "Statusprüfung",
"metrics": "Metriken",
"sec": "Sek.",
"logLevel": "Log-Level",
"enableGuacamole": "Guacamole aktivieren",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy-Host / Port",
"hostDefaultsSocks5Username": "Proxy-Benutzername",
"hostDefaultsSocks5Password": "Proxy-Passwort",
"hostDefaultsMetrics": "Host-Metriken",
"hostDefaultsMetricsEnabled": "Metriken aktivieren",
"hostDefaultsMetricsEnabledDesc": "CPU, Arbeitsspeicher und andere Statistiken standardmäßig auf neuen Hosts erfassen",
"hostDefaultsStatusCheckEnabled": "Statusüberprüfung aktivieren",
"hostDefaultsStatusCheckEnabledDesc": "Online-/Offline-Status standardmäßig auf neuen Hosts abfragen",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Εμφάνιση χρήσης δίσκου",
"addToFolder": "Προσθήκη γραφικού στοιχείου σε φάκελο",
"noHostSelected": "Δεν έχει επιλεγεί κεντρικός υπολογιστής",
"metricsNotAvailable": "Οι μετρήσεις δεν είναι διαθέσιμες",
"selectHost": "Επιλέξτε έναν οικοδεσπότη...",
"displayedMetrics": "Εμφανιζόμενες μετρήσεις",
"metricCpu": "ΚΜΕ",
@@ -276,13 +275,8 @@
"metricDisk": "Δίσκος",
"metricUptime": "Χρόνος λειτουργίας",
"metricSystem": "Σύστημα",
"metricOs": "Λειτουργικό σύστημα",
"metricKernel": "Πυρήνας",
"metricHostname": "Όνομα κεντρικού υπολογιστή",
"metricNetwork": "Δίκτυο",
"metricProcesses": "Διαδικασίες",
"metricProcessesTotal": "σύνολο",
"metricProcessesRunning": "τρέξιμο",
"categoryMonitoring": "Παρακολούθηση",
"loading": "Φόρτωση...",
"allClear": "Ορίζοντας είναι σαφής",
@@ -775,10 +769,6 @@
"discardChanges": "Απόρριψη αλλαγών",
"movedToFolder": "Μετακινήθηκαν οι {{count}} κεντρικοί υπολογιστές σε \"{{folder}}\"",
"editHostTooltip": "Επεξεργασία κεντρικού υπολογιστή",
"statusChecks": "Έλεγχοι κατάστασης",
"metricsCollection": "Συλλογή μετρήσεων",
"metricsInterval": "Διάστημα συλλογής μετρήσεων",
"metricsIntervalDesc": "Πόσο συχνά να συλλέγονται στατιστικά στοιχεία διακομιστή (5 δευτ. - 1 ώρα)",
"behavior": "Συμπεριφορά",
"themePreview": "Προεπισκόπηση θέματος",
"theme": "Θέμα",
@@ -1899,8 +1889,6 @@
"serverStats": "Στατιστικά διακομιστή",
"loadingServerStats": "Φόρτωση στατιστικών διακομιστή...",
"noServerData": "Δεν υπάρχουν διαθέσιμα δεδομένα διακομιστή",
"cpu": "ΚΜΕ",
"ram": "ΕΜΒΟΛΟ",
"customizeLayout": "Προσαρμογή Πίνακα Ελέγχου",
"dashboardSettings": "Ρυθμίσεις πίνακα ελέγχου",
"enableDisableCards": "Ενεργοποίηση/Απενεργοποίηση καρτών",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Εισαγάγετε μια έγκυρη διεύθυνση ιστού",
"serviceLinksAddFailed": "Αποτυχία προσθήκης συνδέσμου υπηρεσίας",
"disk": "Δίσκος",
"viewServerDetails": "Προβολή λεπτομερειών διακομιστή"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Ελάχ. 1 ώρα · Μέγ. 720 ώρες",
"monitoringDefaults": "Παρακολούθηση προεπιλογών",
"statusCheck": "Έλεγχος κατάστασης",
"metrics": "Μετρήσεις",
"sec": "δευτ.",
"logLevel": "Επίπεδο καταγραφής",
"enableGuacamole": "Ενεργοποίηση Γουακαμόλε",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Κεντρικός υπολογιστής / θύρα μεσολάβησης",
"hostDefaultsSocks5Username": "Όνομα χρήστη διακομιστή μεσολάβησης",
"hostDefaultsSocks5Password": "Κωδικός πρόσβασης διακομιστή μεσολάβησης",
"hostDefaultsMetrics": "Μετρήσεις κεντρικού υπολογιστή",
"hostDefaultsMetricsEnabled": "Ενεργοποίηση μετρήσεων",
"hostDefaultsMetricsEnabledDesc": "Συλλογή CPU, μνήμης και άλλων στατιστικών σε νέους κεντρικούς υπολογιστές από προεπιλογή",
"hostDefaultsStatusCheckEnabled": "Ενεργοποίηση ελέγχου κατάστασης",
"hostDefaultsStatusCheckEnabledDesc": "Δημοσκόπηση κατάστασης online/offline σε νέους κεντρικούς υπολογιστές από προεπιλογή",
"hostDefaultsTerminal": "Τερματικό",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Mostrar uso de disco",
"addToFolder": "Añadir widget a la carpeta",
"noHostSelected": "Ningún host seleccionado",
"metricsNotAvailable": "Métricas no disponibles",
"selectHost": "Seleccionar un host...",
"displayedMetrics": "Métricas mostradas",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disco",
"metricUptime": "Tiempo de actividad",
"metricSystem": "Sistema",
"metricOs": "SO",
"metricKernel": "Kernel",
"metricHostname": "Nombre de host",
"metricNetwork": "Red",
"metricProcesses": "Procesos",
"metricProcessesTotal": "total",
"metricProcessesRunning": "en ejecución",
"categoryMonitoring": "Monitorización",
"loading": "Cargando...",
"allClear": "Todo correcto",
@@ -775,10 +769,6 @@
"discardChanges": "Descartar cambios",
"movedToFolder": "Movido(s) {{count}} host(s) a \"{{folder}}\"",
"editHostTooltip": "Editar host",
"statusChecks": "Comprobaciones de estado",
"metricsCollection": "Recopilación de métricas",
"metricsInterval": "Intervalo de recopilación de métricas",
"metricsIntervalDesc": "Frecuencia de recopilación de estadísticas del servidor (5s - 1h)",
"behavior": "Comportamiento",
"themePreview": "Vista previa del tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Estadísticas del servidor",
"loadingServerStats": "Cargando estadísticas del servidor...",
"noServerData": "No hay datos del servidor disponibles",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalizar panel",
"dashboardSettings": "Configuración del panel",
"enableDisableCards": "Activar/Desactivar tarjetas",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Introduce una dirección web válida",
"serviceLinksAddFailed": "Error al añadir el enlace de servicio",
"disk": "Disco",
"viewServerDetails": "Ver detalles del servidor"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Mín 1h · Máx 720h",
"monitoringDefaults": "Configuración predeterminada de monitorización",
"statusCheck": "Comprobación de estado",
"metrics": "Métricas",
"sec": "seg",
"logLevel": "Nivel de registro",
"enableGuacamole": "Activar Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host / Puerto del proxy",
"hostDefaultsSocks5Username": "Nombre de usuario del proxy",
"hostDefaultsSocks5Password": "Contraseña del proxy",
"hostDefaultsMetrics": "Métricas del host",
"hostDefaultsMetricsEnabled": "Habilitar métricas",
"hostDefaultsMetricsEnabledDesc": "Recopilar CPU, memoria y otras estadísticas en hosts nuevos de forma predeterminada",
"hostDefaultsStatusCheckEnabled": "Habilitar verificación de estado",
"hostDefaultsStatusCheckEnabledDesc": "Consultar estado en línea/fuera de línea en hosts nuevos de forma predeterminada",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Näytä levyn käyttö",
"addToFolder": "Lisää widget kansioon",
"noHostSelected": "Ei valittua isäntää",
"metricsNotAvailable": "Mittareita ei ole saatavilla",
"selectHost": "Valitse isäntä...",
"displayedMetrics": "Näytetyt mittarit",
"metricCpu": "Suoritin",
@@ -276,13 +275,8 @@
"metricDisk": "Levy",
"metricUptime": "Käyttöaika",
"metricSystem": "Järjestelmä",
"metricOs": "Käyttöjärjestelmä",
"metricKernel": "Ydin",
"metricHostname": "Isäntänimi",
"metricNetwork": "Verkko",
"metricProcesses": "Prosessit",
"metricProcessesTotal": "kokonais-",
"metricProcessesRunning": "juokseminen",
"categoryMonitoring": "Seuranta",
"loading": "Ladataan...",
"allClear": "Kaikki selvää",
@@ -775,10 +769,6 @@
"discardChanges": "Hylkää muutokset",
"movedToFolder": "Siirretty {{count}} isäntä(ä) kohteeseen \"{{folder}}\"",
"editHostTooltip": "Muokkaa isäntää",
"statusChecks": "Tilatarkastukset",
"metricsCollection": "Mittarikokoelma",
"metricsInterval": "Mittaritietojen keräysväli",
"metricsIntervalDesc": "Palvelintilastojen keräämisen tiheys (5 s - 1 h)",
"behavior": "Käyttäytyminen",
"themePreview": "Teeman esikatselu",
"theme": "Teema",
@@ -1899,8 +1889,6 @@
"serverStats": "Palvelimen tilastot",
"loadingServerStats": "Ladataan palvelimen tilastoja...",
"noServerData": "Palvelintietoja ei saatavilla",
"cpu": "Suoritin",
"ram": "RAM-muistia",
"customizeLayout": "Mukauta kojelautaa",
"dashboardSettings": "Kojelaudan asetukset",
"enableDisableCards": "Korttien käyttöönotto/pois käytöstä",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Anna kelvollinen verkko-osoite",
"serviceLinksAddFailed": "Palvelulinkin lisääminen epäonnistui",
"disk": "Levy",
"viewServerDetails": "Näytä palvelimen tiedot"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Vähintään 1 h · Enintään 720 h",
"monitoringDefaults": "Valvonnan oletusarvot",
"statusCheck": "Tilatarkistus",
"metrics": "Mittarit",
"sec": "sek",
"logLevel": "Lokitaso",
"enableGuacamole": "Ota guacamole käyttöön",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Välityspalvelin/portti",
"hostDefaultsSocks5Username": "Välityspalvelimen käyttäjätunnus",
"hostDefaultsSocks5Password": "Välityspalvelimen salasana",
"hostDefaultsMetrics": "Isännän mittarit",
"hostDefaultsMetricsEnabled": "Ota mittarit käyttöön",
"hostDefaultsMetricsEnabledDesc": "Kerää oletuksena uusien isäntien suorittimen, muistin ja muita tilastoja",
"hostDefaultsStatusCheckEnabled": "Ota tilan tarkistus käyttöön",
"hostDefaultsStatusCheckEnabledDesc": "Kysely online/offline-tila uusilla isännöillä oletuksena",
"hostDefaultsTerminal": "Terminaali",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Afficher l'utilisation du disque",
"addToFolder": "Ajouter le widget au dossier",
"noHostSelected": "Aucun hôte sélectionné",
"metricsNotAvailable": "Métriques non disponibles",
"selectHost": "Sélectionner un hôte…",
"displayedMetrics": "Métriques affichées",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disque",
"metricUptime": "Uptime",
"metricSystem": "Système",
"metricOs": "OS",
"metricKernel": "Noyau",
"metricHostname": "Nom d’hôte",
"metricNetwork": "Réseau",
"metricProcesses": "Processus",
"metricProcessesTotal": "total",
"metricProcessesRunning": "en cours",
"categoryMonitoring": "Surveillance",
"loading": "Chargement…",
"allClear": "Aucune alerte",
@@ -775,10 +769,6 @@
"discardChanges": "Rejeter les modifications",
"movedToFolder": "{{count}} hôte(s) déplacé(s) vers \"{{folder}}\"",
"editHostTooltip": "Modifier l'hôte",
"statusChecks": "Vérifications d'état",
"metricsCollection": "Collecte de métriques",
"metricsInterval": "Intervalle de collecte des métriques",
"metricsIntervalDesc": "Fréquence de collecte des statistiques du serveur (5 s - 1 h)",
"behavior": "Comportement",
"themePreview": "Aperçu du thème",
"theme": "Thème",
@@ -1899,8 +1889,6 @@
"serverStats": "Statistiques serveur",
"loadingServerStats": "Chargement des statistiques serveur...",
"noServerData": "Aucune donnée serveur disponible",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personnaliser le tableau de bord",
"dashboardSettings": "Paramètres du tableau de bord",
"enableDisableCards": "Activer/Désactiver les cartes",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Saisissez une adresse Web valide",
"serviceLinksAddFailed": "Échec de l’ajout du lien de service",
"disk": "Disque",
"viewServerDetails": "Afficher les détails du serveur"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min 1 h · Max 720 h",
"monitoringDefaults": "Paramètres de surveillance par défaut",
"statusCheck": "Vérification de l'état",
"metrics": "Métriques",
"sec": "s",
"logLevel": "Niveau de journalisation",
"enableGuacamole": "Activer Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Hôte / Port du proxy",
"hostDefaultsSocks5Username": "Nom d’utilisateur du proxy",
"hostDefaultsSocks5Password": "Mot de passe du proxy",
"hostDefaultsMetrics": "Métriques de l’hôte",
"hostDefaultsMetricsEnabled": "Activer les métriques",
"hostDefaultsMetricsEnabledDesc": "Collecter par défaut les statistiques CPU, mémoire, etc. des nouveaux hôtes",
"hostDefaultsStatusCheckEnabled": "Activer la vérification de l’état",
"hostDefaultsStatusCheckEnabledDesc": "Sonder par défaut l’état en ligne/hors ligne des nouveaux hôtes",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "הצג שימוש בדיסק",
"addToFolder": "הוסף ווידג'ט לתיקייה",
"noHostSelected": "לא נבחר מארח",
"metricsNotAvailable": "מדדים אינם זמינים",
"selectHost": "בחר מארח...",
"displayedMetrics": "מדדים מוצגים",
"metricCpu": "מעבד",
@@ -276,13 +275,8 @@
"metricDisk": "דִיסק",
"metricUptime": "זמן פעולה",
"metricSystem": "מַעֲרֶכֶת",
"metricOs": "מערכת הפעלה",
"metricKernel": "גַרעִין",
"metricHostname": "שם מארח",
"metricNetwork": "רֶשֶׁת",
"metricProcesses": "תהליכים",
"metricProcessesTotal": "סַך הַכֹּל",
"metricProcessesRunning": "רִיצָה",
"categoryMonitoring": "ניטור",
"loading": "טְעִינָה...",
"allClear": "הכל ברור",
@@ -775,10 +769,6 @@
"discardChanges": "בטל שינויים",
"movedToFolder": "הועבר/י מארח/ים {{count}} ל-\"{{folder}}\"",
"editHostTooltip": "עריכת מארח",
"statusChecks": "בדיקות סטטוס",
"metricsCollection": "אוסף מדדים",
"metricsInterval": "מרווח איסוף מדדים",
"metricsIntervalDesc": "באיזו תדירות לאסוף סטטיסטיקות שרת (5 שניות - שעה)",
"behavior": "הִתְנַהֲגוּת",
"themePreview": "תצוגה מקדימה של ערכת נושא",
"theme": "נוֹשֵׂא",
@@ -1899,8 +1889,6 @@
"serverStats": "סטטיסטיקות שרת",
"loadingServerStats": "טוען סטטיסטיקות שרת...",
"noServerData": "אין נתוני שרת זמינים",
"cpu": "מעבד",
"ram": "אַיִל",
"customizeLayout": "התאמה אישית של לוח המחוונים",
"dashboardSettings": "הגדרות לוח המחוונים",
"enableDisableCards": "הפעלה/השבתה של כרטיסים",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "הזן כתובת אינטרנט חוקית",
"serviceLinksAddFailed": "נכשל הוספת קישור לשירות",
"disk": "דִיסק",
"viewServerDetails": "הצג פרטי שרת"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "מינימום שעה · מקסימום 720 שעות",
"monitoringDefaults": "ניטור ברירות מחדל",
"statusCheck": "בדיקת סטטוס",
"metrics": "מדדים",
"sec": "שניות",
"logLevel": "רמת יומן",
"enableGuacamole": "הפעל גוואקמולי",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "מארח פרוקסי / פורט",
"hostDefaultsSocks5Username": "שם משתמש פרוקסי",
"hostDefaultsSocks5Password": "סיסמת פרוקסי",
"hostDefaultsMetrics": "מדדי מארח",
"hostDefaultsMetricsEnabled": "הפעל מדדים",
"hostDefaultsMetricsEnabledDesc": "איסוף נתונים סטטיסטיים של המעבד, הזיכרון ונתונים סטטיסטיים אחרים במחשבים חדשים כברירת מחדל",
"hostDefaultsStatusCheckEnabled": "הפעל בדיקת סטטוס",
"hostDefaultsStatusCheckEnabledDesc": "סקר סטטוס מקוון/לא מקוון על מארחים חדשים כברירת מחדל",
"hostDefaultsTerminal": "מָסוֹף",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "डिस्क उपयोग दिखाएं",
"addToFolder": "फ़ोल्डर में विजेट जोड़ें",
"noHostSelected": "कोई होस्ट चयनित नहीं",
"metricsNotAvailable": "मेट्रिक्स उपलब्ध नहीं",
"selectHost": "होस्ट चुनें...",
"displayedMetrics": "प्रदर्शित मेट्रिक्स",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "डिस्क",
"metricUptime": "अपटाइम",
"metricSystem": "सिस्टम",
"metricOs": "ओएस",
"metricKernel": "कर्नेल",
"metricHostname": "होस्टनेम",
"metricNetwork": "नेटवर्क",
"metricProcesses": "प्रोसेस",
"metricProcessesTotal": "कुल",
"metricProcessesRunning": "चालू",
"categoryMonitoring": "निगरानी",
"loading": "लोड हो रहा है...",
"allClear": "सब ठीक है",
@@ -775,10 +769,6 @@
"discardChanges": "परिवर्तनों को निरस्त करें",
"movedToFolder": "{{count}} होस्ट(s) को \"{{folder}}\" में स्थानांतरित किया गया",
"editHostTooltip": "होस्ट संपादित करें",
"statusChecks": "स्थिति जांच",
"metricsCollection": "मेट्रिक्स संग्रहण",
"metricsInterval": "मेट्रिक्स संग्रहण अंतराल",
"metricsIntervalDesc": "सर्वर आँकड़े कितनी बार एकत्र करें (5s - 1h)",
"behavior": "व्यवहार",
"themePreview": "थीम पूर्वावलोकन",
"theme": "थीम",
@@ -1899,8 +1889,6 @@
"serverStats": "सर्वर आँकड़े",
"loadingServerStats": "सर्वर आँकड़े लोड हो रहे हैं...",
"noServerData": "कोई सर्वर डेटा उपलब्ध नहीं है",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "डैशबोर्ड अनुकूलित करें",
"dashboardSettings": "डैशबोर्ड सेटिंग्स",
"enableDisableCards": "कार्ड सक्षम/अक्षम करें",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "एक मान्य वेब पता दर्ज करें",
"serviceLinksAddFailed": "सर्विस लिंक जोड़ने में विफल",
"disk": "डिस्क",
"viewServerDetails": "सर्वर विवरण देखें"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "न्यूनतम 1 घंटा · अधिकतम 720 घंटे",
"monitoringDefaults": "निगरानी डिफ़ॉल्ट",
"statusCheck": "स्थिति जाँच",
"metrics": "मेट्रिक्स",
"sec": "सेकंड",
"logLevel": "लॉग स्तर",
"enableGuacamole": "Guacamole सक्षम करें",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "प्रॉक्सी होस्ट / पोर्ट",
"hostDefaultsSocks5Username": "प्रॉक्सी उपयोगकर्ता नाम",
"hostDefaultsSocks5Password": "प्रॉक्सी पासवर्ड",
"hostDefaultsMetrics": "होस्ट मेट्रिक्स",
"hostDefaultsMetricsEnabled": "मेट्रिक्स सक्षम करें",
"hostDefaultsMetricsEnabledDesc": "डिफ़ॉल्ट रूप से नए होस्ट पर CPU, मेमोरी और अन्य आँकड़े एकत्र करें",
"hostDefaultsStatusCheckEnabled": "स्टेटस चेक सक्षम करें",
"hostDefaultsStatusCheckEnabledDesc": "डिफ़ॉल्ट रूप से नए होस्ट पर ऑनलाइन/ऑफ़लाइन स्थिति की जाँच करें",
"hostDefaultsTerminal": "टर्मिनल",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Lemezhasználat megjelenítése",
"addToFolder": "Widget hozzáadása mappához",
"noHostSelected": "Nincs kiválasztva gazdagép",
"metricsNotAvailable": "Mutatók nem állnak rendelkezésre",
"selectHost": "Válasszon egy hosztot...",
"displayedMetrics": "Megjelenített mutatók",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Korong",
"metricUptime": "Üzemidő",
"metricSystem": "Rendszer",
"metricOs": "operációs rendszer",
"metricKernel": "Kernel",
"metricHostname": "Gazdagépnév",
"metricNetwork": "Hálózat",
"metricProcesses": "Folyamatok",
"metricProcessesTotal": "teljes",
"metricProcessesRunning": "futás",
"categoryMonitoring": "Monitoring",
"loading": "Terhelés...",
"allClear": "Minden tiszta",
@@ -775,10 +769,6 @@
"discardChanges": "Változtatások elvetése",
"movedToFolder": "{{count}} hoszt(oka)t áthelyeztem ide: \"{{folder}}\"",
"editHostTooltip": "Gazdagép szerkesztése",
"statusChecks": "Állapotellenőrzések",
"metricsCollection": "Metrikagyűjtemény",
"metricsInterval": "Metrikagyűjtési intervallum",
"metricsIntervalDesc": "Milyen gyakran gyűjtsünk szerverstatisztikákat (5 másodperc - 1 óra)",
"behavior": "Viselkedés",
"themePreview": "Téma előnézete",
"theme": "Téma",
@@ -1899,8 +1889,6 @@
"serverStats": "Szerver statisztikák",
"loadingServerStats": "Szerverstatisztikák betöltése...",
"noServerData": "Nincsenek elérhető szerveradatok",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Irányítópult testreszabása",
"dashboardSettings": "Irányítópult beállításai",
"enableDisableCards": "Kártyák engedélyezése/letiltása",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Adjon meg egy érvényes webcímet",
"serviceLinksAddFailed": "Nem sikerült hozzáadni a szolgáltatás linkjét",
"disk": "Korong",
"viewServerDetails": "Szerver részleteinek megtekintése"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Minimum 1 óra · Max. 720 óra",
"monitoringDefaults": "Monitorozási alapértelmezések",
"statusCheck": "Állapotellenőrzés",
"metrics": "Metrikák",
"sec": "másodperc",
"logLevel": "Naplózási szint",
"enableGuacamole": "Guacamole engedélyezése",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy host / port",
"hostDefaultsSocks5Username": "Proxy felhasználónév",
"hostDefaultsSocks5Password": "Proxy jelszó",
"hostDefaultsMetrics": "Gazdagép-metrikák",
"hostDefaultsMetricsEnabled": "Metrikák engedélyezése",
"hostDefaultsMetricsEnabledDesc": "Alapértelmezés szerint gyűjtsön CPU-, memória- és egyéb statisztikákat az új hosztokon",
"hostDefaultsStatusCheckEnabled": "Állapotellenőrzés engedélyezése",
"hostDefaultsStatusCheckEnabledDesc": "Online/offline állapot lekérdezése új gazdagépeken alapértelmezés szerint",
"hostDefaultsTerminal": "Terminál",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Tampilkan Penggunaan Disk",
"addToFolder": "Tambahkan widget ke folder",
"noHostSelected": "Tidak ada pembawa acara yang dipilih.",
"metricsNotAvailable": "Metrik tidak tersedia",
"selectHost": "Pilih tuan rumah...",
"displayedMetrics": "Metrik yang Ditampilkan",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Waktu aktif",
"metricSystem": "Sistem",
"metricOs": "Sistem Operasi",
"metricKernel": "Inti",
"metricHostname": "Nama host",
"metricNetwork": "Jaringan",
"metricProcesses": "Proses",
"metricProcessesTotal": "total",
"metricProcessesRunning": "berlari",
"categoryMonitoring": "Pemantauan",
"loading": "Memuat...",
"allClear": "Semuanya aman.",
@@ -775,10 +769,6 @@
"discardChanges": "Abaikan perubahan",
"movedToFolder": "Host {{count}} dipindahkan ke \"{{folder}}\"",
"editHostTooltip": "Edit host",
"statusChecks": "Pemeriksaan Status",
"metricsCollection": "Pengumpulan Metrik",
"metricsInterval": "Interval Pengumpulan Metrik",
"metricsIntervalDesc": "Seberapa sering mengumpulkan statistik server (5 detik - 1 jam)",
"behavior": "Perilaku",
"themePreview": "Pratinjau Tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Statistik Server",
"loadingServerStats": "Memuat statistik server...",
"noServerData": "Tidak ada data server yang tersedia.",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Sesuaikan Dasbor",
"dashboardSettings": "Pengaturan Dasbor",
"enableDisableCards": "Aktifkan/Nonaktifkan Kartu",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Masukkan alamat web yang valid",
"serviceLinksAddFailed": "Gagal menambahkan tautan layanan",
"disk": "Disk",
"viewServerDetails": "Lihat detail server"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Minimal 1 jam · Maksimal 720 jam",
"monitoringDefaults": "Pemantauan Default",
"statusCheck": "Pemeriksaan Status",
"metrics": "Metrik",
"sec": "detik",
"logLevel": "Tingkat Log",
"enableGuacamole": "Aktifkan Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host/Port Proksi",
"hostDefaultsSocks5Username": "Nama Pengguna Proksi",
"hostDefaultsSocks5Password": "Kata Sandi Proksi",
"hostDefaultsMetrics": "Metrik Host",
"hostDefaultsMetricsEnabled": "Aktifkan Metrik",
"hostDefaultsMetricsEnabledDesc": "Secara default, kumpulkan statistik CPU, memori, dan statistik lainnya pada host baru.",
"hostDefaultsStatusCheckEnabled": "Aktifkan Pemeriksaan Status",
"hostDefaultsStatusCheckEnabledDesc": "Secara default, lakukan polling status online/offline pada host baru.",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Mostra utilizzo disco",
"addToFolder": "Aggiungi widget alla cartella",
"noHostSelected": "Nessun host selezionato",
"metricsNotAvailable": "Metriche non disponibili",
"selectHost": "Seleziona un host...",
"displayedMetrics": "Metriche visualizzate",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disco",
"metricUptime": "Uptime",
"metricSystem": "Sistema",
"metricOs": "OS",
"metricKernel": "Kernel",
"metricHostname": "Nome host",
"metricNetwork": "Rete",
"metricProcesses": "Processi",
"metricProcessesTotal": "totale",
"metricProcessesRunning": "in esecuzione",
"categoryMonitoring": "Monitoraggio",
"loading": "Caricamento...",
"allClear": "Tutto a posto",
@@ -775,10 +769,6 @@
"discardChanges": "Scarta le modifiche",
"movedToFolder": "Spostato/i {{count}} host nella cartella \"{{folder}}\"",
"editHostTooltip": "Modifica host",
"statusChecks": "Controlli di stato",
"metricsCollection": "Raccolta metriche",
"metricsInterval": "Intervallo raccolta metriche",
"metricsIntervalDesc": "Intervallo di raccolta delle metriche del server (5s - 1h)",
"behavior": "Comportamento",
"themePreview": "Anteprima tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Statistiche server",
"loadingServerStats": "Caricamento statistiche server...",
"noServerData": "Nessun dato del server disponibile",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalizza Dashboard",
"dashboardSettings": "Impostazioni Dashboard",
"enableDisableCards": "Abilita/Disabilita schede",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Inserisci un indirizzo web valido",
"serviceLinksAddFailed": "Impossibile aggiungere il collegamento al servizio",
"disk": "Disco",
"viewServerDetails": "Visualizza dettagli server"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min 1h · Max 720h",
"monitoringDefaults": "Impostazioni predefinite monitoraggio",
"statusCheck": "Verifica stato",
"metrics": "Metriche",
"sec": "sec",
"logLevel": "Livello di log",
"enableGuacamole": "Abilita Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host / Porta proxy",
"hostDefaultsSocks5Username": "Nome utente proxy",
"hostDefaultsSocks5Password": "Password proxy",
"hostDefaultsMetrics": "Metriche host",
"hostDefaultsMetricsEnabled": "Abilita metriche",
"hostDefaultsMetricsEnabledDesc": "Raccogli metriche CPU, memoria e altre sui nuovi host per impostazione predefinita",
"hostDefaultsStatusCheckEnabled": "Abilita controllo stato",
"hostDefaultsStatusCheckEnabledDesc": "Verifica lo stato online/offline sui nuovi host per impostazione predefinita",
"hostDefaultsTerminal": "Terminale",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "ディスク使用量を表示",
"addToFolder": "ウィジェットをフォルダに追加",
"noHostSelected": "ホストが選択されていません",
"metricsNotAvailable": "メトリクスは利用できません",
"selectHost": "ホストを選択...",
"displayedMetrics": "表示メトリクス",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "ディスク",
"metricUptime": "稼働時間",
"metricSystem": "システム",
"metricOs": "OS",
"metricKernel": "カーネル",
"metricHostname": "ホスト名",
"metricNetwork": "ネットワーク",
"metricProcesses": "プロセス",
"metricProcessesTotal": "合計",
"metricProcessesRunning": "実行中",
"categoryMonitoring": "モニタリング",
"loading": "読み込み中...",
"allClear": "すべて正常",
@@ -775,10 +769,6 @@
"discardChanges": "変更を破棄する",
"movedToFolder": "{{count}} 個のホストを \"{{folder}}\" に移動しました",
"editHostTooltip": "ホストを編集",
"statusChecks": "ステータスチェック",
"metricsCollection": "メトリクス収集",
"metricsInterval": "メトリクス収集間隔",
"metricsIntervalDesc": "サーバー統計を収集する頻度 (5秒〜1時間)",
"behavior": "動作",
"themePreview": "テーマプレビュー",
"theme": "テーマ",
@@ -1899,8 +1889,6 @@
"serverStats": "サーバー統計",
"loadingServerStats": "サーバー統計を読み込み中...",
"noServerData": "サーバーデータがありません",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "ダッシュボードのカスタマイズ",
"dashboardSettings": "ダッシュボード設定",
"enableDisableCards": "カードの表示/非表示",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "有効なWebアドレスを入力してください",
"serviceLinksAddFailed": "サービスリンクの追加に失敗しました",
"disk": "ディスク",
"viewServerDetails": "サーバーの詳細を表示"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "最小1時間・最大720時間",
"monitoringDefaults": "監視のデフォルト",
"statusCheck": "ステータスチェック",
"metrics": "メトリクス",
"sec": "秒",
"logLevel": "ログレベル",
"enableGuacamole": "Guacamoleを有効にする",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "プロキシホスト / ポート",
"hostDefaultsSocks5Username": "プロキシユーザー名",
"hostDefaultsSocks5Password": "プロキシパスワード",
"hostDefaultsMetrics": "ホストメトリクス",
"hostDefaultsMetricsEnabled": "メトリクスを有効にする",
"hostDefaultsMetricsEnabledDesc": "デフォルトで新規ホストのCPU、メモリなどの統計情報を収集する",
"hostDefaultsStatusCheckEnabled": "ステータスチェックを有効にする",
"hostDefaultsStatusCheckEnabledDesc": "デフォルトで新規ホストのオンライン/オフライン状態をポーリングする",
"hostDefaultsTerminal": "ターミナル",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "디스크 사용량 표시",
"addToFolder": "폴더에 위젯 추가",
"noHostSelected": "선택된 호스트 없음",
"metricsNotAvailable": "메트릭을 사용할 수 없습니다",
"selectHost": "호스트 선택...",
"displayedMetrics": "표시된 메트릭",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "디스크",
"metricUptime": "업타임",
"metricSystem": "시스템",
"metricOs": "OS",
"metricKernel": "커널",
"metricHostname": "호스트명",
"metricNetwork": "네트워크",
"metricProcesses": "프로세스",
"metricProcessesTotal": "전체",
"metricProcessesRunning": "실행 중",
"categoryMonitoring": "모니터링",
"loading": "로딩 중...",
"allClear": "모두 정상",
@@ -775,10 +769,6 @@
"discardChanges": "잔돈을 버리세요",
"movedToFolder": "호스트 {{count}}개를 \"{{folder}}\" 폴더로 이동했습니다",
"editHostTooltip": "호스트 편집",
"statusChecks": "상태 확인",
"metricsCollection": "메트릭 수집",
"metricsInterval": "메트릭 수집 간격",
"metricsIntervalDesc": "서버 통계 수집 빈도 (5초 - 1시간)",
"behavior": "동작",
"themePreview": "테마 미리보기",
"theme": "테마",
@@ -1899,8 +1889,6 @@
"serverStats": "서버 통계",
"loadingServerStats": "서버 통계 로딩 중...",
"noServerData": "서버 데이터 없음",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "대시보드 사용자 지정",
"dashboardSettings": "대시보드 설정",
"enableDisableCards": "카드 활성화/비활성화",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "올바른 웹 주소를 입력하세요",
"serviceLinksAddFailed": "서비스 링크 추가 실패",
"disk": "디스크",
"viewServerDetails": "서버 세부정보 보기"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "최소 1시간 · 최대 720시간",
"monitoringDefaults": "모니터링 기본값",
"statusCheck": "상태 확인",
"metrics": "메트릭",
"sec": "초",
"logLevel": "로그 레벨",
"enableGuacamole": "Guacamole 활성화",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "프록시 호스트 / 포트",
"hostDefaultsSocks5Username": "프록시 사용자 이름",
"hostDefaultsSocks5Password": "프록시 비밀번호",
"hostDefaultsMetrics": "호스트 메트릭",
"hostDefaultsMetricsEnabled": "메트릭 활성화",
"hostDefaultsMetricsEnabledDesc": "기본적으로 새 호스트에서 CPU, 메모리 등 통계 수집",
"hostDefaultsStatusCheckEnabled": "상태 확인 활성화",
"hostDefaultsStatusCheckEnabledDesc": "기본적으로 새 호스트의 온라인/오프라인 상태 확인",
"hostDefaultsTerminal": "터미널",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Schijfgebruik weergeven",
"addToFolder": "Widget toevoegen aan map",
"noHostSelected": "Geen host geselecteerd",
"metricsNotAvailable": "Gegevens niet beschikbaar",
"selectHost": "Selecteer een host...",
"displayedMetrics": "Weergegeven statistieken",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Schijf",
"metricUptime": "Beschikbaarheid",
"metricSystem": "Systeem",
"metricOs": "OS",
"metricKernel": "Kernel",
"metricHostname": "Hostnaam",
"metricNetwork": "Netwerk",
"metricProcesses": "Processen",
"metricProcessesTotal": "totaal",
"metricProcessesRunning": "rennen",
"categoryMonitoring": "Monitoring",
"loading": "Laden...",
"allClear": "Alles in orde",
@@ -775,10 +769,6 @@
"discardChanges": "Wijzigingen negeren",
"movedToFolder": "Verplaatst {{count}} host(s) naar \"{{folder}}\"",
"editHostTooltip": "Bewerk de host",
"statusChecks": "Statuscontroles",
"metricsCollection": "Gegevensverzameling",
"metricsInterval": "Interval voor het verzamelen van meetgegevens",
"metricsIntervalDesc": "Hoe vaak moeten serverstatistieken worden verzameld (5s - 1u)?",
"behavior": "Gedrag",
"themePreview": "Themavoorbeeld",
"theme": "Thema",
@@ -1899,8 +1889,6 @@
"serverStats": "Serverstatistieken",
"loadingServerStats": "Serverstatistieken worden geladen...",
"noServerData": "Geen servergegevens beschikbaar",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Dashboard aanpassen",
"dashboardSettings": "Dashboardinstellingen",
"enableDisableCards": "Kaarten in-/uitschakelen",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Voer een geldig webadres in.",
"serviceLinksAddFailed": "Het toevoegen van de servicelink is mislukt.",
"disk": "Schijf",
"viewServerDetails": "Servergegevens bekijken"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Minimaal 1 uur · Maximaal 720 uur",
"monitoringDefaults": "Standaardinstellingen bewaken",
"statusCheck": "Statuscontrole",
"metrics": "Statistieken",
"sec": "sec",
"logLevel": "Logniveau",
"enableGuacamole": "Schakel Guacamole in",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy-host / poort",
"hostDefaultsSocks5Username": "Proxy-gebruikersnaam",
"hostDefaultsSocks5Password": "Proxy-wachtwoord",
"hostDefaultsMetrics": "Hoststatistieken",
"hostDefaultsMetricsEnabled": "Statistieken inschakelen",
"hostDefaultsMetricsEnabledDesc": "Verzamel standaard CPU-, geheugen- en andere statistieken van nieuwe hosts.",
"hostDefaultsStatusCheckEnabled": "Statuscontrole inschakelen",
"hostDefaultsStatusCheckEnabledDesc": "Controleer standaard de online/offline-status van nieuwe hosts.",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Vis diskbruk",
"addToFolder": "Legg til widget i mappe",
"noHostSelected": "Ingen vert valgt",
"metricsNotAvailable": "Målinger er ikke tilgjengelige",
"selectHost": "Velg en vert...",
"displayedMetrics": "Viste målinger",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Oppetid",
"metricSystem": "System",
"metricOs": "OS",
"metricKernel": "Kjerne",
"metricHostname": "Vertsnavn",
"metricNetwork": "Nettverk",
"metricProcesses": "Prosesser",
"metricProcessesTotal": "total",
"metricProcessesRunning": "løping",
"categoryMonitoring": "Overvåking",
"loading": "Laster inn...",
"allClear": "Alt klart",
@@ -775,10 +769,6 @@
"discardChanges": "Forkast endringer",
"movedToFolder": "Flyttet {{count}} vert(er) til \"{{folder}}\"",
"editHostTooltip": "Rediger vert",
"statusChecks": "Statuskontroller",
"metricsCollection": "Metriksamling",
"metricsInterval": "Intervall for innsamling av metrikk",
"metricsIntervalDesc": "Hvor ofte skal serverstatistikk samles inn (5 sekunder - 1 time)",
"behavior": "Oppførsel",
"themePreview": "Forhåndsvisning av tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Serverstatistikk",
"loadingServerStats": "Laster inn serverstatistikk ...",
"noServerData": "Ingen serverdata tilgjengelig",
"cpu": "CPU",
"ram": "VÆR",
"customizeLayout": "Tilpass dashbordet",
"dashboardSettings": "Innstillinger for dashbord",
"enableDisableCards": "Aktiver/deaktiver kort",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Skriv inn en gyldig nettadresse",
"serviceLinksAddFailed": "Kunne ikke legge til tjenestelenke",
"disk": "Disk",
"viewServerDetails": "Vis serverdetaljer"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min. 1 t · Maks. 720 t",
"monitoringDefaults": "Overvåking av standardinnstillinger",
"statusCheck": "Statussjekk",
"metrics": "Målinger",
"sec": "sek",
"logLevel": "Loggnivå",
"enableGuacamole": "Aktiver guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy-vert / -port",
"hostDefaultsSocks5Username": "Proxy-brukernavn",
"hostDefaultsSocks5Password": "Proxy-passord",
"hostDefaultsMetrics": "Vertsmålinger",
"hostDefaultsMetricsEnabled": "Aktiver målinger",
"hostDefaultsMetricsEnabledDesc": "Samle inn CPU-, minne- og annen statistikk på nye verter som standard",
"hostDefaultsStatusCheckEnabled": "Aktiver statussjekk",
"hostDefaultsStatusCheckEnabledDesc": "Avstem online/offline-status på nye verter som standard",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Pokaż użycie dysku",
"addToFolder": "Dodaj widżet do folderu",
"noHostSelected": "Nie wybrano hosta",
"metricsNotAvailable": "Metryki niedostępne",
"selectHost": "Wybierz hosta...",
"displayedMetrics": "Wyświetlane metryki",
"metricCpu": "Procesor",
@@ -276,13 +275,8 @@
"metricDisk": "Dysk",
"metricUptime": "Czas działania",
"metricSystem": "System",
"metricOs": "System operacyjny",
"metricKernel": "Jądro",
"metricHostname": "Nazwa hosta",
"metricNetwork": "Sieć",
"metricProcesses": "Procesy",
"metricProcessesTotal": "łącznie",
"metricProcessesRunning": "działa",
"categoryMonitoring": "Monitorowanie",
"loading": "Ładowanie...",
"allClear": "Bez alertów",
@@ -775,10 +769,6 @@
"discardChanges": "Odrzuć zmiany",
"movedToFolder": "Przeniesiono {{count}} hostów do „{{folder}}”",
"editHostTooltip": "Edytuj hosta",
"statusChecks": "Sprawdzanie statusu",
"metricsCollection": "Zbieranie metryk",
"metricsInterval": "Interwał zbierania metryk",
"metricsIntervalDesc": "Jak często zbierać statystyki serwera (5 sek. - 1 godz.)",
"behavior": "Zachowanie",
"themePreview": "Podgląd motywu",
"theme": "Motyw",
@@ -1899,8 +1889,6 @@
"serverStats": "Statystyki serwera",
"loadingServerStats": "Ładowanie statystyk serwera...",
"noServerData": "Brak dostępnych danych serwera",
"cpu": "Procesor",
"ram": "RAM",
"customizeLayout": "Dostosuj pulpit",
"dashboardSettings": "Ustawienia pulpitu",
"enableDisableCards": "Włącz/wyłącz karty",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Wprowadź prawidłowy adres internetowy",
"serviceLinksAddFailed": "Nie udało się dodać linku do usługi",
"disk": "Dysk",
"viewServerDetails": "Wyświetl szczegóły serwera"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min. 1 godz. · Maks. 720 godz.",
"monitoringDefaults": "Domyślne ustawienia monitorowania",
"statusCheck": "Sprawdzanie statusu",
"metrics": "Metryki",
"sec": "sek",
"logLevel": "Poziom logowania",
"enableGuacamole": "Włącz Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host/Port proxy",
"hostDefaultsSocks5Username": "Nazwa użytkownika proxy",
"hostDefaultsSocks5Password": "Hasło proxy",
"hostDefaultsMetrics": "Metryki hosta",
"hostDefaultsMetricsEnabled": "Włącz metryki",
"hostDefaultsMetricsEnabledDesc": "Domyślnie zbieraj na nowych hostach dane o procesorze, pamięci i inne statystyki",
"hostDefaultsStatusCheckEnabled": "Włącz sprawdzanie statusu",
"hostDefaultsStatusCheckEnabledDesc": "Domyślnie sprawdzaj status online/offline na nowych hostach",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Mostrar uso do disco",
"addToFolder": "Adicionar widget à pasta",
"noHostSelected": "Nenhum host selecionado",
"metricsNotAvailable": "Métricas não disponíveis",
"selectHost": "Selecione um host...",
"displayedMetrics": "Métricas exibidas",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disco",
"metricUptime": "Tempo de atividade",
"metricSystem": "Sistema",
"metricOs": "SO",
"metricKernel": "Kernel",
"metricHostname": "Nome do host",
"metricNetwork": "Rede",
"metricProcesses": "Processos",
"metricProcessesTotal": "total",
"metricProcessesRunning": "correndo",
"categoryMonitoring": "Monitoramento",
"loading": "Carregando...",
"allClear": "Tudo certo",
@@ -775,10 +769,6 @@
"discardChanges": "Descartar alterações",
"movedToFolder": "Movidos os {{count}} hosts para \"{{folder}}\"",
"editHostTooltip": "Editar anfitrião",
"statusChecks": "Verificações de status",
"metricsCollection": "Coleta de métricas",
"metricsInterval": "Intervalo de coleta de métricas",
"metricsIntervalDesc": "Com que frequência coletar estatísticas do servidor (5s - 1h)",
"behavior": "Comportamento",
"themePreview": "Pré-visualização do tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Estatísticas do servidor",
"loadingServerStats": "Carregando estatísticas do servidor...",
"noServerData": "Não há dados disponíveis no servidor.",
"cpu": "CPU",
"ram": "BATER",
"customizeLayout": "Personalize o painel de controle",
"dashboardSettings": "Configurações do painel",
"enableDisableCards": "Ativar/Desativar Cartões",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Insira um endereço web válido.",
"serviceLinksAddFailed": "Falha ao adicionar o link de serviço",
"disk": "Disco",
"viewServerDetails": "Ver detalhes do servidor"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Mínimo 1h · Máximo 720h",
"monitoringDefaults": "Monitoramento de padrões",
"statusCheck": "Verificação de status",
"metrics": "Métricas",
"sec": "seg",
"logLevel": "Nível de registro",
"enableGuacamole": "Ativar Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host/Porta do proxy",
"hostDefaultsSocks5Username": "Nome de usuário do proxy",
"hostDefaultsSocks5Password": "Senha do proxy",
"hostDefaultsMetrics": "Métricas do host",
"hostDefaultsMetricsEnabled": "Ativar métricas",
"hostDefaultsMetricsEnabledDesc": "Coletar por padrão estatísticas de CPU, memória e outros dados em novos hosts.",
"hostDefaultsStatusCheckEnabled": "Ativar verificação de status",
"hostDefaultsStatusCheckEnabledDesc": "Verificar o status online/offline de novos hosts por padrão",
"hostDefaultsTerminal": "terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Mostrar utilização do disco",
"addToFolder": "Adicionar widget à pasta",
"noHostSelected": "Nenhum anfitrião selecionado",
"metricsNotAvailable": "Métricas não disponíveis",
"selectHost": "Selecionar um host...",
"displayedMetrics": "Métricas Exibidas",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disco",
"metricUptime": "Tempo de atividade",
"metricSystem": "Sistema",
"metricOs": "SO",
"metricKernel": "Kernel",
"metricHostname": "Nome do host",
"metricNetwork": "Rede",
"metricProcesses": "Processos",
"metricProcessesTotal": "total",
"metricProcessesRunning": "em execução",
"categoryMonitoring": "Monitorização",
"loading": "A carregar...",
"allClear": "Tudo em ordem",
@@ -775,10 +769,6 @@
"discardChanges": "Descartar alterações",
"movedToFolder": "Movido(s) {{count}} host(s) para \"{{folder}}\"",
"editHostTooltip": "Editar host",
"statusChecks": "Verificações de estado",
"metricsCollection": "Recolha de métricas",
"metricsInterval": "Intervalo de recolha de métricas",
"metricsIntervalDesc": "Com que frequência recolher estatísticas do servidor (5s - 1h)",
"behavior": "Comportamento",
"themePreview": "Pré-visualização do tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Estatísticas do Servidor",
"loadingServerStats": "A carregar estatísticas do servidor...",
"noServerData": "Nenhum dado do servidor disponível",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalizar Dashboard",
"dashboardSettings": "Definições do Dashboard",
"enableDisableCards": "Ativar/Desativar Cartões",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Insira um endereço web válido",
"serviceLinksAddFailed": "Falha ao adicionar link de serviço",
"disk": "Disco",
"viewServerDetails": "Ver detalhes do servidor"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Mín. 1h · Máx. 720h",
"monitoringDefaults": "Padrões de Monitorização",
"statusCheck": "Verificação de Estado",
"metrics": "Métricas",
"sec": "seg",
"logLevel": "Nível de Registo",
"enableGuacamole": "Ativar Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Host / Porta do proxy",
"hostDefaultsSocks5Username": "Nome de utilizador do proxy",
"hostDefaultsSocks5Password": "Palavra-passe do proxy",
"hostDefaultsMetrics": "Métricas do Host",
"hostDefaultsMetricsEnabled": "Ativar Métricas",
"hostDefaultsMetricsEnabledDesc": "Recolher CPU, memória e outras estatísticas nos novos hosts por predefinição",
"hostDefaultsStatusCheckEnabled": "Ativar Verificação de Estado",
"hostDefaultsStatusCheckEnabledDesc": "Consultar o estado online/offline nos novos hosts por predefinição",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Afișează utilizarea discului",
"addToFolder": "Adăugați widgetul în folder",
"noHostSelected": "Nicio gazdă selectată",
"metricsNotAvailable": "Indicatorii nu sunt disponibili",
"selectHost": "Selectați o gazdă...",
"displayedMetrics": "Metrici afișate",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disc",
"metricUptime": "Timp de funcționare",
"metricSystem": "Sistem",
"metricOs": "Sistem de operare",
"metricKernel": "Nucleu",
"metricHostname": "Nume gazdă",
"metricNetwork": "Reţea",
"metricProcesses": "Procese",
"metricProcessesTotal": "total",
"metricProcessesRunning": "funcţionare",
"categoryMonitoring": "Monitorizare",
"loading": "Încărcare...",
"allClear": "Totul este clar",
@@ -775,10 +769,6 @@
"discardChanges": "Anulează modificările",
"movedToFolder": "Gazdele {{count}} au fost mutate la „{{folder}}”",
"editHostTooltip": "Editați gazda",
"statusChecks": "Verificări de stare",
"metricsCollection": "Colecție de metrici",
"metricsInterval": "Interval de colectare a metricilor",
"metricsIntervalDesc": "Cât de des se colectează statisticile serverului (5s - 1h)",
"behavior": "Comportament",
"themePreview": "Previzualizare temă",
"theme": "Temă",
@@ -1899,8 +1889,6 @@
"serverStats": "Statistici server",
"loadingServerStats": "Se încarcă statisticile serverului...",
"noServerData": "Nu sunt disponibile date de server",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalizați tabloul de bord",
"dashboardSettings": "Setări tablou de bord",
"enableDisableCards": "Activare/Dezactivare carduri",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Introduceți o adresă web validă",
"serviceLinksAddFailed": "Nu s-a putut adăuga linkul de serviciu",
"disk": "Disc",
"viewServerDetails": "Vizualizați detaliile serverului"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min 1 oră · Max 720 ore",
"monitoringDefaults": "Monitorizarea setărilor implicite",
"statusCheck": "Verificare stare",
"metrics": "Metrici",
"sec": "sec",
"logLevel": "Nivel de jurnal",
"enableGuacamole": "Activează Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Gazdă / Port proxy",
"hostDefaultsSocks5Username": "Nume de utilizator proxy",
"hostDefaultsSocks5Password": "Parolă proxy",
"hostDefaultsMetrics": "Metrici ale gazdei",
"hostDefaultsMetricsEnabled": "Activați metricile",
"hostDefaultsMetricsEnabledDesc": "Colectați în mod implicit statistici despre procesor, memorie și alte date despre gazdele noi",
"hostDefaultsStatusCheckEnabled": "Activează verificarea stării",
"hostDefaultsStatusCheckEnabledDesc": "Sondarea implicită a stării online/offline pentru gazdele noi",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Показывать использование диска",
"addToFolder": "Добавить виджет в папку",
"noHostSelected": "Хост не выбран",
"metricsNotAvailable": "Метрики недоступны",
"selectHost": "Выберите хост...",
"displayedMetrics": "Отображаемые метрики",
"metricCpu": "ЦП",
@@ -276,13 +275,8 @@
"metricDisk": "Диск",
"metricUptime": "Время работы",
"metricSystem": "Система",
"metricOs": "ОС",
"metricKernel": "Ядро",
"metricHostname": "Имя хоста",
"metricNetwork": "Сеть",
"metricProcesses": "Процессы",
"metricProcessesTotal": "всего",
"metricProcessesRunning": "запущено",
"categoryMonitoring": "Мониторинг",
"loading": "Загрузка...",
"allClear": "Всё в порядке",
@@ -775,10 +769,6 @@
"discardChanges": "Отменить изменения",
"movedToFolder": "Перемещено {{count}} хост(а/ов) в \"{{folder}}\"",
"editHostTooltip": "Редактировать хост",
"statusChecks": "Проверки статуса",
"metricsCollection": "Сбор метрик",
"metricsInterval": "Интервал сбора метрик",
"metricsIntervalDesc": "Как часто собирать статистику сервера (5с - 1ч)",
"behavior": "Поведение",
"themePreview": "Предпросмотр темы",
"theme": "Тема",
@@ -1899,8 +1889,6 @@
"serverStats": "Статистика сервера",
"loadingServerStats": "Загрузка статистики сервера...",
"noServerData": "Нет данных о сервере",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Настроить дашборд",
"dashboardSettings": "Настройки дашборда",
"enableDisableCards": "Включить/отключить карточки",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Введите действительный веб-адрес",
"serviceLinksAddFailed": "Не удалось добавить сервисную ссылку",
"disk": "Диск",
"viewServerDetails": "Просмотреть сведения о сервере"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Мин. 1 ч · Макс. 720 ч",
"monitoringDefaults": "Мониторинг по умолчанию",
"statusCheck": "Проверка состояния",
"metrics": "Метрики",
"sec": "сек",
"logLevel": "Уровень логирования",
"enableGuacamole": "Включить Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Хост / порт прокси",
"hostDefaultsSocks5Username": "Имя пользователя прокси",
"hostDefaultsSocks5Password": "Пароль прокси",
"hostDefaultsMetrics": "Метрики хоста",
"hostDefaultsMetricsEnabled": "Включить метрики",
"hostDefaultsMetricsEnabledDesc": "По умолчанию собирать данные о ЦП, памяти и другую статистику с новых хостов",
"hostDefaultsStatusCheckEnabled": "Включить проверку состояния",
"hostDefaultsStatusCheckEnabledDesc": "По умолчанию опрашивать состояние новых хостов (онлайн/офлайн)",
"hostDefaultsTerminal": "Терминал",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Прикажи коришћење диска",
"addToFolder": "Додај виџет у фасциклу",
"noHostSelected": "Није изабран домаћин",
"metricsNotAvailable": "Метрике нису доступне",
"selectHost": "Изаберите хост...",
"displayedMetrics": "Приказане метрике",
"metricCpu": "Процесор",
@@ -276,13 +275,8 @@
"metricDisk": "Диск",
"metricUptime": "Време непрекидног рада",
"metricSystem": "Систем",
"metricOs": "ОС",
"metricKernel": "Језгро",
"metricHostname": "Име хоста",
"metricNetwork": "Мрежа",
"metricProcesses": "Процеси",
"metricProcessesTotal": "укупно",
"metricProcessesRunning": "трчање",
"categoryMonitoring": "Праћење",
"loading": "Учитавање...",
"allClear": "Све је чисто",
@@ -775,10 +769,6 @@
"discardChanges": "Одбаци измене",
"movedToFolder": "Премештено {{count}} хост(ова) на „{{folder}}“",
"editHostTooltip": "Измени хоста",
"statusChecks": "Провере статуса",
"metricsCollection": "Колекција метрика",
"metricsInterval": "Интервал прикупљања метрика",
"metricsIntervalDesc": "Колико често прикупљати статистику сервера (5 с - 1 сат)",
"behavior": "Понашање",
"themePreview": "Преглед теме",
"theme": "Тема",
@@ -1899,8 +1889,6 @@
"serverStats": "Статистика сервера",
"loadingServerStats": "Учитавање статистике сервера...",
"noServerData": "Нема доступних података са сервера",
"cpu": "Процесор",
"ram": "РАМ меморија",
"customizeLayout": "Прилагоди контролну таблу",
"dashboardSettings": "Подешавања контролне табле",
"enableDisableCards": "Омогући/онемогући картице",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "хттп://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Унесите важећу веб адресу",
"serviceLinksAddFailed": "Додавање линка услуге није успело",
"disk": "Диск",
"viewServerDetails": "Погледајте детаље сервера"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Мин. 1 сат · Макс. 720 сати",
"monitoringDefaults": "Праћење подразумеваних подешавања",
"statusCheck": "Провера статуса",
"metrics": "Метрике",
"sec": "сек",
"logLevel": "Ниво логова",
"enableGuacamole": "Омогући гуакамоле",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Прокси хост / порт",
"hostDefaultsSocks5Username": "Корисничко име проксија",
"hostDefaultsSocks5Password": "Лозинка проксија",
"hostDefaultsMetrics": "Метрике хоста",
"hostDefaultsMetricsEnabled": "Омогући метрике",
"hostDefaultsMetricsEnabledDesc": "Подразумевано прикупљајте статистику процесора, меморије и друге статистике на новим хостовима",
"hostDefaultsStatusCheckEnabled": "Омогући проверу статуса",
"hostDefaultsStatusCheckEnabledDesc": "Подразумевано проверава статус анкете на мрежи/офлајн на новим хостовима",
"hostDefaultsTerminal": "Терминал",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Visa diskanvändning",
"addToFolder": "Lägg till widget i mapp",
"noHostSelected": "Ingen värd vald",
"metricsNotAvailable": "Mätvärden är inte tillgängliga",
"selectHost": "Välj en värd...",
"displayedMetrics": "Visade mätvärden",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Drifttid",
"metricSystem": "System",
"metricOs": "operativsystem",
"metricKernel": "Kärna",
"metricHostname": "Värdnamn",
"metricNetwork": "Nätverk",
"metricProcesses": "Processer",
"metricProcessesTotal": "total",
"metricProcessesRunning": "spring",
"categoryMonitoring": "Övervakning",
"loading": "Belastning...",
"allClear": "Faran över",
@@ -775,10 +769,6 @@
"discardChanges": "Ignorera ändringar",
"movedToFolder": "Flyttade {{count}} värd(ar) till \"{{folder}}\"",
"editHostTooltip": "Redigera värd",
"statusChecks": "Statuskontroller",
"metricsCollection": "Metriksamling",
"metricsInterval": "Intervall för mätvärdeninsamling",
"metricsIntervalDesc": "Hur ofta serverstatistik ska samlas in (5 sekunder - 1 timme)",
"behavior": "Beteende",
"themePreview": "Förhandsvisning av tema",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Serverstatistik",
"loadingServerStats": "Laddar serverstatistik...",
"noServerData": "Ingen serverdata tillgänglig",
"cpu": "CPU",
"ram": "RAM-minne",
"customizeLayout": "Anpassa instrumentpanelen",
"dashboardSettings": "Inställningar för instrumentpanelen",
"enableDisableCards": "Aktivera/inaktivera kort",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Ange en giltig webbadress",
"serviceLinksAddFailed": "Misslyckades med att lägga till tjänstelänk",
"disk": "Disk",
"viewServerDetails": "Visa serverinformation"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Min 1 timme · Max 720 timmar",
"monitoringDefaults": "Övervakning av standardvärden",
"statusCheck": "Statuskontroll",
"metrics": "Metrik",
"sec": "sek",
"logLevel": "Loggnivå",
"enableGuacamole": "Aktivera guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxyvärd/port",
"hostDefaultsSocks5Username": "Proxy-användarnamn",
"hostDefaultsSocks5Password": "Proxylösenord",
"hostDefaultsMetrics": "Värdstatistik",
"hostDefaultsMetricsEnabled": "Aktivera mätvärden",
"hostDefaultsMetricsEnabledDesc": "Samla in CPU-, minnes- och annan statistik på nya värdar som standard",
"hostDefaultsStatusCheckEnabled": "Aktivera statuskontroll",
"hostDefaultsStatusCheckEnabledDesc": "Avläs online/offline-status på nya värdar som standard",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "แสดงการใช้งานดิสก์",
"addToFolder": "เพิ่มวิดเจ็ตลงในโฟลเดอร์",
"noHostSelected": "ไม่ได้เลือกโฮสต์",
"metricsNotAvailable": "ข้อมูลตัวชี้วัดไม่พร้อมใช้งาน",
"selectHost": "เลือกโฮสต์...",
"displayedMetrics": "ตัวชี้วัดที่แสดงผล",
"metricCpu": "ซีพียู",
@@ -276,13 +275,8 @@
"metricDisk": "ดิสก์",
"metricUptime": "เวลาใช้งาน",
"metricSystem": "ระบบ",
"metricOs": "โอเอส",
"metricKernel": "เคอร์เนล",
"metricHostname": "ชื่อโฮสต์",
"metricNetwork": "เครือข่าย",
"metricProcesses": "กระบวนการ",
"metricProcessesTotal": "ทั้งหมด",
"metricProcessesRunning": "วิ่ง",
"categoryMonitoring": "การตรวจสอบ",
"loading": "กำลังโหลด...",
"allClear": "ทุกอย่างเรียบร้อย",
@@ -775,10 +769,6 @@
"discardChanges": "ยกเลิกการเปลี่ยนแปลง",
"movedToFolder": "ย้ายโฮสต์ {{count}} ไปยัง \"{{folder}}\"",
"editHostTooltip": "แก้ไขโฮสต์",
"statusChecks": "การตรวจสอบสถานะ",
"metricsCollection": "การรวบรวมเมตริก",
"metricsInterval": "ช่วงเวลาการเก็บรวบรวมเมตริก",
"metricsIntervalDesc": "ควรเก็บรวบรวมสถิติเซิร์ฟเวอร์บ่อยแค่ไหน (5 วินาที - 1 ชั่วโมง)",
"behavior": "พฤติกรรม",
"themePreview": "ตัวอย่างธีม",
"theme": "ธีม",
@@ -1899,8 +1889,6 @@
"serverStats": "สถิติเซิร์ฟเวอร์",
"loadingServerStats": "กำลังโหลดข้อมูลสถิติเซิร์ฟเวอร์...",
"noServerData": "ไม่มีข้อมูลเซิร์ฟเวอร์",
"cpu": "ซีพียู",
"ram": "แรม",
"customizeLayout": "ปรับแต่งแดชบอร์ด",
"dashboardSettings": "การตั้งค่าแดชบอร์ด",
"enableDisableCards": "เปิดใช้งาน/ปิดใช้งานการ์ด",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "ป้อนที่อยู่เว็บที่ถูกต้อง",
"serviceLinksAddFailed": "ไม่สามารถเพิ่มลิงก์บริการได้",
"disk": "ดิสก์",
"viewServerDetails": "ดูรายละเอียดเซิร์ฟเวอร์"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "ขั้นต่ำ 1 ชั่วโมง · ขั้นสูงสุด 720 ชั่วโมง",
"monitoringDefaults": "การตรวจสอบค่าเริ่มต้น",
"statusCheck": "ตรวจสอบสถานะ",
"metrics": "ตัวชี้วัด",
"sec": "วินาที",
"logLevel": "ระดับบันทึก",
"enableGuacamole": "เปิดใช้งาน Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "พร็อกซีโฮสต์ / พอร์ต",
"hostDefaultsSocks5Username": "ชื่อผู้ใช้พร็อกซี",
"hostDefaultsSocks5Password": "รหัสผ่านพร็อกซี",
"hostDefaultsMetrics": "เมตริกโฮสต์",
"hostDefaultsMetricsEnabled": "เปิดใช้งานเมตริก",
"hostDefaultsMetricsEnabledDesc": "โดยค่าเริ่มต้น ระบบจะรวบรวมข้อมูล CPU, หน่วยความจำ และสถิติอื่นๆ บนโฮสต์ใหม่",
"hostDefaultsStatusCheckEnabled": "เปิดใช้งานการตรวจสอบสถานะ",
"hostDefaultsStatusCheckEnabledDesc": "โดยค่าเริ่มต้น ระบบจะตรวจสอบสถานะออนไลน์/ออฟไลน์ของโฮสต์ใหม่",
"hostDefaultsTerminal": "เทอร์มินัล",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Disk Kullanımını Göster",
"addToFolder": "Widget'ı klasöre ekle",
"noHostSelected": "Sunucu seçilmedi",
"metricsNotAvailable": "Metrikler kullanılamıyor",
"selectHost": "Bir sunucu seçin...",
"displayedMetrics": "Gösterilen Metrikler",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Disk",
"metricUptime": "Çalışma Süresi",
"metricSystem": "Sistem",
"metricOs": "İşletim Sistemi",
"metricKernel": "Çekirdek",
"metricHostname": "Ana Bilgisayar Adı",
"metricNetwork": "Ağ",
"metricProcesses": "İşlemler",
"metricProcessesTotal": "toplam",
"metricProcessesRunning": "çalışan",
"categoryMonitoring": "İzleme",
"loading": "Yükleniyor...",
"allClear": "Her şey normal",
@@ -775,10 +769,6 @@
"discardChanges": "Değişiklikleri iptal et",
"movedToFolder": "{{count}} sunucu \"{{folder}}\" klasörüne taşındı.",
"editHostTooltip": "Sunucuyu düzenle",
"statusChecks": "Durum Denetimleri",
"metricsCollection": "Ölçüm Toplama",
"metricsInterval": "Ölçüm Toplama Aralığı",
"metricsIntervalDesc": "Sunucu istatistiklerinin ne sıklıkta toplanacağı (5s - 1h)",
"behavior": "Davranış",
"themePreview": "Tema Önizlemesi",
"theme": "Tema",
@@ -1899,8 +1889,6 @@
"serverStats": "Sunucu İstatistikleri",
"loadingServerStats": "Sunucu istatistikleri yükleniyor...",
"noServerData": "Sunucu verisi mevcut değil",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Panoyu Özelleştir",
"dashboardSettings": "Pano Ayarları",
"enableDisableCards": "Kartları Etkinleştir/Devre Dışı Bırak",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Geçerli bir web adresi girin",
"serviceLinksAddFailed": "Servis bağlantısı eklenemedi",
"disk": "Disk",
"viewServerDetails": "Sunucu ayrıntılarını görüntüle"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "En az 1 saat · En fazla 720 saat",
"monitoringDefaults": "İzleme Varsayılanları",
"statusCheck": "Durum Kontrolü",
"metrics": "Metrikler",
"sec": "sn",
"logLevel": "Günlük Düzeyi",
"enableGuacamole": "Guacamole'yi Etkinleştir",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Proxy Sunucusu / Bağlantı Noktası",
"hostDefaultsSocks5Username": "Proxy Kullanıcı Adı",
"hostDefaultsSocks5Password": "Proxy Parolası",
"hostDefaultsMetrics": "Ana Bilgisayar Ölçümleri",
"hostDefaultsMetricsEnabled": "Ölçümleri Etkinleştir",
"hostDefaultsMetricsEnabledDesc": "Yeni ana bilgisayarlarda varsayılan olarak CPU, bellek ve diğer istatistikleri topla",
"hostDefaultsStatusCheckEnabled": "Durum Denetimini Etkinleştir",
"hostDefaultsStatusCheckEnabledDesc": "Yeni ana bilgisayarlarda varsayılan olarak çevrimiçi/çevrimdışı durumunu sorgula",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Показати використання диска",
"addToFolder": "Додати віджет до папки",
"noHostSelected": "Хост не вибрано",
"metricsNotAvailable": "Метрики недоступні",
"selectHost": "Виберіть хоста...",
"displayedMetrics": "Відображені показники",
"metricCpu": "Процесор",
@@ -276,13 +275,8 @@
"metricDisk": "Диск",
"metricUptime": "Час безперебійної роботи",
"metricSystem": "Система",
"metricOs": "ОС",
"metricKernel": "Ядро",
"metricHostname": "Ім'я хоста",
"metricNetwork": "Мережа",
"metricProcesses": "Процеси",
"metricProcessesTotal": "загальна сума",
"metricProcessesRunning": "біг",
"categoryMonitoring": "Моніторинг",
"loading": "Завантаження...",
"allClear": "Все чисто",
@@ -775,10 +769,6 @@
"discardChanges": "Відхилити зміни",
"movedToFolder": "Переміщено {{count}} хост(ів) до \"{{folder}}\"",
"editHostTooltip": "Редагувати хост",
"statusChecks": "Перевірки статусу",
"metricsCollection": "Колекція показників",
"metricsInterval": "Інтервал збору показників",
"metricsIntervalDesc": "Як часто збирати статистику сервера (5 с - 1 год)",
"behavior": "Поведінка",
"themePreview": "Попередній перегляд теми",
"theme": "Тема",
@@ -1899,8 +1889,6 @@
"serverStats": "Статистика сервера",
"loadingServerStats": "Завантаження статистики сервера...",
"noServerData": "Дані сервера недоступні",
"cpu": "Процесор",
"ram": "Оперативна пам'ять",
"customizeLayout": "Налаштувати інформаційну панель",
"dashboardSettings": "Налаштування панелі інструментів",
"enableDisableCards": "Увімкнути/вимкнути картки",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Введіть дійсну веб-адресу",
"serviceLinksAddFailed": "Не вдалося додати посилання на послугу",
"disk": "Диск",
"viewServerDetails": "Переглянути деталі сервера"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Мін. 1 год · Макс. 720 год",
"monitoringDefaults": "Моніторинг налаштувань за замовчуванням",
"statusCheck": "Перевірка стану",
"metrics": "Метрики",
"sec": "сек",
"logLevel": "Рівень журналу",
"enableGuacamole": "Увімкнути гуакамоле",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Проксі-хост / порт",
"hostDefaultsSocks5Username": "Ім'я користувача проксі-сервера",
"hostDefaultsSocks5Password": "Пароль проксі-сервера",
"hostDefaultsMetrics": "Метрики хоста",
"hostDefaultsMetricsEnabled": "Увімкнути метрики",
"hostDefaultsMetricsEnabledDesc": "Збирати статистику процесора, пам'яті та інші дані на нових хостах за замовчуванням",
"hostDefaultsStatusCheckEnabled": "Увімкнути перевірку стану",
"hostDefaultsStatusCheckEnabledDesc": "Опитувати статус онлайн/офлайн на нових хостах за замовчуванням",
"hostDefaultsTerminal": "Термінал",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "Hiển thị mức sử dụng ổ đĩa",
"addToFolder": "Thêm widget vào thư mục",
"noHostSelected": "Chưa chọn máy chủ",
"metricsNotAvailable": "Chỉ số không khả dụng",
"selectHost": "Chọn máy chủ...",
"displayedMetrics": "Chỉ số hiển thị",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "Đĩa",
"metricUptime": "Thời gian hoạt động",
"metricSystem": "Hệ thống",
"metricOs": "Hệ điều hành",
"metricKernel": "Nhân",
"metricHostname": "Tên máy chủ",
"metricNetwork": "Mạng",
"metricProcesses": "Tiến trình",
"metricProcessesTotal": "tổng",
"metricProcessesRunning": "đang chạy",
"categoryMonitoring": "Giám sát",
"loading": "Đang tải...",
"allClear": "Tất cả ổn",
@@ -775,10 +769,6 @@
"discardChanges": "Hủy bỏ các thay đổi",
"movedToFolder": "Đã chuyển {{count}} máy chủ vào thư mục \"{{folder}}\"",
"editHostTooltip": "Chỉnh sửa máy chủ",
"statusChecks": "Kiểm tra trạng thái",
"metricsCollection": "Thu thập chỉ số",
"metricsInterval": "Khoảng thời gian thu thập chỉ số",
"metricsIntervalDesc": "Tần suất thu thập thống kê máy chủ (5s - 1h)",
"behavior": "Hành vi",
"themePreview": "Xem trước chủ đề",
"theme": "Chủ đề",
@@ -1899,8 +1889,6 @@
"serverStats": "Thống kê máy chủ",
"loadingServerStats": "Đang tải thống kê máy chủ...",
"noServerData": "Không có dữ liệu máy chủ",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Tùy chỉnh Bảng điều khiển",
"dashboardSettings": "Cài đặt Bảng điều khiển",
"enableDisableCards": "Bật/Tắt Thẻ",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Nhập địa chỉ web hợp lệ",
"serviceLinksAddFailed": "Thêm liên kết dịch vụ thất bại",
"disk": "Ổ đĩa",
"viewServerDetails": "Xem chi tiết máy chủ"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "Tối thiểu 1h · Tối đa 720h",
"monitoringDefaults": "Mặc định giám sát",
"statusCheck": "Kiểm tra trạng thái",
"metrics": "Số liệu",
"sec": "giây",
"logLevel": "Mức nhật ký",
"enableGuacamole": "Bật Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "Máy chủ / Cổng proxy",
"hostDefaultsSocks5Username": "Tên đăng nhập proxy",
"hostDefaultsSocks5Password": "Mật khẩu proxy",
"hostDefaultsMetrics": "Số liệu máy chủ",
"hostDefaultsMetricsEnabled": "Bật số liệu",
"hostDefaultsMetricsEnabledDesc": "Mặc định thu thập CPU, bộ nhớ và các số liệu khác trên máy chủ mới",
"hostDefaultsStatusCheckEnabled": "Bật kiểm tra trạng thái",
"hostDefaultsStatusCheckEnabledDesc": "Mặc định kiểm tra trạng thái trực tuyến/ngoại tuyến trên máy chủ mới",
"hostDefaultsTerminal": "Terminal",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "显示磁盘使用情况",
"addToFolder": "添加小组件到文件夹",
"noHostSelected": "未选择主机",
"metricsNotAvailable": "指标不可用",
"selectHost": "选择主机...",
"displayedMetrics": "显示指标",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "磁盘",
"metricUptime": "运行时间",
"metricSystem": "系统",
"metricOs": "操作系统",
"metricKernel": "内核",
"metricHostname": "主机名",
"metricNetwork": "网络",
"metricProcesses": "进程",
"metricProcessesTotal": "总数",
"metricProcessesRunning": "运行中",
"categoryMonitoring": "监控",
"loading": "加载中...",
"allClear": "一切正常",
@@ -775,10 +769,6 @@
"discardChanges": "放弃更改",
"movedToFolder": "已将 {{count}} 台主机移至 \"{{folder}}\"",
"editHostTooltip": "编辑主机",
"statusChecks": "状态检查",
"metricsCollection": "指标采集",
"metricsInterval": "指标采集间隔",
"metricsIntervalDesc": "采集服务器统计信息的频率(5 秒 - 1 小时)",
"behavior": "行为",
"themePreview": "主题预览",
"theme": "主题",
@@ -1899,8 +1889,6 @@
"serverStats": "服务器统计",
"loadingServerStats": "正在加载服务器统计...",
"noServerData": "无服务器数据可用",
"cpu": "CPU",
"ram": "内存",
"customizeLayout": "自定义仪表盘",
"dashboardSettings": "仪表盘设置",
"enableDisableCards": "启用/禁用卡片",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "输入有效的网址",
"serviceLinksAddFailed": "添加服务链接失败",
"disk": "磁盘",
"viewServerDetails": "查看服务器详情"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "最短 1 小时 · 最长 720 小时",
"monitoringDefaults": "监控默认值",
"statusCheck": "状态检查",
"metrics": "指标",
"sec": "秒",
"logLevel": "日志级别",
"enableGuacamole": "启用 Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "代理主机 / 端口",
"hostDefaultsSocks5Username": "代理用户名",
"hostDefaultsSocks5Password": "代理密码",
"hostDefaultsMetrics": "主机指标",
"hostDefaultsMetricsEnabled": "启用指标",
"hostDefaultsMetricsEnabledDesc": "默认情况下,在新主机上收集 CPU、内存及其他统计数据",
"hostDefaultsStatusCheckEnabled": "启用状态检查",
"hostDefaultsStatusCheckEnabledDesc": "默认轮询新主机的在线/离线状态",
"hostDefaultsTerminal": "终端",
-17
View File
@@ -268,7 +268,6 @@
"showDisk": "顯示磁碟使用量",
"addToFolder": "新增小工具至資料夾",
"noHostSelected": "未選取主機",
"metricsNotAvailable": "效能指標無法使用",
"selectHost": "選擇主機...",
"displayedMetrics": "顯示的指標",
"metricCpu": "CPU",
@@ -276,13 +275,8 @@
"metricDisk": "磁碟",
"metricUptime": "運作時間",
"metricSystem": "系統",
"metricOs": "作業系統",
"metricKernel": "核心",
"metricHostname": "主機名稱",
"metricNetwork": "網路",
"metricProcesses": "程序",
"metricProcessesTotal": "總數",
"metricProcessesRunning": "執行中",
"categoryMonitoring": "監控",
"loading": "載入中...",
"allClear": "一切正常",
@@ -775,10 +769,6 @@
"discardChanges": "放棄更改",
"movedToFolder": "已將 {{count}} 台主機移至 \"{{folder}}\"",
"editHostTooltip": "編輯主機",
"statusChecks": "狀態檢查",
"metricsCollection": "指標收集",
"metricsInterval": "指標收集間隔",
"metricsIntervalDesc": "收集伺服器統計資料的頻率 (5秒 - 1小時)",
"behavior": "行為",
"themePreview": "主題預覽",
"theme": "主題",
@@ -1899,8 +1889,6 @@
"serverStats": "伺服器統計",
"loadingServerStats": "正在載入伺服器統計...",
"noServerData": "沒有可用的伺服器資料",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "自訂儀表板",
"dashboardSettings": "儀表板設定",
"enableDisableCards": "啟用/停用卡片",
@@ -1952,7 +1940,6 @@
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "輸入有效的網址",
"serviceLinksAddFailed": "新增服務連結失敗",
"disk": "磁碟",
"viewServerDetails": "檢視伺服器詳細資訊"
},
"admin": {
@@ -2091,7 +2078,6 @@
"sessionTimeoutRange": "最短 1 小時,最長 720 小時",
"monitoringDefaults": "監控預設值",
"statusCheck": "狀態檢查",
"metrics": "指標",
"sec": "秒",
"logLevel": "日誌等級",
"enableGuacamole": "啟用 Guacamole",
@@ -2353,9 +2339,6 @@
"hostDefaultsSocks5Host": "代理主機 / 連接埠",
"hostDefaultsSocks5Username": "代理使用者名稱",
"hostDefaultsSocks5Password": "代理密碼",
"hostDefaultsMetrics": "主機指標",
"hostDefaultsMetricsEnabled": "啟用指標",
"hostDefaultsMetricsEnabledDesc": "預設在新主機上收集 CPU、記憶體及其他統計資料",
"hostDefaultsStatusCheckEnabled": "啟用狀態檢查",
"hostDefaultsStatusCheckEnabledDesc": "預設輪詢新主機的線上/離線狀態",
"hostDefaultsTerminal": "終端機",
+5 -175
View File
@@ -10,7 +10,6 @@ import { getBasePath } from "@/lib/base-path";
import { isElectron } from "@/lib/electron";
import { clearTermixSessionStorage } from "@/shell/TabContext";
import type { SSHHost } from "@/types/index";
import type { GpuMetrics } from "@/types/stats-widgets";
// ============================================================================
// RBAC TYPE DEFINITIONS
@@ -74,140 +73,6 @@ export type SSHHostWithStatus = SSHHost & {
status: "online" | "reachable" | "offline" | "unknown";
};
interface CpuMetrics {
percent: number | null;
cores: number | null;
load: [number, number, number] | null;
}
interface MemoryMetrics {
percent: number | null;
usedGiB: number | null;
totalGiB: number | null;
}
export interface DiskFilesystem {
filesystem: string;
type: string;
mount: string;
percent: number | null;
usedHuman: string | null;
totalHuman: string | null;
availableHuman: string | null;
usedBytes: number | null;
totalBytes: number | null;
availableBytes: number | null;
label?: string;
}
interface DiskMetrics {
percent: number | null;
usedHuman: string | null;
totalHuman: string | null;
availableHuman?: string | null;
mount?: string | null;
filesystems?: DiskFilesystem[];
}
export interface NetworkInterface {
name: string;
ip: string;
state: string;
rx?: string | null;
tx?: string | null;
rxBytes?: string | null;
txBytes?: string | null;
rxRateBps?: number | null;
txRateBps?: number | null;
}
export interface ProcessInfo {
pid: string;
user: string;
cpu: string;
mem: string;
command: string;
}
export interface LoginRecord {
user: string;
ip: string;
time: string;
status: "success" | "failed";
}
export interface ListeningPort {
protocol: "tcp" | "udp";
localAddress: string;
localPort: number;
state?: string;
pid?: number;
process?: string;
}
export interface FirewallRule {
chain: string;
target: string;
protocol: string;
source: string;
destination: string;
dport?: string;
sport?: string;
state?: string;
interface?: string;
extra?: string;
}
export interface FirewallChain {
name: string;
policy: string;
rules: FirewallRule[];
}
export type ServerMetrics = {
cpu: CpuMetrics;
memory: MemoryMetrics;
disk: DiskMetrics;
network?: { interfaces?: NetworkInterface[] };
uptime?: { seconds?: number | null; formatted?: string | null };
system?: {
hostname?: string | null;
os?: string | null;
kernel?: string | null;
arch?: string | null;
};
processes?: {
total?: number | null;
running?: number | null;
top?: ProcessInfo[];
};
login_stats?: {
recentLogins?: LoginRecord[];
failedLogins?: LoginRecord[];
totalLogins?: number;
uniqueIPs?: number;
};
ports?: {
source?: "ss" | "netstat" | "none";
ports?: ListeningPort[];
};
firewall?: {
type?: "iptables" | "nftables" | "none";
status?: "active" | "inactive" | "unknown";
chains?: FirewallChain[];
};
temperature?: {
source?: "sysfs" | "sensors" | "none";
highestCelsius?: number | null;
sensors?: Array<{
label: string;
celsius: number;
}>;
};
gpu?: GpuMetrics;
lastChecked: string;
};
export interface AuthResponse {
success?: boolean;
is_admin?: boolean;
@@ -783,7 +648,7 @@ function getApiUrl(path: string, defaultPort: number): string {
// PER-HOST ORIGIN ROUTING (Electron desktop only)
// ============================================================================
//
// hostApi/fileManagerApi/statsApi above always point at the
// hostApi/fileManagerApi above always point at the
// embedded local backend -- they're the shared, always-on instances. When a
// host's connection origin resolves to "remote" (see
// src/ui/lib/connection-origin.ts), the backend that actually holds that
@@ -833,7 +698,6 @@ export function createRemoteOriginApiInstance(path: string): AxiosInstance {
}
let remoteFileManagerApi: AxiosInstance | null = null;
let remoteStatsApi: AxiosInstance | null = null;
let remoteCoreApi: AxiosInstance | null = null;
export function getRemoteFileManagerApi(): AxiosInstance {
@@ -845,19 +709,10 @@ export function getRemoteFileManagerApi(): AxiosInstance {
return remoteFileManagerApi;
}
export function getRemoteStatsApi(): AxiosInstance {
if (!remoteStatsApi) {
remoteStatsApi = createRemoteOriginApiInstance("/plugin-api/host-metrics");
}
return remoteStatsApi;
}
/**
* The remote server's core routes, unprefixed.
*
* Separate from getRemoteStatsApi because that one is rooted at the
* host-metrics plugin's mount point, and callers reaching core routes such as
* /sync/hosts must not inherit it.
* For core routes such as /sync/hosts and /host/status.
*/
export function getRemoteCoreApi(): AxiosInstance {
if (!remoteCoreApi) {
@@ -894,12 +749,6 @@ export function getSessionOrigin(sessionId: string): "local" | "remote" {
return sessionOrigins.get(sessionId) === "remote" ? "remote" : "local";
}
export function getStatsApiForOrigin(
origin: "local" | "remote",
): AxiosInstance {
return origin === "remote" ? getRemoteStatsApi() : statsApi;
}
function initializeApiInstances() {
// Host Management API (port 30001) - supports SSH, RDP, VNC, Telnet
hostApi = createApiInstance(getApiUrl("/host", 30001), "HOST");
@@ -912,14 +761,6 @@ function initializeApiInstances() {
"FILE_MANAGER",
);
// Host Metrics API - the host-metrics plugin, mounted on the main backend.
// Every existing /status, /metrics/*, /host-metrics/* and /proxmox-stats/*
// path still resolves, because the base carries the plugin mount point.
statsApi = createApiInstance(
getApiUrl("/plugin-api/host-metrics", 30001),
"STATS",
);
// Authentication API (port 30001)
authApi = createApiInstance(getApiUrl("", 30001), "AUTH");
@@ -953,9 +794,6 @@ export let sshHostApi: AxiosInstance;
// File Manager Operations API (file-manager plugin)
export let fileManagerApi: AxiosInstance;
// Host Metrics API (host-metrics plugin)
export let statsApi: AxiosInstance;
// Authentication API (port 30001)
export let authApi: AxiosInstance;
@@ -1544,16 +1382,10 @@ export {
export {
getAllServerStatuses,
getServerStatusById,
getServerMetricsById,
startMetricsPolling,
stopMetricsPolling,
sendMetricsHeartbeat,
registerMetricsViewer,
unregisterMetricsViewer,
submitMetricsTOTP,
refreshServerPolling,
notifyHostCreatedOrUpdated,
} from "@/api/host-metrics-status-api";
getStatusCheckSettings,
updateStatusCheckSettings,
} from "@/api/host-status-api";
export {
getHostSidebarPreferences,
@@ -1568,8 +1400,6 @@ export {
export { getUiPreferences, saveUiPreferences } from "@/api/ui-preferences-api";
export {
getGlobalMonitoringSettings,
updateGlobalMonitoringSettings,
getLogLevel,
updateLogLevel,
getSessionTimeout,
+10
View File
@@ -28,6 +28,7 @@ import { invokeAction } from "@/shell/action-registry";
import { useSshAuthProviders } from "@/hooks/useSshAuthProviders";
import { useActionSlot } from "@/hooks/use-action-slot";
import { usePluginComponent } from "./component-registry";
import { useOptionalHostStatusEntry } from "@/lib/ServerStatusContext";
/**
* Core permission groups, mirroring RESERVED_PERMISSION_PREFIXES in the SDK
@@ -284,6 +285,15 @@ export const pluginHostBridge: PluginHostBridge = {
],
usePluginComponent: (id) => usePluginComponent(id),
useHostStatus: (hostId) => {
const entry = useOptionalHostStatusEntry(hostId);
if (!entry) return null;
return {
status: entry.status === "degraded" ? "unknown" : entry.status,
...(entry.reason ? { reason: entry.reason } : {}),
};
},
};
/** Installs the bridge. Idempotent. */
+7
View File
@@ -38,6 +38,7 @@ export * from "@/components/tooltip";
export * from "@/components/section-card";
export * from "@/components/metric-card";
export * from "@/components/charts";
export { LineChart, type LineChartSeries } from "@/components/charts/LineChart";
export {
CardGridCanvas,
ColumnCountStepper,
@@ -82,6 +83,12 @@ export {
} from "@/lib/adaptive-polling";
export * from "@/components/sheet";
export { useConfirmation } from "@/hooks/use-confirmation";
export { useAdaptivePolling } from "@/hooks/use-adaptive-polling";
// Per-area display density and chart options the user picked in Appearance.
export { useAreaPreferences } from "@/contexts/UiPreferencesContext";
// Homepage widget pieces, for plugins that register a widget.
export { WidgetTitle } from "@/features/homepage/widgets/WidgetTitle";
export { runVisibleInterval } from "@/features/homepage/use-visible-interval";
export { useIsMobile } from "@/hooks/use-mobile";
export { PassphraseDialog } from "@/ssh/dialogs/PassphraseDialog";
export { OPKSSHDialog } from "@/ssh/dialogs/OPKSSHDialog";
+5 -13
View File
@@ -29,8 +29,8 @@ import {
updatePasswordResetAllowed,
getSessionTimeout,
updateSessionTimeout,
getGlobalMonitoringSettings,
updateGlobalMonitoringSettings,
getStatusCheckSettings,
updateStatusCheckSettings,
getLogLevel,
updateLogLevel,
getOidcAutoProvision,
@@ -134,7 +134,6 @@ export function AdminSettingsPanel({
const [allowPasswordReset, setAllowPasswordReset] = useState(true);
const [sessionTimeout, setSessionTimeout] = useState("24");
const [statusInterval, setStatusInterval] = useState("60");
const [metricsInterval, setMetricsInterval] = useState("30");
const [logLevel, setLogLevel] = useState("info");
const [analyticsEnabled, setAnalyticsEnabled] = useState(true);
const [analyticsLocked, setAnalyticsLocked] = useState(false);
@@ -359,7 +358,7 @@ export function AdminSettingsPanel({
getPasswordLoginAllowed(),
getPasswordResetAllowed(),
getSessionTimeout(),
getGlobalMonitoringSettings(),
getStatusCheckSettings(),
getLogLevel(),
getOidcAutoProvision(),
getSecondFactorAfterExternalLogin(),
@@ -392,7 +391,6 @@ export function AdminSettingsPanel({
setSessionTimeout(String(timeout.value.timeoutHours));
if (monitoring.status === "fulfilled") {
setStatusInterval(String(monitoring.value.statusCheckInterval));
setMetricsInterval(String(monitoring.value.metricsInterval));
}
if (level.status === "fulfilled") setLogLevel(level.value.level);
@@ -630,16 +628,12 @@ export function AdminSettingsPanel({
async function handleSaveMonitoring() {
const status = parseInt(statusInterval, 10);
const metrics = parseInt(metricsInterval, 10);
if (isNaN(status) || isNaN(metrics)) {
if (isNaN(status) || status < 5 || status > 3600) {
toast.error(t("admin.monitoringIntervalInvalid"));
return;
}
try {
await updateGlobalMonitoringSettings({
statusCheckInterval: status,
metricsInterval: metrics,
});
await updateStatusCheckSettings({ statusCheckInterval: status });
toast.success(t("admin.monitoringSaved"));
} catch {
toast.error(t("admin.monitoringSaveFailed"));
@@ -1070,8 +1064,6 @@ export function AdminSettingsPanel({
handleSaveSessionTimeout={handleSaveSessionTimeout}
statusInterval={statusInterval}
setStatusInterval={setStatusInterval}
metricsInterval={metricsInterval}
setMetricsInterval={setMetricsInterval}
handleSaveMonitoring={handleSaveMonitoring}
logLevel={logLevel}
handleSaveLogLevel={handleSaveLogLevel}
+1 -35
View File
@@ -57,8 +57,6 @@ type GeneralSettingsSectionProps = {
handleSaveSessionTimeout: () => void;
statusInterval: string;
setStatusInterval: Dispatch<SetStateAction<string>>;
metricsInterval: string;
setMetricsInterval: Dispatch<SetStateAction<string>>;
handleSaveMonitoring: () => void;
logLevel: string;
handleSaveLogLevel: (level: string) => void;
@@ -98,8 +96,6 @@ export function AdminGeneralSettingsSection({
handleSaveSessionTimeout,
statusInterval,
setStatusInterval,
metricsInterval,
setMetricsInterval,
handleSaveMonitoring,
logLevel,
handleSaveLogLevel,
@@ -352,22 +348,6 @@ export function AdminGeneralSettingsSection({
<span className="text-xs text-muted-foreground">
{t("admin.sec")}
</span>
</div>
</div>
<div className="flex flex-col gap-1.5">
<label className="text-[10px] font-semibold text-muted-foreground uppercase tracking-widest">
{t("admin.metrics")}
</label>
<div className="flex items-center gap-2">
<Input
type="number"
value={metricsInterval}
onChange={(e) => setMetricsInterval(e.target.value)}
className="w-20 text-sm"
/>
<span className="text-xs text-muted-foreground">
{t("admin.sec")}
</span>
<Button
variant="outline"
size="sm"
@@ -972,22 +952,8 @@ export function AdminHostDefaultsSection({
<div className="flex flex-col gap-2 border-t border-border pt-3">
<span className="text-[10px] font-bold uppercase tracking-widest text-muted-foreground">
{t("admin.hostDefaultsMetrics")}
{t("admin.hostDefaultsStatus")}
</span>
<SettingRow
label={t("admin.hostDefaultsMetricsEnabled")}
description={t("admin.hostDefaultsMetricsEnabledDesc")}
>
<AdminToggle
on={defaults.metricsEnabled ?? true}
onToggle={() =>
setDefaults((p) => ({
...p,
metricsEnabled: !(p.metricsEnabled ?? true),
}))
}
/>
</SettingRow>
<SettingRow
label={t("admin.hostDefaultsStatusCheckEnabled")}
description={t("admin.hostDefaultsStatusCheckEnabledDesc")}
+5 -24
View File
@@ -282,29 +282,9 @@ export function createHostEditorForm(
telnetAuthType: (host?.telnetAuthType ??
(host?.telnetCredentialId ? "credential" : "direct")) as
"direct" | "credential",
statsConfig: host?.statsConfig ?? {
statusCheckEnabled: d?.statusCheckEnabled ?? true,
statusCheckInterval: 60,
useGlobalStatusInterval: true,
metricsEnabled: d?.metricsEnabled ?? true,
metricsInterval: 30,
useGlobalMetricsInterval: true,
enabledWidgets: [
"cpu",
"memory",
"disk",
"network",
"uptime",
"system",
"login_stats",
"processes",
"ports",
"firewall",
"temperature",
],
excludedMounts: [] as string[],
monitoredMounts: [] as Array<{ path: string; label?: string }>,
},
statusCheckEnabled:
host?.statusCheckEnabled ?? d?.statusCheckEnabled ?? true,
statusCheckInterval: (host?.statusCheckInterval ?? null) as number | null,
// Host-scope plugin settings, keyed by plugin id. Loaded with the host and
// saved through the plugin's own scoped route, not in the host payload.
@@ -546,7 +526,8 @@ export function buildHostEditorPayload(
name: a.name,
snippetId: Number(a.snippetId),
})),
statsConfig: form.statsConfig,
statusCheckEnabled: form.statusCheckEnabled,
statusCheckInterval: form.statusCheckInterval,
terminalConfig: protocols.enableSsh ? terminalOverrides : null,
};
}
+48
View File
@@ -7,6 +7,7 @@ import { PasswordInput } from "@/components/password-input";
import { FakeSwitch, SectionCard, SettingRow } from "@/components/section-card";
import type { Host } from "@/types/ui-types";
import {
Activity,
Globe,
LayoutGrid,
Plus,
@@ -843,6 +844,53 @@ export function HostEditorGeneralTab({
</div>
</SectionCard>
<SectionCard
title={t("hosts.statusChecksLabel")}
icon={<Activity className="size-3.5" />}
>
<div className="flex flex-col gap-0 py-1">
<SettingRow
label={t("hosts.enableStatusChecks")}
description={t("hosts.enableStatusChecksDesc")}
>
<FakeSwitch
checked={form.statusCheckEnabled}
onChange={(value) => setField("statusCheckEnabled", value)}
/>
</SettingRow>
{form.statusCheckEnabled && (
<SettingRow
label={t("hosts.useGlobalInterval")}
description={t("hosts.useGlobalIntervalDesc")}
>
<FakeSwitch
checked={form.statusCheckInterval === null}
onChange={(useGlobal) =>
setField("statusCheckInterval", useGlobal ? null : 60)
}
/>
</SettingRow>
)}
{form.statusCheckEnabled && form.statusCheckInterval !== null && (
<SettingRow
label={t("hosts.checkIntervalS")}
description={t("hosts.checkIntervalDesc")}
>
<Input
type="number"
min={5}
max={86400}
value={form.statusCheckInterval}
onChange={(e) =>
setField("statusCheckInterval", Number(e.target.value))
}
className="w-20 h-7 text-xs text-right [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
/>
</SettingRow>
)}
</div>
</SectionCard>
<SectionCard
title={t("hosts.connectionToolbar")}
icon={<LayoutGrid className="size-3.5" />}
+2 -1
View File
@@ -150,7 +150,8 @@ export function sshHostToHost(h: SSHHostWithStatus): Host {
terminalConfig: parsedTerminalConfig as Host["terminalConfig"],
hasSudoPassword:
!!host.hasSudoPassword || !!parsedTerminalConfig?.sudoPassword,
statsConfig: parseJson(h.statsConfig) as Host["statsConfig"],
statusCheckEnabled: h.statusCheckEnabled !== false,
statusCheckInterval: h.statusCheckInterval ?? null,
forceKeyboardInteractive: h.forceKeyboardInteractive ?? false,
useSocks5: h.useSocks5,
socks5Host: h.socks5Host,
+2 -1
View File
@@ -57,7 +57,8 @@ export const FIELD_GROUP_KEYS: Record<FieldGroup, string[]> = {
"forceKeyboardInteractive",
],
advanced: [
"statsConfig",
"statusCheckEnabled",
"statusCheckInterval",
"dockerConfig",
"webUiConfig",
"proxmoxConfig",
+4 -20
View File
@@ -17,7 +17,7 @@ function makeHost(overrides: Partial<Host> = {}): Host {
enableRdp: false,
enableVnc: false,
enableTelnet: false,
statsConfig: { statusCheckEnabled: true },
statusCheckEnabled: true,
...overrides,
} as unknown as Host;
}
@@ -56,15 +56,7 @@ describe("buildStatusTooltip", () => {
});
it("returns 'Monitoring disabled' when status check is disabled", () => {
const host = makeHost({
statsConfig: {
enabledWidgets: [],
statusCheckEnabled: false,
statusCheckInterval: 30,
metricsEnabled: false,
metricsInterval: 30,
},
});
const host = makeHost({ statusCheckEnabled: false });
const tooltip = buildStatusTooltip(host, "online", t);
expect(tooltip).toBe("Monitoring disabled");
});
@@ -106,20 +98,12 @@ describe("buildStatusTooltip", () => {
describe("statusCheckEnabled", () => {
it("returns true when statusCheckEnabled is not set (default)", () => {
const host = makeHost({ statsConfig: undefined });
const host = makeHost({ statusCheckEnabled: undefined });
expect(statusCheckEnabled(host)).toBe(true);
});
it("returns false when statusCheckEnabled is explicitly false", () => {
const host = makeHost({
statsConfig: {
enabledWidgets: [],
statusCheckEnabled: false,
statusCheckInterval: 30,
metricsEnabled: false,
metricsInterval: 30,
},
});
const host = makeHost({ statusCheckEnabled: false });
expect(statusCheckEnabled(host)).toBe(false);
});
});
+1 -1
View File
@@ -89,7 +89,7 @@ import { shell } from "@/plugin-host/shell-bridge";
import type { TabShellCallbacks } from "@/shell/tab-registry";
export function statusCheckEnabled(host: Host): boolean {
return host.statsConfig?.statusCheckEnabled !== false;
return host.statusCheckEnabled !== false;
}
export function buildStatusTooltip(
+2 -1
View File
@@ -642,7 +642,8 @@ export function SidebarTree({
name: a.name,
snippetId: Number(a.snippetId),
})),
statsConfig: host.statsConfig,
statusCheckEnabled: host.statusCheckEnabled,
statusCheckInterval: host.statusCheckInterval,
terminalConfig: host.terminalConfig ?? null,
};
const created = await createSSHHost(duplicateHost);
+109
View File
@@ -0,0 +1,109 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const remoteCoreApiMock = vi.hoisted(() => ({ get: vi.fn() }));
const sshHostApiMock = vi.hoisted(() => ({
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
}));
const resolveConnectionOriginMock = vi.hoisted(() => vi.fn());
vi.mock("@/main-axios", () => ({
sshHostApi: sshHostApiMock,
getRemoteCoreApi: () => remoteCoreApiMock,
isElectron: () => true,
handleApiError: vi.fn(),
}));
vi.mock("@/lib/hosts-request-cache", () => ({
getCachedServerStatuses: (loader: () => Promise<unknown>) => loader(),
}));
vi.mock("@/lib/connection-origin", () => ({
resolveConnectionOrigin: resolveConnectionOriginMock,
}));
import {
getAllServerStatuses,
refreshServerPolling,
updateStatusCheckSettings,
} from "@/api/host-status-api";
/** The host list for "/db/host", core's statuses for "/status". */
function hostsAndStatuses(hosts: unknown[]) {
sshHostApiMock.get.mockImplementation(async (path: string) =>
path === "/status"
? { data: { 1: { status: "online" } } }
: { data: hosts },
);
}
beforeEach(() => {
vi.clearAllMocks();
window.electronAPI = {
invoke: vi.fn(async (channel: string) =>
channel === "get-remote-sync-config"
? { serverUrl: "https://termix.example.test" }
: null,
),
} as unknown as NonNullable<typeof window.electronAPI>;
remoteCoreApiMock.get.mockResolvedValue({
data: { 2: { status: "reachable" } },
});
});
describe("status check origin routing", () => {
it("only asks the embedded backend to poll local-origin hosts", async () => {
hostsAndStatuses([
{ id: 1, connectionOrigin: "local" },
{ id: 2, connectionOrigin: "remote" },
]);
resolveConnectionOriginMock.mockImplementation(async (host) =>
host.connectionOrigin === "local" ? "local" : "remote",
);
await expect(getAllServerStatuses()).resolves.toEqual({
1: { status: "online" },
2: { status: "reachable" },
});
expect(sshHostApiMock.get).toHaveBeenCalledWith("/status", {
timeout: 2000,
params: { hostIds: "1" },
__silentRetry: true,
});
expect(remoteCoreApiMock.get).toHaveBeenCalledWith(
"/host/status",
expect.objectContaining({ __silentRetry: true }),
);
});
it("sends an empty allowlist when every host uses the remote server", async () => {
hostsAndStatuses([{ id: 2, connectionOrigin: "remote" }]);
resolveConnectionOriginMock.mockResolvedValue("remote");
await getAllServerStatuses();
expect(sshHostApiMock.get).toHaveBeenCalledWith("/status", {
timeout: 2000,
params: { hostIds: "" },
__silentRetry: true,
});
});
});
describe("status check routes", () => {
it("restarts checks through core", async () => {
sshHostApiMock.post.mockResolvedValue({ data: {} });
await refreshServerPolling();
expect(sshHostApiMock.post).toHaveBeenCalledWith("/status/refresh");
});
it("saves the default interval", async () => {
sshHostApiMock.put.mockResolvedValue({ data: {} });
await updateStatusCheckSettings({ statusCheckInterval: 45 });
expect(sshHostApiMock.put).toHaveBeenCalledWith("/status/settings", {
statusCheckInterval: 45,
});
});
});
+2 -14
View File
@@ -23,13 +23,7 @@ describe("HostStatusCard", () => {
online: false,
} as Host;
render(
<HostStatusCard
hosts={[host]}
hostMetrics={new Map()}
onOpenTab={() => {}}
/>,
);
render(<HostStatusCard hosts={[host]} onOpenTab={() => {}} />);
const name = screen.getByText(host.name);
const ip = screen.getByText(host.ip);
@@ -90,13 +84,7 @@ describe("dashboard host routing", () => {
...flags,
} as unknown as Host;
const onOpenTab = vi.fn();
render(
<HostStatusCard
hosts={[host]}
hostMetrics={new Map()}
onOpenTab={onOpenTab}
/>,
);
render(<HostStatusCard hosts={[host]} onOpenTab={onOpenTab} />);
fireEvent.click(screen.getByText("Remote host"));
expect(onOpenTab).toHaveBeenCalledWith(host, expected);
});