diff --git a/README.md b/README.md index ca16c49..85047d3 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,6 @@ services: glance: container_name: glance image: glanceapp/glance - restart: unless-stopped volumes: - ./config:/app/config ports: diff --git a/docs/custom-api.md b/docs/custom-api.md index d42d1fc..99e3a5e 100644 --- a/docs/custom-api.md +++ b/docs/custom-api.md @@ -389,7 +389,6 @@ The following helper functions provided by Glance are available: - `trimSuffix(suffix string, str string) string`: Trims the suffix from a string. - `trimSpace(str string) string`: Trims whitespace from a string on both ends. - `replaceAll(old string, new string, str string) string`: Replaces all occurrences of a string in a string. -- `replaceMatches(pattern string, replacement string, str string) string`: Replaces all occurrences of a regular expression in a string. - `findMatch(pattern string, str string) string`: Finds the first match of a regular expression in a string. - `findSubmatch(pattern string, str string) string`: Finds the first submatch of a regular expression in a string. - `sortByString(key string, order string, arr []JSON): []JSON`: Sorts an array of JSON objects by a string key in either ascending or descending order. @@ -397,7 +396,6 @@ The following helper functions provided by Glance are available: - `sortByFloat(key string, order string, arr []JSON): []JSON`: Sorts an array of JSON objects by a float key in either ascending or descending order. - `sortByTime(key string, layout string, order string, arr []JSON): []JSON`: Sorts an array of JSON objects by a time key in either ascending or descending order. The format must be provided in Go's [date format](https://pkg.go.dev/time#pkg-constants). - `concat(strings ...string) string`: Concatenates multiple strings together. -- `unique(key string, arr []JSON) []JSON`: Returns a unique array of JSON objects based on the given key. The following helper functions provided by Go's `text/template` are available: diff --git a/internal/glance/cli.go b/internal/glance/cli.go index f5a16fb..9cbb607 100644 --- a/internal/glance/cli.go +++ b/internal/glance/cli.go @@ -6,7 +6,6 @@ import ( "os" "strings" - "github.com/shirou/gopsutil/v4/disk" "github.com/shirou/gopsutil/v4/sensors" ) @@ -19,13 +18,11 @@ const ( cliIntentConfigPrint cliIntentDiagnose cliIntentSensorsPrint - cliIntentMountpointInfo ) type cliOptions struct { intent cliIntent configPath string - args []string } func parseCliOptions() (*cliOptions, error) { @@ -49,7 +46,6 @@ func parseCliOptions() (*cliOptions, error) { fmt.Println(" config:validate Validate the config file") fmt.Println(" config:print Print the parsed config file with embedded includes") fmt.Println(" sensors:print List all sensors") - fmt.Println(" mountpoint:info Print information about a given mountpoint path") fmt.Println(" diagnose Run diagnostic checks") } configPath := flags.String("config", "glance.yml", "Set config path") @@ -76,12 +72,6 @@ func parseCliOptions() (*cliOptions, error) { } else { return nil, unknownCommandErr } - } else if len(args) == 2 { - if args[0] == "mountpoint:info" { - intent = cliIntentMountpointInfo - } else { - return nil, unknownCommandErr - } } else { return nil, unknownCommandErr } @@ -89,7 +79,6 @@ func parseCliOptions() (*cliOptions, error) { return &cliOptions{ intent: intent, configPath: *configPath, - args: args, }, nil } @@ -117,23 +106,3 @@ func cliSensorsPrint() int { return 0 } - -func cliMountpointInfo(requestedPath string) int { - usage, err := disk.Usage(requestedPath) - if err != nil { - fmt.Printf("Failed to retrieve info for path %s: %v\n", requestedPath, err) - if warns, ok := err.(*disk.Warnings); ok { - for _, w := range warns.List { - fmt.Printf(" - %v\n", w) - } - } - - return 1 - } - - fmt.Println("Path:", usage.Path) - fmt.Println("FS type:", ternary(usage.Fstype == "", "unknown", usage.Fstype)) - fmt.Printf("Used percent: %.1f%%\n", usage.UsedPercent) - - return 0 -} diff --git a/internal/glance/main.go b/internal/glance/main.go index 67a980c..3dd43dc 100644 --- a/internal/glance/main.go +++ b/internal/glance/main.go @@ -51,8 +51,6 @@ func Main() int { fmt.Println(string(contents)) case cliIntentSensorsPrint: return cliSensorsPrint() - case cliIntentMountpointInfo: - return cliMountpointInfo(options.args[1]) case cliIntentDiagnose: runDiagnostic() } diff --git a/internal/glance/static/js/main.js b/internal/glance/static/js/main.js index 41d2ae3..dcd8946 100644 --- a/internal/glance/static/js/main.js +++ b/internal/glance/static/js/main.js @@ -649,7 +649,7 @@ function setupTruncatedElementTitles() { for (let i = 0; i < elements.length; i++) { const element = elements[i]; - if (element.getAttribute("title") === null) element.title = element.textContent; + if (element.title === "") element.title = element.textContent; } } diff --git a/internal/glance/static/main.css b/internal/glance/static/main.css index 2975a73..a715565 100644 --- a/internal/glance/static/main.css +++ b/internal/glance/static/main.css @@ -2038,7 +2038,6 @@ details[open] .summary::after { .color-primary { color: var(--color-primary); } .cursor-help { cursor: help; } -.rounded { border-radius: var(--border-radius); } .break-all { word-break: break-all; } .text-left { text-align: left; } .text-right { text-align: right; } diff --git a/internal/glance/widget-custom-api.go b/internal/glance/widget-custom-api.go index 93d51c0..e092fc3 100644 --- a/internal/glance/widget-custom-api.go +++ b/internal/glance/widget-custom-api.go @@ -468,15 +468,16 @@ var customAPITemplateFuncs = func() template.FuncMap { return strings.TrimSuffix(s, suffix) }, "trimSpace": strings.TrimSpace, - "replaceAll": func(old, new, s string) string { - return strings.ReplaceAll(s, old, new) - }, - "replaceMatches": func(pattern, replacement, s string) string { + "replaceAll": func(oldOrPattern, new, s string) string { if s == "" { return "" } - return getCachedRegexp(pattern).ReplaceAllString(s, replacement) + regex := getCachedRegexp(oldOrPattern) + if regex == nil { + return strings.ReplaceAll(s, oldOrPattern, new) + } + return regex.ReplaceAllString(s, new) }, "findMatch": func(pattern, s string) string { if s == "" { @@ -543,18 +544,6 @@ var customAPITemplateFuncs = func() template.FuncMap { "concat": func(items ...string) string { return strings.Join(items, "") }, - "unique": func(key string, results []decoratedGJSONResult) []decoratedGJSONResult { - seen := make(map[string]struct{}) - out := make([]decoratedGJSONResult, 0, len(results)) - for _, result := range results { - val := result.String(key) - if _, ok := seen[val]; !ok { - seen[val] = struct{}{} - out = append(out, result) - } - } - return out - }, } for key, value := range globalTemplateFunctions { diff --git a/internal/glance/widget-utils.go b/internal/glance/widget-utils.go index 9489cbf..4aaf5d5 100644 --- a/internal/glance/widget-utils.go +++ b/internal/glance/widget-utils.go @@ -182,8 +182,8 @@ func workerPoolDo[I any, O any](job *workerPoolJob[I, O]) ([]O, []error, error) } if len(job.data) == 1 { - results[0], errs[0] = job.task(job.data[0]) - return results, errs, nil + output, err := job.task(job.data[0]) + return append(results, output), append(errs, err), nil } tasksQueue := make(chan *workerPoolTask[I, O]) diff --git a/pkg/sysinfo/sysinfo.go b/pkg/sysinfo/sysinfo.go index 1ed8c75..673b9d2 100644 --- a/pkg/sysinfo/sysinfo.go +++ b/pkg/sysinfo/sysinfo.go @@ -227,50 +227,35 @@ func Collect(req *SystemInfoRequest) (*SystemInfo, []error) { } } - addedMountpoints := map[string]struct{}{} - addMountpointInfo := func(requestedPath string, mpReq MointpointRequest) { - if _, exists := addedMountpoints[requestedPath]; exists { - return - } - - isHidden := req.HideMountpointsByDefault - if mpReq.Hide != nil { - isHidden = *mpReq.Hide - } - if isHidden { - return - } - - usage, err := disk.Usage(requestedPath) - if err == nil { - mpInfo := MountpointInfo{ - Path: requestedPath, - Name: mpReq.Name, - TotalMB: usage.Total / 1024 / 1024, - UsedMB: usage.Used / 1024 / 1024, - UsedPercent: uint8(math.Min(usage.UsedPercent, 100)), + filesystems, err := disk.Partitions(false) + if err == nil { + for _, fs := range filesystems { + mpReq, ok := req.Mountpoints[fs.Mountpoint] + isHidden := req.HideMountpointsByDefault + if ok && mpReq.Hide != nil { + isHidden = *mpReq.Hide + } + if isHidden { + continue } - info.Mountpoints = append(info.Mountpoints, mpInfo) - addedMountpoints[requestedPath] = struct{}{} - } else { - addErr(fmt.Errorf("getting filesystem usage for %s: %v", requestedPath, err)) - } - } + usage, err := disk.Usage(fs.Mountpoint) + if err == nil { + mpInfo := MountpointInfo{ + Path: fs.Mountpoint, + Name: mpReq.Name, + TotalMB: usage.Total / 1024 / 1024, + UsedMB: usage.Used / 1024 / 1024, + UsedPercent: uint8(math.Min(usage.UsedPercent, 100)), + } - if !req.HideMountpointsByDefault { - filesystems, err := disk.Partitions(false) - if err == nil { - for _, fs := range filesystems { - addMountpointInfo(fs.Mountpoint, req.Mountpoints[fs.Mountpoint]) + info.Mountpoints = append(info.Mountpoints, mpInfo) + } else { + addErr(fmt.Errorf("getting filesystem usage for %s: %v", fs.Mountpoint, err)) } - } else { - addErr(fmt.Errorf("getting filesystems: %v", err)) } - } - - for mountpoint, mpReq := range req.Mountpoints { - addMountpointInfo(mountpoint, mpReq) + } else { + addErr(fmt.Errorf("getting filesystems: %v", err)) } sort.Slice(info.Mountpoints, func(a, b int) bool {