revise login display
This commit is contained in:
parent
488f47980e
commit
38d1c6aa7f
2 changed files with 132 additions and 77 deletions
|
|
@ -224,9 +224,9 @@
|
||||||
smartDrives = {
|
smartDrives = {
|
||||||
"/dev/disk/by-id/ata-ZHITAI_SC001_XT_1000GB_ZTB401TAB244431J4R" = "ZFS_Mirror_1";
|
"/dev/disk/by-id/ata-ZHITAI_SC001_XT_1000GB_ZTB401TAB244431J4R" = "ZFS_Mirror_1";
|
||||||
"/dev/disk/by-id/ata-ZHITAI_SC001_XT_1000GB_ZTB401TAB244431KEG" = "ZFS_Mirror_2";
|
"/dev/disk/by-id/ata-ZHITAI_SC001_XT_1000GB_ZTB401TAB244431KEG" = "ZFS_Mirror_2";
|
||||||
"/dev/disk/by-id/ata-HGST_HUH721212ALE604_5PK2N4GB" = "Data_Drive_1_12TB";
|
"/dev/disk/by-id/ata-HGST_HUH721212ALE604_5PK2N4GB" = "Data_1_12TB";
|
||||||
"/dev/disk/by-id/ata-HGST_HUH721212ALE604_5PJ7Z3LE" = "Data_Drive_2_12TB";
|
"/dev/disk/by-id/ata-HGST_HUH721212ALE604_5PJ7Z3LE" = "Data_2_12TB";
|
||||||
"/dev/disk/by-id/ata-ST16000NM000J-2TW103_WRS0F8BE" = "Parity_Drive_16TB";
|
"/dev/disk/by-id/ata-ST16000NM000J-2TW103_WRS0F8BE" = "Parity_16TB";
|
||||||
};
|
};
|
||||||
showDiskUsage = true;
|
showDiskUsage = true;
|
||||||
diskUsagePaths = [ "/" "/mnt/storage" "/mnt/parity" ];
|
diskUsagePaths = [ "/" "/mnt/storage" "/mnt/parity" ];
|
||||||
|
|
|
||||||
|
|
@ -51,17 +51,24 @@ in
|
||||||
# Configure shell login initialization
|
# Configure shell login initialization
|
||||||
programs.zsh.loginShellInit = mkIf config.programs.zsh.enable (
|
programs.zsh.loginShellInit = mkIf config.programs.zsh.enable (
|
||||||
let
|
let
|
||||||
|
# ANSI color codes for truecolor (using \033 for better compatibility)
|
||||||
|
colors = {
|
||||||
|
reset = "\\033[0m";
|
||||||
|
dim = "\\033[2m";
|
||||||
|
cyan = "\\033[38;2;0;200;255m";
|
||||||
|
blue = "\\033[38;2;100;150;255m";
|
||||||
|
green = "\\033[38;2;80;250;123m";
|
||||||
|
yellow = "\\033[38;2;241;250;140m";
|
||||||
|
orange = "\\033[38;2;255;184;108m";
|
||||||
|
red = "\\033[38;2;255;85;85m";
|
||||||
|
gray = "\\033[38;2;100;100;120m";
|
||||||
|
};
|
||||||
|
|
||||||
# Build SMART status display
|
# Build SMART status display
|
||||||
smartStatusCode = optionalString cfg.showSmartStatus ''
|
smartStatusCode = optionalString cfg.showSmartStatus ''
|
||||||
# Only show on SSH sessions
|
|
||||||
if [[ -n "$SSH_CONNECTION" ]] || [[ -n "$SSH_TTY" ]]; then
|
|
||||||
echo ""
|
|
||||||
echo "=== Disk Health Status ==="
|
|
||||||
|
|
||||||
${concatStringsSep "\n" (mapAttrsToList (device: name: ''
|
${concatStringsSep "\n" (mapAttrsToList (device: name: ''
|
||||||
if [[ -e "${device}" ]]; then
|
if [[ -e "${device}" ]]; then
|
||||||
# Get health status (using sudo for disk access)
|
# Get health status
|
||||||
# Use separate commands for NVMe vs SATA to avoid variable expansion issues
|
|
||||||
if [[ "${device}" == *"nvme"* ]]; then
|
if [[ "${device}" == *"nvme"* ]]; then
|
||||||
HEALTH_OUTPUT=$(sudo ${pkgs.smartmontools}/bin/smartctl -d nvme -H "${device}" 2>/dev/null)
|
HEALTH_OUTPUT=$(sudo ${pkgs.smartmontools}/bin/smartctl -d nvme -H "${device}" 2>/dev/null)
|
||||||
else
|
else
|
||||||
|
|
@ -80,67 +87,115 @@ in
|
||||||
if [[ "${device}" == *"nvme"* ]]; then
|
if [[ "${device}" == *"nvme"* ]]; then
|
||||||
SMART_DATA=$(sudo ${pkgs.smartmontools}/bin/smartctl -d nvme -A "${device}" 2>/dev/null)
|
SMART_DATA=$(sudo ${pkgs.smartmontools}/bin/smartctl -d nvme -A "${device}" 2>/dev/null)
|
||||||
TEMP=$(echo "$SMART_DATA" | ${pkgs.gawk}/bin/awk '/^Temperature:/ {print $2}' | head -1)
|
TEMP=$(echo "$SMART_DATA" | ${pkgs.gawk}/bin/awk '/^Temperature:/ {print $2}' | head -1)
|
||||||
[[ -n "$TEMP" && "$TEMP" =~ ^[0-9]+$ ]] && TEMP="''${TEMP}°C" || TEMP="N/A"
|
[[ -n "$TEMP" && "$TEMP" =~ ^[0-9]+$ ]] && TEMP="''${TEMP}" || TEMP="N/A"
|
||||||
else
|
else
|
||||||
SMART_DATA=$(sudo ${pkgs.smartmontools}/bin/smartctl -A "${device}" 2>/dev/null)
|
SMART_DATA=$(sudo ${pkgs.smartmontools}/bin/smartctl -A "${device}" 2>/dev/null)
|
||||||
TEMP=$(echo "$SMART_DATA" | ${pkgs.gawk}/bin/awk '/Temperature_Celsius/ {print $10}' | head -1)
|
TEMP=$(echo "$SMART_DATA" | ${pkgs.gawk}/bin/awk '/Temperature_Celsius/ {print $10}' | head -1)
|
||||||
[[ -n "$TEMP" && "$TEMP" =~ ^[0-9]+$ ]] && TEMP="''${TEMP}°C" || TEMP="N/A"
|
[[ -n "$TEMP" && "$TEMP" =~ ^[0-9]+$ ]] && TEMP="''${TEMP}" || TEMP="N/A"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Display status with color
|
# Color-code status and temperature
|
||||||
if [[ "$HEALTH" == "PASSED" ]]; then
|
if [[ "$HEALTH" == "PASSED" ]]; then
|
||||||
echo " ✓ ${name}: $HEALTH (Temp: $TEMP)"
|
STATUS="\\033[38;2;80;250;123m✓\\033[0m"
|
||||||
|
HEALTH_COLOR="\\033[38;2;80;250;123m"
|
||||||
|
# Color temp based on value
|
||||||
|
if [[ "$TEMP" =~ ^[0-9]+$ ]]; then
|
||||||
|
if [[ $TEMP -ge 70 ]]; then
|
||||||
|
TEMP_COLOR="\\033[38;2;255;85;85m"
|
||||||
|
elif [[ $TEMP -ge 50 ]]; then
|
||||||
|
TEMP_COLOR="\\033[38;2;255;184;108m"
|
||||||
else
|
else
|
||||||
echo " ✗ ${name}: $HEALTH"
|
TEMP_COLOR="\\033[38;2;241;250;140m"
|
||||||
fi
|
fi
|
||||||
|
TEMP_STR="$(printf "%b" "''${TEMP_COLOR}''${TEMP}°C\\033[0m")"
|
||||||
else
|
else
|
||||||
echo " ⚠ ${name}: Device not found"
|
TEMP_STR="$(printf "%b" "\\033[2m$TEMP\\033[0m")"
|
||||||
|
fi
|
||||||
|
elif [[ "$HEALTH" == "FAILED" ]]; then
|
||||||
|
STATUS="\\033[38;2;255;85;85m✗\\033[0m"
|
||||||
|
HEALTH_COLOR="\\033[38;2;255;85;85m"
|
||||||
|
TEMP_STR="$(printf "%b" "\\033[2m$TEMP\\033[0m")"
|
||||||
|
else
|
||||||
|
STATUS="\\033[38;2;241;250;140m⚠\\033[0m"
|
||||||
|
HEALTH_COLOR="\\033[38;2;241;250;140m"
|
||||||
|
TEMP_STR="$(printf "%b" "\\033[2m$TEMP\\033[0m")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf " %b \\033[2m%-15s\\033[0m %b%-7s\\033[0m %s\n" "$STATUS" "${name}" "$HEALTH_COLOR" "$HEALTH" "$TEMP_STR"
|
||||||
|
else
|
||||||
|
printf " \\033[38;2;241;250;140m⚠\\033[0m \\033[2m%-15s\\033[0m \\033[38;2;255;85;85m%-20s\\033[0m\n" "${name}" "Not found"
|
||||||
fi
|
fi
|
||||||
'') cfg.smartDrives)}
|
'') cfg.smartDrives)}
|
||||||
fi
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Build system info display
|
# Build system info display
|
||||||
systemInfoCode = optionalString cfg.showSystemInfo ''
|
systemInfoCode = optionalString cfg.showSystemInfo ''
|
||||||
# Only show on SSH sessions
|
# Parse uptime
|
||||||
if [[ -n "$SSH_CONNECTION" ]] || [[ -n "$SSH_TTY" ]]; then
|
|
||||||
echo ""
|
|
||||||
echo "=== System Information ==="
|
|
||||||
echo " Hostname: $(hostname)"
|
|
||||||
# Parse uptime output to get readable format
|
|
||||||
UPTIME_STR=$(uptime | ${pkgs.gawk}/bin/awk '{
|
UPTIME_STR=$(uptime | ${pkgs.gawk}/bin/awk '{
|
||||||
# Extract the uptime part (between "up" and "user" or "load")
|
|
||||||
match($0, /up\s+(.+?),\s+[0-9]+\s+user/, arr)
|
match($0, /up\s+(.+?),\s+[0-9]+\s+user/, arr)
|
||||||
if (arr[1] != "") {
|
if (arr[1] != "") {
|
||||||
|
gsub(/^ +| +$/, "", arr[1])
|
||||||
|
# Shorten format: "5 days, 3:42" -> "5d 3h"
|
||||||
|
gsub(/ days?,/, "d", arr[1])
|
||||||
|
gsub(/ hours?,/, "h", arr[1])
|
||||||
|
gsub(/ mins?,/, "m", arr[1])
|
||||||
|
gsub(/:[0-9]+$/, "", arr[1])
|
||||||
print arr[1]
|
print arr[1]
|
||||||
}
|
}
|
||||||
}')
|
}')
|
||||||
echo " Uptime: $UPTIME_STR"
|
LOAD=$(uptime | ${pkgs.gawk}/bin/awk -F'load average:' '{gsub(/^ +| +$/, "", $2); print $2}')
|
||||||
echo " Load: $(uptime | ${pkgs.gawk}/bin/awk -F'load average:' '{print $2}')"
|
|
||||||
fi
|
printf " \\033[38;2;0;200;255m%s\\033[0m \\033[2m·\\033[0m \\033[2m↑\\033[0m %s \\033[2m· load\\033[0m %s\n" "$(hostname)" "$UPTIME_STR" "$LOAD"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Build disk usage display
|
# Build disk usage display with bar
|
||||||
diskUsageCode = optionalString cfg.showDiskUsage ''
|
diskUsageCode = optionalString cfg.showDiskUsage ''
|
||||||
# Only show on SSH sessions
|
|
||||||
if [[ -n "$SSH_CONNECTION" ]] || [[ -n "$SSH_TTY" ]]; then
|
|
||||||
echo ""
|
|
||||||
echo "=== Disk Usage ==="
|
|
||||||
${concatMapStringsSep "\n" (path: ''
|
${concatMapStringsSep "\n" (path: ''
|
||||||
df -h "${path}" | ${pkgs.gawk}/bin/awk 'NR==2 {printf " ${path}: %s / %s (%s used)\n", $3, $2, $5}'
|
DF_OUTPUT=$(df -h "${path}" | ${pkgs.gawk}/bin/awk 'NR==2 {print $3, $2, $5}')
|
||||||
'') cfg.diskUsagePaths}
|
read -r USED TOTAL PCT <<< "$DF_OUTPUT"
|
||||||
|
PCT_NUM=''${PCT%\%}
|
||||||
|
|
||||||
|
# Create progress bar (10 chars)
|
||||||
|
FILLED=$((PCT_NUM / 10))
|
||||||
|
EMPTY=$((10 - FILLED))
|
||||||
|
BAR=""
|
||||||
|
for ((i=0; i<FILLED; i++)); do BAR="$BAR█"; done
|
||||||
|
for ((i=0; i<EMPTY; i++)); do BAR="$BAR░"; done
|
||||||
|
|
||||||
|
# Color bar based on usage
|
||||||
|
if [[ $PCT_NUM -ge 90 ]]; then
|
||||||
|
BAR_COLOR="\\033[38;2;255;85;85m"
|
||||||
|
elif [[ $PCT_NUM -ge 70 ]]; then
|
||||||
|
BAR_COLOR="\\033[38;2;255;184;108m"
|
||||||
|
elif [[ $PCT_NUM -ge 50 ]]; then
|
||||||
|
BAR_COLOR="\\033[38;2;241;250;140m"
|
||||||
|
else
|
||||||
|
BAR_COLOR="\\033[38;2;80;250;123m"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
printf " \\033[2m%-12s\\033[0m %6s/%-6s %b%s\\033[0m %5s\n" "${path}" "$USED" "$TOTAL" "$BAR_COLOR" "$BAR" "$PCT"
|
||||||
|
'') cfg.diskUsagePaths}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# Combine all sections
|
||||||
|
hasDisks = cfg.showSmartStatus && (builtins.length (builtins.attrNames cfg.smartDrives) > 0);
|
||||||
|
hasStorage = cfg.showDiskUsage && (builtins.length cfg.diskUsagePaths > 0);
|
||||||
|
|
||||||
in ''
|
in ''
|
||||||
${systemInfoCode}
|
|
||||||
${smartStatusCode}
|
|
||||||
${diskUsageCode}
|
|
||||||
|
|
||||||
# Add blank line after all info
|
|
||||||
if [[ -n "$SSH_CONNECTION" ]] || [[ -n "$SSH_TTY" ]]; then
|
if [[ -n "$SSH_CONNECTION" ]] || [[ -n "$SSH_TTY" ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
|
printf "\\033[38;2;0;200;255m━━ System ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\033[0m\n"
|
||||||
|
${systemInfoCode}
|
||||||
|
${optionalString hasDisks ''
|
||||||
|
printf "\\033[38;2;100;150;255m━━ Disks ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\033[0m\n"
|
||||||
|
${smartStatusCode}
|
||||||
|
''}
|
||||||
|
${optionalString hasStorage ''
|
||||||
|
printf "\\033[38;2;100;150;255m━━ Storage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\033[0m\n"
|
||||||
|
${diskUsageCode}
|
||||||
|
''}
|
||||||
|
echo ""
|
||||||
fi
|
fi
|
||||||
''
|
''
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue