diff --git a/docs/configuration.md b/docs/configuration.md index 1bd4a26..844d34d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -97,9 +97,9 @@ Including config files from within your main config file is supported. This is d ```yaml pages: - !include home.yml - !include videos.yml - !include homelab.yml + !include: home.yml + !include: videos.yml + !include: homelab.yml ``` The file you are including should not have any additional indentation, its values should be at the top level and the appropriate amount of indentation will be added automatically depending on where the file is included. Example: @@ -112,14 +112,14 @@ pages: columns: - size: full widgets: - !include rss.yml + !include: rss.yml - name: News columns: - size: full widgets: - type: group widgets: - !include rss.yml + !include: rss.yml - type: reddit subreddit: news ``` @@ -1672,7 +1672,7 @@ For services with multiple containers you can specify a `glance.id` on the "main
```yaml -servies: +services: immich-server: image: ghcr.io/immich-app/immich-server labels: @@ -1852,11 +1852,29 @@ Whether to hide the swap usage. | Name | Type | Required | Default | | ---- | ---- | -------- | ------- | | cpu-temp-sensor | string | no | | +| hide-mointpoints-by-default | boolean | no | false | | mountpoints | map\[string\]object | no | | ###### `cpu-temp-sensor` The name of the sensor to use for the CPU temperature. When not provided the widget will attempt to find the correct one, if it fails to do so the temperature will not be displayed. To view the available sensors you can use `sensors` command. +###### `hide-mountpoints-by-default` +If set to `true` you'll have to manually make each mountpoint visible by adding a `hide: false` property to it like so: + +```yaml +- type: server-stats + servers: + - type: local + hide-mountpoints-by-default: true + mountpoints: + "/": + hide: false + "/mnt/data": + hide: false +``` + +This is useful if you're running Glance inside of a container which usually mounts a lot of irrelevant filesystems. + ###### `mountpoints` A map of mountpoints to display disk usage for. The key is the path to the mountpoint and the value is an object with optional properties. Example: diff --git a/internal/glance/config-fields.go b/internal/glance/config-fields.go index 8aaac85..f3c836e 100644 --- a/internal/glance/config-fields.go +++ b/internal/glance/config-fields.go @@ -152,9 +152,9 @@ func newCustomIconField(value string) customIconField { } if prefix == "di" { - field.URL = "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/" + ext + "/" + basename + "." + ext + field.URL = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/" + ext + "/" + basename + "." + ext } else { - field.URL = "https://cdn.jsdelivr.net/gh/selfhst/icons@main/" + ext + "/" + basename + "." + ext + field.URL = "https://cdn.jsdelivr.net/gh/selfhst/icons/" + ext + "/" + basename + "." + ext } default: field.URL = value diff --git a/internal/glance/static/js/popover.js b/internal/glance/static/js/popover.js index 91c69e3..331ee26 100644 --- a/internal/glance/static/js/popover.js +++ b/internal/glance/static/js/popover.js @@ -98,7 +98,6 @@ function showPopover() { } contentElement.style.maxWidth = contentMaxWidth; - containerElement.style.display = "block"; activeTarget.classList.add("popover-active"); document.addEventListener("keydown", handleHidePopoverOnEscape); window.addEventListener("resize", queueRepositionContainer); @@ -106,6 +105,8 @@ function showPopover() { } function repositionContainer() { + containerElement.style.display = "block"; + const targetBounds = activeTarget.dataset.popoverAnchor !== undefined ? activeTarget.querySelector(activeTarget.dataset.popoverAnchor).getBoundingClientRect() : activeTarget.getBoundingClientRect(); diff --git a/internal/glance/widget-videos.go b/internal/glance/widget-videos.go index c67fbbe..fdc654c 100644 --- a/internal/glance/widget-videos.go +++ b/internal/glance/widget-videos.go @@ -52,10 +52,11 @@ func (widget *videosWidget) initialize() error { // playlists are separate things rather than specifying a list of channels and some of // them awkwardly have a "playlist:" prefix if len(widget.Playlists) > 0 { + initialLen := len(widget.Channels) widget.Channels = append(widget.Channels, make([]string, len(widget.Playlists))...) for i := range widget.Playlists { - widget.Channels[len(widget.Channels)-1+i] = "playlist:" + widget.Playlists[i] + widget.Channels[initialLen+i] = "playlist:" + widget.Playlists[i] } } diff --git a/pkg/sysinfo/sysinfo.go b/pkg/sysinfo/sysinfo.go index f4adef8..09df02f 100644 --- a/pkg/sysinfo/sysinfo.go +++ b/pkg/sysinfo/sysinfo.go @@ -3,6 +3,7 @@ package sysinfo import ( "fmt" "math" + "os" "runtime" "sort" "strconv" @@ -73,24 +74,52 @@ type MountpointInfo struct { } type SystemInfoRequest struct { - CPUTempSensor string `yaml:"cpu-temp-sensor"` - Mountpoints map[string]MointpointRequest `yaml:"mountpoints"` + CPUTempSensor string `yaml:"cpu-temp-sensor"` + HideMountpointsByDefault bool `yaml:"hide-mountpoints-by-default"` + Mountpoints map[string]MointpointRequest `yaml:"mountpoints"` } type MointpointRequest struct { Name string `yaml:"name"` - Hide bool `yaml:"hide"` + Hide *bool `yaml:"hide"` } // Currently caches hostname indefinitely which isn't ideal // Potential issue with caching boot time as it may not initially get reported correctly: // https://github.com/shirou/gopsutil/issues/842#issuecomment-1908972344 -var cachedHostInfo = struct { +type cacheableHostInfo struct { available bool hostname string platform string bootTime timestampJSON -}{} +} + +var cachedHostInfo cacheableHostInfo + +func getHostInfo() (cacheableHostInfo, error) { + var err error + info := cacheableHostInfo{} + + info.hostname, err = os.Hostname() + if err != nil { + return info, err + } + + info.platform, _, _, err = host.PlatformInformation() + if err != nil { + return info, err + } + + bootTime, err := host.BootTime() + if err != nil { + return info, err + } + + info.bootTime = timestampJSON{time.Unix(int64(bootTime), 0)} + info.available = true + + return info, nil +} func Collect(req *SystemInfoRequest) (*SystemInfo, []error) { if req == nil { @@ -117,13 +146,9 @@ func Collect(req *SystemInfoRequest) (*SystemInfo, []error) { if cachedHostInfo.available { applyCachedHostInfo() } else { - hostInfo, err := host.Info() + hostInfo, err := getHostInfo() if err == nil { - cachedHostInfo.available = true - cachedHostInfo.bootTime = timestampJSON{time.Unix(int64(hostInfo.BootTime), 0)} - cachedHostInfo.hostname = hostInfo.Hostname - cachedHostInfo.platform = hostInfo.Platform - + cachedHostInfo = hostInfo applyCachedHostInfo() } else { addErr(fmt.Errorf("getting host info: %v", err)) @@ -205,7 +230,11 @@ func Collect(req *SystemInfoRequest) (*SystemInfo, []error) { if err == nil { for _, fs := range filesystems { mpReq, ok := req.Mountpoints[fs.Mountpoint] - if ok && mpReq.Hide { + isHidden := req.HideMountpointsByDefault + if ok && mpReq.Hide != nil { + isHidden = *mpReq.Hide + } + if isHidden { continue }