diff --git a/modules/servers/tyr/glance.nix b/modules/servers/tyr/glance.nix index 77b65d4..5da1f26 100644 --- a/modules/servers/tyr/glance.nix +++ b/modules/servers/tyr/glance.nix @@ -1,4 +1,4 @@ -{ +{config, ...}: { services.glance = { enable = true; openFirewall = true; @@ -45,10 +45,235 @@ ]; } { - type = "videos"; - channels = [ - "UCR-DXc1voovS8nhAvccRZhg" - ]; + type = "custom-api"; + title = "Beszel stats"; + cache = "5m"; + options = { + base-url = "\${BESZEL_URL}"; + api-key = "\${BESZEL_TOKEN}"; + }; + template = '' + {{/* Required config options */}} + {{ $baseURL := .Options.StringOr "base-url" "" }} + {{ $apiKey := .Options.StringOr "api-key" "" }} + + {{/* Error message template */}} + {{ define "errorMsg" }} +
+
ERROR
+ + + +
+

{{ . }}

+ {{ end }} + + {{ define "formatGigabytes" }} + {{ $value := . }} + {{ $label := "GB" }} + {{- if lt $value 1.0 }} + {{ $value = mul $value 1000.0 }} + {{ $label = "MB" }} + {{- else if lt $value 1000.0 }} + {{ else }} + {{ $value = div $value 1000.0 }} + {{ $label = "TB" }} + {{ end }} + {{ printf "%.1f" $value }} {{ $label }} + {{ end }} + + {{/* Check required fields */}} + {{ if or (eq $baseURL "") (eq $apiKey "") }} + {{ template "errorMsg" "Some required options are not set." }} + {{ else }} + + {{ $token := concat "Bearer " $apiKey }} + + {{ $systemsResponse := newRequest (print $baseURL "/api/collections/systems/records") + | withHeader "Authorization" $token + | getResponse }} + {{ $systems := $systemsResponse.JSON.Array "items" }} + + + {{ range $n, $system := $systems }} + {{ $status := $system.String "status" }} + + {{ $systemStatsRequest := newRequest (print $baseURL "/api/collections/system_stats/records") + | withHeader "Authorization" $token + | withParameter "sort" "-created" + | withParameter "page" "1" + | withParameter "perPage" "1" + | withParameter "filter" (print "type='1m'&&system='" ($system.String "id") "'") + | getResponse }} + {{ $systemStats := index ($systemStatsRequest.JSON.Array "items") 0 }} + + {{ $hostname := $system.String "name" }} + {{ $uptimeSec := $system.Float "info.u" }} + + {{ $systemTemp := $system.Float "info.dt"}} + + {{ $cpuLoad := $system.Float "info.cpu" }} + {{ $cpuLoad1m := $system.Float "info.l1" }} + {{ $cpuLoad15m := $system.Float "info.l15" }} + + {{ $memoryUsedPercent := $system.Float "info.mp" }} + {{ $memoryTotalGb := $systemStats.Float "stats.m" }} + {{ $memoryUsedGb := $systemStats.Float "stats.mu" }} + + {{ $swapTotalGb := $systemStats.Float "stats.s" }} + {{ $swapUsedGb := $systemStats.Float "stats.su" }} + {{ $swapUsedPercent := mul (div $swapUsedGb $swapTotalGb) 100.0 }} + + {{ $rootUsedPercent := $system.Float "info.dp" }} + {{ $rootTotalGb := $systemStats.Float "stats.d" }} + {{ $rootUsedGb := $systemStats.Float "stats.du" }} + +
+
+
+
{{ $hostname }}
+
+ {{ if eq $status "up" }} + {{ printf "%.1f" (mul $uptimeSec 0.000011574) }}d uptime + {{ else }} + unreachable + {{ end }} +
+
+
+ {{- if eq $status "up" }} +
+
+
Kernel
+
+
{{ $system.String "info.k" }}
+
+
+
CPU
+
+
{{ $system.String "info.m" }}
+
+
+ {{- end }} + + + +
+
+ +
+
+
+
CPU
+ {{- if ge $systemTemp 80.0 }} + + + + {{- end }} +
{{ $cpuLoad }} %
+
+
+
+
+
1M AVG
+
+
{{ printf "%.1f" $cpuLoad1m }} %
+
+
+
15M AVG
+
+
{{ printf "%.1f" $cpuLoad15m }} %
+
+
+
TEMP C
+
+
{{ printf "%.1f" $systemTemp }} °
+
+
+ +
+
+
+
+
+
+ +
+
+
RAM
+
{{ $memoryUsedPercent }} %
+
+
+
+
+
RAM
+
+
+ {{ template "formatGigabytes" $memoryUsedGb }} / {{ template "formatGigabytes" $memoryTotalGb }} +
+
+ {{- if gt $swapTotalGb 0.0 }} +
+
SWAP
+
+
+ {{ template "formatGigabytes" $swapUsedGb }} / {{ template "formatGigabytes" $swapTotalGb }} +
+
+ {{- end }} +
+
+
+ {{- if gt $swapTotalGb 0.0 }} +
+ {{- end }} +
+
+
+ +
+
+
DISK
+
{{ $rootUsedPercent }} %
+
+
+
+
    +
  • +
    /
    +
    +
    + {{ template "formatGigabytes" $rootUsedGb }} / {{ template "formatGigabytes" $rootTotalGb }} +
    +
  • + {{ range $key, $efs := ($systemStats.Get "stats.efs").Map }} +
  • +
    {{ $key }}
    +
    +
    + {{ template "formatGigabytes" (($efs.Get "du").Float) }} / {{ template "formatGigabytes" (($efs.Get "d").Float) }} +
    +
  • + {{ end }} +
+
+
+
+ {{ range $key, $efs := ($systemStats.Get "stats.efs").Map }} + {{ $efsTotalGb := (($efs.Get "d").Float) }} + {{ $efsUsedGb := (($efs.Get "du").Float) }} + {{ $efsPercent := mul (div $efsUsedGb $efsTotalGb) 100 }} +
+ {{ end }} +
+
+
+ +
+
+ {{ end }} + {{ end }} + ''; } ]; } @@ -77,4 +302,8 @@ ]; }; }; + + systemd.services.glance.serviceConfig = { + EnvironmentFile = ["${config.age.secrets.glance.path}"]; + }; } diff --git a/modules/servers/tyr/secrets.nix b/modules/servers/tyr/secrets.nix index 2c23a49..14d10a8 100644 --- a/modules/servers/tyr/secrets.nix +++ b/modules/servers/tyr/secrets.nix @@ -19,6 +19,9 @@ restic-server-env = { file = ../../../secrets/restic-server-env.age; }; + glance = { + file = ../../../secrets/glance.age; + }; }; }; } diff --git a/secrets/glance.age b/secrets/glance.age new file mode 100644 index 0000000..43efa98 Binary files /dev/null and b/secrets/glance.age differ diff --git a/secrets/secrets.nix b/secrets/secrets.nix index a6f6211..5198713 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -42,4 +42,5 @@ in { "wg-ymir-home.age".publicKeys = systems ++ users; "wg-tyr.age".publicKeys = systems ++ users; "duckdns.age".publicKeys = systems ++ users; + "glance.age".publicKeys = systems ++ users; }