dotfiles/servers/eisen/glance-pages.nix
2026-04-12 20:13:45 +02:00

197 lines
7.2 KiB
Nix

[
{
name = "Home";
columns = [
{
size = "small";
widgets = [
{
type = "calendar";
"first-day-of-week" = "monday";
}
{
type = "server-stats";
servers = [
{
type = "local";
}
];
}
{
type = "custom-api";
title = "Uptime Kuma";
title-url = "http://status.eisen";
url = "http://status.eisen/api/status-page/base";
subrequests = {
heartbeats = {
url = "http://status.eisen/api/status-page/heartbeat/base";
};
};
cache = "10m";
template = ''
{{ $hb := .Subrequest "heartbeats" }}
{{ if not (.JSON.Exists "publicGroupList") }}
<p class="color-negative">Error reading response</p>
{{ else if eq (len (.JSON.Array "publicGroupList")) 0 }}
<p>No monitors found</p>
{{ else }}
<ul class="dynamic-columns list-gap-8">
{{ range .JSON.Array "publicGroupList" }}
{{ range .Array "monitorList" }}
{{ $id := .String "id" }}
{{ $hbArray := $hb.JSON.Array (print "heartbeatList." $id) }}
<div class="flex items-center gap-12">
<a class="size-title-dynamic color-highlight text-truncate block grow" href="http://status.eisen/dashboard/{{ $id }}"
target="_blank" rel="noreferrer">
{{ .String "name" }} </a>
{{ if gt (len $hbArray) 0 }}
{{ $latest := index $hbArray (sub (len $hbArray) 1) }}
{{ if eq ($latest.Int "status") 1 }}
<div>{{ $latest.Int "ping" }}ms</div>
<div class="monitor-site-status-icon-compact" title="OK">
<svg fill="var(--color-positive)" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill-rule="evenodd"
d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm3.857-9.809a.75.75 0 0 0-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 1 0-1.06 1.061l2.5 2.5a.75.75 0 0 0 1.137-.089l4-5.5Z"
clip-rule="evenodd"></path>
</svg>
</div>
{{ else }}
<div><span class="color-negative">DOWN</span></div>
<div class="monitor-site-status-icon-compact" title="{{ if $latest.Exists "msg" }}{{ $latest.String "msg" }}{{ else
}}Error{{ end }}">
<svg fill="var(--color-negative)" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill-rule="evenodd"
d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"
clip-rule="evenodd"></path>
</svg>
</div>
{{ end }}
{{ else }}
<div><span class="color-negative">No data</span></div>
<div class="monitor-site-status-icon-compact" title="No data available">
<svg fill="var(--color-negative)" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path d="M10 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16zm0-2a6 6 0 1 0 0-12 6 6 0 0 0 0 12zm-.75-8a.75.75 0 0 1 1.5 0v3a.75.75 0 0 1-1.5 0V8zm.75 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
</svg>
</div>
{{ end }}
</div>
{{ end }}
{{ end }}
</ul>
{{ end }}
'';
}
];
}
{
size = "full";
widgets = [
{
type = "group";
widgets = [
{ type = "hacker-news"; }
{ type = "lobsters"; }
];
}
{
type = "monitor";
cache = "1m";
title = "Services";
sites = [
{
title = "Jellyfin";
url = "http://jellyfin.eisen.danbulant.cloud";
icon = "si:jellyfin";
}
{
title = "qBittorrent";
url = "http://qb.eisen.danbulant.cloud";
icon = "si:qbittorrent";
}
{
title = "Radarr";
url = "http://radarr.eisen.danbulant.cloud";
icon = "si:radarr";
}
{
title = "Sonarr";
url = "http://sonarr.eisen.danbulant.cloud";
icon = "si:sonarr";
}
{
title = "Vaultwarden";
url = "https://vaultwarden.danbulant.cloud";
icon = "si:vaultwarden";
}
{
title = "Nextcloud";
url = "https://direct.danbulant.cloud";
icon = "si:nextcloud";
}
{
title = "Grafana";
url = "http://grafana.eisen.danbulant.cloud";
icon = "si:grafana";
}
{
title = "Karakeep";
url = "http://keep.eisen.danbulant.cloud";
icon = "si:karakeep";
}
];
}
# {
# type = "docker-containers";
# }
];
}
{
size = "small";
widgets = [
{
type = "weather";
location = "Aarhus, Denmark";
units = "metric";
"hour-format" = "24h";
}
{
type = "releases";
cache = "1d";
repositories = [
"glanceapp/glance"
"go-gitea/gitea"
"immich-app/immich"
"syncthing/syncthing"
"9001/copyparty"
"caddyserver/caddy"
];
}
{
type = "custom-api";
title = "Steam specials";
cache = "12h";
url = "https://store.steampowered.com/api/featuredcategories?cc=us";
template = ''
<ul class="list list-gap-10 collapsible-container" data-collapse-after="5">
{{ range .JSON.Array "specials.items" }}
<li>
<a class="size-h4 color-highlight block text-truncate" href="https://store.steampowered.com/app/{{ .Int "id" }}/">{{ .String "name" }}</a>
<ul class="list-horizontal-text">
<li>{{ div (.Int "final_price" | toFloat) 100 | printf "$%.2f" }}</li>
{{ $discount := .Int "discount_percent" }}
<li{{ if ge $discount 40 }} class="color-positive"{{ end }}>{{ $discount }}% off</li>
</ul>
</li>
{{ end }}
</ul>
'';
}
];
}
];
}
]