Compare commits

...

19 Commits

Author SHA1 Message Date
henrygd
4bfe9dd5ad add missing systemd methods for nonlinux 2025-11-14 17:28:40 -05:00
henrygd
e159a75b79 update language files 2025-11-14 17:24:51 -05:00
henrygd
a69686125e release 0.16.1 2025-11-14 16:39:24 -05:00
henrygd
3eb025ded2 make sure distroless image gets :latest tag in workflow 2025-11-14 16:21:17 -05:00
henrygd
1d0e646094 update changelog and go deps 2025-11-14 16:05:36 -05:00
henrygd
32c8e047e3 update cpu / container axis datamax calculations 2025-11-14 15:45:18 -05:00
henrygd
3650482b09 refactor: move getRootMountPoint to disk.go 2025-11-14 14:06:46 -05:00
Arush Wadhawan
79adfd2c0d fix: detect and handle immutable filesystems like Fedora Silverblue (#1405) 2025-11-14 14:03:26 -05:00
Sven van Ginkel
779dcc62aa chore: update actions to lock issues and skip PRs (#1419) 2025-11-14 13:58:13 -05:00
henrygd
abe39c1a0a update bun.lockb to text-based bun.lock 2025-11-14 13:54:40 -05:00
henrygd
bd41ad813c change alert history pagination to use local storage instead of saving to user settings 2025-11-14 13:54:23 -05:00
Arush Wadhawan
77fe63fb63 feat: add alert history page size preference with persistence (#1404) 2025-11-14 13:37:46 -05:00
henrygd
f61ba202d8 remove matrix from list of notification services that support title param (#1406) 2025-11-14 13:27:23 -05:00
henrygd
e1067fa1a3 make layout width adjustable 2025-11-13 18:50:47 -05:00
henrygd
0a3eb898ae truncate device name in smart table (#1416) 2025-11-13 16:41:15 -05:00
evrial
6c33e9dc93 Set a dynamic upper domain on the YAxis for container chart (#1412) 2025-11-13 16:28:37 -05:00
henrygd
f8ed6ce705 refactor: fix nan when net value is undefined in systems table 2025-11-13 16:25:21 -05:00
henrygd
f64478b75e add SERVICE_PATTERNS env var (#1153) 2025-11-13 16:11:24 -05:00
henrygd
854a3697d7 add services column to all systems table 2025-11-13 15:09:48 -05:00
57 changed files with 1864 additions and 75 deletions

View File

@@ -10,6 +10,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: false
max-parallel: 5
matrix:
include:
# henrygd/beszel
@@ -24,20 +25,18 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}
# henrygd/beszel-agent
# henrygd/beszel-agent:alpine
- image: henrygd/beszel-agent
dockerfile: ./internal/dockerfile_agent
dockerfile: ./internal/dockerfile_agent_alpine
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
tags: |
type=raw,value=edge
type=raw,value=latest
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}
type=raw,value=alpine
type=semver,pattern={{version}}-alpine
type=semver,pattern={{major}}.{{minor}}-alpine
type=semver,pattern={{major}}-alpine
# henrygd/beszel-agent-nvidia
- image: henrygd/beszel-agent-nvidia
@@ -67,18 +66,6 @@ jobs:
type=semver,pattern={{major}}
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}
# henrygd/beszel-agent:alpine
- image: henrygd/beszel-agent
dockerfile: ./internal/dockerfile_agent_alpine
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
tags: |
type=raw,value=alpine
type=semver,pattern={{version}}-alpine
type=semver,pattern={{major}}.{{minor}}-alpine
type=semver,pattern={{major}}-alpine
# ghcr.io/henrygd/beszel
- image: ghcr.io/${{ github.repository }}/beszel
dockerfile: ./internal/dockerfile_hub
@@ -146,6 +133,19 @@ jobs:
type=semver,pattern={{major}}.{{minor}}-alpine
type=semver,pattern={{major}}-alpine
# henrygd/beszel-agent (keep at bottom so it gets built after :alpine and gets the latest tag)
- image: henrygd/beszel-agent
dockerfile: ./internal/dockerfile_agent
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
tags: |
type=raw,value=edge
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}
permissions:
contents: read
packages: write

View File

@@ -10,12 +10,25 @@ permissions:
pull-requests: write
jobs:
lock-inactive:
name: Lock Inactive Issues
runs-on: ubuntu-24.04
steps:
- uses: klaasnicolaas/action-inactivity-lock@v1.1.3
id: lock
with:
days-inactive-issues: 14
lock-reason-issues: ""
# Action can not skip PRs, set it to 100 years to cover it.
days-inactive-prs: 36524
lock-reason-prs: ""
close-stale:
name: Close Stale Issues
runs-on: ubuntu-24.04
steps:
- name: Close Stale Issues
uses: actions/stale@v9
uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
@@ -32,6 +45,8 @@ jobs:
# Timing
days-before-issue-stale: 14
days-before-issue-close: 7
# Action can not skip PRs, set it to 100 years to cover it.
days-before-pr-stale: 36524
# Labels
stale-issue-label: 'stale'

View File

@@ -161,8 +161,15 @@ func (a *Agent) gatherStats(cacheTimeMs uint16) *system.CombinedData {
}
// skip updating systemd services if cache time is not the default 60sec interval
if a.systemdManager != nil && cacheTimeMs == 60_000 && a.systemdManager.hasFreshStats {
data.SystemdServices = a.systemdManager.getServiceStats(nil, false)
if a.systemdManager != nil && cacheTimeMs == 60_000 {
totalCount := uint16(a.systemdManager.getServiceStatsCount())
if totalCount > 0 {
numFailed := a.systemdManager.getFailedServiceCount()
data.Info.Services = []uint16{totalCount, numFailed}
}
if a.systemdManager.hasFreshStats {
data.SystemdServices = a.systemdManager.getServiceStats(nil, false)
}
}
data.Stats.ExtraFs = make(map[string]*system.FsStats)

View File

@@ -95,6 +95,9 @@ func (a *Agent) initializeDiskInfo() {
}
}
// Get the appropriate root mount point for this system
rootMountPoint := a.getRootMountPoint()
// Use FILESYSTEM env var to find root filesystem
if filesystem != "" {
for _, p := range partitions {
@@ -138,7 +141,7 @@ func (a *Agent) initializeDiskInfo() {
for _, p := range partitions {
// fmt.Println(p.Device, p.Mountpoint)
// Binary root fallback or docker root fallback
if !hasRoot && (p.Mountpoint == "/" || (p.Mountpoint == "/etc/hosts" && strings.HasPrefix(p.Device, "/dev"))) {
if !hasRoot && (p.Mountpoint == rootMountPoint || (p.Mountpoint == "/etc/hosts" && strings.HasPrefix(p.Device, "/dev"))) {
fs, match := findIoDevice(filepath.Base(p.Device), diskIoCounters, a.fsStats)
if match {
addFsStat(fs, p.Mountpoint, true)
@@ -174,8 +177,8 @@ func (a *Agent) initializeDiskInfo() {
// If no root filesystem set, use fallback
if !hasRoot {
rootDevice, _ := findIoDevice(filepath.Base(filesystem), diskIoCounters, a.fsStats)
slog.Info("Root disk", "mountpoint", "/", "io", rootDevice)
a.fsStats[rootDevice] = &system.FsStats{Root: true, Mountpoint: "/"}
slog.Info("Root disk", "mountpoint", rootMountPoint, "io", rootDevice)
a.fsStats[rootDevice] = &system.FsStats{Root: true, Mountpoint: rootMountPoint}
}
a.initializeDiskIoStats(diskIoCounters)
@@ -312,3 +315,32 @@ func (a *Agent) updateDiskIo(cacheTimeMs uint16, systemStats *system.Stats) {
}
}
}
// getRootMountPoint returns the appropriate root mount point for the system
// For immutable systems like Fedora Silverblue, it returns /sysroot instead of /
func (a *Agent) getRootMountPoint() string {
// 1. Check if /etc/os-release contains indicators of an immutable system
if osReleaseContent, err := os.ReadFile("/etc/os-release"); err == nil {
content := string(osReleaseContent)
if strings.Contains(content, "fedora") && strings.Contains(content, "silverblue") ||
strings.Contains(content, "coreos") ||
strings.Contains(content, "flatcar") ||
strings.Contains(content, "rhel-atomic") ||
strings.Contains(content, "centos-atomic") {
// Verify that /sysroot exists before returning it
if _, err := os.Stat("/sysroot"); err == nil {
return "/sysroot"
}
}
}
// 2. Check if /run/ostree is present (ostree-based systems like Silverblue)
if _, err := os.Stat("/run/ostree"); err == nil {
// Verify that /sysroot exists before returning it
if _, err := os.Stat("/sysroot"); err == nil {
return "/sysroot"
}
}
return "/"
}

View File

@@ -27,6 +27,7 @@ type systemdManager struct {
serviceStatsMap map[string]*systemd.Service
isRunning bool
hasFreshStats bool
patterns []string
}
// newSystemdManager creates a new systemdManager.
@@ -39,6 +40,7 @@ func newSystemdManager() (*systemdManager, error) {
manager := &systemdManager{
serviceStatsMap: make(map[string]*systemd.Service),
patterns: getServicePatterns(),
}
manager.startWorker(conn)
@@ -62,6 +64,24 @@ func (sm *systemdManager) startWorker(conn *dbus.Conn) {
}()
}
// getServiceStatsCount returns the number of systemd services.
func (sm *systemdManager) getServiceStatsCount() int {
return len(sm.serviceStatsMap)
}
// getFailedServiceCount returns the number of systemd services in a failed state.
func (sm *systemdManager) getFailedServiceCount() uint16 {
sm.Lock()
defer sm.Unlock()
count := uint16(0)
for _, service := range sm.serviceStatsMap {
if service.State == systemd.StatusFailed {
count++
}
}
return count
}
// getServiceStats collects statistics for all running systemd services.
func (sm *systemdManager) getServiceStats(conn *dbus.Conn, refresh bool) []*systemd.Service {
// start := time.Now()
@@ -91,7 +111,7 @@ func (sm *systemdManager) getServiceStats(conn *dbus.Conn, refresh bool) []*syst
defer conn.Close()
}
units, err := conn.ListUnitsByPatternsContext(context.Background(), []string{"loaded"}, []string{"*.service"})
units, err := conn.ListUnitsByPatternsContext(context.Background(), []string{"loaded"}, sm.patterns)
if err != nil {
slog.Error("Error listing systemd service units", "err", err)
return nil
@@ -227,3 +247,26 @@ func unescapeServiceName(name string) string {
}
return unescaped
}
// getServicePatterns returns the list of service patterns to match.
// It reads from the SERVICE_PATTERNS environment variable if set,
// otherwise defaults to "*service".
func getServicePatterns() []string {
patterns := []string{}
if envPatterns, _ := GetEnv("SERVICE_PATTERNS"); envPatterns != "" {
for pattern := range strings.SplitSeq(envPatterns, ",") {
pattern = strings.TrimSpace(pattern)
if pattern == "" {
continue
}
if !strings.HasSuffix(pattern, ".service") {
pattern += ".service"
}
patterns = append(patterns, pattern)
}
}
if len(patterns) == 0 {
patterns = []string{"*.service"}
}
return patterns
}

View File

@@ -23,6 +23,16 @@ func (sm *systemdManager) getServiceStats(conn any, refresh bool) []*systemd.Ser
return nil
}
// getServiceStatsCount returns 0 for non-linux systems.
func (sm *systemdManager) getServiceStatsCount() int {
return 0
}
// getFailedServiceCount returns 0 for non-linux systems.
func (sm *systemdManager) getFailedServiceCount() uint16 {
return 0
}
func (sm *systemdManager) getServiceDetails(string) (systemd.ServiceDetails, error) {
return nil, errors.New("systemd manager unavailable")
}

View File

@@ -3,6 +3,7 @@
package agent
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
@@ -46,3 +47,112 @@ func TestUnescapeServiceNameInvalid(t *testing.T) {
})
}
}
func TestGetServicePatterns(t *testing.T) {
tests := []struct {
name string
prefixedEnv string
unprefixedEnv string
expected []string
cleanupEnvVars bool
}{
{
name: "default when no env var set",
prefixedEnv: "",
unprefixedEnv: "",
expected: []string{"*.service"},
cleanupEnvVars: true,
},
{
name: "single pattern with prefixed env",
prefixedEnv: "nginx",
unprefixedEnv: "",
expected: []string{"nginx.service"},
cleanupEnvVars: true,
},
{
name: "single pattern with unprefixed env",
prefixedEnv: "",
unprefixedEnv: "nginx",
expected: []string{"nginx.service"},
cleanupEnvVars: true,
},
{
name: "prefixed env takes precedence",
prefixedEnv: "nginx",
unprefixedEnv: "apache",
expected: []string{"nginx.service"},
cleanupEnvVars: true,
},
{
name: "multiple patterns",
prefixedEnv: "nginx,apache,postgresql",
unprefixedEnv: "",
expected: []string{"nginx.service", "apache.service", "postgresql.service"},
cleanupEnvVars: true,
},
{
name: "patterns with .service suffix",
prefixedEnv: "nginx.service,apache.service",
unprefixedEnv: "",
expected: []string{"nginx.service", "apache.service"},
cleanupEnvVars: true,
},
{
name: "mixed patterns with and without suffix",
prefixedEnv: "nginx.service,apache,postgresql.service",
unprefixedEnv: "",
expected: []string{"nginx.service", "apache.service", "postgresql.service"},
cleanupEnvVars: true,
},
{
name: "patterns with whitespace",
prefixedEnv: " nginx , apache , postgresql ",
unprefixedEnv: "",
expected: []string{"nginx.service", "apache.service", "postgresql.service"},
cleanupEnvVars: true,
},
{
name: "empty patterns are skipped",
prefixedEnv: "nginx,,apache, ,postgresql",
unprefixedEnv: "",
expected: []string{"nginx.service", "apache.service", "postgresql.service"},
cleanupEnvVars: true,
},
{
name: "wildcard pattern",
prefixedEnv: "*nginx*,*apache*",
unprefixedEnv: "",
expected: []string{"*nginx*.service", "*apache*.service"},
cleanupEnvVars: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Clean up any existing env vars
os.Unsetenv("BESZEL_AGENT_SERVICE_PATTERNS")
os.Unsetenv("SERVICE_PATTERNS")
// Set up environment variables
if tt.prefixedEnv != "" {
os.Setenv("BESZEL_AGENT_SERVICE_PATTERNS", tt.prefixedEnv)
}
if tt.unprefixedEnv != "" {
os.Setenv("SERVICE_PATTERNS", tt.unprefixedEnv)
}
// Run the function
result := getServicePatterns()
// Verify results
assert.Equal(t, tt.expected, result, "Patterns should match expected values")
// Cleanup
if tt.cleanupEnvVars {
os.Unsetenv("BESZEL_AGENT_SERVICE_PATTERNS")
os.Unsetenv("SERVICE_PATTERNS")
}
})
}
}

View File

@@ -6,7 +6,7 @@ import "github.com/blang/semver"
const (
// Version is the current version of the application.
Version = "0.16.0"
Version = "0.16.1"
// AppName is the name of the application.
AppName = "beszel"
)

6
go.mod
View File

@@ -12,14 +12,14 @@ require (
github.com/lxzan/gws v1.8.9
github.com/nicholas-fedor/shoutrrr v0.12.0
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.32.0
github.com/pocketbase/pocketbase v0.33.0
github.com/shirou/gopsutil/v4 v4.25.10
github.com/spf13/cast v1.10.0
github.com/spf13/cobra v1.10.1
github.com/spf13/pflag v1.0.10
github.com/stretchr/testify v1.11.1
golang.org/x/crypto v0.44.0
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6
gopkg.in/yaml.v3 v3.0.1
)
@@ -38,7 +38,7 @@ require (
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/go-sql-driver/mysql v1.9.1 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/godbus/dbus/v5 v5.2.0 // indirect
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/klauspost/compress v1.18.1 // indirect

34
go.sum
View File

@@ -51,8 +51,8 @@ github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtS
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.2.0 h1:3WexO+U+yg9T70v9FdHr9kCxYlazaAXUhx2VMkbfax8=
github.com/godbus/dbus/v5 v5.2.0/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -62,6 +62,8 @@ github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d h1:KJIErDwbSHjnp/SGzE
github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A=
@@ -94,8 +96,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.32.0 h1:2DskUUO06sjDeXzmi9NlU/xIa5OknuHAnDQk+ncsfvc=
github.com/pocketbase/pocketbase v0.32.0/go.mod h1:prwdJKQYTums5Nhy5eeqFR5qV2AIZlS8o2JD0k6qn5E=
github.com/pocketbase/pocketbase v0.33.0 h1:v2EfiY3hxigzRJ/BwFuwVn0vUv7d2QQoD5zUFPaKR9o=
github.com/pocketbase/pocketbase v0.33.0/go.mod h1:9BEs+CRV7CrS+X5LfBh4bdJQsbzQAIklft3ovGe/c5A=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
@@ -129,13 +131,13 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY=
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70=
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0=
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.33.0 h1:LXRZRnv1+zGd5XBUVRFmYEphyyKJjQjCRiOuAP3sZfQ=
golang.org/x/image v0.33.0/go.mod h1:DD3OsTYT9chzuzTQt+zMcOlBHgfoKQb1gry8p76Y1sc=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
@@ -157,8 +159,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
@@ -171,18 +173,22 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM=
howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4=
modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A=
modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q=
modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis=
modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc=
modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM=
modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA=
modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE=
modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A=
modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I=
modernc.org/libc v1.67.0 h1:QzL4IrKab2OFmxA3/vRYl0tLXrIamwrhD6CKD4WBVjQ=
modernc.org/libc v1.67.0/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=

View File

@@ -77,7 +77,6 @@ var supportsTitle = map[string]struct{}{
"ifttt": {},
"join": {},
"lark": {},
"matrix": {},
"ntfy": {},
"opsgenie": {},
"pushbullet": {},

View File

@@ -147,6 +147,7 @@ type Info struct {
LoadAvg [3]float64 `json:"la,omitempty" cbor:"19,keyasint"`
ConnectionType ConnectionType `json:"ct,omitempty" cbor:"20,keyasint,omitempty,omitzero"`
ExtraFsPct map[string]float64 `json:"efs,omitempty" cbor:"21,keyasint,omitempty"`
Services []uint16 `json:"sv,omitempty" cbor:"22,keyasint,omitempty"` // [totalServices, numFailedServices]
}
// Final data structure to return to the hub

1008
internal/site/bun.lock Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,12 +1,12 @@
{
"name": "beszel",
"version": "0.16.0",
"version": "0.16.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "beszel",
"version": "0.16.0",
"version": "0.16.1",
"dependencies": {
"@henrygd/queue": "^1.0.7",
"@henrygd/semaphore": "^0.0.2",
@@ -4807,9 +4807,9 @@
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"devOptional": true,
"license": "MIT",
"dependencies": {

View File

@@ -1,7 +1,7 @@
{
"name": "beszel",
"private": true,
"version": "0.16.0",
"version": "0.16.1",
"type": "module",
"scripts": {
"dev": "vite --host",

View File

@@ -11,6 +11,7 @@ import {
import { chartMargin, cn, formatShortDate } from "@/lib/utils"
import type { ChartData, SystemStatsRecord } from "@/types"
import { useYAxisWidth } from "./hooks"
import { AxisDomain } from "recharts/types/util/types"
export type DataPoint = {
label: string
@@ -41,7 +42,7 @@ export default function AreaChartDefault({
tickFormatter: (value: number, index: number) => string
contentFormatter: ({ value, payload }: { value: number; payload: SystemStatsRecord }) => string
dataPoints?: DataPoint[]
domain?: [number, number]
domain?: AxisDomain
legend?: boolean
showTotal?: boolean
itemSorter?: (a: any, b: any) => number

View File

@@ -2,7 +2,7 @@
import { useStore } from "@nanostores/react"
import { memo, useMemo } from "react"
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, pinnedAxisDomain, xAxis } from "@/components/ui/chart"
import { ChartType, Unit } from "@/lib/enums"
import { $containerFilter, $userSettings } from "@/lib/stores"
import { chartMargin, cn, decimalString, formatBytes, formatShortDate, toFixedFloat } from "@/lib/utils"
@@ -124,6 +124,7 @@ export default memo(function ContainerChart({
<CartesianGrid vertical={false} />
<YAxis
direction="ltr"
domain={pinnedAxisDomain()}
orientation={chartData.orientation}
className="tracking-tighter"
width={yAxisWidth}

View File

@@ -7,6 +7,7 @@ import {
getFilteredRowModel,
getPaginationRowModel,
getSortedRowModel,
type PaginationState,
type SortingState,
useReactTable,
type VisibilityState,
@@ -40,7 +41,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@
import { useToast } from "@/components/ui/use-toast"
import { alertInfo } from "@/lib/alerts"
import { pb } from "@/lib/api"
import { cn, formatDuration, formatShortDate } from "@/lib/utils"
import { cn, formatDuration, formatShortDate, useBrowserStorage } from "@/lib/utils"
import type { AlertsHistoryRecord } from "@/types"
import { alertsHistoryColumns } from "../../alerts-history-columns"
@@ -66,6 +67,12 @@ export default function AlertsHistoryDataTable() {
const [globalFilter, setGlobalFilter] = useState("")
const { toast } = useToast()
const [deleteOpen, setDeleteDialogOpen] = useState(false)
// Store pagination preference in local storage
const [pagination, setPagination] = useBrowserStorage<PaginationState>("ah-pagination", {
pageIndex: 0,
pageSize: 10,
})
useEffect(() => {
let unsubscribe: (() => void) | undefined
@@ -136,12 +143,14 @@ export default function AlertsHistoryDataTable() {
onColumnFiltersChange: setColumnFilters,
onColumnVisibilityChange: setColumnVisibility,
onRowSelectionChange: setRowSelection,
onPaginationChange: setPagination,
state: {
sorting,
columnFilters,
columnVisibility,
rowSelection,
globalFilter,
pagination,
},
onGlobalFilterChange: setGlobalFilter,
globalFilterFn: (row, _columnId, filterValue) => {
@@ -318,10 +327,10 @@ export default function AlertsHistoryDataTable() {
<Select
value={`${table.getState().pagination.pageSize}`}
onValueChange={(value) => {
table.setPageSize(Number(value))
table.setPageSize(Number(value));
}}
>
<SelectTrigger className="w-[4.8em]" id="rows-per-page">
<SelectTrigger className="w-18" id="rows-per-page">
<SelectValue placeholder={table.getState().pagination.pageSize} />
</SelectTrigger>
<SelectContent side="top">

View File

@@ -2,14 +2,17 @@
import { Trans, useLingui } from "@lingui/react/macro"
import { LanguagesIcon, LoaderCircleIcon, SaveIcon } from "lucide-react"
import { useState } from "react"
import { useStore } from "@nanostores/react"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Separator } from "@/components/ui/separator"
import Slider from "@/components/ui/slider"
import { HourFormat, Unit } from "@/lib/enums"
import { dynamicActivate } from "@/lib/i18n"
import languages from "@/lib/languages"
import { $userSettings } from "@/lib/stores"
import { chartTimeData, currentHour12 } from "@/lib/utils"
import type { UserSettings } from "@/types"
import { saveSettings } from "./layout"
@@ -17,6 +20,8 @@ import { saveSettings } from "./layout"
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
const [isLoading, setIsLoading] = useState(false)
const { i18n } = useLingui()
const currentUserSettings = useStore($userSettings)
const layoutWidth = currentUserSettings.layoutWidth ?? 1480
async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault()
@@ -73,6 +78,27 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
</Select>
</div>
<Separator />
<div className="grid gap-2">
<div className="mb-2">
<h3 className="mb-1 text-lg font-medium">
<Trans>Layout width</Trans>
</h3>
<Label htmlFor="layoutWidth" className="text-sm text-muted-foreground leading-relaxed">
<Trans>Adjust the width of the main layout</Trans> ({layoutWidth}px)
</Label>
</div>
<Slider
id="layoutWidth"
name="layoutWidth"
value={[layoutWidth]}
onValueChange={(val) => $userSettings.setKey("layoutWidth", val[0])}
min={1000}
max={2000}
step={10}
className="w-full mb-1"
/>
</div>
<Separator />
<div className="grid gap-2">
<div className="mb-2">
<h3 className="mb-1 text-lg font-medium">

View File

@@ -74,6 +74,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/
import NetworkSheet from "./system/network-sheet"
import CpuCoresSheet from "./system/cpu-sheet"
import LineChartDefault from "../charts/line-chart"
import { pinnedAxisDomain } from "../ui/chart"
type ChartTimeData = {
time: number
@@ -603,6 +604,7 @@ export default memo(function SystemDetail({ id }: { id: string }) {
]}
tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
contentFormatter={({ value }) => `${decimalString(value)}%`}
domain={pinnedAxisDomain()}
/>
</ChartCard>

View File

@@ -118,7 +118,9 @@ export const columns: ColumnDef<DiskInfo>[] = [
sortingFn: (a, b) => a.original.device.localeCompare(b.original.device),
header: ({ column }) => <HeaderButton column={column} name={t`Device`} Icon={HardDrive} />,
cell: ({ row }) => (
<div className="font-medium ms-1.5">{row.getValue("device")}</div>
<div className="font-medium max-w-50 truncate ms-1.5" title={row.getValue("device")}>
{row.getValue("device")}
</div>
),
},
{

View File

@@ -16,6 +16,7 @@ import {
PenBoxIcon,
PlayCircleIcon,
ServerIcon,
TerminalSquareIcon,
Trash2Icon,
WifiIcon,
} from "lucide-react"
@@ -69,7 +70,7 @@ const STATUS_COLORS = {
* @param viewMode - "table" or "grid"
* @returns - Column definitions for the systems table
*/
export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<SystemRecord>[] {
export function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<SystemRecord>[] {
return [
{
// size: 200,
@@ -134,7 +135,7 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.cpu,
accessorFn: ({ info }) => info.cpu || undefined,
id: "cpu",
name: () => t`CPU`,
cell: TableCellWithMeter,
@@ -143,7 +144,7 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
},
{
// accessorKey: "info.mp",
accessorFn: ({ info }) => info.mp,
accessorFn: ({ info }) => info.mp || undefined,
id: "memory",
name: () => t`Memory`,
cell: TableCellWithMeter,
@@ -151,7 +152,7 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.dp,
accessorFn: ({ info }) => info.dp || undefined,
id: "disk",
name: () => t`Disk`,
cell: DiskCellWithMultiple,
@@ -159,7 +160,7 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.g,
accessorFn: ({ info }) => info.g || undefined,
id: "gpu",
name: () => "GPU",
cell: TableCellWithMeter,
@@ -172,9 +173,9 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
const sum = info.la?.reduce((acc, curr) => acc + curr, 0)
// TODO: remove this in future release in favor of la array
if (!sum) {
return (info.l1 ?? 0) + (info.l5 ?? 0) + (info.l15 ?? 0)
return (info.l1 ?? 0) + (info.l5 ?? 0) + (info.l15 ?? 0) || undefined
}
return sum
return sum || undefined
},
name: () => t({ message: "Load Avg", comment: "Short label for load average" }),
size: 0,
@@ -217,7 +218,7 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
},
},
{
accessorFn: ({ info }) => info.bb || (info.b || 0) * 1024 * 1024,
accessorFn: ({ info }) => (info.bb || (info.b || 0) * 1024 * 1024) || undefined,
id: "net",
name: () => t`Net`,
size: 0,
@@ -229,10 +230,10 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
if (sys.status === SystemStatus.Paused) {
return null
}
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, false)
const { value, unit } = formatBytes((info.getValue() || 0) as number, true, userSettings.unitNet, false)
return (
<span className="tabular-nums whitespace-nowrap">
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
{decimalString(value , value >= 100 ? 1 : 2)} {unit}
</span>
)
},
@@ -259,11 +260,46 @@ export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnD
)
},
},
{
accessorFn: ({ info }) => info.sv?.[0],
id: "services",
name: () => t`Services`,
size: 50,
Icon: TerminalSquareIcon,
header: sortableHeader,
hideSort: true,
sortingFn: (a, b) => {
// sort priorities: 1) failed services, 2) total services
const [totalCountA, numFailedA] = a.original.info.sv ?? [0, 0]
const [totalCountB, numFailedB] = b.original.info.sv ?? [0, 0]
if (numFailedA !== numFailedB) {
return numFailedA - numFailedB
}
return totalCountA - totalCountB
},
cell(info) {
const sys = info.row.original
const [totalCount, numFailed] = sys.info.sv ?? [0, 0]
if (sys.status !== SystemStatus.Up || totalCount === 0) {
return null
}
return (
<span className="tabular-nums whitespace-nowrap flex gap-1.5 items-center">
<span
className={cn("block size-2 rounded-full", {
[STATUS_COLORS[SystemStatus.Down]]: numFailed > 0,
[STATUS_COLORS[SystemStatus.Up]]: numFailed === 0,
})}
/>
{totalCount} <span className="text-muted-foreground text-sm -ms-0.5">({t`Failed`.toLowerCase()}: {numFailed})</span>
</span>
)
},
},
{
accessorFn: ({ info }) => info.v,
id: "agent",
name: () => t`Agent`,
// invertSorting: true,
size: 50,
Icon: WifiIcon,
hideSort: true,

View File

@@ -47,7 +47,7 @@ import type { SystemRecord } from "@/types"
import AlertButton from "../alerts/alert-button"
import { $router, Link } from "../router"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
import SystemsTableColumns, { ActionsButton, IndicatorDot } from "./systems-table-columns"
import { SystemsTableColumns, ActionsButton, IndicatorDot } from "./systems-table-columns"
type ViewMode = "table" | "grid"
type StatusFilter = "all" | SystemRecord["status"]

View File

@@ -5,6 +5,7 @@ import * as RechartsPrimitive from "recharts"
import { chartTimeData, cn } from "@/lib/utils"
import type { ChartData } from "@/types"
import { Separator } from "./separator"
import { AxisDomain } from "recharts/types/util/types"
// Format: { THEME_NAME: CSS_SELECTOR }
const THEMES = { light: "", dark: ".dark" } as const
@@ -454,3 +455,15 @@ export {
xAxis,
// ChartStyle,
}
export function pinnedAxisDomain(): AxisDomain {
return [0, (dataMax: number) => {
if (dataMax > 10) {
return Math.round(dataMax)
}
if (dataMax > 1) {
return Math.round(dataMax / 0.1) * 0.1
}
return dataMax
}]
}

View File

@@ -34,6 +34,7 @@
--table-header: hsl(225, 6%, 97%);
--chart-saturation: 65%;
--chart-lightness: 50%;
--container: 1480px;
}
.dark {
@@ -149,7 +150,8 @@
}
@utility container {
@apply max-w-370 mx-auto px-4;
max-width: var(--container);
@apply mx-auto px-4;
}
@utility link {

View File

@@ -114,6 +114,10 @@ msgstr "إضافة رابط"
msgid "Adjust display options for charts."
msgstr "تعديل خيارات العرض للرسوم البيانية."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "تعديل عرض التخطيط الرئيسي"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
msgid "Fahrenheit (°F)"
msgstr "فهرنهايت (°ف)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "فشل"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "السمات الفاشلة:"
@@ -767,6 +775,10 @@ msgstr "اللغة"
msgid "Layout"
msgstr "التخطيط"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "عرض التخطيط"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "دورة الحياة"
@@ -1197,6 +1209,10 @@ msgstr "الرقم التسلسلي"
msgid "Service Details"
msgstr "تفاصيل الخدمة"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "الخدمات"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "تعيين عتبات النسبة المئوية لألوان العداد."

View File

@@ -114,6 +114,10 @@ msgstr "Добави URL"
msgid "Adjust display options for charts."
msgstr "Настрой опциите за показване на диаграмите."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Настройка ширината на основния макет"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Експортирай конфигурацията на системи
msgid "Fahrenheit (°F)"
msgstr "Фаренхайт (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Неуспешно"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Неуспешни атрибути:"
@@ -767,6 +775,10 @@ msgstr "Език"
msgid "Layout"
msgstr "Подреждане"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Ширина на макета"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Жизнен цикъл"
@@ -1197,6 +1209,10 @@ msgstr "Сериен номер"
msgid "Service Details"
msgstr "Детайли на услугата"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Услуги"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Задайте процентни прагове за цветовете на измервателните уреди."

View File

@@ -114,6 +114,10 @@ msgstr "Přidat URL"
msgid "Adjust display options for charts."
msgstr "Upravit možnosti zobrazení pro grafy."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Upravit šířku hlavního rozvržení"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exportovat aktuální konfiguraci systémů."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheita (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Selhalo"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Neúspěšné atributy:"
@@ -767,6 +775,10 @@ msgstr "Jazyk"
msgid "Layout"
msgstr "Rozvržení"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Šířka rozvržení"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Životní cyklus"
@@ -1197,6 +1209,10 @@ msgstr "Sériové číslo"
msgid "Service Details"
msgstr "Detaily služby"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Služby"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Nastavte procentuální prahové hodnoty pro barvy měřičů."

View File

@@ -114,6 +114,10 @@ msgstr "Tilføj URL"
msgid "Adjust display options for charts."
msgstr "Juster visningsindstillinger for diagrammer."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Juster bredden af hovedlayoutet"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Eksporter din nuværende systemkonfiguration."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Mislykkedes"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Mislykkede attributter:"
@@ -767,6 +775,10 @@ msgstr "Sprog"
msgid "Layout"
msgstr "Opstilling"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layoutbredde"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Livscyklus"
@@ -1197,6 +1209,10 @@ msgstr "Serienummer"
msgid "Service Details"
msgstr "Tjenestedetaljer"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Tjenester"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Indstil procentvise tærskler for målerfarver."

View File

@@ -114,6 +114,10 @@ msgstr "URL hinzufügen"
msgid "Adjust display options for charts."
msgstr "Anzeigeoptionen für Diagramme anpassen."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Breite des Hauptlayouts anpassen"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exportiere die aktuelle Systemkonfiguration."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Fehlgeschlagen"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Fehlgeschlagene Attribute:"
@@ -767,6 +775,10 @@ msgstr "Sprache"
msgid "Layout"
msgstr "Anordnung"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layoutbreite"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Lebenszyklus"
@@ -1197,6 +1209,10 @@ msgstr "Seriennummer"
msgid "Service Details"
msgstr "Servicedetails"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Dienste"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Prozentuale Schwellenwerte für Zählerfarben festlegen."

View File

@@ -109,6 +109,10 @@ msgstr "Add URL"
msgid "Adjust display options for charts."
msgstr "Adjust display options for charts."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Adjust the width of the main layout"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -633,6 +637,10 @@ msgstr "Export your current systems configuration."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Failed"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Failed Attributes:"
@@ -762,6 +770,10 @@ msgstr "Language"
msgid "Layout"
msgstr "Layout"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layout width"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Lifecycle"
@@ -1192,6 +1204,10 @@ msgstr "Serial Number"
msgid "Service Details"
msgstr "Service Details"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Services"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Set percentage thresholds for meter colors."

View File

@@ -114,6 +114,10 @@ msgstr "Agregar URL"
msgid "Adjust display options for charts."
msgstr "Ajustar las opciones de visualización para los gráficos."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Ajustar el ancho del diseño principal"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exporta la configuración actual de sus sistemas."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Fallido"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Atributos fallidos:"
@@ -767,6 +775,10 @@ msgstr "Idioma"
msgid "Layout"
msgstr "Diseño"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Ancho del diseño"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Ciclo de vida"
@@ -1197,6 +1209,10 @@ msgstr "Número de serie"
msgid "Service Details"
msgstr "Detalles del servicio"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Servicios"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Establecer umbrales de porcentaje para los colores de los medidores."

View File

@@ -114,6 +114,10 @@ msgstr "افزودن آدرس اینترنتی"
msgid "Adjust display options for charts."
msgstr "تنظیم گزینه‌های نمایش برای نمودارها."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "تنظیم عرض چیدمان اصلی"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "پیکربندی سیستم‌های فعلی خود را خارج کن
msgid "Fahrenheit (°F)"
msgstr "فارنهایت (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "ناموفق"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "ویژگی‌های ناموفق:"
@@ -767,6 +775,10 @@ msgstr "زبان"
msgid "Layout"
msgstr "طرح‌بندی"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "عرض چیدمان"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "چرخه حیات"
@@ -1197,6 +1209,10 @@ msgstr "شماره سریال"
msgid "Service Details"
msgstr "جزئیات سرویس"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "سرویس‌ها"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "آستانه های درصدی را برای رنگ های متر تنظیم کنید."

View File

@@ -114,6 +114,10 @@ msgstr "Ajouter lURL"
msgid "Adjust display options for charts."
msgstr "Ajuster les options d'affichage pour les graphiques."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Ajuster la largeur de la mise en page principale"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exportez la configuration actuelle de vos systèmes."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Échoué"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Attributs défaillants :"
@@ -767,6 +775,10 @@ msgstr "Langue"
msgid "Layout"
msgstr "Disposition"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Largeur de la mise en page"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Cycle de vie"
@@ -1197,6 +1209,10 @@ msgstr "Numéro de série"
msgid "Service Details"
msgstr "Détails du service"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Services"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Définir des seuils de pourcentage pour les couleurs des compteurs."

View File

@@ -114,6 +114,10 @@ msgstr "הוסף URL"
msgid "Adjust display options for charts."
msgstr "התאם אפשרויות תצוגה עבור גרפים."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "התאם את רוחב הפריסה הראשית"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "ייצא את תצורת המערכות הנוכחית שלך."
msgid "Fahrenheit (°F)"
msgstr "פרנהייט (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "נכשל"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "מאפיינים שנכשלו:"
@@ -767,6 +775,10 @@ msgstr "שפה"
msgid "Layout"
msgstr "פריסה"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "רוחב פריסה"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "מחזור חיים"
@@ -1197,6 +1209,10 @@ msgstr "מספר סידורי"
msgid "Service Details"
msgstr "פרטי שירות"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "שירותים"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "הגדר סף אחוזים עבור צבעי מד."

View File

@@ -114,6 +114,10 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Podesite opcije prikaza za grafikone."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Prilagodite širinu glavnog rasporeda"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Izvoz trenutne sistemske konfiguracije."
msgid "Fahrenheit (°F)"
msgstr "Farenhajt (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Neuspješno"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Neuspjeli atributi:"
@@ -767,6 +775,10 @@ msgstr "Jezik"
msgid "Layout"
msgstr "Izgled"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Širina rasporeda"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Životni ciklus"
@@ -1197,6 +1209,10 @@ msgstr "Serijski broj"
msgid "Service Details"
msgstr "Detalji usluge"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Usluge"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Postavite pragove postotka za boje mjerača."

View File

@@ -114,6 +114,10 @@ msgstr "URL hozzáadása"
msgid "Adjust display options for charts."
msgstr "Állítsa be a diagram megjelenítését."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "A fő elrendezés szélességének beállítása"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Sikertelen"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Sikertelen attribútumok:"
@@ -767,6 +775,10 @@ msgstr "Nyelv"
msgid "Layout"
msgstr "Elrendezés"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Elrendezés szélessége"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Életciklus"
@@ -1197,6 +1209,10 @@ msgstr "Sorozatszám"
msgid "Service Details"
msgstr "Szolgáltatás részletei"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Szolgáltatások"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Százalékos küszöbértékek beállítása a mérőszínekhez."

View File

@@ -114,6 +114,10 @@ msgstr "Aggiungi URL"
msgid "Adjust display options for charts."
msgstr "Regola le opzioni di visualizzazione per i grafici."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Regola la larghezza del layout principale"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Esporta la configurazione attuale dei tuoi sistemi."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Fallito"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Attributi falliti:"
@@ -767,6 +775,10 @@ msgstr "Lingua"
msgid "Layout"
msgstr "Aspetto"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Larghezza del layout"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Ciclo di vita"
@@ -1197,6 +1209,10 @@ msgstr "Numero di serie"
msgid "Service Details"
msgstr "Dettagli servizio"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Servizi"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Imposta le soglie percentuali per i colori dei contatori."

View File

@@ -114,6 +114,10 @@ msgstr "URLを追加"
msgid "Adjust display options for charts."
msgstr "チャートの表示オプションを調整します。"
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "メインレイアウトの幅を調整"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "現在のシステム設定をエクスポートします。"
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "失敗"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "失敗した属性:"
@@ -767,6 +775,10 @@ msgstr "言語"
msgid "Layout"
msgstr "レイアウト"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "レイアウト幅"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "ライフサイクル"
@@ -1197,6 +1209,10 @@ msgstr "シリアル番号"
msgid "Service Details"
msgstr "サービス詳細"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "サービス"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "メーターの色を変更するしきい値(パーセンテージ)を設定します。"

View File

@@ -114,6 +114,10 @@ msgstr "URL 추가"
msgid "Adjust display options for charts."
msgstr "차트 표시 옵션 변경."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "메인 레이아웃 너비 조정"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "현재 시스템 구성 내보내기"
msgid "Fahrenheit (°F)"
msgstr "화씨 (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "실패"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "실패한 속성:"
@@ -767,6 +775,10 @@ msgstr "언어"
msgid "Layout"
msgstr "레이아웃"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "레이아웃 너비"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "생명주기"
@@ -1197,6 +1209,10 @@ msgstr "시리얼 번호"
msgid "Service Details"
msgstr "서비스 세부 정보"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "서비스"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "그래프 미터 색상의 백분율 임계값을 설정합니다."

View File

@@ -114,6 +114,10 @@ msgstr "Voeg URL toe"
msgid "Adjust display options for charts."
msgstr "Weergaveopties voor grafieken aanpassen."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Breedte van het hoofdlayout aanpassen"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exporteer je huidige systeemconfiguratie."
msgid "Fahrenheit (°F)"
msgstr ""
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Mislukt"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Mislukte kenmerken:"
@@ -767,6 +775,10 @@ msgstr "Taal"
msgid "Layout"
msgstr "Indeling"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layoutbreedte"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr ""
@@ -1197,6 +1209,10 @@ msgstr "Serienummer"
msgid "Service Details"
msgstr "Servicedetails"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Services"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Stel percentagedrempels in voor meterkleuren."

View File

@@ -114,6 +114,10 @@ msgstr "Legg Til URL"
msgid "Adjust display options for charts."
msgstr "Juster visningsalternativer for diagrammer."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Juster bredden på hovedlayouten"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Eksporter din nåværende systemkonfigurasjon"
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Mislyktes"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Mislykkede attributter:"
@@ -767,6 +775,10 @@ msgstr "Språk"
msgid "Layout"
msgstr "Oppsett"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layoutbredde"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Livssyklus"
@@ -1197,6 +1209,10 @@ msgstr "Serienummer"
msgid "Service Details"
msgstr "Tjenestedetaljer"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Tjenester"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Angi prosentvise terskler for målerfarger."

View File

@@ -114,6 +114,10 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Dostosuj opcje wyświetlania wykresów."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Dostosuj szerokość głównego układu"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Eksportuj aktualną konfigurację systemów."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Nieudane"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Nieudane atrybuty:"
@@ -767,6 +775,10 @@ msgstr "Język"
msgid "Layout"
msgstr "Układ"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Szerokość układu"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Cykl życia"
@@ -1197,6 +1209,10 @@ msgstr "Numer seryjny"
msgid "Service Details"
msgstr "Szczegóły usługi"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Usługi"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Ustaw progi procentowe dla kolorów mierników."

View File

@@ -114,6 +114,10 @@ msgstr "Adicionar URL"
msgid "Adjust display options for charts."
msgstr "Ajustar opções de exibição para gráficos."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Ajustar a largura do layout principal"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exporte a configuração atual dos seus sistemas."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Falhou"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Atributos com Falha:"
@@ -767,6 +775,10 @@ msgstr "Idioma"
msgid "Layout"
msgstr "Aspeto"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Largura do layout"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Ciclo de vida"
@@ -1197,6 +1209,10 @@ msgstr "Número de Série"
msgid "Service Details"
msgstr "Detalhes do serviço"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Serviços"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Defina os limiares de porcentagem para as cores do medidor."

View File

@@ -114,6 +114,10 @@ msgstr "Добавить URL"
msgid "Adjust display options for charts."
msgstr "Настроить параметры отображения для графиков."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Настроить ширину основного макета"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Экспортируйте текущую конфигурацию си
msgid "Fahrenheit (°F)"
msgstr "Фаренгейт (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Неудачно"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Неудачные атрибуты:"
@@ -767,6 +775,10 @@ msgstr "Язык"
msgid "Layout"
msgstr "Макет"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Ширина макета"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Жизненный цикл"
@@ -1197,6 +1209,10 @@ msgstr "Серийный номер"
msgid "Service Details"
msgstr "Детали сервиса"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Службы"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Установите процентные пороги для цветов счетчиков."

View File

@@ -114,6 +114,10 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Prilagodi možnosti prikaza za grafikone."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Prilagodite širino glavne postavitve"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Izvozi trenutne nastavitve sistema."
msgid "Fahrenheit (°F)"
msgstr ""
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Neuspešno"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Neuspeli atributi:"
@@ -767,6 +775,10 @@ msgstr "Jezik"
msgid "Layout"
msgstr "Postavitev"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Širina postavitve"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Življenjski cikel"
@@ -1197,6 +1209,10 @@ msgstr "Serijska številka"
msgid "Service Details"
msgstr "Podrobnosti storitve"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Storitve"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Nastavite odstotne pragove za barve merilnikov."

View File

@@ -114,6 +114,10 @@ msgstr "Lägg till URL"
msgid "Adjust display options for charts."
msgstr "Justera visningsalternativ för diagram."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Justera bredden på huvudlayouten"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Exportera din nuvarande systemkonfiguration."
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Misslyckades"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Misslyckade attribut:"
@@ -767,6 +775,10 @@ msgstr "Språk"
msgid "Layout"
msgstr "Layout"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Layoutbredd"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Livscykel"
@@ -1197,6 +1209,10 @@ msgstr "Serienummer"
msgid "Service Details"
msgstr "Tjänstedetaljer"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Tjänster"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Ställ in procentuella tröskelvärden för mätarfärger."

View File

@@ -114,6 +114,10 @@ msgstr "URL Ekle"
msgid "Adjust display options for charts."
msgstr "Grafikler için görüntüleme seçeneklerini ayarlayın."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Ana düzenin genişliğini ayarla"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
msgid "Fahrenheit (°F)"
msgstr "Fahrenhayt (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Başarısız"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Başarısız Özellikler:"
@@ -767,6 +775,10 @@ msgstr "Dil"
msgid "Layout"
msgstr "Düzen"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Düzen genişliği"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Yaşam döngüsü"
@@ -1197,6 +1209,10 @@ msgstr "Seri Numarası"
msgid "Service Details"
msgstr "Hizmet Ayrıntıları"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Hizmetler"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Sayaç renkleri için yüzde eşiklerini ayarlayın."

View File

@@ -114,6 +114,10 @@ msgstr "Додати URL"
msgid "Adjust display options for charts."
msgstr "Налаштуйте параметри відображення для графіків."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Налаштувати ширину основного макету"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Експортуйте поточну конфігурацію сист
msgid "Fahrenheit (°F)"
msgstr "Фаренгейт (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Не вдалося"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Невдалі атрибути:"
@@ -767,6 +775,10 @@ msgstr "Мова"
msgid "Layout"
msgstr "Макет"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Ширина макету"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Життєвий цикл"
@@ -1197,6 +1209,10 @@ msgstr "Серійний номер"
msgid "Service Details"
msgstr "Деталі служби"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Служби"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Встановіть відсоткові пороги для кольорів лічильників."

View File

@@ -114,6 +114,10 @@ msgstr "Thêm URL"
msgid "Adjust display options for charts."
msgstr "Điều chỉnh tùy chọn hiển thị cho biểu đồ."
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "Điều chỉnh chiều rộng bố cục chính"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
msgid "Fahrenheit (°F)"
msgstr "Độ F (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "Thất bại"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "Thuộc tính thất bại:"
@@ -767,6 +775,10 @@ msgstr "Ngôn ngữ"
msgid "Layout"
msgstr "Bố cục"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "Chiều rộng bố cục"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "Vòng đời"
@@ -1197,6 +1209,10 @@ msgstr "Số seri"
msgid "Service Details"
msgstr "Chi tiết dịch vụ"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "Dịch vụ"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Đặt ngưỡng cho màu sắc đồng hồ."

View File

@@ -114,6 +114,10 @@ msgstr "添加 URL"
msgid "Adjust display options for charts."
msgstr "调整图表的显示选项。"
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "调整主布局宽度"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "导出您当前的系统配置。"
msgid "Fahrenheit (°F)"
msgstr "华氏度 (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "失败"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "失败属性:"
@@ -767,6 +775,10 @@ msgstr "语言"
msgid "Layout"
msgstr "布局"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "布局宽度"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "生命周期"
@@ -1197,6 +1209,10 @@ msgstr "序列号"
msgid "Service Details"
msgstr "服务详情"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "服务"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "设置仪表颜色的百分比阈值。"

View File

@@ -114,6 +114,10 @@ msgstr "添加 URL"
msgid "Adjust display options for charts."
msgstr "調整圖表的顯示選項。"
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "調整主版面寬度"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "匯出您現在的系統設定。"
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "失敗"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "失敗屬性:"
@@ -767,6 +775,10 @@ msgstr "語言"
msgid "Layout"
msgstr "版面配置"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "版面寬度"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "生命週期"
@@ -1197,6 +1209,10 @@ msgstr "序列號"
msgid "Service Details"
msgstr "服務詳情"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "服務"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "設定儀表顏色的百分比閾值。"

View File

@@ -114,6 +114,10 @@ msgstr "新增 URL"
msgid "Adjust display options for charts."
msgstr "調整圖表的顯示選項。"
#: src/components/routes/settings/general.tsx
msgid "Adjust the width of the main layout"
msgstr "調整主版面寬度"
#: src/components/command-palette.tsx
#: src/components/command-palette.tsx
msgid "Admin"
@@ -638,6 +642,10 @@ msgstr "匯出您現在的系統設定。"
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Failed"
msgstr "失敗"
#: src/components/routes/system/smart-table.tsx
msgid "Failed Attributes:"
msgstr "失敗屬性:"
@@ -767,6 +775,10 @@ msgstr "語言"
msgid "Layout"
msgstr "版面配置"
#: src/components/routes/settings/general.tsx
msgid "Layout width"
msgstr "版面寬度"
#: src/components/systemd-table/systemd-table.tsx
msgid "Lifecycle"
msgstr "生命週期"
@@ -1197,6 +1209,10 @@ msgstr "序號"
msgid "Service Details"
msgstr "服務詳細資訊"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Services"
msgstr "服務"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "設定儀表顏色的百分比閾值。"

View File

@@ -14,7 +14,7 @@ import { Toaster } from "@/components/ui/toaster.tsx"
import { alertManager } from "@/lib/alerts"
import { pb, updateUserSettings } from "@/lib/api.ts"
import { dynamicActivate, getLocale } from "@/lib/i18n"
import { $authenticated, $copyContent, $direction, $publicKey } from "@/lib/stores.ts"
import { $authenticated, $copyContent, $direction, $publicKey, $userSettings } from "@/lib/stores.ts"
import * as systemsManager from "@/lib/systemsManager.ts"
const LoginPage = lazy(() => import("@/components/login/login.tsx"))
@@ -71,6 +71,7 @@ const Layout = () => {
const authenticated = useStore($authenticated)
const copyContent = useStore($copyContent)
const direction = useStore($direction)
const userSettings = useStore($userSettings)
useEffect(() => {
document.documentElement.dir = direction
@@ -96,7 +97,7 @@ const Layout = () => {
<LoginPage />
</Suspense>
) : (
<>
<div style={{"--container": `${userSettings.layoutWidth ?? 1480}px`} as React.CSSProperties}>
<div className="container">
<Navbar />
</div>
@@ -108,7 +109,7 @@ const Layout = () => {
</Suspense>
)}
</div>
</>
</div>
)}
</DirectionProvider>
)

View File

@@ -79,6 +79,8 @@ export interface SystemInfo {
ct?: ConnectionType
/** extra filesystem percentages */
efs?: Record<string, number>
/** services [totalServices, numFailedServices] */
sv?: [number, number]
}
export interface SystemStats {
@@ -279,6 +281,7 @@ export interface UserSettings {
colorWarn?: number
colorCrit?: number
hourFormat?: HourFormat
layoutWidth?: number
}
type ChartDataContainer = {

View File

@@ -1,3 +1,17 @@
## 0.16.1
- Add services column to All Systems table. (#1153)
- Add `SERVICE_PATTERNS` environment variable to filter systemd services. (#1153)
- Fix detection and handling of immutable filesystems like Fedora Silverblue. (#1405)
- Persist alert history page size preference. (#1404)
- Add setting for layout width.
- Update Go dependencies.
## 0.16.0
- Add basic systemd service monitoring. (#1153)