From 19ca7fa905f3cf149e7c51f932cddbf73562c48b Mon Sep 17 00:00:00 2001 From: fatalerrors Date: Thu, 21 May 2026 11:10:09 +0200 Subject: [PATCH] added pinfo --- profile.d/info.sh | 170 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 160 insertions(+), 10 deletions(-) diff --git a/profile.d/info.sh b/profile.d/info.sh index 5e0733d..60d2669 100644 --- a/profile.d/info.sh +++ b/profile.d/info.sh @@ -127,6 +127,165 @@ export -f meteo # ------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------ +# Display a system information block using only /proc and /sys — no external tools. +# Usage: pinfo +pinfo() +{ + local _row + _row() { + printf " %b%-12s%b %b%s%b\n" "$_lbl" "$1" "$_rst" "$_val" "$2" "$_rst" + } + + local PARSED + PARSED=$(getopt -o h --long help -n 'pinfo' -- "$@") + # shellcheck disable=SC2181 + if [[ $? -ne 0 ]]; then + disp E "Invalid options, use \"pinfo --help\" to display usage." + return 1 + fi + eval set -- "$PARSED" + while true; do + case "$1" in + -h|--help) + printf "pinfo: Display system information from /proc and /sys (no external tools required).\n" + printf "Usage: pinfo\n" + return 0 + ;; + --) + shift + break + ;; + *) + disp E "Invalid options, use \"pinfo --help\" to display usage." + return 1 + ;; + esac + done + + # --- Hostname --- + local hostname_str + if [[ -r /proc/sys/kernel/hostname ]]; then + read -r hostname_str < /proc/sys/kernel/hostname + else + hostname_str="${HOSTNAME:-unknown}" + fi + + # --- OS release (parsed line by line, never sourced) --- + local os_name="Unknown" os_version="" + if [[ -r /etc/os-release ]]; then + local _osr_key _osr_val + while IFS='=' read -r _osr_key _osr_val; do + _osr_val="${_osr_val//\"/}" + case "$_osr_key" in + NAME) os_name="$_osr_val" ;; + VERSION_ID) os_version="$_osr_val" ;; + esac + done < /etc/os-release + fi + + # --- Kernel release --- + local kernel_str="unknown" + [[ -r /proc/sys/kernel/osrelease ]] && read -r kernel_str < /proc/sys/kernel/osrelease + + # --- Architecture (set by bash at startup from the ELF interpreter) --- + local arch_str="${HOSTTYPE:-unknown}" + + # --- Uptime (seconds from /proc/uptime) --- + local uptime_str="unknown" + if [[ -r /proc/uptime ]]; then + local _upraw + read -r _upraw _ < /proc/uptime + local _upsec="${_upraw%%.*}" + local _days=$(( _upsec / 86400 )) + local _hours=$(( (_upsec % 86400) / 3600 )) + local _mins=$(( (_upsec % 3600) / 60 )) + local _secs=$(( _upsec % 60 )) + uptime_str="" + (( _days > 0 )) && uptime_str+="${_days}d " + (( _hours > 0 || _days > 0 )) && uptime_str+="${_hours}h " + uptime_str+="${_mins}m ${_secs}s" + fi + + # --- Load average --- + local load_str="unknown" + if [[ -r /proc/loadavg ]]; then + local _l1 _l5 _l15 + read -r _l1 _l5 _l15 _ < /proc/loadavg + load_str="${_l1} ${_l5} ${_l15} (1/5/15 min)" + fi + + # --- CPU model and logical/physical core count (pure bash) --- + local cpu_model="unknown" cpu_threads=0 + local -A _seen_cores=() + local _cur_phys="" _cpu_line + if [[ -r /proc/cpuinfo ]]; then + while IFS= read -r _cpu_line; do + case "$_cpu_line" in + "model name"*|"Model name"*|"Hardware"*) + [[ "$cpu_model" == "unknown" ]] && cpu_model="${_cpu_line#*: }" + ;; + "processor"*) + (( cpu_threads++ )) + ;; + "physical id"*) + _cur_phys="${_cpu_line#*: }" + ;; + "core id"*) + _seen_cores["${_cur_phys}:${_cpu_line#*: }"]=1 + ;; + esac + done < /proc/cpuinfo + fi + local cpu_cores="${#_seen_cores[@]}" + (( cpu_cores == 0 )) && cpu_cores=$cpu_threads + + # --- Memory (pure bash, /proc/meminfo, values in kB) --- + local mem_total=0 mem_available=0 + if [[ -r /proc/meminfo ]]; then + local _mkey _mval _munit + while read -r _mkey _mval _munit; do + case "${_mkey%:}" in + MemTotal) mem_total="$_mval" ;; + MemAvailable) mem_available="$_mval" ;; + esac + done < /proc/meminfo + fi + local mem_total_mib=$(( mem_total / 1024 )) + local mem_used_mib=$(( (mem_total - mem_available) / 1024 )) + + # --- Process count (glob over numeric /proc entries) --- + local proc_count=0 _pdir + for _pdir in /proc/[0-9]*/; do + [[ -d "$_pdir" ]] && (( proc_count++ )) + done + + # --- Shell and terminal --- + local shell_str="${BASH:-bash} ${BASH_VERSION%\(*}" + local term_str="${TERM:-unknown}" + + # --- Render --- + local _lbl="${BIWhite:-}" _val="${ICyan:-}" _rst="${DEFAULTCOL:-}" + + printf "\n" + _row "Hostname" "$hostname_str" + _row "OS" "${os_name}${os_version:+ $os_version}" + _row "Kernel" "$kernel_str" + _row "Arch" "$arch_str" + _row "Uptime" "$uptime_str" + _row "Load avg" "$load_str" + _row "CPU" "$cpu_model" + _row "Cores" "${cpu_cores} physical, ${cpu_threads} logical" + _row "Memory" "${mem_used_mib} MiB used / ${mem_total_mib} MiB total" + _row "Processes" "$proc_count" + _row "Shell" "$shell_str" + _row "Terminal" "$term_str" + printf "\n" +} +export -f pinfo +# ------------------------------------------------------------------------------ + + # ------------------------------------------------------------------------------ # Display system general information # Usage: showinfo @@ -179,16 +338,7 @@ showinfo() elif command -v fastfetch >/dev/null 2>&1; then fastfetch else - ( - if [[ -s /etc/os-release ]]; then - # shellcheck disable=SC1091 - . /etc/os-release - printf "%s %s\n" "$NAME" "$VERSION" - else - cat /proc/version - fi - printf "Uptime: %s\n" "$(uptime -p)" - ) + pinfo "$@" fi } export -f showinfo