Files
dotfiles/bin/sysfetch
T
2024-07-05 13:25:21 +07:00

233 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
_user_host(){
local username hostname
username="${USER:-$(id -un)}"
hostname="${HOSTNAME:-$(</etc/hostname)}"
userHost="$username@${hostname:-$(uname -n)}\n"
}
_uptime(){
local rawSeconds seconds days hours minutes
read -r rawSeconds _ </proc/uptime
seconds="${rawSeconds%.*}"
((days=seconds/86400))|| days=''
((hours=seconds%86400/3600))|| hours=''
((minutes=seconds%3600/60))|| minutes=''
days="${days:+$days days, }"
hours="${hours:+$hours hours, }"
minutes="${minutes:+$minutes minutes}"
uptime="${minutes:+\e[32mUptime\e[m: ${days}${hours}${minutes}\n}"
}
_kernel_arch(){
read -r kernel kernelRelease architecture < <(uname -srm)
architecture="${architecture:-$HOSTTYPE}"
kernelArch="${kernel:+\e[32mKernel\e[m: $kernel $kernelRelease $architecture\n}"
}
_operating_system(){
operatingSystem="${OSTYPE:-$(uname -o)}"
operatingSystem="${operatingSystem:+\e[32mOS\e[m: $operatingSystem\n}"
}
_cpu(){
local line processor freqDir curFreq maxFreq frequency
while read -r line; do
[[ $line =~ ^'model name' ]]&&{ processor="${line#*: }"; break; }
done </proc/cpuinfo
freqDir='/sys/devices/system/cpu/cpu0/cpufreq'
read -r maxFreq <"$freqDir/scaling_max_freq"
maxFreq="${maxFreq::2}"
: "${maxFreq#[0-9]}"
maxFreq="${maxFreq%[0-9]}.$_"
read -r curFreq <"$freqDir"/scaling_cur_freq
curFreq="${curFreq::2}"
: "${curFreq#0-9}"
curFreq="${curFreq%[0-9]}.$_"
frequency="${curFreq:+ $maxFreq@$curFreq}"
cpu="${processor:+\e[32mCPU\e[m: $processor $frequency\n}"
}
_gpu(){
local line
while read -r line; do
[[ $line =~ 'VGA'|'3D' ]]&&{ gpu="${line##*: }"; break; }
done < <(lspci)
gpu="${gpu:+\e[32mGPU\e[m: $gpu\n}"
}
_mobo(){
local moboDir moboVendor moboName
moboDir='/sys/devices/virtual/dmi/id'
read -r moboVendor <"$moboDir"/board_vendor
read -r moboName <"$moboDir"/board_name
mobo="${moboVendor:+\e[32mMobo\e[m: $moboVendor $moboName\n}"
}
_disk(){
local line blockPath blockDevice blockSize blocksTotal blocksAvailable diskModel rawDiskTotal diskTotal
while read -r line; do
[[ $line =~ '0 1'$ ]]&&{ blockPath="${line%% *}"; break; }
done </etc/fstab
blockDevice="${blockPath#/dev/}"
: "/sys/class/block/${blockDevice%[0-9]}/device/model"
[[ -f $_ ]]&& read -r diskModel <"$_"
read -r _ _ _ _ blockSize _ blocksTotal _ blocksAvailable _ _ < <(stat --file-system --terse /)
((partAvail=blockSize*blocksAvailable/1073741824))
((partTotal=blockSize*blocksTotal/1073741824))
((partUsed=partTotal-partAvail))
while read -r line; do
[[ $line =~ sda$ ]]&&{ line="${line% *}" rawDiskTotal="${line##* }"; break; }
done </proc/partitions
((diskTotal=rawDiskTotal/1048576))
disk="${partAvail:+\e[32mDisk\e[m: $diskModel $diskTotal $partUsed/$partTotal GiB\n}"
}
_ram(){
local line rawMemory memActive memTotal memUsage
while read -r line; do
case $line in
MemTot*) rawMemory=("${line#*: }");;
Active:*) rawMemory+=("${line#*:}"); break;;
esac
done </proc/meminfo
((memActive=${rawMemory[1]% kB}/1024))
((memTotal=${rawMemory[0]% kB}/1024))
memUsage="$(awk 'BEGIN{printf "%.0f\n", ('$memActive'/'$memTotal')*100}')%"
ram="${memUsage:+\e[32mRAM\e[m: $memActive/$memTotal MiB $memUsage\n}"
}
_kernel(){
local kernelName kernelRel
read -r kernelName _ kernelRel _ </proc/version
kernel="${kernelName:+\e[32mKernel\e[m: $kernelName $kernelRel\n}"
}
_distro(){
local line
while read -r line; do
[[ $line =~ ^'PRETTY'|^'NAME' ]]&&{
line="${line#*=}" distro="${line//\"}"; break
}
done </etc/os-release
distro="${distro:+\e[32mDistro\e[m: $distro\n}"
}
_genv(){
local line
genv="${XDG_CURRENT_DESKTOP:-$DESKTOP_SESSION}"
[[ ! $genv ]]&& hash wmctrl&&{
while read -r line; do
[[ $line =~ Name: ]]&&{ genv="${line#*: }"; break; }
done < <(wmctrl -m)
}
genv="${genv:+\e[32mGENV\e[m: $genv\n}"
}
_packages(){
local pkgCnt=0
pkgPath='/var/lib/pacman/local'
[[ -d $pkgPath ]]&&{
for _ in "$pkgPath"/*; do ((++pkgCnt)); done
}
packages="${pkgCnt:+\e[32mPackages\e[m: $pkgCnt\n}"
}
_swap(){
local line curSwap maxSwap
while read -ra line; do
(( ${i:=0} ))&&{
((curSwap+=line[3]/1024))
((maxSwap+=line[2]/1024))
}|| ((++i))
done </proc/swaps
swap="${curSwap:+\e[32mSwap\e[m: $curSwap/$maxSwap\n}"
}
main(){
_user_host
_uptime
_kernel_arch
_operating_system
_cpu
_gpu
_mobo
_disk
_ram
_kernel
_distro
_genv
_packages
_swap
printf '\e[?7l'
printf '%b' \
"$userHost" \
"$uptime" \
"$kernelArch" \
"$operatingSystem" \
"$cpu" \
"$gpu" \
"$mobo" \
"$disk" \
"$ram" \
"$kernel" \
"$distro" \
"$genv" \
"$packages" \
"$swap"
printf '\e[?7h'
}
stty -echo
if (( ${1:-0} > 0 )); then
trap 'printf "\e[?1049l"; stty echo; exit' 2
printf '\e[?1049h'
for((;;)){
printf '\e[2J\e[H'
main
sleep "$1"
}
else
main
fi
stty echo