mirror of
https://github.com/henrygd/beszel.git
synced 2026-03-23 22:16:18 +01:00
Compare commits
14 Commits
v0.12.0-be
...
feat/displ
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d759112ee9 | ||
|
|
6576141f54 | ||
|
|
926e807020 | ||
|
|
d91847c6c5 | ||
|
|
0abd88270c | ||
|
|
806c4e51c5 | ||
|
|
6520783fe9 | ||
|
|
48c8a3a4a5 | ||
|
|
e0c839f78c | ||
|
|
1ba362bafe | ||
|
|
b5d55ead4a | ||
|
|
4f879ccc66 | ||
|
|
cd9e0f7b5b | ||
|
|
780644eeae |
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🐛 Bug report
|
name: 🐛 Bug report
|
||||||
description: Report a new bug or issue.
|
description: Report a new bug or issue.
|
||||||
title: '[Bug]: '
|
title: '[Bug]: '
|
||||||
labels: ['bug']
|
labels: ['bug', "needs confirmation"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
@@ -43,6 +54,39 @@ body:
|
|||||||
3. Pour it into a cup.
|
3. Pour it into a cup.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: system
|
id: system
|
||||||
attributes:
|
attributes:
|
||||||
@@ -61,7 +105,6 @@ body:
|
|||||||
id: install-method
|
id: install-method
|
||||||
attributes:
|
attributes:
|
||||||
label: Installation method
|
label: Installation method
|
||||||
default: 0
|
|
||||||
options:
|
options:
|
||||||
- Docker
|
- Docker
|
||||||
- Binary
|
- Binary
|
||||||
|
|||||||
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🚀 Feature request
|
name: 🚀 Feature request
|
||||||
description: Request a new feature or change.
|
description: Request a new feature or change.
|
||||||
title: "[Feature]: "
|
title: "[Feature]: "
|
||||||
labels: ["enhancement"]
|
labels: ["enhancement", "needs review"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
||||||
@@ -11,8 +22,55 @@ body:
|
|||||||
label: Describe the feature you would like to see
|
label: Describe the feature you would like to see
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: motivation
|
||||||
|
attributes:
|
||||||
|
label: Motivation / Use Case
|
||||||
|
description: Why do you want this feature? What problem does it solve?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Describe how you would like to see this feature implemented
|
label: Describe how you would like to see this feature implemented
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Screenshots
|
||||||
|
description: Please attach any relevant screenshots, such as images from your current solution or similar implementations.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
33
.github/pull_request_template.md
vendored
Normal file
33
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
## 📃 Description
|
||||||
|
|
||||||
|
A short description of the pull request changes should go here and the sections below should list in detail all changes. You can remove the sections you don't need.
|
||||||
|
|
||||||
|
## 📖 Documentation
|
||||||
|
|
||||||
|
Add a link to the PR for [documentation](https://github.com/henrygd/beszel-docs) changes.
|
||||||
|
|
||||||
|
## 🪵 Changelog
|
||||||
|
|
||||||
|
### ➕ Added
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### ✏️ Changed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🔧 Fixed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🗑️ Removed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
## 📷 Screenshots
|
||||||
|
|
||||||
|
If this PR has any UI/UX changes it's strongly suggested you add screenshots here.
|
||||||
2
.github/workflows/docker-images.yml
vendored
2
.github/workflows/docker-images.yml
vendored
@@ -65,7 +65,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
images: ${{ matrix.image }}
|
images: ${{ matrix.image }}
|
||||||
tags: |
|
tags: |
|
||||||
type=edge,enable=true
|
type=raw,value=edge
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
type=semver,pattern={{major}}
|
type=semver,pattern={{major}}
|
||||||
|
|||||||
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: 'Issue and PR Maintenance'
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # runs at midnight UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-stale:
|
||||||
|
name: Close Stale Issues
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Close Stale Issues
|
||||||
|
uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Messaging
|
||||||
|
stale-issue-message: >
|
||||||
|
👋 This issue has been automatically marked as stale due to inactivity.
|
||||||
|
If this issue is still relevant, please comment to keep it open.
|
||||||
|
Without activity, it will be closed in 7 days.
|
||||||
|
|
||||||
|
close-issue-message: >
|
||||||
|
🔒 This issue has been automatically closed due to prolonged inactivity.
|
||||||
|
Feel free to open a new issue if you have further questions or concerns.
|
||||||
|
|
||||||
|
# Timing
|
||||||
|
days-before-issue-stale: 14
|
||||||
|
days-before-issue-close: 7
|
||||||
|
|
||||||
|
# Labels
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
only-issue-labels: 'awaiting-requester'
|
||||||
|
|
||||||
|
# Exemptions
|
||||||
|
exempt-assignees: true
|
||||||
|
exempt-milestones: true
|
||||||
82
.github/workflows/label-from-dropdown.yml
vendored
Normal file
82
.github/workflows/label-from-dropdown.yml
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
name: Label issues from dropdowns
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label_from_dropdown:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Apply labels based on dropdown choices
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
|
||||||
|
const issueNumber = context.issue.number;
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
|
// Get the issue body
|
||||||
|
const body = context.payload.issue.body;
|
||||||
|
|
||||||
|
// Helper to find dropdown value in the body (assuming markdown format)
|
||||||
|
function extractSectionValue(heading) {
|
||||||
|
const regex = new RegExp(`### ${heading}\\s+([\\s\\S]*?)(?:\\n###|$)`, 'i');
|
||||||
|
const match = body.match(regex);
|
||||||
|
if (match) {
|
||||||
|
// Get the first non-empty line after the heading
|
||||||
|
const lines = match[1].split('\n').map(l => l.trim()).filter(Boolean);
|
||||||
|
return lines[0] || null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract dropdown selections
|
||||||
|
const category = extractSectionValue('Category');
|
||||||
|
const metrics = extractSectionValue('Affected Metrics');
|
||||||
|
const component = extractSectionValue('Component');
|
||||||
|
|
||||||
|
// Build labels to add
|
||||||
|
let labelsToAdd = [];
|
||||||
|
if (category) labelsToAdd.push(category);
|
||||||
|
if (metrics) labelsToAdd.push(metrics);
|
||||||
|
if (component) labelsToAdd.push(component);
|
||||||
|
|
||||||
|
// Get existing labels in the repo
|
||||||
|
const { data: existingLabels } = await github.rest.issues.listLabelsForRepo({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
const existingLabelNames = existingLabels.map(l => l.name);
|
||||||
|
|
||||||
|
// Find labels that need to be created
|
||||||
|
const labelsToCreate = labelsToAdd.filter(label => !existingLabelNames.includes(label));
|
||||||
|
|
||||||
|
// Create missing labels (with a default color)
|
||||||
|
for (const label of labelsToCreate) {
|
||||||
|
try {
|
||||||
|
await github.rest.issues.createLabel({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
name: label,
|
||||||
|
color: 'ededed' // light gray, you can pick any hex color
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Ignore if label already exists (race condition), otherwise rethrow
|
||||||
|
if (!e || e.status !== 422) throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now apply all labels (they all exist now)
|
||||||
|
if (labelsToAdd.length > 0) {
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issueNumber,
|
||||||
|
labels: labelsToAdd
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -119,8 +119,8 @@ scoops:
|
|||||||
repository:
|
repository:
|
||||||
owner: henrygd
|
owner: henrygd
|
||||||
name: beszel-scoops
|
name: beszel-scoops
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
license: MIT
|
license: MIT
|
||||||
|
|
||||||
# # Needs choco installed, so doesn't build on linux / default gh workflow :(
|
# # Needs choco installed, so doesn't build on linux / default gh workflow :(
|
||||||
@@ -152,9 +152,10 @@ brews:
|
|||||||
repository:
|
repository:
|
||||||
owner: henrygd
|
owner: henrygd
|
||||||
name: homebrew-beszel
|
name: homebrew-beszel
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
license: MIT
|
license: MIT
|
||||||
|
skip_upload: auto
|
||||||
extra_install: |
|
extra_install: |
|
||||||
(bin/"beszel-agent-launcher").write <<~EOS
|
(bin/"beszel-agent-launcher").write <<~EOS
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
@@ -181,12 +182,12 @@ winget:
|
|||||||
package_identifier: henrygd.beszel-agent
|
package_identifier: henrygd.beszel-agent
|
||||||
publisher: henrygd
|
publisher: henrygd
|
||||||
license: MIT
|
license: MIT
|
||||||
license_url: 'https://github.com/henrygd/beszel/blob/main/LICENSE'
|
license_url: "https://github.com/henrygd/beszel/blob/main/LICENSE"
|
||||||
copyright: '2025 henrygd'
|
copyright: "2025 henrygd"
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
release_notes_url: 'https://github.com/henrygd/beszel/releases/tag/v{{ .Version }}'
|
release_notes_url: "https://github.com/henrygd/beszel/releases/tag/v{{ .Version }}"
|
||||||
publisher_support_url: 'https://github.com/henrygd/beszel/issues'
|
publisher_support_url: "https://github.com/henrygd/beszel/issues"
|
||||||
short_description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
short_description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
skip_upload: auto
|
skip_upload: auto
|
||||||
description: |
|
description: |
|
||||||
Beszel is a lightweight server monitoring platform that includes Docker
|
Beszel is a lightweight server monitoring platform that includes Docker
|
||||||
@@ -218,5 +219,5 @@ changelog:
|
|||||||
sort: asc
|
sort: asc
|
||||||
filters:
|
filters:
|
||||||
exclude:
|
exclude:
|
||||||
- '^docs:'
|
- "^docs:"
|
||||||
- '^test:'
|
- "^test:"
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ func TestWriteToSessionEncoding(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "matching beta version should use CBOR",
|
name: "matching beta version should use CBOR",
|
||||||
hubVersion: "0.12.0-beta1",
|
hubVersion: "0.12.0-beta2",
|
||||||
expectedUsesCbor: true,
|
expectedUsesCbor: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/shirou/gopsutil/v4/cpu"
|
"github.com/shirou/gopsutil/v4/cpu"
|
||||||
"github.com/shirou/gopsutil/v4/disk"
|
"github.com/shirou/gopsutil/v4/disk"
|
||||||
"github.com/shirou/gopsutil/v4/host"
|
"github.com/shirou/gopsutil/v4/host"
|
||||||
|
"github.com/shirou/gopsutil/v4/load"
|
||||||
"github.com/shirou/gopsutil/v4/mem"
|
"github.com/shirou/gopsutil/v4/mem"
|
||||||
psutilNet "github.com/shirou/gopsutil/v4/net"
|
psutilNet "github.com/shirou/gopsutil/v4/net"
|
||||||
)
|
)
|
||||||
@@ -77,6 +78,16 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
systemStats.Cpu = twoDecimals(cpuPct[0])
|
systemStats.Cpu = twoDecimals(cpuPct[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load average
|
||||||
|
if avgstat, err := load.Avg(); err == nil {
|
||||||
|
systemStats.LoadAvg1 = twoDecimals(avgstat.Load1)
|
||||||
|
systemStats.LoadAvg5 = twoDecimals(avgstat.Load5)
|
||||||
|
systemStats.LoadAvg15 = twoDecimals(avgstat.Load15)
|
||||||
|
slog.Debug("Load average", "5m", systemStats.LoadAvg5, "15m", systemStats.LoadAvg15)
|
||||||
|
} else {
|
||||||
|
slog.Error("Error getting load average", "err", err)
|
||||||
|
}
|
||||||
|
|
||||||
// memory
|
// memory
|
||||||
if v, err := mem.VirtualMemory(); err == nil {
|
if v, err := mem.VirtualMemory(); err == nil {
|
||||||
// swap
|
// swap
|
||||||
@@ -240,6 +251,8 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
|
|
||||||
// update base system info
|
// update base system info
|
||||||
a.systemInfo.Cpu = systemStats.Cpu
|
a.systemInfo.Cpu = systemStats.Cpu
|
||||||
|
a.systemInfo.LoadAvg5 = systemStats.LoadAvg5
|
||||||
|
a.systemInfo.LoadAvg15 = systemStats.LoadAvg15
|
||||||
a.systemInfo.MemPct = systemStats.MemPct
|
a.systemInfo.MemPct = systemStats.MemPct
|
||||||
a.systemInfo.DiskPct = systemStats.DiskPct
|
a.systemInfo.DiskPct = systemStats.DiskPct
|
||||||
a.systemInfo.Uptime, _ = host.Uptime()
|
a.systemInfo.Uptime, _ = host.Uptime()
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ type SystemAlertStats struct {
|
|||||||
NetSent float64 `json:"ns"`
|
NetSent float64 `json:"ns"`
|
||||||
NetRecv float64 `json:"nr"`
|
NetRecv float64 `json:"nr"`
|
||||||
Temperatures map[string]float32 `json:"t"`
|
Temperatures map[string]float32 `json:"t"`
|
||||||
|
LoadAvg5 float64 `json:"l5"`
|
||||||
|
LoadAvg15 float64 `json:"l15"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SystemAlertData struct {
|
type SystemAlertData struct {
|
||||||
|
|||||||
@@ -54,6 +54,12 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
|
|||||||
}
|
}
|
||||||
val = data.Info.DashboardTemp
|
val = data.Info.DashboardTemp
|
||||||
unit = "°C"
|
unit = "°C"
|
||||||
|
case "LoadAvg5":
|
||||||
|
val = data.Info.LoadAvg5
|
||||||
|
unit = ""
|
||||||
|
case "LoadAvg15":
|
||||||
|
val = data.Info.LoadAvg15
|
||||||
|
unit = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
triggered := alertRecord.GetBool("triggered")
|
triggered := alertRecord.GetBool("triggered")
|
||||||
@@ -190,6 +196,10 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
|
|||||||
}
|
}
|
||||||
alert.mapSums[key] += temp
|
alert.mapSums[key] += temp
|
||||||
}
|
}
|
||||||
|
case "LoadAvg5":
|
||||||
|
alert.val += stats.LoadAvg5
|
||||||
|
case "LoadAvg15":
|
||||||
|
alert.val += stats.LoadAvg15
|
||||||
default:
|
default:
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -247,6 +257,10 @@ func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
|
|||||||
if alert.name == "Disk" {
|
if alert.name == "Disk" {
|
||||||
alert.name += " usage"
|
alert.name += " usage"
|
||||||
}
|
}
|
||||||
|
// format LoadAvg5 and LoadAvg15
|
||||||
|
if after, ok := strings.CutPrefix(alert.name, "LoadAvg"); ok {
|
||||||
|
alert.name = after + "m Load"
|
||||||
|
}
|
||||||
|
|
||||||
// make title alert name lowercase if not CPU
|
// make title alert name lowercase if not CPU
|
||||||
titleAlertName := alert.name
|
titleAlertName := alert.name
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ type Stats struct {
|
|||||||
Temperatures map[string]float64 `json:"t,omitempty" cbor:"20,keyasint,omitempty"`
|
Temperatures map[string]float64 `json:"t,omitempty" cbor:"20,keyasint,omitempty"`
|
||||||
ExtraFs map[string]*FsStats `json:"efs,omitempty" cbor:"21,keyasint,omitempty"`
|
ExtraFs map[string]*FsStats `json:"efs,omitempty" cbor:"21,keyasint,omitempty"`
|
||||||
GPUData map[string]GPUData `json:"g,omitempty" cbor:"22,keyasint,omitempty"`
|
GPUData map[string]GPUData `json:"g,omitempty" cbor:"22,keyasint,omitempty"`
|
||||||
|
LoadAvg1 float64 `json:"l1,omitempty" cbor:"23,keyasint,omitempty,omitzero"`
|
||||||
|
LoadAvg5 float64 `json:"l5,omitempty" cbor:"24,keyasint,omitempty,omitzero"`
|
||||||
|
LoadAvg15 float64 `json:"l15,omitempty" cbor:"25,keyasint,omitempty,omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type GPUData struct {
|
type GPUData struct {
|
||||||
@@ -89,6 +92,8 @@ type Info struct {
|
|||||||
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
|
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
|
||||||
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
|
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
|
||||||
Os Os `json:"os" cbor:"14,keyasint"`
|
Os Os `json:"os" cbor:"14,keyasint"`
|
||||||
|
LoadAvg5 float64 `json:"l5,omitempty" cbor:"15,keyasint,omitempty,omitzero"`
|
||||||
|
LoadAvg15 float64 `json:"l15,omitempty" cbor:"16,keyasint,omitempty,omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Final data structure to return to the hub
|
// Final data structure to return to the hub
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import (
|
|||||||
"beszel/internal/hub/expirymap"
|
"beszel/internal/hub/expirymap"
|
||||||
"beszel/internal/hub/ws"
|
"beszel/internal/hub/ws"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/blang/semver"
|
"github.com/blang/semver"
|
||||||
@@ -17,118 +17,96 @@ import (
|
|||||||
"github.com/pocketbase/pocketbase/core"
|
"github.com/pocketbase/pocketbase/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
// tokenMap maps tokens to user IDs for universal tokens
|
// agentConnectRequest holds information related to an agent's connection attempt.
|
||||||
var tokenMap *expirymap.ExpiryMap[string]
|
|
||||||
|
|
||||||
type agentConnectRequest struct {
|
type agentConnectRequest struct {
|
||||||
|
hub *Hub
|
||||||
|
req *http.Request
|
||||||
|
res http.ResponseWriter
|
||||||
token string
|
token string
|
||||||
agentSemVer semver.Version
|
agentSemVer semver.Version
|
||||||
// for universal token
|
// isUniversalToken is true if the token is a universal token.
|
||||||
isUniversalToken bool
|
isUniversalToken bool
|
||||||
userId string
|
// userId is the user ID associated with the universal token.
|
||||||
remoteAddr string
|
userId string
|
||||||
}
|
}
|
||||||
|
|
||||||
// validateAgentHeaders validates the required headers from agent connection requests.
|
// universalTokenMap stores active universal tokens and their associated user IDs.
|
||||||
func (h *Hub) validateAgentHeaders(headers http.Header) (string, string, error) {
|
var universalTokenMap tokenMap
|
||||||
token := headers.Get("X-Token")
|
|
||||||
agentVersion := headers.Get("X-Beszel")
|
|
||||||
|
|
||||||
if agentVersion == "" || token == "" || len(token) > 512 {
|
type tokenMap struct {
|
||||||
return "", "", errors.New("")
|
store *expirymap.ExpiryMap[string]
|
||||||
}
|
once sync.Once
|
||||||
return token, agentVersion, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// getFingerprintRecord retrieves fingerprint data from the database by token.
|
// getMap returns the expirymap, creating it if necessary.
|
||||||
func (h *Hub) getFingerprintRecord(token string, recordData *ws.FingerprintRecord) error {
|
func (tm *tokenMap) GetMap() *expirymap.ExpiryMap[string] {
|
||||||
err := h.DB().NewQuery("SELECT id, system, fingerprint, token FROM fingerprints WHERE token = {:token}").
|
tm.once.Do(func() {
|
||||||
Bind(dbx.Params{
|
tm.store = expirymap.New[string](time.Hour)
|
||||||
"token": token,
|
})
|
||||||
}).
|
return tm.store
|
||||||
One(recordData)
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendResponseError sends an HTTP error response with the given status code and message.
|
// handleAgentConnect is the HTTP handler for an agent's connection request.
|
||||||
func sendResponseError(res http.ResponseWriter, code int, message string) error {
|
|
||||||
res.WriteHeader(code)
|
|
||||||
if message != "" {
|
|
||||||
res.Write([]byte(message))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleAgentConnect handles the incoming connection request from the agent.
|
|
||||||
func (h *Hub) handleAgentConnect(e *core.RequestEvent) error {
|
func (h *Hub) handleAgentConnect(e *core.RequestEvent) error {
|
||||||
if err := h.agentConnect(e.Request, e.Response); err != nil {
|
agentRequest := agentConnectRequest{req: e.Request, res: e.Response, hub: h}
|
||||||
return err
|
_ = agentRequest.agentConnect()
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// agentConnect handles agent connection requests, validating credentials and upgrading to WebSocket.
|
// agentConnect validates agent credentials and upgrades the connection to a WebSocket.
|
||||||
func (h *Hub) agentConnect(req *http.Request, res http.ResponseWriter) (err error) {
|
func (acr *agentConnectRequest) agentConnect() (err error) {
|
||||||
var agentConnectRequest agentConnectRequest
|
|
||||||
var agentVersion string
|
var agentVersion string
|
||||||
// check if user agent and token are valid
|
|
||||||
agentConnectRequest.token, agentVersion, err = h.validateAgentHeaders(req.Header)
|
acr.token, agentVersion, err = acr.validateAgentHeaders(acr.req.Header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "")
|
return acr.sendResponseError(acr.res, http.StatusBadRequest, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pull fingerprint from database matching token
|
// Check if token is an active universal token
|
||||||
var fpRecord ws.FingerprintRecord
|
acr.userId, acr.isUniversalToken = universalTokenMap.GetMap().GetOk(acr.token)
|
||||||
err = h.getFingerprintRecord(agentConnectRequest.token, &fpRecord)
|
|
||||||
|
|
||||||
// if no existing record, check if token is a universal token
|
// Find matching fingerprint records for this token
|
||||||
if err != nil {
|
fpRecords := getFingerprintRecordsByToken(acr.token, acr.hub)
|
||||||
if err = checkUniversalToken(&agentConnectRequest); err == nil {
|
if len(fpRecords) == 0 && !acr.isUniversalToken {
|
||||||
// if this is a universal token, set the remote address and new record token
|
// Invalid token - no records found and not a universal token
|
||||||
agentConnectRequest.remoteAddr = getRealIP(req)
|
return acr.sendResponseError(acr.res, http.StatusUnauthorized, "Invalid token")
|
||||||
fpRecord.Token = agentConnectRequest.token
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no matching token, return unauthorized
|
|
||||||
if err != nil {
|
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "Invalid token")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate agent version
|
// Validate agent version
|
||||||
agentConnectRequest.agentSemVer, err = semver.Parse(agentVersion)
|
acr.agentSemVer, err = semver.Parse(agentVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "Invalid agent version")
|
return acr.sendResponseError(acr.res, http.StatusUnauthorized, "Invalid agent version")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upgrade connection to WebSocket
|
// Upgrade connection to WebSocket
|
||||||
conn, err := ws.GetUpgrader().Upgrade(res, req)
|
conn, err := ws.GetUpgrader().Upgrade(acr.res, acr.req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusInternalServerError, "WebSocket upgrade failed")
|
return acr.sendResponseError(acr.res, http.StatusInternalServerError, "WebSocket upgrade failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
go h.verifyWsConn(conn, agentConnectRequest, fpRecord)
|
go acr.verifyWsConn(conn, fpRecords)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// verifyWsConn verifies the WebSocket connection using agent's fingerprint and SSH key signature.
|
// verifyWsConn verifies the WebSocket connection using the agent's fingerprint and
|
||||||
func (h *Hub) verifyWsConn(conn *gws.Conn, acr agentConnectRequest, fpRecord ws.FingerprintRecord) (err error) {
|
// SSH key signature, then adds the system to the system manager.
|
||||||
|
func (acr *agentConnectRequest) verifyWsConn(conn *gws.Conn, fpRecords []ws.FingerprintRecord) (err error) {
|
||||||
wsConn := ws.NewWsConnection(conn)
|
wsConn := ws.NewWsConnection(conn)
|
||||||
// must be set before the read loop
|
|
||||||
|
// must set wsConn in connection store before the read loop
|
||||||
conn.Session().Store("wsConn", wsConn)
|
conn.Session().Store("wsConn", wsConn)
|
||||||
|
|
||||||
// make sure connection is closed if there is an error
|
// make sure connection is closed if there is an error
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
wsConn.Close()
|
wsConn.Close([]byte(err.Error()))
|
||||||
h.Logger().Error("WebSocket error", "error", err, "system", fpRecord.SystemId)
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go conn.ReadLoop()
|
go conn.ReadLoop()
|
||||||
|
|
||||||
signer, err := h.GetSSHKey("")
|
signer, err := acr.hub.GetSSHKey("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -138,40 +116,152 @@ func (h *Hub) verifyWsConn(conn *gws.Conn, acr agentConnectRequest, fpRecord ws.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create system if using universal token
|
// Find or create the appropriate system for this token and fingerprint
|
||||||
if acr.isUniversalToken {
|
fpRecord, err := acr.findOrCreateSystemForToken(fpRecords, agentFingerprint)
|
||||||
if acr.userId == "" {
|
if err != nil {
|
||||||
return errors.New("token user not found")
|
return err
|
||||||
}
|
|
||||||
fpRecord.SystemId, err = h.createSystemFromAgentData(&acr, agentFingerprint)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to create system from universal token: %w", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
return acr.hub.sm.AddWebSocketSystem(fpRecord.SystemId, acr.agentSemVer, wsConn)
|
||||||
// If no current fingerprint, update with new fingerprint (first time connecting)
|
|
||||||
case fpRecord.Fingerprint == "":
|
|
||||||
if err := h.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Abort if fingerprint exists but doesn't match (different machine)
|
|
||||||
case fpRecord.Fingerprint != agentFingerprint.Fingerprint:
|
|
||||||
return errors.New("fingerprint mismatch")
|
|
||||||
}
|
|
||||||
|
|
||||||
return h.sm.AddWebSocketSystem(fpRecord.SystemId, acr.agentSemVer, wsConn)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// createSystemFromAgentData creates a new system record using data from the agent
|
// validateAgentHeaders extracts and validates the token and agent version from HTTP headers.
|
||||||
func (h *Hub) createSystemFromAgentData(acr *agentConnectRequest, agentFingerprint common.FingerprintResponse) (recordId string, err error) {
|
func (acr *agentConnectRequest) validateAgentHeaders(headers http.Header) (string, string, error) {
|
||||||
systemsCollection, err := h.FindCollectionByNameOrId("systems")
|
token := headers.Get("X-Token")
|
||||||
if err != nil {
|
agentVersion := headers.Get("X-Beszel")
|
||||||
return "", fmt.Errorf("failed to find systems collection: %w", err)
|
|
||||||
|
if agentVersion == "" || token == "" || len(token) > 64 {
|
||||||
|
return "", "", errors.New("")
|
||||||
}
|
}
|
||||||
|
return token, agentVersion, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// sendResponseError writes an HTTP error response.
|
||||||
|
func (acr *agentConnectRequest) sendResponseError(res http.ResponseWriter, code int, message string) error {
|
||||||
|
res.WriteHeader(code)
|
||||||
|
if message != "" {
|
||||||
|
res.Write([]byte(message))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getFingerprintRecordsByToken retrieves all fingerprint records associated with a given token.
|
||||||
|
func getFingerprintRecordsByToken(token string, h *Hub) []ws.FingerprintRecord {
|
||||||
|
var records []ws.FingerprintRecord
|
||||||
|
// All will populate empty slice even on error
|
||||||
|
_ = h.DB().NewQuery("SELECT id, system, fingerprint, token FROM fingerprints WHERE token = {:token}").
|
||||||
|
Bind(dbx.Params{
|
||||||
|
"token": token,
|
||||||
|
}).
|
||||||
|
All(&records)
|
||||||
|
return records
|
||||||
|
}
|
||||||
|
|
||||||
|
// findOrCreateSystemForToken finds an existing system matching the token and fingerprint,
|
||||||
|
// or creates a new one for a universal token.
|
||||||
|
func (acr *agentConnectRequest) findOrCreateSystemForToken(fpRecords []ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// No records - only valid for active universal tokens
|
||||||
|
if len(fpRecords) == 0 {
|
||||||
|
return acr.handleNoRecords(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single record - handle as regular token
|
||||||
|
if len(fpRecords) == 1 && !acr.isUniversalToken {
|
||||||
|
return acr.handleSingleRecord(fpRecords[0], agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multiple records or universal token - look for matching fingerprint
|
||||||
|
return acr.handleMultipleRecordsOrUniversalToken(fpRecords, agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleNoRecords handles the case where no fingerprint records are found for a token.
|
||||||
|
// A new system is created if the token is a valid universal token.
|
||||||
|
func (acr *agentConnectRequest) handleNoRecords(agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
var fpRecord ws.FingerprintRecord
|
||||||
|
|
||||||
|
if !acr.isUniversalToken || acr.userId == "" {
|
||||||
|
return fpRecord, errors.New("no matching fingerprints")
|
||||||
|
}
|
||||||
|
|
||||||
|
return acr.createNewSystemForUniversalToken(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleSingleRecord handles the case with a single fingerprint record. It validates
|
||||||
|
// the agent's fingerprint against the stored one, or sets it on first connect.
|
||||||
|
func (acr *agentConnectRequest) handleSingleRecord(fpRecord ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// If no current fingerprint, update with new fingerprint (first time connecting)
|
||||||
|
if fpRecord.Fingerprint == "" {
|
||||||
|
if err := acr.hub.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
// Update the record with the fingerprint that was set
|
||||||
|
fpRecord.Fingerprint = agentFingerprint.Fingerprint
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Abort if fingerprint exists but doesn't match (different machine)
|
||||||
|
if fpRecord.Fingerprint != agentFingerprint.Fingerprint {
|
||||||
|
return fpRecord, errors.New("fingerprint mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleMultipleRecordsOrUniversalToken finds a matching fingerprint from multiple records.
|
||||||
|
// If no match is found and the token is a universal token, a new system is created.
|
||||||
|
func (acr *agentConnectRequest) handleMultipleRecordsOrUniversalToken(fpRecords []ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// Return existing record with matching fingerprint if found
|
||||||
|
for i := range fpRecords {
|
||||||
|
if fpRecords[i].Fingerprint == agentFingerprint.Fingerprint {
|
||||||
|
return fpRecords[i], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No matching fingerprint record found, but it's
|
||||||
|
// an active universal token so create a new system
|
||||||
|
if acr.isUniversalToken {
|
||||||
|
return acr.createNewSystemForUniversalToken(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ws.FingerprintRecord{}, errors.New("fingerprint mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
|
// createNewSystemForUniversalToken creates a new system and fingerprint record for a universal token.
|
||||||
|
func (acr *agentConnectRequest) createNewSystemForUniversalToken(agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
var fpRecord ws.FingerprintRecord
|
||||||
|
if !acr.isUniversalToken || acr.userId == "" {
|
||||||
|
return fpRecord, errors.New("invalid token")
|
||||||
|
}
|
||||||
|
|
||||||
|
fpRecord.Token = acr.token
|
||||||
|
|
||||||
|
systemId, err := acr.createSystem(agentFingerprint)
|
||||||
|
if err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
fpRecord.SystemId = systemId
|
||||||
|
|
||||||
|
// Set the fingerprint for the new system
|
||||||
|
if err := acr.hub.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the record with the fingerprint that was set
|
||||||
|
fpRecord.Fingerprint = agentFingerprint.Fingerprint
|
||||||
|
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// createSystem creates a new system record in the database using details from the agent.
|
||||||
|
func (acr *agentConnectRequest) createSystem(agentFingerprint common.FingerprintResponse) (recordId string, err error) {
|
||||||
|
systemsCollection, err := acr.hub.FindCachedCollectionByNameOrId("systems")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
remoteAddr := getRealIP(acr.req)
|
||||||
// separate port from address
|
// separate port from address
|
||||||
if agentFingerprint.Hostname == "" {
|
if agentFingerprint.Hostname == "" {
|
||||||
agentFingerprint.Hostname = acr.remoteAddr
|
agentFingerprint.Hostname = remoteAddr
|
||||||
}
|
}
|
||||||
if agentFingerprint.Port == "" {
|
if agentFingerprint.Port == "" {
|
||||||
agentFingerprint.Port = "45876"
|
agentFingerprint.Port = "45876"
|
||||||
@@ -179,14 +269,14 @@ func (h *Hub) createSystemFromAgentData(acr *agentConnectRequest, agentFingerpri
|
|||||||
// create new record
|
// create new record
|
||||||
systemRecord := core.NewRecord(systemsCollection)
|
systemRecord := core.NewRecord(systemsCollection)
|
||||||
systemRecord.Set("name", agentFingerprint.Hostname)
|
systemRecord.Set("name", agentFingerprint.Hostname)
|
||||||
systemRecord.Set("host", acr.remoteAddr)
|
systemRecord.Set("host", remoteAddr)
|
||||||
systemRecord.Set("port", agentFingerprint.Port)
|
systemRecord.Set("port", agentFingerprint.Port)
|
||||||
systemRecord.Set("users", []string{acr.userId})
|
systemRecord.Set("users", []string{acr.userId})
|
||||||
|
|
||||||
return systemRecord.Id, h.Save(systemRecord)
|
return systemRecord.Id, acr.hub.Save(systemRecord)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetFingerprint updates the fingerprint for a given record ID.
|
// SetFingerprint creates or updates a fingerprint record in the database.
|
||||||
func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string) (err error) {
|
func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string) (err error) {
|
||||||
// // can't use raw query here because it doesn't trigger SSE
|
// // can't use raw query here because it doesn't trigger SSE
|
||||||
var record *core.Record
|
var record *core.Record
|
||||||
@@ -207,25 +297,8 @@ func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string)
|
|||||||
return h.SaveNoValidate(record)
|
return h.SaveNoValidate(record)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTokenMap() *expirymap.ExpiryMap[string] {
|
// getRealIP extracts the client's real IP address from request headers,
|
||||||
if tokenMap == nil {
|
// checking common proxy headers before falling back to the remote address.
|
||||||
tokenMap = expirymap.New[string](time.Hour)
|
|
||||||
}
|
|
||||||
return tokenMap
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkUniversalToken(acr *agentConnectRequest) (err error) {
|
|
||||||
if tokenMap == nil {
|
|
||||||
tokenMap = expirymap.New[string](time.Hour)
|
|
||||||
}
|
|
||||||
acr.userId, acr.isUniversalToken = tokenMap.GetOk(acr.token)
|
|
||||||
if !acr.isUniversalToken {
|
|
||||||
return errors.New("invalid token")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRealIP attempts to extract the real IP address from the request headers.
|
|
||||||
func getRealIP(r *http.Request) string {
|
func getRealIP(r *http.Request) string {
|
||||||
if ip := r.Header.Get("CF-Connecting-IP"); ip != "" {
|
if ip := r.Header.Get("CF-Connecting-IP"); ip != "" {
|
||||||
return ip
|
return ip
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -259,7 +259,7 @@ func (h *Hub) getUniversalToken(e *core.RequestEvent) error {
|
|||||||
return apis.NewForbiddenError("Forbidden", nil)
|
return apis.NewForbiddenError("Forbidden", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenMap := getTokenMap()
|
tokenMap := universalTokenMap.GetMap()
|
||||||
userID := info.Auth.Id
|
userID := info.Auth.Id
|
||||||
query := e.Request.URL.Query()
|
query := e.Request.URL.Query()
|
||||||
token := query.Get("token")
|
token := query.Get("token")
|
||||||
|
|||||||
@@ -254,5 +254,3 @@ func TestGetSSHKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to create test records
|
|
||||||
|
|||||||
@@ -365,7 +365,7 @@ func (sys *System) closeSSHConnection() {
|
|||||||
// The system will be set as down a few seconds later if the connection is not re-established.
|
// The system will be set as down a few seconds later if the connection is not re-established.
|
||||||
func (sys *System) closeWebSocketConnection() {
|
func (sys *System) closeWebSocketConnection() {
|
||||||
if sys.WsConn != nil {
|
if sys.WsConn != nil {
|
||||||
sys.WsConn.Close()
|
sys.WsConn.Close(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func (h *Handler) OnMessage(conn *gws.Conn, message *gws.Message) {
|
|||||||
case wsConn.(*WsConn).responseChan <- message:
|
case wsConn.(*WsConn).responseChan <- message:
|
||||||
default:
|
default:
|
||||||
// close if the connection is not expecting a response
|
// close if the connection is not expecting a response
|
||||||
wsConn.(*WsConn).Close()
|
wsConn.(*WsConn).Close(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +100,9 @@ func (h *Handler) OnClose(conn *gws.Conn, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Close terminates the WebSocket connection gracefully.
|
// Close terminates the WebSocket connection gracefully.
|
||||||
func (ws *WsConn) Close() {
|
func (ws *WsConn) Close(msg []byte) {
|
||||||
if ws.IsConnected() {
|
if ws.IsConnected() {
|
||||||
ws.conn.WriteClose(1000, nil)
|
ws.conn.WriteClose(1000, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ func (ws *WsConn) RequestSystemData(data *system.CombinedData) error {
|
|||||||
})
|
})
|
||||||
select {
|
select {
|
||||||
case <-time.After(10 * time.Second):
|
case <-time.After(10 * time.Second):
|
||||||
ws.Close()
|
ws.Close(nil)
|
||||||
return gws.ErrConnClosed
|
return gws.ErrConnClosed
|
||||||
case message = <-ws.responseChan:
|
case message = <-ws.responseChan:
|
||||||
}
|
}
|
||||||
@@ -140,11 +140,12 @@ func (ws *WsConn) RequestSystemData(data *system.CombinedData) error {
|
|||||||
|
|
||||||
// GetFingerprint authenticates with the agent using SSH signature and returns the agent's fingerprint.
|
// GetFingerprint authenticates with the agent using SSH signature and returns the agent's fingerprint.
|
||||||
func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bool) (common.FingerprintResponse, error) {
|
func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bool) (common.FingerprintResponse, error) {
|
||||||
|
var clientFingerprint common.FingerprintResponse
|
||||||
challenge := []byte(token)
|
challenge := []byte(token)
|
||||||
|
|
||||||
signature, err := signer.Sign(nil, challenge)
|
signature, err := signer.Sign(nil, challenge)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.FingerprintResponse{}, err
|
return clientFingerprint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ws.sendMessage(common.HubRequest[any]{
|
err = ws.sendMessage(common.HubRequest[any]{
|
||||||
@@ -155,24 +156,19 @@ func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bo
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.FingerprintResponse{}, err
|
return clientFingerprint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var message *gws.Message
|
var message *gws.Message
|
||||||
var clientFingerprint common.FingerprintResponse
|
|
||||||
select {
|
select {
|
||||||
case message = <-ws.responseChan:
|
case message = <-ws.responseChan:
|
||||||
case <-time.After(10 * time.Second):
|
case <-time.After(10 * time.Second):
|
||||||
return common.FingerprintResponse{}, errors.New("request expired")
|
return clientFingerprint, errors.New("request expired")
|
||||||
}
|
}
|
||||||
defer message.Close()
|
defer message.Close()
|
||||||
|
|
||||||
err = cbor.Unmarshal(message.Data.Bytes(), &clientFingerprint)
|
err = cbor.Unmarshal(message.Data.Bytes(), &clientFingerprint)
|
||||||
if err != nil {
|
return clientFingerprint, err
|
||||||
return common.FingerprintResponse{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return clientFingerprint, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConnected returns true if the WebSocket connection is active.
|
// IsConnected returns true if the WebSocket connection is active.
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ type UserSettings struct {
|
|||||||
ChartTime string `json:"chartTime"`
|
ChartTime string `json:"chartTime"`
|
||||||
NotificationEmails []string `json:"emails"`
|
NotificationEmails []string `json:"emails"`
|
||||||
NotificationWebhooks []string `json:"webhooks"`
|
NotificationWebhooks []string `json:"webhooks"`
|
||||||
// Language string `json:"lang"`
|
// TemperatureUnit int `json:"unitTemp"` // 0 for Celsius, 1 for Fahrenheit
|
||||||
|
// NetworkUnit int `json:"unitNet"` // 0 for bytes, 1 for bits
|
||||||
|
// DiskUnit int `json:"unitDisk"` // 0 for bytes, 1 for bits
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUserManager(app core.App) *UserManager {
|
func NewUserManager(app core.App) *UserManager {
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ func init() {
|
|||||||
"Memory",
|
"Memory",
|
||||||
"Disk",
|
"Disk",
|
||||||
"Temperature",
|
"Temperature",
|
||||||
"Bandwidth"
|
"Bandwidth",
|
||||||
|
"LoadAvg5",
|
||||||
|
"LoadAvg15"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
m "github.com/pocketbase/pocketbase/migrations"
|
m "github.com/pocketbase/pocketbase/migrations"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
const (
|
||||||
TempAdminEmail = "_@b.b"
|
TempAdminEmail = "_@b.b"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
3688
beszel/site/package-lock.json
generated
3688
beszel/site/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "beszel",
|
"name": "beszel",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.12.0-beta1",
|
"version": "0.12.0-beta2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -39,13 +39,33 @@ export default memo(function AlertsButton({ system }: { system: SystemRecord })
|
|||||||
/>
|
/>
|
||||||
</Button>
|
</Button>
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
<DialogContent className="max-h-full overflow-auto max-w-[35rem]">
|
<DialogContent className="max-h-full sm:max-h-[95svh] overflow-auto max-w-[37rem]">
|
||||||
{opened && <AlertDialogContent system={system} />}
|
{opened && <AlertDialogContent system={system} />}
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
),
|
),
|
||||||
[opened, hasAlert]
|
[opened, hasAlert]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// return useMemo(
|
||||||
|
// () => (
|
||||||
|
// <Sheet>
|
||||||
|
// <SheetTrigger asChild>
|
||||||
|
// <Button variant="ghost" size="icon" aria-label={t`Alerts`} data-nolink onClick={() => setOpened(true)}>
|
||||||
|
// <BellIcon
|
||||||
|
// className={cn("h-[1.2em] w-[1.2em] pointer-events-none", {
|
||||||
|
// "fill-primary": hasAlert,
|
||||||
|
// })}
|
||||||
|
// />
|
||||||
|
// </Button>
|
||||||
|
// </SheetTrigger>
|
||||||
|
// <SheetContent className="max-h-full overflow-auto w-[35em] p-4 sm:p-5">
|
||||||
|
// {opened && <AlertDialogContent system={system} />}
|
||||||
|
// </SheetContent>
|
||||||
|
// </Sheet>
|
||||||
|
// ),
|
||||||
|
// [opened, hasAlert]
|
||||||
|
// )
|
||||||
})
|
})
|
||||||
|
|
||||||
function AlertDialogContent({ system }: { system: SystemRecord }) {
|
function AlertDialogContent({ system }: { system: SystemRecord }) {
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ function AlertContent({ data }: { data: AlertData }) {
|
|||||||
|
|
||||||
const [checked, setChecked] = useState(data.checked || false)
|
const [checked, setChecked] = useState(data.checked || false)
|
||||||
const [min, setMin] = useState(data.min || 10)
|
const [min, setMin] = useState(data.min || 10)
|
||||||
const [value, setValue] = useState(data.val || (singleDescription ? 0 : 80))
|
const [value, setValue] = useState(data.val || (singleDescription ? 0 : data.alert.start ?? 80))
|
||||||
|
|
||||||
const Icon = alertInfo[name].icon
|
const Icon = alertInfo[name].icon
|
||||||
|
|
||||||
@@ -268,7 +268,8 @@ function AlertContent({ data }: { data: AlertData }) {
|
|||||||
onValueChange={(val) => {
|
onValueChange={(val) => {
|
||||||
setValue(val[0])
|
setValue(val[0])
|
||||||
}}
|
}}
|
||||||
min={1}
|
step={data.alert.step ?? 1}
|
||||||
|
min={data.alert.min ?? 1}
|
||||||
max={alertInfo[name].max ?? 99}
|
max={alertInfo[name].max ?? 99}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,14 +2,7 @@ import { t } from "@lingui/core/macro"
|
|||||||
|
|
||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, chartMargin } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
toFixedWithoutTrailingZeros,
|
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
// import Spinner from '../spinner'
|
// import Spinner from '../spinner'
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo, useMemo } from "react"
|
import { memo, useMemo } from "react"
|
||||||
@@ -30,7 +23,6 @@ const getNestedValue = (path: string, max = false, data: any): number | null =>
|
|||||||
|
|
||||||
export default memo(function AreaChartDefault({
|
export default memo(function AreaChartDefault({
|
||||||
maxToggled = false,
|
maxToggled = false,
|
||||||
unit = " MB/s",
|
|
||||||
chartName,
|
chartName,
|
||||||
chartData,
|
chartData,
|
||||||
max,
|
max,
|
||||||
@@ -38,12 +30,11 @@ export default memo(function AreaChartDefault({
|
|||||||
contentFormatter,
|
contentFormatter,
|
||||||
}: {
|
}: {
|
||||||
maxToggled?: boolean
|
maxToggled?: boolean
|
||||||
unit?: string
|
|
||||||
chartName: string
|
chartName: string
|
||||||
chartData: ChartData
|
chartData: ChartData
|
||||||
max?: number
|
max?: number
|
||||||
tickFormatter?: (value: number) => string
|
tickFormatter: (value: number) => string
|
||||||
contentFormatter?: (value: number) => string
|
contentFormatter: ({ value }: { value: number }) => string
|
||||||
}) {
|
}) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
const { i18n } = useLingui()
|
const { i18n } = useLingui()
|
||||||
@@ -98,15 +89,7 @@ export default memo(function AreaChartDefault({
|
|||||||
className="tracking-tighter"
|
className="tracking-tighter"
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
domain={[0, max ?? "auto"]}
|
domain={[0, max ?? "auto"]}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(value) => updateYAxisWidth(tickFormatter(value))}
|
||||||
let val: string
|
|
||||||
if (tickFormatter) {
|
|
||||||
val = tickFormatter(value)
|
|
||||||
} else {
|
|
||||||
val = toFixedWithoutTrailingZeros(value, 2) + unit
|
|
||||||
}
|
|
||||||
return updateYAxisWidth(val)
|
|
||||||
}}
|
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
/>
|
/>
|
||||||
@@ -117,12 +100,7 @@ export default memo(function AreaChartDefault({
|
|||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={({ value }) => {
|
contentFormatter={contentFormatter}
|
||||||
if (contentFormatter) {
|
|
||||||
return contentFormatter(value)
|
|
||||||
}
|
|
||||||
return decimalString(value) + unit
|
|
||||||
}}
|
|
||||||
// indicator="line"
|
// indicator="line"
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,18 +5,18 @@ import {
|
|||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
chartMargin,
|
||||||
toFixedFloat,
|
|
||||||
getSizeAndUnit,
|
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedWithoutTrailingZeros,
|
||||||
|
formatBytes,
|
||||||
|
decimalString,
|
||||||
|
toFixedFloat,
|
||||||
} from "@/lib/utils"
|
} from "@/lib/utils"
|
||||||
// import Spinner from '../spinner'
|
// import Spinner from '../spinner'
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import { $containerFilter } from "@/lib/stores"
|
import { $containerFilter, $userSettings } from "@/lib/stores"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { Separator } from "../ui/separator"
|
import { Separator } from "../ui/separator"
|
||||||
import { ChartType } from "@/lib/enums"
|
import { ChartType, DataUnit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function ContainerChart({
|
export default memo(function ContainerChart({
|
||||||
dataKey,
|
dataKey,
|
||||||
@@ -30,6 +30,7 @@ export default memo(function ContainerChart({
|
|||||||
unit?: string
|
unit?: string
|
||||||
}) {
|
}) {
|
||||||
const filter = useStore($containerFilter)
|
const filter = useStore($containerFilter)
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
const { containerData } = chartData
|
const { containerData } = chartData
|
||||||
@@ -88,9 +89,10 @@ export default memo(function ContainerChart({
|
|||||||
return updateYAxisWidth(val)
|
return updateYAxisWidth(val)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.tickFormatter = (value) => {
|
const chartUnit = isNetChart ? userSettings.unitNet : DataUnit.Bytes
|
||||||
const { v, u } = getSizeAndUnit(value, false)
|
obj.tickFormatter = (val) => {
|
||||||
return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}${isNetChart ? "/s" : ""}`)
|
const { value, unit } = formatBytes(val, isNetChart, chartUnit, true)
|
||||||
|
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// tooltip formatter
|
// tooltip formatter
|
||||||
@@ -99,12 +101,14 @@ export default memo(function ContainerChart({
|
|||||||
try {
|
try {
|
||||||
const sent = item?.payload?.[key]?.ns ?? 0
|
const sent = item?.payload?.[key]?.ns ?? 0
|
||||||
const received = item?.payload?.[key]?.nr ?? 0
|
const received = item?.payload?.[key]?.nr ?? 0
|
||||||
|
const { value: receivedValue, unit: receivedUnit } = formatBytes(received, true, userSettings.unitNet, true)
|
||||||
|
const { value: sentValue, unit: sentUnit } = formatBytes(sent, true, userSettings.unitNet, true)
|
||||||
return (
|
return (
|
||||||
<span className="flex">
|
<span className="flex">
|
||||||
{decimalString(received)} MB/s
|
{decimalString(receivedValue)} {receivedUnit}
|
||||||
<span className="opacity-70 ms-0.5"> rx </span>
|
<span className="opacity-70 ms-0.5"> rx </span>
|
||||||
<Separator orientation="vertical" className="h-3 mx-1.5 bg-primary/40" />
|
<Separator orientation="vertical" className="h-3 mx-1.5 bg-primary/40" />
|
||||||
{decimalString(sent)} MB/s
|
{decimalString(sentValue)} {sentUnit}
|
||||||
<span className="opacity-70 ms-0.5"> tx</span>
|
<span className="opacity-70 ms-0.5"> tx</span>
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
@@ -114,8 +118,8 @@ export default memo(function ContainerChart({
|
|||||||
}
|
}
|
||||||
} else if (chartType === ChartType.Memory) {
|
} else if (chartType === ChartType.Memory) {
|
||||||
obj.toolTipFormatter = (item: any) => {
|
obj.toolTipFormatter = (item: any) => {
|
||||||
const { v, u } = getSizeAndUnit(item.value, false)
|
const { value, unit } = formatBytes(item.value, false, DataUnit.Bytes, true)
|
||||||
return decimalString(v, 2) + u
|
return decimalString(value) + " " + unit
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.toolTipFormatter = (item: any) => decimalString(item.value) + unit
|
obj.toolTipFormatter = (item: any) => decimalString(item.value) + unit
|
||||||
|
|||||||
@@ -1,17 +1,10 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, decimalString, toFixedFloat, chartMargin, formatBytes } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
decimalString,
|
|
||||||
toFixedFloat,
|
|
||||||
chartMargin,
|
|
||||||
getSizeAndUnit,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo } from "react"
|
import { memo } from "react"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
|
import { DataUnit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function DiskChart({
|
export default memo(function DiskChart({
|
||||||
dataKey,
|
dataKey,
|
||||||
@@ -53,9 +46,9 @@ export default memo(function DiskChart({
|
|||||||
minTickGap={6}
|
minTickGap={6}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(val) => {
|
||||||
const { v, u } = getSizeAndUnit(value)
|
const { value, unit } = formatBytes(val * 1024, false, DataUnit.Bytes, true)
|
||||||
return updateYAxisWidth(toFixedFloat(v, 2) + u)
|
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{xAxis(chartData)}
|
{xAxis(chartData)}
|
||||||
@@ -66,8 +59,8 @@ export default memo(function DiskChart({
|
|||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={({ value }) => {
|
contentFormatter={({ value }) => {
|
||||||
const { v, u } = getSizeAndUnit(value)
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
|
||||||
return decimalString(v) + u
|
return decimalString(convertedValue) + " " + unit
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin } from "@/lib/utils"
|
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin, formatBytes } from "@/lib/utils"
|
||||||
import { memo } from "react"
|
import { memo } from "react"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
|
import { DataUnit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
@@ -39,8 +40,8 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(value) => {
|
||||||
const val = toFixedFloat(value, 1)
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
|
||||||
return updateYAxisWidth(val + " GB")
|
return updateYAxisWidth(toFixedFloat(convertedValue, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@@ -54,8 +55,11 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
itemSorter={(a, b) => a.order - b.order}
|
itemSorter={(a, b) => a.order - b.order}
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={(item) => decimalString(item.value) + " GB"}
|
contentFormatter={({ value }) => {
|
||||||
// indicator="line"
|
// mem values are supplied as GB
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -13,16 +13,18 @@ import {
|
|||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedWithoutTrailingZeros,
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
chartMargin,
|
||||||
|
convertTemperature,
|
||||||
|
decimalString,
|
||||||
} from "@/lib/utils"
|
} from "@/lib/utils"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo, useMemo } from "react"
|
import { memo, useMemo } from "react"
|
||||||
import { $temperatureFilter } from "@/lib/stores"
|
import { $temperatureFilter, $userSettings } from "@/lib/stores"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
|
|
||||||
export default memo(function TemperatureChart({ chartData }: { chartData: ChartData }) {
|
export default memo(function TemperatureChart({ chartData }: { chartData: ChartData }) {
|
||||||
const filter = useStore($temperatureFilter)
|
const filter = useStore($temperatureFilter)
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
if (chartData.systemStats.length === 0) {
|
if (chartData.systemStats.length === 0) {
|
||||||
@@ -72,9 +74,9 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
|
|||||||
className="tracking-tighter"
|
className="tracking-tighter"
|
||||||
domain={[0, "auto"]}
|
domain={[0, "auto"]}
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(val) => {
|
||||||
const val = toFixedWithoutTrailingZeros(value, 2)
|
const { value, unit } = convertTemperature(val, userSettings.unitTemp)
|
||||||
return updateYAxisWidth(val + " °C")
|
return updateYAxisWidth(toFixedWithoutTrailingZeros(value, 2) + " " + unit)
|
||||||
}}
|
}}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
@@ -88,7 +90,10 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
|
|||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={(item) => decimalString(item.value) + " °C"}
|
contentFormatter={(item) => {
|
||||||
|
const { value, unit } = convertTemperature(item.value, userSettings.unitTemp)
|
||||||
|
return decimalString(value) + " " + unit
|
||||||
|
}}
|
||||||
filter={filter}
|
filter={filter}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { useState } from "react"
|
|||||||
import languages from "@/lib/languages"
|
import languages from "@/lib/languages"
|
||||||
import { dynamicActivate } from "@/lib/i18n"
|
import { dynamicActivate } from "@/lib/i18n"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
// import { setLang } from "@/lib/i18n"
|
import { DataUnit, TemperatureUnit } from "@/lib/enums"
|
||||||
|
|
||||||
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
|
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
|
||||||
const [isLoading, setIsLoading] = useState(false)
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
@@ -101,6 +101,75 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Separator />
|
<Separator />
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="mb-4">
|
||||||
|
<h3 className="mb-1 text-lg font-medium">
|
||||||
|
<Trans>Unit preferences</Trans>
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-muted-foreground leading-relaxed">
|
||||||
|
<Trans>Change display units for metrics.</Trans>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid sm:grid-cols-3 gap-4">
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitTemp">
|
||||||
|
<Trans>Temperature unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitTemp"
|
||||||
|
key={userSettings.unitTemp}
|
||||||
|
defaultValue={userSettings.unitTemp?.toString() || String(TemperatureUnit.Celsius)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitTemp">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(TemperatureUnit.Celsius)}>Celsius (°C)</SelectItem>
|
||||||
|
<SelectItem value={String(TemperatureUnit.Fahrenheit)}>Fahrenheit (°F)</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitTemp">
|
||||||
|
<Trans>Network unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitNet"
|
||||||
|
key={userSettings.unitNet}
|
||||||
|
defaultValue={userSettings.unitNet?.toString() ?? String(DataUnit.Bytes)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitTemp">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(DataUnit.Bytes)}>Bytes (KB/s, MB/s, GB/s)</SelectItem>
|
||||||
|
<SelectItem value={String(DataUnit.Bits)}>Bits (kbps, Mbps, Gbps)</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitDisk">
|
||||||
|
<Trans>Disk unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitDisk"
|
||||||
|
key={userSettings.unitDisk}
|
||||||
|
defaultValue={userSettings.unitDisk?.toString() ?? String(DataUnit.Bytes)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitDisk">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(DataUnit.Bytes)}>Bytes (KB/s, MB/s, GB/s)</SelectItem>
|
||||||
|
<SelectItem value={String(DataUnit.Bits)}>Bits (kbps, Mbps, Gbps)</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Separator />
|
||||||
<Button type="submit" className="flex items-center gap-1.5 disabled:opacity-100" disabled={isLoading}>
|
<Button type="submit" className="flex items-center gap-1.5 disabled:opacity-100" disabled={isLoading}>
|
||||||
{isLoading ? <LoaderCircleIcon className="h-4 w-4 animate-spin" /> : <SaveIcon className="h-4 w-4" />}
|
{isLoading ? <LoaderCircleIcon className="h-4 w-4 animate-spin" /> : <SaveIcon className="h-4 w-4" />}
|
||||||
<Trans>Save Settings</Trans>
|
<Trans>Save Settings</Trans>
|
||||||
|
|||||||
@@ -95,8 +95,8 @@ export default function SettingsLayout() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="p-0">
|
<CardContent className="p-0">
|
||||||
<Separator className="hidden md:block my-5" />
|
<Separator className="hidden md:block my-5" />
|
||||||
<div className="flex flex-col gap-3.5 md:flex-row md:gap-5 lg:gap-10">
|
<div className="flex flex-col gap-3.5 md:flex-row md:gap-5 lg:gap-12">
|
||||||
<aside className="md:max-w-44 min-w-40">
|
<aside className="md:max-w-52 min-w-40">
|
||||||
<SidebarNav items={sidebarNavItems} />
|
<SidebarNav items={sidebarNavItems} />
|
||||||
</aside>
|
</aside>
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans, useLingui } from "@lingui/react/macro"
|
||||||
import { t } from "@lingui/core/macro"
|
import { t } from "@lingui/core/macro"
|
||||||
import { $publicKey, pb } from "@/lib/stores"
|
import { $publicKey, pb } from "@/lib/stores"
|
||||||
import { memo, useEffect, useMemo, useState } from "react"
|
import { memo, useEffect, useMemo, useState } from "react"
|
||||||
@@ -180,32 +180,33 @@ const SectionUniversalToken = memo(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; checked: boolean }) => {
|
const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; checked: boolean }) => {
|
||||||
|
const { t } = useLingui()
|
||||||
const publicKey = $publicKey.get()
|
const publicKey = $publicKey.get()
|
||||||
const port = "45876"
|
const port = "45876"
|
||||||
|
|
||||||
const dropdownItems: DropdownItem[] = [
|
const dropdownItems: DropdownItem[] = [
|
||||||
{
|
{
|
||||||
text: "Copy Docker Compose",
|
text: t({ message: "Copy docker compose", context: "Button to copy docker compose file content" }),
|
||||||
onClick: () => copyDockerCompose(port, publicKey, token),
|
onClick: () => copyDockerCompose(port, publicKey, token),
|
||||||
icons: [DockerIcon],
|
icons: [DockerIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Docker Run",
|
text: t({ message: "Copy docker run", context: "Button to copy docker run command" }),
|
||||||
onClick: () => copyDockerRun(port, publicKey, token),
|
onClick: () => copyDockerRun(port, publicKey, token),
|
||||||
icons: [DockerIcon],
|
icons: [DockerIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Linux Command",
|
text: t`Copy Linux command`,
|
||||||
onClick: () => copyLinuxCommand(port, publicKey, token),
|
onClick: () => copyLinuxCommand(port, publicKey, token),
|
||||||
icons: [TuxIcon],
|
icons: [TuxIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Brew Command",
|
text: t({ message: "Homebrew command", context: "Button to copy install command" }),
|
||||||
onClick: () => copyLinuxCommand(port, publicKey, token, true),
|
onClick: () => copyLinuxCommand(port, publicKey, token, true),
|
||||||
icons: [TuxIcon, AppleIcon],
|
icons: [TuxIcon, AppleIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Windows Command",
|
text: t({ message: "Windows command", context: "Button to copy install command" }),
|
||||||
onClick: () => copyWindowsCommand(port, publicKey, token),
|
onClick: () => copyWindowsCommand(port, publicKey, token),
|
||||||
icons: [WindowsIcon],
|
icons: [WindowsIcon],
|
||||||
},
|
},
|
||||||
@@ -233,26 +234,28 @@ const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; c
|
|||||||
})
|
})
|
||||||
|
|
||||||
const SectionTable = memo(({ fingerprints = [] }: { fingerprints: FingerprintRecord[] }) => {
|
const SectionTable = memo(({ fingerprints = [] }: { fingerprints: FingerprintRecord[] }) => {
|
||||||
|
const { t } = useLingui()
|
||||||
const isReadOnly = isReadOnlyUser()
|
const isReadOnly = isReadOnlyUser()
|
||||||
|
|
||||||
const headerCols = useMemo(
|
const headerCols = useMemo(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
label: "System",
|
label: t`System`,
|
||||||
Icon: ServerIcon,
|
Icon: ServerIcon,
|
||||||
w: "11em",
|
w: "11em",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Token",
|
label: t`Token`,
|
||||||
Icon: KeyIcon,
|
Icon: KeyIcon,
|
||||||
w: "20em",
|
w: "20em",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Fingerprint",
|
label: t`Fingerprint`,
|
||||||
Icon: FingerprintIcon,
|
Icon: FingerprintIcon,
|
||||||
w: "20em",
|
w: "20em",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[]
|
[t]
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
<div className="rounded-md border overflow-hidden w-full mt-4">
|
<div className="rounded-md border overflow-hidden w-full mt-4">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
$temperatureFilter,
|
$temperatureFilter,
|
||||||
} from "@/lib/stores"
|
} from "@/lib/stores"
|
||||||
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
|
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
|
||||||
import { ChartType, Os } from "@/lib/enums"
|
import { ChartType, DataUnit, Os } from "@/lib/enums"
|
||||||
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
|
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
|
||||||
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
|
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
@@ -21,11 +21,13 @@ import ChartTimeSelect from "../charts/chart-time-select"
|
|||||||
import {
|
import {
|
||||||
chartTimeData,
|
chartTimeData,
|
||||||
cn,
|
cn,
|
||||||
|
decimalString,
|
||||||
|
formatBytes,
|
||||||
getHostDisplayValue,
|
getHostDisplayValue,
|
||||||
getPbTimestamp,
|
getPbTimestamp,
|
||||||
getSizeAndUnit,
|
|
||||||
listen,
|
listen,
|
||||||
toFixedFloat,
|
toFixedFloat,
|
||||||
|
toFixedWithoutTrailingZeros,
|
||||||
useLocalStorage,
|
useLocalStorage,
|
||||||
} from "@/lib/utils"
|
} from "@/lib/utils"
|
||||||
import { Separator } from "../ui/separator"
|
import { Separator } from "../ui/separator"
|
||||||
@@ -131,6 +133,7 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
const [bottomSpacing, setBottomSpacing] = useState(0)
|
const [bottomSpacing, setBottomSpacing] = useState(0)
|
||||||
const [chartLoading, setChartLoading] = useState(true)
|
const [chartLoading, setChartLoading] = useState(true)
|
||||||
const isLongerChart = chartTime !== "1h"
|
const isLongerChart = chartTime !== "1h"
|
||||||
|
const userSettings = $userSettings.get()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = `${name} / Beszel`
|
document.title = `${name} / Beszel`
|
||||||
@@ -472,7 +475,13 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Average system-wide CPU utilization`}
|
description={t`Average system-wide CPU utilization`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="CPU Usage" maxToggled={maxValues} unit="%" />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
chartName="CPU Usage"
|
||||||
|
maxToggled={maxValues}
|
||||||
|
tickFormatter={(val) => toFixedWithoutTrailingZeros(val, 2) + "%"}
|
||||||
|
contentFormatter={({ value }) => decimalString(value) + "%"}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
{containerFilterBar && (
|
{containerFilterBar && (
|
||||||
@@ -519,7 +528,19 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Throughput of root filesystem`}
|
description={t`Throughput of root filesystem`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="dio" maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
chartName="dio"
|
||||||
|
maxToggled={maxValues}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitDisk, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
<ChartCard
|
<ChartCard
|
||||||
@@ -529,7 +550,20 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
description={t`Network traffic of public interfaces`}
|
description={t`Network traffic of public interfaces`}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="bw" maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
chartName="bw"
|
||||||
|
maxToggled={maxValues}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
let { value, unit } = formatBytes(val, true, userSettings.unitNet, true)
|
||||||
|
// value = value >= 10 ? Math.ceil(value) : value
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitNet, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
{containerFilterBar && containerData.length > 0 && (
|
{containerFilterBar && containerData.length > 0 && (
|
||||||
@@ -594,10 +628,10 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
<div className="grid xl:grid-cols-2 gap-4">
|
<div className="grid xl:grid-cols-2 gap-4">
|
||||||
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
|
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
|
||||||
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
|
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
|
||||||
const sizeFormatter = (value: number, decimals?: number) => {
|
// const sizeFormatter = (value: number, decimals?: number) => {
|
||||||
const { v, u } = getSizeAndUnit(value, false)
|
// const { v, u } = getSizeAndUnit(value, false)
|
||||||
return toFixedFloat(v, decimals || 1) + u
|
// return toFixedFloat(v, decimals || 1) + u
|
||||||
}
|
// }
|
||||||
return (
|
return (
|
||||||
<div key={id} className="contents">
|
<div key={id} className="contents">
|
||||||
<ChartCard
|
<ChartCard
|
||||||
@@ -606,7 +640,12 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
title={`${gpu.n} ${t`Usage`}`}
|
title={`${gpu.n} ${t`Usage`}`}
|
||||||
description={t`Average utilization of ${gpu.n}`}
|
description={t`Average utilization of ${gpu.n}`}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName={`g.${id}.u`} unit="%" />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
chartName={`g.${id}.u`}
|
||||||
|
tickFormatter={(val) => toFixedWithoutTrailingZeros(val, 2) + "%"}
|
||||||
|
contentFormatter={({ value }) => decimalString(value) + "%"}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
<ChartCard
|
<ChartCard
|
||||||
empty={dataEmpty}
|
empty={dataEmpty}
|
||||||
@@ -618,8 +657,14 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
chartData={chartData}
|
chartData={chartData}
|
||||||
chartName={`g.${id}.mu`}
|
chartName={`g.${id}.mu`}
|
||||||
max={gpu.mt}
|
max={gpu.mt}
|
||||||
tickFormatter={sizeFormatter}
|
tickFormatter={(val) => {
|
||||||
contentFormatter={(value) => sizeFormatter(value, 2)}
|
const { value, unit } = formatBytes(val, false, DataUnit.Bytes, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, false, DataUnit.Bytes, true)
|
||||||
|
return decimalString(convertedValue) + " " + unit
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
</div>
|
</div>
|
||||||
@@ -653,7 +698,19 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Throughput of ${extraFsName}`}
|
description={t`Throughput of ${extraFsName}`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName={`efs.${extraFsName}`} maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
chartName={`efs.${extraFsName}`}
|
||||||
|
maxToggled={maxValues}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitDisk, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -63,12 +63,20 @@ import {
|
|||||||
PenBoxIcon,
|
PenBoxIcon,
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
import { memo, useEffect, useMemo, useRef, useState } from "react"
|
import { memo, useEffect, useMemo, useRef, useState } from "react"
|
||||||
import { $systems, pb } from "@/lib/stores"
|
import { $systems, $userSettings, pb } from "@/lib/stores"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import { cn, copyToClipboard, decimalString, isReadOnlyUser, useLocalStorage } from "@/lib/utils"
|
import {
|
||||||
|
cn,
|
||||||
|
copyToClipboard,
|
||||||
|
isReadOnlyUser,
|
||||||
|
useLocalStorage,
|
||||||
|
convertTemperature,
|
||||||
|
decimalString,
|
||||||
|
formatBytes,
|
||||||
|
} from "@/lib/utils"
|
||||||
import AlertsButton from "../alerts/alert-button"
|
import AlertsButton from "../alerts/alert-button"
|
||||||
import { $router, Link, navigate } from "../router"
|
import { $router, Link, navigate } from "../router"
|
||||||
import { EthernetIcon, GpuIcon, ThermometerIcon } from "../ui/icons"
|
import { EthernetIcon, GpuIcon, HourglassIcon, ThermometerIcon } from "../ui/icons"
|
||||||
import { useLingui, Trans } from "@lingui/react/macro"
|
import { useLingui, Trans } from "@lingui/react/macro"
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
||||||
import { Input } from "../ui/input"
|
import { Input } from "../ui/input"
|
||||||
@@ -83,8 +91,8 @@ function CellFormatter(info: CellContext<SystemRecord, unknown>) {
|
|||||||
const val = (info.getValue() as number) || 0
|
const val = (info.getValue() as number) || 0
|
||||||
return (
|
return (
|
||||||
<div className="flex gap-2 items-center tabular-nums tracking-tight">
|
<div className="flex gap-2 items-center tabular-nums tracking-tight">
|
||||||
<span className="min-w-[3.3em]">{decimalString(val, 1)}%</span>
|
<span className="min-w-8">{decimalString(val, 1)}%</span>
|
||||||
<span className="grow min-w-10 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
|
<span className="grow min-w-8 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
|
||||||
<span
|
<span
|
||||||
className={cn(
|
className={cn(
|
||||||
"absolute inset-0 w-full h-full origin-left",
|
"absolute inset-0 w-full h-full origin-left",
|
||||||
@@ -127,6 +135,7 @@ export default function SystemsTable() {
|
|||||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
|
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
|
||||||
const [columnVisibility, setColumnVisibility] = useLocalStorage<VisibilityState>("cols", {})
|
const [columnVisibility, setColumnVisibility] = useLocalStorage<VisibilityState>("cols", {})
|
||||||
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("viewMode", window.innerWidth > 1024 ? "table" : "grid")
|
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("viewMode", window.innerWidth > 1024 ? "table" : "grid")
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
|
|
||||||
const locale = i18n.locale
|
const locale = i18n.locale
|
||||||
|
|
||||||
@@ -144,7 +153,6 @@ export default function SystemsTable() {
|
|||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
// size: 200,
|
|
||||||
size: 200,
|
size: 200,
|
||||||
minSize: 0,
|
minSize: 0,
|
||||||
accessorKey: "name",
|
accessorKey: "name",
|
||||||
@@ -163,6 +171,7 @@ export default function SystemsTable() {
|
|||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
enableHiding: false,
|
enableHiding: false,
|
||||||
|
invertSorting: false,
|
||||||
Icon: ServerIcon,
|
Icon: ServerIcon,
|
||||||
cell: (info) => (
|
cell: (info) => (
|
||||||
<span className="flex gap-0.5 items-center text-base md:pe-5">
|
<span className="flex gap-0.5 items-center text-base md:pe-5">
|
||||||
@@ -181,28 +190,26 @@ export default function SystemsTable() {
|
|||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "info.cpu",
|
accessorFn: (originalRow) => originalRow.info.cpu,
|
||||||
id: "cpu",
|
id: "cpu",
|
||||||
name: () => t`CPU`,
|
name: () => t`CPU`,
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
cell: CellFormatter,
|
||||||
Icon: CpuIcon,
|
Icon: CpuIcon,
|
||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "info.mp",
|
// accessorKey: "info.mp",
|
||||||
|
accessorFn: (originalRow) => originalRow.info.mp,
|
||||||
id: "memory",
|
id: "memory",
|
||||||
name: () => t`Memory`,
|
name: () => t`Memory`,
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
cell: CellFormatter,
|
||||||
Icon: MemoryStickIcon,
|
Icon: MemoryStickIcon,
|
||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "info.dp",
|
accessorFn: (originalRow) => originalRow.info.dp,
|
||||||
id: "disk",
|
id: "disk",
|
||||||
name: () => t`Disk`,
|
name: () => t`Disk`,
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
cell: CellFormatter,
|
||||||
Icon: HardDriveIcon,
|
Icon: HardDriveIcon,
|
||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
@@ -211,8 +218,6 @@ export default function SystemsTable() {
|
|||||||
accessorFn: (originalRow) => originalRow.info.g,
|
accessorFn: (originalRow) => originalRow.info.g,
|
||||||
id: "gpu",
|
id: "gpu",
|
||||||
name: () => "GPU",
|
name: () => "GPU",
|
||||||
invertSorting: true,
|
|
||||||
sortUndefined: -1,
|
|
||||||
cell: CellFormatter,
|
cell: CellFormatter,
|
||||||
Icon: GpuIcon,
|
Icon: GpuIcon,
|
||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
@@ -221,19 +226,54 @@ export default function SystemsTable() {
|
|||||||
accessorFn: (originalRow) => originalRow.info.b || 0,
|
accessorFn: (originalRow) => originalRow.info.b || 0,
|
||||||
id: "net",
|
id: "net",
|
||||||
name: () => t`Net`,
|
name: () => t`Net`,
|
||||||
invertSorting: true,
|
size: 0,
|
||||||
size: 50,
|
|
||||||
Icon: EthernetIcon,
|
Icon: EthernetIcon,
|
||||||
header: sortableHeader,
|
header: sortableHeader,
|
||||||
cell(info) {
|
cell(info) {
|
||||||
const val = info.getValue() as number
|
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, true)
|
||||||
return (
|
return (
|
||||||
<span
|
<span className="tabular-nums whitespace-nowrap">
|
||||||
className={cn("tabular-nums whitespace-nowrap", {
|
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
|
||||||
"ps-1": viewMode === "table",
|
</span>
|
||||||
})}
|
)
|
||||||
>
|
},
|
||||||
{decimalString(val, val >= 100 ? 1 : 2)} MB/s
|
},
|
||||||
|
{
|
||||||
|
accessorFn: (originalRow) => originalRow.info.l5,
|
||||||
|
id: "l5",
|
||||||
|
name: () => t({ message: "L5", comment: "Load average 5 minutes" }),
|
||||||
|
size: 0,
|
||||||
|
hideSort: true,
|
||||||
|
Icon: HourglassIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info) {
|
||||||
|
const val = info.getValue() as number
|
||||||
|
if (!val) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-1")}>
|
||||||
|
{decimalString(val)}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: (originalRow) => originalRow.info.l15,
|
||||||
|
id: "l15",
|
||||||
|
name: () => t({ message: "L15", comment: "Load average 15 minutes" }),
|
||||||
|
size: 0,
|
||||||
|
hideSort: true,
|
||||||
|
Icon: HourglassIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info) {
|
||||||
|
const val = info.getValue() as number
|
||||||
|
if (!val) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-1")}>
|
||||||
|
{decimalString(val)}
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@@ -242,8 +282,6 @@ export default function SystemsTable() {
|
|||||||
accessorFn: (originalRow) => originalRow.info.dt,
|
accessorFn: (originalRow) => originalRow.info.dt,
|
||||||
id: "temp",
|
id: "temp",
|
||||||
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
|
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
|
||||||
invertSorting: true,
|
|
||||||
sortUndefined: -1,
|
|
||||||
size: 50,
|
size: 50,
|
||||||
hideSort: true,
|
hideSort: true,
|
||||||
Icon: ThermometerIcon,
|
Icon: ThermometerIcon,
|
||||||
@@ -253,22 +291,19 @@ export default function SystemsTable() {
|
|||||||
if (!val) {
|
if (!val) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
const { value, unit } = convertTemperature(val, userSettings.unitTemp)
|
||||||
return (
|
return (
|
||||||
<span
|
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-0.5")}>
|
||||||
className={cn("tabular-nums whitespace-nowrap", {
|
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
|
||||||
"ps-1.5": viewMode === "table",
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
{decimalString(val)} °C
|
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "info.v",
|
accessorFn: (originalRow) => originalRow.info.v,
|
||||||
id: "agent",
|
id: "agent",
|
||||||
name: () => t`Agent`,
|
name: () => t`Agent`,
|
||||||
invertSorting: true,
|
// invertSorting: true,
|
||||||
size: 50,
|
size: 50,
|
||||||
Icon: WifiIcon,
|
Icon: WifiIcon,
|
||||||
hideSort: true,
|
hideSort: true,
|
||||||
@@ -280,11 +315,7 @@ export default function SystemsTable() {
|
|||||||
}
|
}
|
||||||
const system = info.row.original
|
const system = info.row.original
|
||||||
return (
|
return (
|
||||||
<span
|
<span className={cn("flex gap-2 items-center md:pe-5 tabular-nums", viewMode === "table" && "ps-0.5")}>
|
||||||
className={cn("flex gap-2 items-center md:pe-5 tabular-nums", {
|
|
||||||
"ps-1": viewMode === "table",
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
<IndicatorDot
|
<IndicatorDot
|
||||||
system={system}
|
system={system}
|
||||||
className={
|
className={
|
||||||
@@ -304,7 +335,7 @@ export default function SystemsTable() {
|
|||||||
name: () => t({ message: "Actions", comment: "Table column" }),
|
name: () => t({ message: "Actions", comment: "Table column" }),
|
||||||
size: 50,
|
size: 50,
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<div className="flex justify-end items-center gap-1">
|
<div className="flex justify-end items-center gap-1 -ms-3">
|
||||||
<AlertsButton system={row.original} />
|
<AlertsButton system={row.original} />
|
||||||
<ActionsButton system={row.original} />
|
<ActionsButton system={row.original} />
|
||||||
</div>
|
</div>
|
||||||
@@ -328,6 +359,9 @@ export default function SystemsTable() {
|
|||||||
columnVisibility,
|
columnVisibility,
|
||||||
},
|
},
|
||||||
defaultColumn: {
|
defaultColumn: {
|
||||||
|
// sortDescFirst: true,
|
||||||
|
invertSorting: true,
|
||||||
|
sortUndefined: "last",
|
||||||
minSize: 0,
|
minSize: 0,
|
||||||
size: 900,
|
size: 900,
|
||||||
maxSize: 900,
|
maxSize: 900,
|
||||||
@@ -511,7 +545,7 @@ function SystemsTableHead({ table, colLength }: { table: TableType<SystemRecord>
|
|||||||
<TableRow key={headerGroup.id}>
|
<TableRow key={headerGroup.id}>
|
||||||
{headerGroup.headers.map((header) => {
|
{headerGroup.headers.map((header) => {
|
||||||
return (
|
return (
|
||||||
<TableHead className="px-2" key={header.id}>
|
<TableHead className="px-1" key={header.id}>
|
||||||
{flexRender(header.column.columnDef.header, header.getContext())}
|
{flexRender(header.column.columnDef.header, header.getContext())}
|
||||||
</TableHead>
|
</TableHead>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -121,3 +121,12 @@ export function GpuIcon(props: SVGProps<SVGSVGElement>) {
|
|||||||
</svg>
|
</svg>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remix icons (Apache 2.0) https://github.com/Remix-Design/RemixIcon/blob/master/License
|
||||||
|
export function HourglassIcon(props: SVGProps<SVGSVGElement>) {
|
||||||
|
return (
|
||||||
|
<svg viewBox="0 0 24 24" {...props} fill="currentColor">
|
||||||
|
<path d="M4 2h16v4.5L13.5 12l6.5 5.5V22H4v-4.5l6.5-5.5L4 6.5zm12.3 5L18 5.5V4H6v1.5L7.7 7zM12 13.3l-6 5.2V20h1l5-3 5 3h1v-1.5z" />
|
||||||
|
</svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,3 +11,13 @@ export enum ChartType {
|
|||||||
Network,
|
Network,
|
||||||
CPU,
|
CPU,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum DataUnit {
|
||||||
|
Bytes,
|
||||||
|
Bits,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum TemperatureUnit {
|
||||||
|
Celsius,
|
||||||
|
Fahrenheit,
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ export const $maxValues = atom(false)
|
|||||||
export const $userSettings = map<UserSettings>({
|
export const $userSettings = map<UserSettings>({
|
||||||
chartTime: "1h",
|
chartTime: "1h",
|
||||||
emails: [pb.authStore.record?.email || ""],
|
emails: [pb.authStore.record?.email || ""],
|
||||||
|
temperatureUnit: "celsius",
|
||||||
|
networkUnit: "mbps",
|
||||||
|
diskUnit: "mbps",
|
||||||
})
|
})
|
||||||
// update local storage on change
|
// update local storage on change
|
||||||
$userSettings.subscribe((value) => {
|
$userSettings.subscribe((value) => {
|
||||||
|
|||||||
@@ -3,14 +3,24 @@ import { toast } from "@/components/ui/use-toast"
|
|||||||
import { type ClassValue, clsx } from "clsx"
|
import { type ClassValue, clsx } from "clsx"
|
||||||
import { twMerge } from "tailwind-merge"
|
import { twMerge } from "tailwind-merge"
|
||||||
import { $alerts, $copyContent, $systems, $userSettings, pb } from "./stores"
|
import { $alerts, $copyContent, $systems, $userSettings, pb } from "./stores"
|
||||||
import { AlertInfo, AlertRecord, ChartTimeData, ChartTimes, FingerprintRecord, SystemRecord } from "@/types"
|
import {
|
||||||
|
AlertInfo,
|
||||||
|
AlertRecord,
|
||||||
|
ChartTimeData,
|
||||||
|
ChartTimes,
|
||||||
|
FingerprintRecord,
|
||||||
|
SystemRecord,
|
||||||
|
TemperatureConversion,
|
||||||
|
DataUnitConversion,
|
||||||
|
} from "@/types"
|
||||||
import { RecordModel, RecordSubscription } from "pocketbase"
|
import { RecordModel, RecordSubscription } from "pocketbase"
|
||||||
import { WritableAtom } from "nanostores"
|
import { WritableAtom } from "nanostores"
|
||||||
import { timeDay, timeHour } from "d3-time"
|
import { timeDay, timeHour } from "d3-time"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
|
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
|
||||||
import { EthernetIcon, ThermometerIcon } from "@/components/ui/icons"
|
import { EthernetIcon, HourglassIcon, ThermometerIcon } from "@/components/ui/icons"
|
||||||
import { prependBasePath } from "@/components/router"
|
import { prependBasePath } from "@/components/router"
|
||||||
|
import { DataUnit, TemperatureUnit } from "./enums"
|
||||||
|
|
||||||
export function cn(...inputs: ClassValue[]) {
|
export function cn(...inputs: ClassValue[]) {
|
||||||
return twMerge(clsx(inputs))
|
return twMerge(clsx(inputs))
|
||||||
@@ -230,7 +240,7 @@ export function toFixedWithoutTrailingZeros(num: number, digits: number) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function toFixedFloat(num: number, digits: number) {
|
export function toFixedFloat(num: number, digits: number) {
|
||||||
return parseFloat(num.toFixed(digits))
|
return parseFloat((digits === 0 ? Math.ceil(num) : num).toFixed(digits))
|
||||||
}
|
}
|
||||||
|
|
||||||
let decimalFormatters: Map<number, Intl.NumberFormat> = new Map()
|
let decimalFormatters: Map<number, Intl.NumberFormat> = new Map()
|
||||||
@@ -266,6 +276,72 @@ export function useLocalStorage<T>(key: string, defaultValue: T) {
|
|||||||
return [value, setValue]
|
return [value, setValue]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function convertTemperature(celsius: number, unit = TemperatureUnit.Celsius): TemperatureConversion {
|
||||||
|
const userSettings = $userSettings.get()
|
||||||
|
unit ||= userSettings.unitTemp || TemperatureUnit.Celsius
|
||||||
|
// need loose equality check due to form data being strings
|
||||||
|
if (unit == TemperatureUnit.Fahrenheit) {
|
||||||
|
return {
|
||||||
|
value: celsius * 1.8 + 32,
|
||||||
|
unit: "°F",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: celsius,
|
||||||
|
unit: "°C",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatBytes(
|
||||||
|
size: number,
|
||||||
|
perSecond = false,
|
||||||
|
unit = DataUnit.Bytes,
|
||||||
|
isMegabytes = false
|
||||||
|
): DataUnitConversion {
|
||||||
|
// Convert MB to bytes if isMegabytes is true
|
||||||
|
if (isMegabytes) size *= 1024 * 1024
|
||||||
|
|
||||||
|
// need loose equality check due to form data being strings
|
||||||
|
if (unit == DataUnit.Bits) {
|
||||||
|
const bits = size * 8
|
||||||
|
const suffix = perSecond ? "ps" : ""
|
||||||
|
if (bits < 1000) return { value: bits, unit: `b${suffix}` }
|
||||||
|
if (bits < 1_000_000) return { value: bits / 1_000, unit: `Kb${suffix}` }
|
||||||
|
if (bits < 1_000_000_000)
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000,
|
||||||
|
unit: `Mb${suffix}`,
|
||||||
|
}
|
||||||
|
if (bits < 1_000_000_000_000)
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000_000,
|
||||||
|
unit: `Gb${suffix}`,
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000_000_000,
|
||||||
|
unit: `Tb${suffix}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const suffix = perSecond ? "/s" : ""
|
||||||
|
if (size < 100) return { value: size, unit: `B${suffix}` }
|
||||||
|
if (size < 1000 * 1024) return { value: size / 1024, unit: `KB${suffix}` }
|
||||||
|
if (size < 1000 * 1024 ** 2)
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 2,
|
||||||
|
unit: `MB${suffix}`,
|
||||||
|
}
|
||||||
|
if (size < 1000 * 1024 ** 3)
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 3,
|
||||||
|
unit: `GB${suffix}`,
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 4,
|
||||||
|
unit: `TB${suffix}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function updateUserSettings() {
|
export async function updateUserSettings() {
|
||||||
try {
|
try {
|
||||||
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
|
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
|
||||||
@@ -342,6 +418,26 @@ export const alertInfo: Record<string, AlertInfo> = {
|
|||||||
icon: ThermometerIcon,
|
icon: ThermometerIcon,
|
||||||
desc: () => t`Triggers when any sensor exceeds a threshold`,
|
desc: () => t`Triggers when any sensor exceeds a threshold`,
|
||||||
},
|
},
|
||||||
|
LoadAvg5: {
|
||||||
|
name: () => t`Load Average 5m`,
|
||||||
|
unit: "",
|
||||||
|
icon: HourglassIcon,
|
||||||
|
max: 100,
|
||||||
|
min: 0.1,
|
||||||
|
start: 10,
|
||||||
|
step: 0.1,
|
||||||
|
desc: () => t`Triggers when 5 minute load average exceeds a threshold`,
|
||||||
|
},
|
||||||
|
LoadAvg15: {
|
||||||
|
name: () => t`Load Average 15m`,
|
||||||
|
unit: "",
|
||||||
|
icon: HourglassIcon,
|
||||||
|
min: 0.1,
|
||||||
|
max: 100,
|
||||||
|
start: 10,
|
||||||
|
step: 0.1,
|
||||||
|
desc: () => t`Triggers when 15 minute load average exceeds a threshold`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "تم النسخ إلى الحافظة"
|
msgstr "تم النسخ إلى الحافظة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "نسخ docker compose"
|
msgstr "نسخ docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "نسخ docker run"
|
msgstr "نسخ docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "نسخ المضيف"
|
msgstr "نسخ المضيف"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "نسخ أمر لينكس"
|
msgstr "نسخ أمر لينكس"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "فشل في تحديث التنبيه"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "تصفية..."
|
msgstr "تصفية..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "لمدة <0>{min}</0> {min, plural, one {دقيقة} other {دقائق}}"
|
msgstr "لمدة <0>{min}</0> {min, plural, one {دقيقة} other {دقائق}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "شبكة"
|
msgstr "شبكة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "أمر Homebrew"
|
msgstr "أمر Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "عنوان البريد الإشباكي غير صالح."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "النواة"
|
msgstr "النواة"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "اللغة"
|
msgstr "اللغة"
|
||||||
@@ -453,6 +471,14 @@ msgstr "التخطيط"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "فاتح"
|
msgstr "فاتح"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "تسجيل الخروج"
|
msgstr "تسجيل الخروج"
|
||||||
@@ -734,6 +760,7 @@ msgstr "استخدام التبديل"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "النظام"
|
msgstr "النظام"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "تبديل السمة"
|
msgstr "تبديل السمة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "رمز مميز"
|
msgstr "رمز مميز"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "تسمح الرموز المميزة للوكلاء بالاتصال و
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
|
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "يتم التفعيل عندما يتجاوز أي مستشعر عتبة معينة"
|
msgstr "يتم التفعيل عندما يتجاوز أي مستشعر عتبة معينة"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "عند التفعيل، يسمح هذا الرمز المميز للوكلاء بالتسجيل الذاتي دون إنشاء نظام مسبق. ينتهي بعد ساعة واحدة أو عند إعادة تشغيل المحور."
|
msgstr "عند التفعيل، يسمح هذا الرمز المميز للوكلاء بالتسجيل الذاتي دون إنشاء نظام مسبق. ينتهي بعد ساعة واحدة أو عند إعادة تشغيل المحور."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "أمر Windows"
|
msgstr "أمر Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Записано в клипборда"
|
msgstr "Записано в клипборда"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Копирай docker compose"
|
msgstr "Копирай docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Копирай docker run"
|
msgstr "Копирай docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Копирай хоста"
|
msgstr "Копирай хоста"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Копирай linux командата"
|
msgstr "Копирай linux командата"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Неуспешно обнови тревога"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Филтрирай..."
|
msgstr "Филтрирай..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
|
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Мрежово"
|
msgstr "Мрежово"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Команда Homebrew"
|
msgstr "Команда Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Невалиден имейл адрес."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Linux Kernel"
|
msgstr "Linux Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Език"
|
msgstr "Език"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Подреждане"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Светъл"
|
msgstr "Светъл"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Изход"
|
msgstr "Изход"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Използване на swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Система"
|
msgstr "Система"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Включи тема"
|
msgstr "Включи тема"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
|
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Команда Windows"
|
msgstr "Команда Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Zkopírováno do schránky"
|
msgstr "Zkopírováno do schránky"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopírovat docker compose"
|
msgstr "Kopírovat docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopírovat hostitele"
|
msgstr "Kopírovat hostitele"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopírovat příkaz Linux"
|
msgstr "Kopírovat příkaz Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Nepodařilo se aktualizovat upozornění"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtr..."
|
msgstr "Filtr..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Mřížka"
|
msgstr "Mřížka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -440,6 +448,16 @@ msgstr "Neplatná e-mailová adresa."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Jazyk"
|
msgstr "Jazyk"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Rozvržení"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Světlý"
|
msgstr "Světlý"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odhlásit"
|
msgstr "Odhlásit"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap využití"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Systém"
|
msgstr "Systém"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Přepnout motiv"
|
msgstr "Přepnout motiv"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
|
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopieret til udklipsholder"
|
msgstr "Kopieret til udklipsholder"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiér docker compose"
|
msgstr "Kopiér docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiér docker run"
|
msgstr "Kopiér docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopier host"
|
msgstr "Kopier host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopier Linux kommando"
|
msgstr "Kopier Linux kommando"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Kunne ikke opdatere alarm"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
|
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Gitter"
|
msgstr "Gitter"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-kommando"
|
msgstr "Homebrew-kommando"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ugyldig email adresse."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Sprog"
|
msgstr "Sprog"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Lys"
|
msgstr "Lys"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Log ud"
|
msgstr "Log ud"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap forbrug"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Skift tema"
|
msgstr "Skift tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Udløser når en sensor overstiger en tærskel"
|
msgstr "Udløser når en sensor overstiger en tærskel"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-kommando"
|
msgstr "Windows-kommando"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "In die Zwischenablage kopiert"
|
msgstr "In die Zwischenablage kopiert"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose kopieren"
|
msgstr "Docker compose kopieren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run kopieren"
|
msgstr "Docker run kopieren"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Host kopieren"
|
msgstr "Host kopieren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linux-Befehl kopieren"
|
msgstr "Linux-Befehl kopieren"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Warnung konnte nicht aktualisiert werden"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
|
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Raster"
|
msgstr "Raster"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-Befehl"
|
msgstr "Homebrew-Befehl"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ungültige E-Mail-Adresse."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Sprache"
|
msgstr "Sprache"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Anordnung"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Hell"
|
msgstr "Hell"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap-Nutzung"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Darstellung umschalten"
|
msgstr "Darstellung umschalten"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Tokens ermöglichen es Agents, sich zu verbinden und zu registrieren. Fi
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
|
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Löst aus, wenn ein Sensor einen Schwellenwert überschreitet"
|
msgstr "Löst aus, wenn ein Sensor einen Schwellenwert überschreitet"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Wenn aktiviert, ermöglicht dieser Token Agents, sich selbst zu registrieren, ohne vorherige Systemerstellung. Läuft nach einer Stunde oder beim Hub-Neustart ab."
|
msgstr "Wenn aktiviert, ermöglicht dieser Token Agents, sich selbst zu registrieren, ohne vorherige Systemerstellung. Läuft nach einer Stunde oder beim Hub-Neustart ab."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-Befehl"
|
msgstr "Windows-Befehl"
|
||||||
|
|||||||
@@ -206,11 +206,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copied to clipboard"
|
msgstr "Copied to clipboard"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copy docker compose"
|
msgstr "Copy docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copy docker run"
|
msgstr "Copy docker run"
|
||||||
@@ -225,6 +227,7 @@ msgid "Copy host"
|
|||||||
msgstr "Copy host"
|
msgstr "Copy host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copy Linux command"
|
msgstr "Copy Linux command"
|
||||||
|
|
||||||
@@ -391,6 +394,10 @@ msgstr "Failed to update alert"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Fingerprint"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgstr "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
@@ -414,6 +421,7 @@ msgid "Grid"
|
|||||||
msgstr "Grid"
|
msgstr "Grid"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew command"
|
msgstr "Homebrew command"
|
||||||
@@ -435,6 +443,16 @@ msgstr "Invalid email address."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr "L15"
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr "L5"
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Language"
|
msgstr "Language"
|
||||||
@@ -448,6 +466,14 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Light"
|
msgstr "Light"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Load Average 15m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Load Average 5m"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Log Out"
|
msgstr "Log Out"
|
||||||
@@ -729,6 +755,7 @@ msgstr "Swap Usage"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -796,6 +823,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Toggle theme"
|
msgstr "Toggle theme"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -813,6 +841,14 @@ msgstr "Tokens allow agents to connect and register. Fingerprints are stable ide
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Triggers when any sensor exceeds a threshold"
|
msgstr "Triggers when any sensor exceeds a threshold"
|
||||||
@@ -901,6 +937,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
msgstr "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows command"
|
msgstr "Windows command"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiado al portapapeles"
|
msgstr "Copiado al portapapeles"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copiar docker compose"
|
msgstr "Copiar docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copiar docker run"
|
msgstr "Copiar docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Copiar host"
|
msgstr "Copiar host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copiar comando de Linux"
|
msgstr "Copiar comando de Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Error al actualizar la alerta"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrar..."
|
msgstr "Filtrar..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Cuadrícula"
|
msgstr "Cuadrícula"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Dirección de correo electrónico no válida."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Idioma"
|
msgstr "Idioma"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Diseño"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Claro"
|
msgstr "Claro"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Cerrar Sesión"
|
msgstr "Cerrar Sesión"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Uso de Swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Alternar tema"
|
msgstr "Alternar tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Los tokens permiten que los agentes se conecten y registren. Las huellas
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
|
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Se activa cuando cualquier sensor supera un umbral"
|
msgstr "Se activa cuando cualquier sensor supera un umbral"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Cuando está habilitado, este token permite que los agentes se auto-registren sin crear previamente el sistema. Expira después de una hora o al reiniciar el hub."
|
msgstr "Cuando está habilitado, este token permite que los agentes se auto-registren sin crear previamente el sistema. Expira después de una hora o al reiniciar el hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "در کلیپبورد کپی شد"
|
msgstr "در کلیپبورد کپی شد"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "کپی docker compose"
|
msgstr "کپی docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "کپی docker run"
|
msgstr "کپی docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "کپی میزبان"
|
msgstr "کپی میزبان"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "کپی دستور لینوکس"
|
msgstr "کپی دستور لینوکس"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "بهروزرسانی هشدار ناموفق بود"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "فیلتر..."
|
msgstr "فیلتر..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
|
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "جدول"
|
msgstr "جدول"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "دستور Homebrew"
|
msgstr "دستور Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "آدرس ایمیل نامعتبر است."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "هسته"
|
msgstr "هسته"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "زبان"
|
msgstr "زبان"
|
||||||
@@ -453,6 +471,14 @@ msgstr "طرحبندی"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "روشن"
|
msgstr "روشن"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "خروج"
|
msgstr "خروج"
|
||||||
@@ -734,6 +760,7 @@ msgstr "میزان استفاده از Swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "سیستم"
|
msgstr "سیستم"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "تغییر تم"
|
msgstr "تغییر تم"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "توکن"
|
msgstr "توکن"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "توکنها به عاملها اجازه اتصال و ثبت
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "توکنها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده میشوند."
|
msgstr "توکنها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده میشوند."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال میشود"
|
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال میشود"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "هنگامی که فعال است، این توکن به عاملها اجازه خودثبتنامی بدون ایجاد سیستم قبلی میدهد. پس از یک ساعت یا در راهاندازی مجدد هاب منقضی میشود."
|
msgstr "هنگامی که فعال است، این توکن به عاملها اجازه خودثبتنامی بدون ایجاد سیستم قبلی میدهد. پس از یک ساعت یا در راهاندازی مجدد هاب منقضی میشود."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "دستور Windows"
|
msgstr "دستور Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copié dans le presse-papiers"
|
msgstr "Copié dans le presse-papiers"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copier docker compose"
|
msgstr "Copier docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copier docker run"
|
msgstr "Copier docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Copier l'hôte"
|
msgstr "Copier l'hôte"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copier la commande Linux"
|
msgstr "Copier la commande Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Échec de la mise à jour de l'alerte"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrer..."
|
msgstr "Filtrer..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Pour <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgstr "Pour <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Grille"
|
msgstr "Grille"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Commande Homebrew"
|
msgstr "Commande Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Adresse email invalide."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Noyau"
|
msgstr "Noyau"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Langue"
|
msgstr "Langue"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Disposition"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Clair"
|
msgstr "Clair"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Déconnexion"
|
msgstr "Déconnexion"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Utilisation du swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Système"
|
msgstr "Système"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Changer le thème"
|
msgstr "Changer le thème"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Les tokens permettent aux agents de se connecter et de s'enregistrer. Le
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
|
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Déclenchement lorsque tout capteur dépasse un seuil"
|
msgstr "Déclenchement lorsque tout capteur dépasse un seuil"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Lorsqu'il est activé, ce token permet aux agents de s'auto-enregistrer sans création préalable du système. Expire après une heure ou au redémarrage du hub."
|
msgstr "Lorsqu'il est activé, ce token permet aux agents de s'auto-enregistrer sans création préalable du système. Expire après une heure ou au redémarrage du hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Commande Windows"
|
msgstr "Commande Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopirano u međuspremnik"
|
msgstr "Kopirano u međuspremnik"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiraj docker compose"
|
msgstr "Kopiraj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiraj docker run"
|
msgstr "Kopiraj docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiraj hosta"
|
msgstr "Kopiraj hosta"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiraj Linux komandu"
|
msgstr "Kopiraj Linux komandu"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Ažuriranje upozorenja nije uspjelo"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Mreža"
|
msgstr "Mreža"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew naredba"
|
msgstr "Homebrew naredba"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Nevažeća adresa e-pošte."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Jezik"
|
msgstr "Jezik"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Izgled"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Svijetlo"
|
msgstr "Svijetlo"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odjava"
|
msgstr "Odjava"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap Iskorištenost"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistem"
|
msgstr "Sistem"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Uključi/isključi temu"
|
msgstr "Uključi/isključi temu"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Pokreće se kada bilo koji senzor prijeđe prag"
|
msgstr "Pokreće se kada bilo koji senzor prijeđe prag"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows naredba"
|
msgstr "Windows naredba"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Vágólapra másolva"
|
msgstr "Vágólapra másolva"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose másolása"
|
msgstr "Docker compose másolása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run másolása"
|
msgstr "Docker run másolása"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Hoszt másolása"
|
msgstr "Hoszt másolása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linux parancs másolása"
|
msgstr "Linux parancs másolása"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Nem sikerült frissíteni a riasztást"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Szűrő..."
|
msgstr "Szűrő..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
|
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Rács"
|
msgstr "Rács"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew parancs"
|
msgstr "Homebrew parancs"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Érvénytelen e-mail cím."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Nyelv"
|
msgstr "Nyelv"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Elrendezés"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Világos"
|
msgstr "Világos"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Kijelentkezés"
|
msgstr "Kijelentkezés"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap használat"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Rendszer"
|
msgstr "Rendszer"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Téma váltása"
|
msgstr "Téma váltása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
|
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows parancs"
|
msgstr "Windows parancs"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Afritað í klippiborð"
|
msgstr "Afritað í klippiborð"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Afrita docker compose"
|
msgstr "Afrita docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Afrita docker run"
|
msgstr "Afrita docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Afrita host"
|
msgstr "Afrita host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Afrita Linux aðgerð"
|
msgstr "Afrita Linux aðgerð"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Mistókst að uppfæra tilkynningu"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Sía..."
|
msgstr "Sía..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew skipun"
|
msgstr "Homebrew skipun"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ógilt netfang."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Tungumál"
|
msgstr "Tungumál"
|
||||||
@@ -453,6 +471,14 @@ msgstr ""
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Ljóst"
|
msgstr "Ljóst"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Útskrá"
|
msgstr "Útskrá"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Skipti minni"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Kerfi"
|
msgstr "Kerfi"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Velja þema"
|
msgstr "Velja þema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
|
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows skipun"
|
msgstr "Windows skipun"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiato negli appunti"
|
msgstr "Copiato negli appunti"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copia docker compose"
|
msgstr "Copia docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copia docker run"
|
msgstr "Copia docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Copia host"
|
msgstr "Copia host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copia comando Linux"
|
msgstr "Copia comando Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Aggiornamento dell'avviso fallito"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtra..."
|
msgstr "Filtra..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Per <0>{min}</0> {min, plural, one {minuto} other {minuti}}"
|
msgstr "Per <0>{min}</0> {min, plural, one {minuto} other {minuti}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Griglia"
|
msgstr "Griglia"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Indirizzo email non valido."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Lingua"
|
msgstr "Lingua"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Aspetto"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Chiaro"
|
msgstr "Chiaro"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Disconnetti"
|
msgstr "Disconnetti"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Utilizzo Swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Attiva/disattiva tema"
|
msgstr "Attiva/disattiva tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "I token consentono agli agenti di connettersi e registrarsi. Le impronte
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
|
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Attiva quando un sensore supera una soglia"
|
msgstr "Attiva quando un sensore supera una soglia"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Quando abilitato, questo token consente agli agenti di auto-registrarsi senza creazione preventiva del sistema. Scade dopo un'ora o al riavvio dell'hub."
|
msgstr "Quando abilitato, questo token consente agli agenti di auto-registrarsi senza creazione preventiva del sistema. Scade dopo un'ora o al riavvio dell'hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "クリップボードにコピーされました"
|
msgstr "クリップボードにコピーされました"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "docker compose をコピー"
|
msgstr "docker compose をコピー"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "docker run をコピー"
|
msgstr "docker run をコピー"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "ホストをコピー"
|
msgstr "ホストをコピー"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linuxコマンドをコピー"
|
msgstr "Linuxコマンドをコピー"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "アラートの更新に失敗しました"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "フィルター..."
|
msgstr "フィルター..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
|
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "グリッド"
|
msgstr "グリッド"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew コマンド"
|
msgstr "Homebrew コマンド"
|
||||||
@@ -440,6 +448,16 @@ msgstr "無効なメールアドレスです。"
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "カーネル"
|
msgstr "カーネル"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "言語"
|
msgstr "言語"
|
||||||
@@ -453,6 +471,14 @@ msgstr "レイアウト"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "ライト"
|
msgstr "ライト"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "ログアウト"
|
msgstr "ログアウト"
|
||||||
@@ -734,6 +760,7 @@ msgstr "スワップ使用量"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "システム"
|
msgstr "システム"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "テーマを切り替え"
|
msgstr "テーマを切り替え"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "トークン"
|
msgstr "トークン"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "トークンはエージェントの接続と登録を可能にします
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
|
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "センサーがしきい値を超えたときにトリガーされます"
|
msgstr "センサーがしきい値を超えたときにトリガーされます"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "有効にすると、このトークンはエージェントが事前のシステム作成なしに自己登録することを可能にします。1時間後またはハブの再起動時に期限切れになります。"
|
msgstr "有効にすると、このトークンはエージェントが事前のシステム作成なしに自己登録することを可能にします。1時間後またはハブの再起動時に期限切れになります。"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows コマンド"
|
msgstr "Windows コマンド"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "클립보드에 복사됨"
|
msgstr "클립보드에 복사됨"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "docker compose 복사"
|
msgstr "docker compose 복사"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "docker run 복사"
|
msgstr "docker run 복사"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "호스트 복사"
|
msgstr "호스트 복사"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "리눅스 명령어 복사"
|
msgstr "리눅스 명령어 복사"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "알림 수정 실패"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "필터..."
|
msgstr "필터..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
|
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "그리드"
|
msgstr "그리드"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew 명령어"
|
msgstr "Homebrew 명령어"
|
||||||
@@ -440,6 +448,16 @@ msgstr "잘못된 이메일 주소입니다."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "커널"
|
msgstr "커널"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "언어"
|
msgstr "언어"
|
||||||
@@ -453,6 +471,14 @@ msgstr "레이아웃"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "밝게"
|
msgstr "밝게"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "로그아웃"
|
msgstr "로그아웃"
|
||||||
@@ -734,6 +760,7 @@ msgstr "스왑 사용량"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "시스템"
|
msgstr "시스템"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "테마 전환"
|
msgstr "테마 전환"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "센서가 임계값을 초과할 때 트리거됩니다."
|
msgstr "센서가 임계값을 초과할 때 트리거됩니다."
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows 명령어"
|
msgstr "Windows 명령어"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Gekopieerd naar het klembord"
|
msgstr "Gekopieerd naar het klembord"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose kopiëren"
|
msgstr "Docker compose kopiëren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run kopiëren"
|
msgstr "Docker run kopiëren"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopieer host"
|
msgstr "Kopieer host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopieer Linux-opdracht"
|
msgstr "Kopieer Linux-opdracht"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Bijwerken waarschuwing mislukt"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Voor <0>{min}</0> {min, plural, one {minuut} other {minuten}}"
|
msgstr "Voor <0>{min}</0> {min, plural, one {minuut} other {minuten}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Raster"
|
msgstr "Raster"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-commando"
|
msgstr "Homebrew-commando"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ongeldig e-mailadres."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Taal"
|
msgstr "Taal"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Indeling"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Licht"
|
msgstr "Licht"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Afmelden"
|
msgstr "Afmelden"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap gebruik"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Systeem"
|
msgstr "Systeem"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Schakel thema"
|
msgstr "Schakel thema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Triggert wanneer een sensor een drempelwaarde overschrijdt"
|
msgstr "Triggert wanneer een sensor een drempelwaarde overschrijdt"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-commando"
|
msgstr "Windows-commando"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopiert til utklippstavlen"
|
msgstr "Kopiert til utklippstavlen"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopier docker compose"
|
msgstr "Kopier docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopier docker run"
|
msgstr "Kopier docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopier vert"
|
msgstr "Kopier vert"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopier Linux-kommando"
|
msgstr "Kopier Linux-kommando"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Kunne ikke oppdatere alarm"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "I <0>{min}</0> {min, plural, one {minutt} other {minutter}}"
|
msgstr "I <0>{min}</0> {min, plural, one {minutt} other {minutter}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Rutenett"
|
msgstr "Rutenett"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-kommando"
|
msgstr "Homebrew-kommando"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ugyldig e-postadresse."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kjerne"
|
msgstr "Kjerne"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Språk"
|
msgstr "Språk"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Lyst"
|
msgstr "Lyst"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logg Ut"
|
msgstr "Logg Ut"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap-bruk"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Tema av/på"
|
msgstr "Tema av/på"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
|
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-kommando"
|
msgstr "Windows-kommando"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Skopiowano do schowka"
|
msgstr "Skopiowano do schowka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Skopiuj docker compose"
|
msgstr "Skopiuj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Skopiuj docker run"
|
msgstr "Skopiuj docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiuj host"
|
msgstr "Kopiuj host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiuj polecenie Linux"
|
msgstr "Kopiuj polecenie Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Nie udało się zaktualizować powiadomienia"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtruj..."
|
msgstr "Filtruj..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
|
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Siatka"
|
msgstr "Siatka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Polecenie Homebrew"
|
msgstr "Polecenie Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Nieprawidłowy adres e-mail."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Jądro"
|
msgstr "Jądro"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Język"
|
msgstr "Język"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Układ"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Jasny"
|
msgstr "Jasny"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Wyloguj"
|
msgstr "Wyloguj"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Użycie pamięci wymiany"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Zmień motyw"
|
msgstr "Zmień motyw"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Wyzwalane, gdy jakikolwiek czujnik przekroczy ustalony próg."
|
msgstr "Wyzwalane, gdy jakikolwiek czujnik przekroczy ustalony próg."
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Polecenie Windows"
|
msgstr "Polecenie Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiado para a área de transferência"
|
msgstr "Copiado para a área de transferência"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copiar docker compose"
|
msgstr "Copiar docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copiar docker run"
|
msgstr "Copiar docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Copiar host"
|
msgstr "Copiar host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copiar comando Linux"
|
msgstr "Copiar comando Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Falha ao atualizar alerta"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrar..."
|
msgstr "Filtrar..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Grade"
|
msgstr "Grade"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Endereço de email inválido."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Idioma"
|
msgstr "Idioma"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Aspeto"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Claro"
|
msgstr "Claro"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Uso de Swap"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Alternar tema"
|
msgstr "Alternar tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Os tokens permitem que os agentes se conectem e registrem. As impressõe
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
|
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Dispara quando qualquer sensor excede um limite"
|
msgstr "Dispara quando qualquer sensor excede um limite"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Quando habilitado, este token permite que os agentes se registrem automaticamente sem criação prévia do sistema. Expira após uma hora ou na reinicialização do hub."
|
msgstr "Quando habilitado, este token permite que os agentes se registrem automaticamente sem criação prévia do sistema. Expira após uma hora ou na reinicialização do hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Скопировано в буфер обмена"
|
msgstr "Скопировано в буфер обмена"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Скопировать docker compose"
|
msgstr "Скопировать docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Скопировать docker run"
|
msgstr "Скопировать docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Копировать хост"
|
msgstr "Копировать хост"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Копировать команду Linux"
|
msgstr "Копировать команду Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Не удалось обновить оповещение"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Фильтр..."
|
msgstr "Фильтр..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "На <0>{min}</0> {min, plural, one {минуту} other {минут}}"
|
msgstr "На <0>{min}</0> {min, plural, one {минуту} other {минут}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Сетка"
|
msgstr "Сетка"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Команда Homebrew"
|
msgstr "Команда Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Неверный адрес электронной почты."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Ядро"
|
msgstr "Ядро"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Язык"
|
msgstr "Язык"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Макет"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Светлая"
|
msgstr "Светлая"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Выйти"
|
msgstr "Выйти"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Использование подкачки"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Система"
|
msgstr "Система"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Переключить тему"
|
msgstr "Переключить тему"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Срабатывает, когда любой датчик превышает порог"
|
msgstr "Срабатывает, когда любой датчик превышает порог"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Команда Windows"
|
msgstr "Команда Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopirano v odložišče"
|
msgstr "Kopirano v odložišče"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiraj docker compose"
|
msgstr "Kopiraj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiraj docker run"
|
msgstr "Kopiraj docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiraj gostitelja"
|
msgstr "Kopiraj gostitelja"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiraj Linux ukaz"
|
msgstr "Kopiraj Linux ukaz"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Opozorila ni bilo mogoče posodobiti"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Mreža"
|
msgstr "Mreža"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Ukaz Homebrew"
|
msgstr "Ukaz Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Napačen e-poštni naslov."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Jedro"
|
msgstr "Jedro"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Jezik"
|
msgstr "Jezik"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Postavitev"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Svetlo"
|
msgstr "Svetlo"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odjava"
|
msgstr "Odjava"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap uporaba"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistemsko"
|
msgstr "Sistemsko"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Obrni temo"
|
msgstr "Obrni temo"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Sproži se, ko kateri koli senzor preseže prag"
|
msgstr "Sproži se, ko kateri koli senzor preseže prag"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Ukaz Windows"
|
msgstr "Ukaz Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopierat till urklipp"
|
msgstr "Kopierat till urklipp"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiera docker compose"
|
msgstr "Kopiera docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiera docker run"
|
msgstr "Kopiera docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiera värd"
|
msgstr "Kopiera värd"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiera Linux-kommando"
|
msgstr "Kopiera Linux-kommando"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Kunde inte uppdatera larm"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrera..."
|
msgstr "Filtrera..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Under <0>{min}</0> {min, plural, one {minut} other {minuter}}"
|
msgstr "Under <0>{min}</0> {min, plural, one {minut} other {minuter}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Rutnät"
|
msgstr "Rutnät"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-kommando"
|
msgstr "Homebrew-kommando"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Ogiltig e-postadress."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kärna"
|
msgstr "Kärna"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Språk"
|
msgstr "Språk"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Ljust"
|
msgstr "Ljust"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logga ut"
|
msgstr "Logga ut"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Swap-användning"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Växla tema"
|
msgstr "Växla tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Utlöses när någon sensor överskrider ett tröskelvärde"
|
msgstr "Utlöses när någon sensor överskrider ett tröskelvärde"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-kommando"
|
msgstr "Windows-kommando"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Panoya kopyalandı"
|
msgstr "Panoya kopyalandı"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose kopyala"
|
msgstr "Docker compose kopyala"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run kopyala"
|
msgstr "Docker run kopyala"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Ana bilgisayarı kopyala"
|
msgstr "Ana bilgisayarı kopyala"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linux komutunu kopyala"
|
msgstr "Linux komutunu kopyala"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Uyarı güncellenemedi"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrele..."
|
msgstr "Filtrele..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "<0>{min}</0> {min, plural, one {dakika} other {dakika}} için"
|
msgstr "<0>{min}</0> {min, plural, one {dakika} other {dakika}} için"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Izgara"
|
msgstr "Izgara"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew komutu"
|
msgstr "Homebrew komutu"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Geçersiz e-posta adresi."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Çekirdek"
|
msgstr "Çekirdek"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Dil"
|
msgstr "Dil"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Düzen"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Açık"
|
msgstr "Açık"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Çıkış Yap"
|
msgstr "Çıkış Yap"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Takas Kullanımı"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistem"
|
msgstr "Sistem"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Temayı değiştir"
|
msgstr "Temayı değiştir"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Token'lar agentların bağlanıp kaydolmasına izin verir. Parmak izleri
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Token'lar ve parmak izleri hub'a WebSocket bağlantılarını doğrulamak için kullanılır."
|
msgstr "Token'lar ve parmak izleri hub'a WebSocket bağlantılarını doğrulamak için kullanılır."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Herhangi bir sensör bir eşiği aştığında tetiklenir"
|
msgstr "Herhangi bir sensör bir eşiği aştığında tetiklenir"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Etkinleştirildiğinde, bu token agentların önceden sistem oluşturmadan kendilerini kaydetmelerine izin verir. Bir saat sonra veya hub yeniden başlatıldığında sona erer."
|
msgstr "Etkinleştirildiğinde, bu token agentların önceden sistem oluşturmadan kendilerini kaydetmelerine izin verir. Bir saat sonra veya hub yeniden başlatıldığında sona erer."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows komutu"
|
msgstr "Windows komutu"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Скопійовано в буфер обміну"
|
msgstr "Скопійовано в буфер обміну"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Копіювати docker compose"
|
msgstr "Копіювати docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Копіювати docker run"
|
msgstr "Копіювати docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Копіювати хост"
|
msgstr "Копіювати хост"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Копіювати команду Linux"
|
msgstr "Копіювати команду Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Не вдалося оновити сповіщення"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Фільтр..."
|
msgstr "Фільтр..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Протягом <0>{min}</0> {min, plural, one {хвилини} other {хвилин}}"
|
msgstr "Протягом <0>{min}</0> {min, plural, one {хвилини} other {хвилин}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Сітка"
|
msgstr "Сітка"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Команда Homebrew"
|
msgstr "Команда Homebrew"
|
||||||
@@ -440,6 +448,16 @@ msgstr "Неправильна адреса електронної пошти."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Ядро"
|
msgstr "Ядро"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Мова"
|
msgstr "Мова"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Макет"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Світлий"
|
msgstr "Світлий"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Вийти"
|
msgstr "Вийти"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Використання підкачки"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Система"
|
msgstr "Система"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Перемкнути тему"
|
msgstr "Перемкнути тему"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Токен"
|
msgstr "Токен"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "Токени дозволяють агентам підключатис
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Токени та відбитки використовуються для автентифікації WebSocket з'єднань до хабу."
|
msgstr "Токени та відбитки використовуються для автентифікації WebSocket з'єднань до хабу."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Спрацьовує, коли будь-який датчик перевищує поріг"
|
msgstr "Спрацьовує, коли будь-який датчик перевищує поріг"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Коли увімкнено, цей токен дозволяє агентам самостійно реєструватися без попереднього створення системи. Термін дії закінчується через годину або при перезапуску хабу."
|
msgstr "Коли увімкнено, цей токен дозволяє агентам самостійно реєструватися без попереднього створення системи. Термін дії закінчується через годину або при перезапуску хабу."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Команда Windows"
|
msgstr "Команда Windows"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Đã sao chép vào clipboard"
|
msgstr "Đã sao chép vào clipboard"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Sao chép docker compose"
|
msgstr "Sao chép docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Sao chép docker run"
|
msgstr "Sao chép docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "Sao chép máy chủ"
|
msgstr "Sao chép máy chủ"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Sao chép lệnh Linux"
|
msgstr "Sao chép lệnh Linux"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "Cập nhật cảnh báo thất bại"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Lọc..."
|
msgstr "Lọc..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Trong <0>{min}</0> {min, plural, one {phút} other {phút}}"
|
msgstr "Trong <0>{min}</0> {min, plural, one {phút} other {phút}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "Lưới"
|
msgstr "Lưới"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -440,6 +448,16 @@ msgstr "Địa chỉ email không hợp lệ."
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Nhân"
|
msgstr "Nhân"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Ngôn ngữ"
|
msgstr "Ngôn ngữ"
|
||||||
@@ -453,6 +471,14 @@ msgstr "Bố cục"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Sáng"
|
msgstr "Sáng"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Đăng xuất"
|
msgstr "Đăng xuất"
|
||||||
@@ -734,6 +760,7 @@ msgstr "Sử dụng Hoán đổi"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Hệ thống"
|
msgstr "Hệ thống"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Chuyển đổi chủ đề"
|
msgstr "Chuyển đổi chủ đề"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Kích hoạt khi bất kỳ cảm biến nào vượt quá ngưỡng"
|
msgstr "Kích hoạt khi bất kỳ cảm biến nào vượt quá ngưỡng"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "已复制到剪贴板"
|
msgstr "已复制到剪贴板"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "复制 docker compose 文件"
|
msgstr "复制 docker compose 文件"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "复制 docker run 命令"
|
msgstr "复制 docker run 命令"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "复制主机名"
|
msgstr "复制主机名"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "复制 Linux 安装命令"
|
msgstr "复制 Linux 安装命令"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "更新警报失败"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "过滤..."
|
msgstr "过滤..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "持续<0>{min}</0> {min, plural, one {分钟} other {分钟}}"
|
msgstr "持续<0>{min}</0> {min, plural, one {分钟} other {分钟}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "网格"
|
msgstr "网格"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew 安装命令"
|
msgstr "Homebrew 安装命令"
|
||||||
@@ -440,6 +448,16 @@ msgstr "无效的电子邮件地址。"
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "内核"
|
msgstr "内核"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "语言"
|
msgstr "语言"
|
||||||
@@ -453,6 +471,14 @@ msgstr "布局"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "浅色模式"
|
msgstr "浅色模式"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "登出"
|
msgstr "登出"
|
||||||
@@ -734,6 +760,7 @@ msgstr "SWAP 使用"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "系统"
|
msgstr "系统"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "切换主题"
|
msgstr "切换主题"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "令牌"
|
msgstr "令牌"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "令牌允许客户端连接和注册。指纹是每个系统唯一的稳
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "令牌和指纹用于验证到中心的WebSocket连接。"
|
msgstr "令牌和指纹用于验证到中心的WebSocket连接。"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "当任何传感器超过阈值时触发"
|
msgstr "当任何传感器超过阈值时触发"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "启用时,此令牌允许客户端在无需预先创建系统的情况下自动注册。在一小时后或中心重启时过期。"
|
msgstr "启用时,此令牌允许客户端在无需预先创建系统的情况下自动注册。在一小时后或中心重启时过期。"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows 安装命令"
|
msgstr "Windows 安装命令"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "已複製到剪貼板"
|
msgstr "已複製到剪貼板"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "複製 docker compose"
|
msgstr "複製 docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "複製 docker run"
|
msgstr "複製 docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "複製主機"
|
msgstr "複製主機"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "複製 Linux 指令"
|
msgstr "複製 Linux 指令"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "更新警報失敗"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "篩選..."
|
msgstr "篩選..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
|
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "網格"
|
msgstr "網格"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew 指令"
|
msgstr "Homebrew 指令"
|
||||||
@@ -440,6 +448,16 @@ msgstr "無效的電子郵件地址。"
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "語言"
|
msgstr "語言"
|
||||||
@@ -453,6 +471,14 @@ msgstr "版面配置"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "淺色"
|
msgstr "淺色"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "登出"
|
msgstr "登出"
|
||||||
@@ -734,6 +760,7 @@ msgstr "交換使用"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "系統"
|
msgstr "系統"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "切換主題"
|
msgstr "切換主題"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "令牌"
|
msgstr "令牌"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "令牌允許代理程式連接和註冊。指紋是每個系統唯一的
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
|
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "當任何傳感器超過閾值時觸發"
|
msgstr "當任何傳感器超過閾值時觸發"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "啟用時,此令牌允許代理程式在無需預先創建系統的情況下自動註冊。在一小時後或中心重啟時過期。"
|
msgstr "啟用時,此令牌允許代理程式在無需預先創建系統的情況下自動註冊。在一小時後或中心重啟時過期。"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows 指令"
|
msgstr "Windows 指令"
|
||||||
|
|||||||
@@ -211,11 +211,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "已複製到剪貼簿"
|
msgstr "已複製到剪貼簿"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "复制 docker compose"
|
msgstr "复制 docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "复制 docker run"
|
msgstr "复制 docker run"
|
||||||
@@ -230,6 +232,7 @@ msgid "Copy host"
|
|||||||
msgstr "複製主機"
|
msgstr "複製主機"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "複製 Linux 指令"
|
msgstr "複製 Linux 指令"
|
||||||
|
|
||||||
@@ -396,6 +399,10 @@ msgstr "更新警報失敗"
|
|||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "篩選..."
|
msgstr "篩選..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
|
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
|
||||||
@@ -419,6 +426,7 @@ msgid "Grid"
|
|||||||
msgstr "網格"
|
msgstr "網格"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew 命令"
|
msgstr "Homebrew 命令"
|
||||||
@@ -440,6 +448,16 @@ msgstr "無效的電子郵件地址。"
|
|||||||
msgid "Kernel"
|
msgid "Kernel"
|
||||||
msgstr "Kernel"
|
msgstr "Kernel"
|
||||||
|
|
||||||
|
#. Load average 15 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L15"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Load average 5 minutes
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "L5"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "語言"
|
msgstr "語言"
|
||||||
@@ -453,6 +471,14 @@ msgstr "版面配置"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "淺色"
|
msgstr "淺色"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "登出"
|
msgstr "登出"
|
||||||
@@ -734,6 +760,7 @@ msgstr "虛擬記憶體使用量"
|
|||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "系統"
|
msgstr "系統"
|
||||||
|
|
||||||
@@ -801,6 +828,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "切換主題"
|
msgstr "切換主題"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "令牌"
|
msgstr "令牌"
|
||||||
|
|
||||||
@@ -818,6 +846,14 @@ msgstr "令牌允許代理程式連接和註冊。指紋是每個系統唯一的
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
|
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "當任何感應器超過閾值時觸發"
|
msgstr "當任何感應器超過閾值時觸發"
|
||||||
@@ -906,6 +942,7 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "啟用時,此令牌允許代理程式在無需預先創建系統的情況下自動註冊。在一小時後或中心重啟時過期。"
|
msgstr "啟用時,此令牌允許代理程式在無需預先創建系統的情況下自動註冊。在一小時後或中心重啟時過期。"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows 命令"
|
msgstr "Windows 命令"
|
||||||
|
|||||||
29
beszel/site/src/types.d.ts
vendored
29
beszel/site/src/types.d.ts
vendored
@@ -1,5 +1,5 @@
|
|||||||
import { RecordModel } from "pocketbase"
|
import { RecordModel } from "pocketbase"
|
||||||
import { Os } from "./lib/enums"
|
import { DataUnit, Os, TemperatureUnit } from "./lib/enums"
|
||||||
|
|
||||||
// global window properties
|
// global window properties
|
||||||
declare global {
|
declare global {
|
||||||
@@ -22,6 +22,17 @@ export interface FingerprintRecord extends RecordModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unit conversion result types
|
||||||
|
export interface TemperatureConversion {
|
||||||
|
value: number
|
||||||
|
unit: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DataUnitConversion {
|
||||||
|
value: number
|
||||||
|
unit: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface SystemRecord extends RecordModel {
|
export interface SystemRecord extends RecordModel {
|
||||||
name: string
|
name: string
|
||||||
host: string
|
host: string
|
||||||
@@ -44,6 +55,10 @@ export interface SystemInfo {
|
|||||||
c: number
|
c: number
|
||||||
/** cpu model */
|
/** cpu model */
|
||||||
m: string
|
m: string
|
||||||
|
/** load average 5 minutes */
|
||||||
|
l5?: number
|
||||||
|
/** load average 15 minutes */
|
||||||
|
l15?: number
|
||||||
/** operating system */
|
/** operating system */
|
||||||
o?: string
|
o?: string
|
||||||
/** uptime */
|
/** uptime */
|
||||||
@@ -71,6 +86,12 @@ export interface SystemStats {
|
|||||||
cpu: number
|
cpu: number
|
||||||
/** peak cpu */
|
/** peak cpu */
|
||||||
cpum?: number
|
cpum?: number
|
||||||
|
/** load average 1 minute */
|
||||||
|
l1?: number
|
||||||
|
/** load average 5 minutes */
|
||||||
|
l5?: number
|
||||||
|
/** load average 15 minutes */
|
||||||
|
l15?: number
|
||||||
/** total memory (gb) */
|
/** total memory (gb) */
|
||||||
m: number
|
m: number
|
||||||
/** memory used (gb) */
|
/** memory used (gb) */
|
||||||
@@ -195,6 +216,9 @@ export type UserSettings = {
|
|||||||
chartTime: ChartTimes
|
chartTime: ChartTimes
|
||||||
emails?: string[]
|
emails?: string[]
|
||||||
webhooks?: string[]
|
webhooks?: string[]
|
||||||
|
unitTemp?: TemperatureUnit
|
||||||
|
unitNet?: DataUnit
|
||||||
|
unitDisk?: DataUnit
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChartDataContainer = {
|
type ChartDataContainer = {
|
||||||
@@ -218,6 +242,9 @@ interface AlertInfo {
|
|||||||
icon: any
|
icon: any
|
||||||
desc: () => string
|
desc: () => string
|
||||||
max?: number
|
max?: number
|
||||||
|
min?: number
|
||||||
|
step?: number
|
||||||
|
start?: number
|
||||||
/** Single value description (when there's only one value, like status) */
|
/** Single value description (when there's only one value, like status) */
|
||||||
singleDesc?: () => string
|
singleDesc?: () => string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ module.exports = {
|
|||||||
center: true,
|
center: true,
|
||||||
padding: "1rem",
|
padding: "1rem",
|
||||||
screens: {
|
screens: {
|
||||||
"2xl": "1420px",
|
"2xl": "1440px",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"composite": true,
|
"composite": true,
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2021",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"lib": ["ES2021", "DOM", "DOM.Iterable"],
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package beszel
|
|||||||
import "github.com/blang/semver"
|
import "github.com/blang/semver"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "0.12.0-beta1"
|
Version = "0.12.0-beta2"
|
||||||
AppName = "beszel"
|
AppName = "beszel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var MinVersionCbor = semver.MustParse("0.12.0-beta1")
|
var MinVersionCbor = semver.MustParse("0.12.0-beta2")
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
HUB_URL="$1"
|
HUB_URL="$1"
|
||||||
;;
|
;;
|
||||||
-v|--version)
|
-v | --version)
|
||||||
shift
|
shift
|
||||||
VERSION="$1"
|
VERSION="$1"
|
||||||
;;
|
;;
|
||||||
@@ -353,8 +353,8 @@ if is_alpine; then
|
|||||||
fi
|
fi
|
||||||
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
||||||
if getent group docker; then
|
if getent group docker; then
|
||||||
echo "Adding besel to docker group"
|
echo "Adding beszel to docker group"
|
||||||
usermod -aG docker beszel
|
usermod -aG docker beszel
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -362,10 +362,10 @@ else
|
|||||||
echo "Creating a dedicated user for the Beszel Agent service..."
|
echo "Creating a dedicated user for the Beszel Agent service..."
|
||||||
useradd --system --home-dir /nonexistent --shell /bin/false beszel
|
useradd --system --home-dir /nonexistent --shell /bin/false beszel
|
||||||
fi
|
fi
|
||||||
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
||||||
if getent group docker; then
|
if getent group docker; then
|
||||||
echo "Adding besel to docker group"
|
echo "Adding beszel to docker group"
|
||||||
usermod -aG docker beszel
|
usermod -aG docker beszel
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -323,8 +323,8 @@ if is_alpine; then
|
|||||||
fi
|
fi
|
||||||
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
||||||
if getent group docker; then
|
if getent group docker; then
|
||||||
echo "Adding besel to docker group"
|
echo "Adding beszel to docker group"
|
||||||
usermod -aG docker beszel
|
usermod -aG docker beszel
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -332,10 +332,10 @@ else
|
|||||||
echo "Creating a dedicated user for the Beszel Agent service..."
|
echo "Creating a dedicated user for the Beszel Agent service..."
|
||||||
useradd --system --home-dir /nonexistent --shell /bin/false beszel
|
useradd --system --home-dir /nonexistent --shell /bin/false beszel
|
||||||
fi
|
fi
|
||||||
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
# Add the user to the docker group to allow access to the Docker socket if group docker exists
|
||||||
if getent group docker; then
|
if getent group docker; then
|
||||||
echo "Adding besel to docker group"
|
echo "Adding beszel to docker group"
|
||||||
usermod -aG docker beszel
|
usermod -aG docker beszel
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user