mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 14:15:24 +00:00
feat: finish the host-metrics plugin, move host status into core (B16)
This commit is contained in:
1 parent
14eb558b85
commit
0a3f05d99d
308 files changed
+53073
-8985
No files matched your search
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -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,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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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)",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "الطرفية",
|
||||
|
||||
@@ -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": "Терминал",
|
||||
|
||||
@@ -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": "টার্মিনাল",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Τερματικό",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "מָסוֹף",
|
||||
|
||||
@@ -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": "टर्मिनल",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "ターミナル",
|
||||
|
||||
@@ -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": "터미널",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Терминал",
|
||||
|
||||
@@ -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": "Терминал",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "เทอร์มินัล",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Термінал",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "终端",
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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")}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
@@ -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" />}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -57,7 +57,8 @@ export const FIELD_GROUP_KEYS: Record<FieldGroup, string[]> = {
|
||||
"forceKeyboardInteractive",
|
||||
],
|
||||
advanced: [
|
||||
"statsConfig",
|
||||
"statusCheckEnabled",
|
||||
"statusCheckInterval",
|
||||
"dockerConfig",
|
||||
"webUiConfig",
|
||||
"proxmoxConfig",
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user