diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 0cc2f40..62a6464 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -22,6 +22,7 @@ end local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") +local systemStatsCheckInterval = cfg("system_stats_check_interval") local completedCommands = 0 local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" @@ -30,7 +31,7 @@ local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{print $5}'" -local nixStoreSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` +local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '{print $2, $3}'" setState("lastCheckTime", 0) @@ -39,11 +40,23 @@ setState("localHash", "n/a") setState("remoteHash", "n/a") setState("isRunning", false) setState("isUpdateAvailable", false) +setState("lastSystemStatsCheckTime", 0) +setState("hasHomeManager", noctalia.commandExists("home-manager")) +setState("nixosGenerations", "•••") +setState("nixosCurrentGen", "•••") +setState("hmGenerations", "•••") +setState("hmCurrentGen", "•••") +setState("storeSize", "•••") +setState("closureSize", "•••") function update() if (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then checkUpdate() end + + if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then + checkSystemStats() + end end function checkUpdate() @@ -116,3 +129,33 @@ watchState("command", function(command) completedCommands = 0 end end) + +function checkSystemStats() + setState("lastSystemStatsCheckTime", os.time()) + + noctalia.runAsync(nixosGenerationsCmd, function(result) + setState("nixosGenerations", result.stdout) + end) + + noctalia.runAsync(nixosCurrentGenCmd, function(result) + setState("nixosCurrentGen", result.stdout) + end) + + if getState("hasHomeManager") then + noctalia.runAsync(hmGenerationsCmd, function(result) + setState("hmGenerations", result.stdout) + end) + + noctalia.runAsync(hmCurrentGenCmd, function(result) + setState("hmCurrentGen", result.stdout) + end) + end + + noctalia.runStream(storeSizeCmd, function(line) + setState("storeSize", line) + end) + + noctalia.runStream(closureSizeCmd, function(line) + setState("closureSize", line) + end) +end diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau index 2704d31..521382e 100644 --- a/nix-monitor/panel.luau +++ b/nix-monitor/panel.luau @@ -48,6 +48,27 @@ local function labelBox(subtext, text, glyph) }) end +function statLabel(text, glyph: string?) + local items = {} + if glyph ~= nil then + table.insert(items, ui.glyph({ + name = glyph, + size = 20 + })) + end + + table.insert(items, ui.label({ + text = text, + fontSize = 12, + fontWeight = "semibold" + })) + + return ui.row({ + gap = 8, + align = "center" + }, items) +end + local function render() local firstBtn = btnCheck @@ -80,10 +101,24 @@ local function render() end local lastCheckTimeStr = getState("lastCheckTimeStr") + local generationItems = { + statLabel(`SYS: {getState("nixosGenerations")}`, "device-desktop"), + statLabel(`{tr("panel.current")}: {getState("nixosCurrentGen")}`, "device-desktop-check") + } + + if getState("hasHomeManager") then + table.insert(generationItems, + statLabel(`HM: {getState("hmGenerations")}`, "home") + ) + + table.insert(generationItems, + statLabel(`{tr("panel.current")}: {getState("hmCurrentGen")}`, "home-check") + ) + end panel.render( ui.column({ - gap = 8 + gap = 8, }, { ui.row({ justify = "space_between", @@ -117,6 +152,33 @@ local function render() orientation = "horizontal", spacing = 4 }), + ui.row({ + fill = "surface/0.7", + align = "center", + justify = "space_between", + flexGrow = 1, + paddingV = 4, + paddingH = 8, + radius = 8, + }, generationItems), + ui.row({ + fill = "surface/0.7", + align = "center", + justify = "center", + flexGrow = 1, + paddingV = 4, + paddingH = 8, + radius = 8, + }, { + statLabel(`{tr("panel.store_size")}: {getState("storeSize")}`, "database"), + ui.spacer({width = 16}), + statLabel(`{tr("panel.closure_size")}: {getState("closureSize")}`, "server"), + }), + ui.separator({ + thickness = 2, + orientation = "horizontal", + spacing = 4 + }), ui.label({ text = `{tr("panel.last_checked")}: {lastCheckTimeStr}` }), diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 4e9e255..f3dc82c 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -93,6 +93,14 @@ description_key = "setting.check_interval.description" default = 60 min = 10 +[[setting]] +key = "system_stats_check_interval" +type = "int" +label_key = "setting.system_stats_check_interval.label" +description_key = "setting.system_stats_check_interval.description" +default = 10 +min = 5 + [[setting]] key = "show_checking_notification" type = "bool" @@ -159,7 +167,7 @@ placement = "attached" position = "auto" open_near_click = true width = 420 -height = 290 +height = 370 [[service]] id = "service" diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 0c7ef0d..10a6668 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -16,6 +16,9 @@ "panel.local": "Local", "panel.remote": "Remote", "panel.last_checked": "Last checked", + "panel.current": "Current", + "panel.store_size": "Store size", + "panel.closure_size": "Closure size", "terminal.press_enter_to_exit": "Press enter to exit...", "setting.widget.show_text.label": "Show text", "setting.widget.colorize_text.label": "Colorize text", @@ -31,6 +34,8 @@ "setting.widget.unknown_color.label": "Unknown status color", "setting.check_interval.label": "Update check interval", "setting.check_interval.description": "How often to check for updates (in minutes)", + "setting.system_stats_check_interval.label": "System stats check interval", + "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", "setting.checking_notification.label": "Show checking update notification", "setting.checking_notification.description": "Wether to show a notification whenever checking is in progress", "setting.show_update_notification.label": "Show update notification",