{config, ...}: { services.glance = { enable = true; openFirewall = true; settings = { server = { host = "0.0.0.0"; }; pages = [ { name = "Home"; columns = [ { size = "small"; widgets = [ { type = "calendar"; first-day-of-week = "monday"; } { type = "twitch-channels"; channels = [ "theprimeagen" ]; } ]; } { size = "full"; widgets = [ { type = "group"; widgets = [ {type = "hacker-news";} {type = "lobsters";} ]; } { type = "server-stats"; servers = [ { type = "local"; name = "Tyr"; } ]; } { 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" }}
{{ . }}
{{ 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" }}{{ . }}
{{ end }} {{ $bearer := printf "Bearer %s" $apiKey }} {{ $librariesRequestURL := concat $baseURL "/api/libraries" }} {{ $librariesResponse := newRequest $librariesRequestURL | withHeader "Content-Type" "application/json" | withHeader "Authorization" $bearer | getResponse }} {{ if $librariesResponse.JSON.Exists "libraries" }} {{ $all_libraries := $librariesResponse.JSON.Array "libraries" }} {{ $books_count := 0 }} {{ $books_duration := 0 }} {{ $podcasts_count := 0 }} {{ $podcasts_duration := 0 }} {{ range $library := $all_libraries }} {{ $lib_id := $library.String "id" }} {{ $lib_request_url := concat $baseURL "/api/libraries/" $lib_id "/stats"}} {{ $lib_stats := newRequest $lib_request_url | withHeader "Content-Type" "application/json" | withHeader "Authorization" $bearer | getResponse }} {{ $lib_type := $library.String "mediaType" }} {{ $lib_item_count := $lib_stats.JSON.Int "totalItems" }} {{ $lib_total_duration := $lib_stats.JSON.Int "totalDuration" }} {{ if eq $lib_type "book" }} {{ $books_count = add $books_count $lib_item_count }} {{ $books_duration = add $books_duration $lib_total_duration }} {{ else if eq $lib_type "podcast" }} {{ $podcasts_count = add $podcasts_count $lib_item_count }} {{ $podcasts_duration = add $podcasts_duration $lib_total_duration }} {{ end }} {{ end }} {{ $books_duration = duration (concat (printf "%d" $books_duration) "s") }} {{ $podcasts_duration = duration (concat (printf "%d" $podcasts_duration) "s") }}Error: The URL or API Key was not configured in the widget options.
{{- else -}} {{- $requestUrl := printf "%s/emby/Items/Counts?api_key=%s" $url $key -}} {{- $jellyfinData := newRequest $requestUrl | getResponse -}} {{- if eq $jellyfinData.Response.StatusCode 200 -}}Failed: {{ $jellyfinData.Response.Status }}
{{- end -}} {{- end -}} ''; } ]; } { size = "full"; widgets = [ ]; } ]; } ]; }; }; systemd.services.glance.serviceConfig = { EnvironmentFile = ["${config.age.secrets.glance.path}"]; }; }