mirror of
https://github.com/dylanaraps/pfetch.git
synced 2026-01-02 16:02:12 +01:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
67003d91b1 |
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
@@ -6,6 +6,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- name: Run shellcheck.
|
- name: Run shellcheck.
|
||||||
run: |
|
run: shellcheck pfetch
|
||||||
shellcheck pfetch
|
|
||||||
TERM=dumb sh pfetch
|
|
||||||
|
|||||||
98
README.md
98
README.md
@@ -1,42 +1,52 @@
|
|||||||
<p align="center"><img src="https://user-images.githubusercontent.com/6799467/65944518-68834d80-e421-11e9-9b14-6ca26a16108a.png" width="350px"></p>
|
# pfetch
|
||||||
<h1 align="center">pfetch</h1>
|
|
||||||
<p align="center">A pretty system information tool written in POSIX sh</p><br>
|
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/6799467/65945384-5bfff480-e423-11e9-863e-4e7cf16eb648.png" width="40%" align="right">
|
A pretty system information tool written in POSIX `sh`.
|
||||||
|
|
||||||
The goal of this project is to implement a simple system
|
The goal of this project is to implement a simple system information tool in POSIX `sh` using features built into the language itself (*where possible*).
|
||||||
information tool in POSIX `sh` using features built into
|
|
||||||
the language itself (*where possible*).
|
|
||||||
|
|
||||||
The source code is highly documented and I hope it will
|
The source code is highly documented and I hope it will act as a learning resource for POSIX `sh` and simple information detection across various different operating systems.
|
||||||
act as a learning resource for POSIX `sh` and simple
|
|
||||||
information detection across various different operating
|
|
||||||
systems.
|
|
||||||
|
|
||||||
If anything in the source code is unclear or is lacking
|
If anything in the source code is unclear or is lacking in its explanation, open an issue. Sometimes you get too close to something and you fail to see the "bigger picture"!
|
||||||
in its explanation, open an issue. Sometimes you get too
|
|
||||||
close to something and you fail to see the "bigger
|
|
||||||
picture"!
|
|
||||||
|
|
||||||
<br>
|
```sh
|
||||||
<br>
|
➜ pfetch
|
||||||
<br>
|
___ goldie@KISS
|
||||||
<br>
|
(.· | os KISS Linux
|
||||||
|
(<> | host Lenovo YOGA 900-13ISK
|
||||||
|
/ __ \ kernel 5.3.1-coffee
|
||||||
|
( / \ /| uptime 6h 20m
|
||||||
|
_/\ __)/_) pkgs 130
|
||||||
|
\/-____\/ memory 1721M / 7942M
|
||||||
|
```
|
||||||
|
|
||||||
## OS support
|
## OS support
|
||||||
|
|
||||||
- **Linux**
|
- [x] Linux (A myriad of distributions)
|
||||||
- Alpine Linux, Arch Linux, Arco Linux, Artix Linux, CentOS, Debian, Elementary, Fedora, Gentoo, Guix, Hyperbola, KISS Linux, Linux Lite, Linux Mint, Mageia, Manjaro, MX Linux, NixOS, OpenSUSE, Parabola, Pop!\_OS, PureOS, Slackware, Ubuntu and Void Linux.
|
- [x] MacOS
|
||||||
- All other distributions are supported with a generic penguin logo.
|
- [x] OpenBSD
|
||||||
- **Android**
|
- [x] FreeBSD
|
||||||
- **BSD**
|
- [x] NetBSD
|
||||||
- DragonflyBSD, FreeBSD, NetBSD and OpenBSD.
|
- [x] Haiku
|
||||||
- **Windows**
|
|
||||||
- Windows subsystem for Linux.
|
## TODO
|
||||||
- **Haiku**
|
|
||||||
- **MacOS**
|
- [ ] Add optional and additional information detection.
|
||||||
- **Minix**
|
- [ ] CPU
|
||||||
- **Solaris**
|
- [ ] Terminal Emulator
|
||||||
|
- The way I implement this in `neofetch` is interesting.
|
||||||
|
- [ ] Terminal colors
|
||||||
|
- [ ] ???
|
||||||
|
- [ ] Expand operating system support.
|
||||||
|
- [ ] Solaris ([#5](https://github.com/dylanaraps/pfetch/issues/5))
|
||||||
|
- [ ] MINIX ([#6](https://github.com/dylanaraps/pfetch/issues/6))
|
||||||
|
- [ ] AIX ([#7](https://github.com/dylanaraps/pfetch/issues/7))
|
||||||
|
- [ ] IRIX ([#8](https://github.com/dylanaraps/pfetch/issues/8))
|
||||||
|
- [ ] FreeMiNT ([#9](https://github.com/dylanaraps/pfetch/issues/9))
|
||||||
|
- [ ] Windows ([#10](https://github.com/dylanaraps/pfetch/issues/10))
|
||||||
|
- [ ] CYGWIN
|
||||||
|
- [ ] MSYS
|
||||||
|
- [ ] MINGW
|
||||||
|
- [ ] WSL (*this is fairly simple*)
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -48,14 +58,14 @@ picture"!
|
|||||||
# Default: first example below
|
# Default: first example below
|
||||||
# Valid: space separated string
|
# Valid: space separated string
|
||||||
#
|
#
|
||||||
# OFF by default: shell editor wm de palette
|
# OFF by default: shell
|
||||||
PF_INFO="ascii title os host kernel uptime pkgs memory"
|
PF_INFO="ascii title distro host kernel uptime pkgs memory"
|
||||||
|
|
||||||
# Example: Only ASCII.
|
# Example: Only ASCII.
|
||||||
PF_INFO="ascii"
|
PF_INFO="ascii"
|
||||||
|
|
||||||
# Example: Only Information.
|
# Example: Only Information.
|
||||||
PF_INFO="title os host kernel uptime pkgs memory"
|
PF_INFO="title distro host kernel uptime pkgs memory"
|
||||||
|
|
||||||
# Separator between info name and info data.
|
# Separator between info name and info data.
|
||||||
# Default: unset
|
# Default: unset
|
||||||
@@ -86,26 +96,6 @@ PF_ALIGN=""
|
|||||||
# Default: unset (auto)
|
# Default: unset (auto)
|
||||||
# Valid: string
|
# Valid: string
|
||||||
PF_ASCII="openbsd"
|
PF_ASCII="openbsd"
|
||||||
|
|
||||||
# The below environment variables control more
|
|
||||||
# than just 'pfetch' and can be passed using
|
|
||||||
# 'HOSTNAME=cool_pc pfetch' to restrict their
|
|
||||||
# usage solely to 'pfetch'.
|
|
||||||
|
|
||||||
# Which user to display.
|
|
||||||
USER=""
|
|
||||||
|
|
||||||
# Which hostname to display.
|
|
||||||
HOSTNAME=""
|
|
||||||
|
|
||||||
# Which editor to display.
|
|
||||||
EDITOR=""
|
|
||||||
|
|
||||||
# Which shell to display.
|
|
||||||
SHELL=""
|
|
||||||
|
|
||||||
# Which desktop environment to display.
|
|
||||||
XDG_CURRENT_DESKTOP=""
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Credit
|
## Credit
|
||||||
|
|||||||
603
pfetch
603
pfetch
@@ -64,7 +64,7 @@ log() {
|
|||||||
|
|
||||||
# Use 'set --' as a means of stripping all leading and trailing
|
# Use 'set --' as a means of stripping all leading and trailing
|
||||||
# white-space from the info string. This also normalizes all
|
# white-space from the info string. This also normalizes all
|
||||||
# white-space inside of the string.
|
# whitespace inside of the string.
|
||||||
#
|
#
|
||||||
# Disable the shellcheck warning for word-splitting
|
# Disable the shellcheck warning for word-splitting
|
||||||
# as it's safe and intended ('set -f' disables globbing).
|
# as it's safe and intended ('set -f' disables globbing).
|
||||||
@@ -95,13 +95,13 @@ log() {
|
|||||||
printf '[3%sm%s[m\n' "${PF_COL2-7}" "$info"
|
printf '[3%sm%s[m\n' "${PF_COL2-7}" "$info"
|
||||||
|
|
||||||
# Keep track of the number of times 'log()' has been run.
|
# Keep track of the number of times 'log()' has been run.
|
||||||
info_height=$((${info_height:-0} + 1))
|
: $((info_height+=1))
|
||||||
}
|
}
|
||||||
|
|
||||||
get_title() {
|
get_title() {
|
||||||
# Username is retrieved by first checking '$USER' with a fallback
|
# Username is retrieved by first checking '$USER' with a fallback
|
||||||
# to the 'id -un' command.
|
# to the 'whoami' command.
|
||||||
user=${USER:-$(id -un)}
|
user=${USER:-$(whoami)}
|
||||||
|
|
||||||
# Hostname is retrieved by first checking '$HOSTNAME' with a fallback
|
# Hostname is retrieved by first checking '$HOSTNAME' with a fallback
|
||||||
# to the 'hostname' command.
|
# to the 'hostname' command.
|
||||||
@@ -129,7 +129,7 @@ get_os() {
|
|||||||
|
|
||||||
case $os in
|
case $os in
|
||||||
Linux*)
|
Linux*)
|
||||||
# Some Linux distributions (which are based on others)
|
# Some Linux disttributions (which are based on others)
|
||||||
# fail to identify as they **do not** change the upstream
|
# fail to identify as they **do not** change the upstream
|
||||||
# distributions identification packages or files.
|
# distributions identification packages or files.
|
||||||
#
|
#
|
||||||
@@ -154,51 +154,17 @@ get_os() {
|
|||||||
if command -v lsb_release; then
|
if command -v lsb_release; then
|
||||||
distro=$(lsb_release -sd)
|
distro=$(lsb_release -sd)
|
||||||
|
|
||||||
# Android detection works by checking for the existence of
|
|
||||||
# the follow two directories. I don't think there's a simpler
|
|
||||||
# method than this.
|
|
||||||
elif [ -d /system/app ] && [ -d /system/priv-app ]; then
|
|
||||||
distro="Android $(getprop ro.build.version.release)"
|
|
||||||
|
|
||||||
else
|
else
|
||||||
# This used to be a simple '. /etc/os-release' but I believe
|
# Disable warning about shellcheck not being able
|
||||||
# this is insecure as we blindly executed whatever was in the
|
# to read '/etc/os-release'. This is fine.
|
||||||
# file. This parser instead simply handles 'key=val', treating
|
# shellcheck source=/dev/null
|
||||||
# the file contents as plain-text.
|
. /etc/os-release && distro=$PRETTY_NAME
|
||||||
while IFS='=' read -r key val; do
|
|
||||||
case $key in
|
|
||||||
PRETTY_NAME) distro=$val ;;
|
|
||||||
esac
|
|
||||||
done < /etc/os-release
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 'os-release' and 'lsb_release' sometimes add quotes
|
|
||||||
# around the distribution name, strip them.
|
|
||||||
distro=${distro##[\"\']}
|
|
||||||
distro=${distro%%[\"\']}
|
|
||||||
|
|
||||||
# Special cases for (independent) distributions which
|
# Special cases for (independent) distributions which
|
||||||
# don't follow any os-release/lsb standards whatsoever.
|
# don't follow any os-release/lsb standards whatsoever.
|
||||||
command -v crux && distro=$(crux)
|
command -v crux && distro=$(crux)
|
||||||
command -v guix && distro='Guix System'
|
command -v guix && distro='Guix System'
|
||||||
|
|
||||||
# Check to see if Linux is running in Windows 10 under
|
|
||||||
# WSL1 (Windows subsystem for Linux [version 1]) and
|
|
||||||
# append a string accordingly.
|
|
||||||
#
|
|
||||||
# If the kernel version string ends in "-Microsoft",
|
|
||||||
# we're very likely running under Windows 10 in WSL1.
|
|
||||||
[ "${kernel%%*-Microsoft}" ] ||
|
|
||||||
distro="$distro on Windows 10 [WSL1]"
|
|
||||||
|
|
||||||
# Check to see if Linux is running in Windows 10 under
|
|
||||||
# WSL2 (Windows subsystem for Linux [version 2]) and
|
|
||||||
# append a string accordingly.
|
|
||||||
#
|
|
||||||
# This checks to see if '$WSLENV' is defined. This
|
|
||||||
# appends the Windows 10 string even if '$WSLENV' is
|
|
||||||
# empty. We only need to check that is has been _exported_.
|
|
||||||
distro="${distro}${WSLENV+ on Windows 10 [WSL2]}"
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Darwin*)
|
Darwin*)
|
||||||
@@ -249,22 +215,8 @@ get_os() {
|
|||||||
|
|
||||||
Haiku)
|
Haiku)
|
||||||
# Haiku uses 'uname -v' for version information
|
# Haiku uses 'uname -v' for version information
|
||||||
# instead of 'uname -r' which only prints '1'.
|
# instead of 'uname -r'.
|
||||||
distro=$(uname -sv)
|
distro="Haiku $(uname -v)"
|
||||||
;;
|
|
||||||
|
|
||||||
Minix|DragonFly)
|
|
||||||
distro="$os $kernel"
|
|
||||||
|
|
||||||
# Minix and DragonFly don't support the escape
|
|
||||||
# sequences used, clear the exit trap.
|
|
||||||
trap '' EXIT
|
|
||||||
;;
|
|
||||||
|
|
||||||
SunOS)
|
|
||||||
# Grab the first line of the '/etc/release' file
|
|
||||||
# discarding everything after '('.
|
|
||||||
IFS='(' read -r distro _ < /etc/release
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
@@ -279,7 +231,7 @@ get_kernel() {
|
|||||||
case $os in
|
case $os in
|
||||||
# Don't print kernel output on some systems as the
|
# Don't print kernel output on some systems as the
|
||||||
# OS name includes it.
|
# OS name includes it.
|
||||||
*BSD*|Haiku|Minix) ;;
|
*BSD*|Haiku) ;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
# '$kernel' is the cached output of 'uname -r'.
|
# '$kernel' is the cached output of 'uname -r'.
|
||||||
@@ -301,7 +253,7 @@ get_host() {
|
|||||||
host="$name $version $model"
|
host="$name $version $model"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Darwin*|FreeBSD*|DragonFly*)
|
Darwin*|FreeBSD*)
|
||||||
host=$(sysctl -n hw.model)
|
host=$(sysctl -n hw.model)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -345,7 +297,7 @@ get_host() {
|
|||||||
case $word in
|
case $word in
|
||||||
To | [Bb]e | [Ff]illed | by | O.E.M. | OEM |\
|
To | [Bb]e | [Ff]illed | by | O.E.M. | OEM |\
|
||||||
Not | Applicable | Specified | System | Product | Name |\
|
Not | Applicable | Specified | System | Product | Name |\
|
||||||
Version | Undefined | Default | string | INVALID | <20> | os )
|
Version | Undefined | Default | string | INVALID | <20> )
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -362,11 +314,11 @@ get_uptime() {
|
|||||||
# converting that data into days, hours and minutes using simple
|
# converting that data into days, hours and minutes using simple
|
||||||
# math.
|
# math.
|
||||||
case $os in
|
case $os in
|
||||||
Linux*|Minix*)
|
Linux*)
|
||||||
IFS=. read -r s _ < /proc/uptime
|
IFS=. read -r s _ < /proc/uptime
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Darwin*|*BSD*|DragonFly*)
|
Darwin*|*BSD*)
|
||||||
s=$(sysctl -n kern.boottime)
|
s=$(sysctl -n kern.boottime)
|
||||||
|
|
||||||
# Extract the uptime in seconds from the following output:
|
# Extract the uptime in seconds from the following output:
|
||||||
@@ -384,19 +336,6 @@ get_uptime() {
|
|||||||
# regular seconds.
|
# regular seconds.
|
||||||
s=$(($(system_time) / 1000000))
|
s=$(($(system_time) / 1000000))
|
||||||
;;
|
;;
|
||||||
|
|
||||||
SunOS)
|
|
||||||
# Split the output of 'kstat' on '.' and any white-space
|
|
||||||
# which exists in the command output.
|
|
||||||
#
|
|
||||||
# The output is as follows:
|
|
||||||
# unix:0:system_misc:snaptime 14809.906993005
|
|
||||||
#
|
|
||||||
# The parser extracts: ^^^^^
|
|
||||||
IFS=' .' read -r _ s _ <<-EOF
|
|
||||||
$(kstat -p unix:0:system_misc:snaptime)
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Convert the uptime from seconds into days, hours and minutes.
|
# Convert the uptime from seconds into days, hours and minutes.
|
||||||
@@ -413,10 +352,6 @@ get_uptime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_pkgs() {
|
get_pkgs() {
|
||||||
# This is just a simple wrapper around 'command -v' to avoid
|
|
||||||
# spamming '>/dev/null' throughout this function.
|
|
||||||
has() { command -v "$1" >/dev/null; }
|
|
||||||
|
|
||||||
# This works by first checking for which package managers are
|
# This works by first checking for which package managers are
|
||||||
# installed and finally by printing each package manager's
|
# installed and finally by printing each package manager's
|
||||||
# package list with each package one per line.
|
# package list with each package one per line.
|
||||||
@@ -437,22 +372,27 @@ get_pkgs() {
|
|||||||
case $os in
|
case $os in
|
||||||
Linux*)
|
Linux*)
|
||||||
# Commands which print packages one per line.
|
# Commands which print packages one per line.
|
||||||
has bonsai && bonsai list
|
command -v kiss && kiss l
|
||||||
has pacman-key && pacman -Qq
|
command -v bonsai && bonsai list
|
||||||
has dpkg && dpkg-query -f '.\n' -W
|
command -v pacman-key && pacman -Qq
|
||||||
has rpm && rpm -qa
|
command -v dpkg && dpkg-query -f '.\n' -W
|
||||||
has xbps-query && xbps-query -l
|
command -v rpm && rpm -qa
|
||||||
has apk && apk info
|
command -v xbps-query && xbps-query -l
|
||||||
has guix && guix package --list-installed
|
command -v apk && apk info
|
||||||
|
|
||||||
# Directories containing packages.
|
# Directories containing packages.
|
||||||
has kiss && printf '%s\n' /var/db/kiss/installed/*/
|
command -v brew && printf '%s\n' "$(brew --cellar)/"*
|
||||||
has brew && printf '%s\n' "$(brew --cellar)/"*
|
command -v emerge && printf '%s\n' /var/db/pkg/*/*/
|
||||||
has emerge && printf '%s\n' /var/db/pkg/*/*/
|
command -v pkgtool && printf '%s\n' /var/log/packages/*
|
||||||
has pkgtool && printf '%s\n' /var/log/packages/*
|
|
||||||
|
|
||||||
# 'nix' requires two commands.
|
# GUIX requires two commands.
|
||||||
has nix-store && {
|
command -v guix && {
|
||||||
|
guix package -p /run/current-system/profile -I
|
||||||
|
guix package -I
|
||||||
|
}
|
||||||
|
|
||||||
|
# NIX requires two commands.
|
||||||
|
command -v nix-store && {
|
||||||
nix-store -q --requisites /run/current-system/sw
|
nix-store -q --requisites /run/current-system/sw
|
||||||
nix-store -q --requisites ~.nix-profile
|
nix-store -q --requisites ~.nix-profile
|
||||||
}
|
}
|
||||||
@@ -460,28 +400,14 @@ get_pkgs() {
|
|||||||
|
|
||||||
Darwin*)
|
Darwin*)
|
||||||
# Commands which print packages one per line.
|
# Commands which print packages one per line.
|
||||||
has pkgin && pkgin list
|
command -v pkgin && pkgin list
|
||||||
|
command -v port && port installed
|
||||||
|
|
||||||
# Directories containing packages.
|
# Directories containing packages.
|
||||||
has brew && printf '%s\n' /usr/local/Cellar/*
|
command -v brew && printf '%s\n' /usr/local/Cellar/*
|
||||||
|
|
||||||
# 'port' prints a single line of output to 'stdout'
|
|
||||||
# when no packages are installed and exits with
|
|
||||||
# success causing a false-positive of 1 package
|
|
||||||
# installed.
|
|
||||||
#
|
|
||||||
# 'port' should really exit with a non-zero code
|
|
||||||
# in this case to allow scripts to cleanly handle
|
|
||||||
# this behavior.
|
|
||||||
has port && {
|
|
||||||
pkg_list=$(port installed)
|
|
||||||
|
|
||||||
[ "$pkg_list" = "No ports are installed." ] ||
|
|
||||||
printf '%s\n' "$pkg_list"
|
|
||||||
}
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
FreeBSD*|DragonFly*)
|
FreeBSD*)
|
||||||
pkg info
|
pkg info
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -496,15 +422,6 @@ get_pkgs() {
|
|||||||
Haiku)
|
Haiku)
|
||||||
printf '%s\n' /boot/system/package-links/*
|
printf '%s\n' /boot/system/package-links/*
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Minix)
|
|
||||||
printf '%s\n' /usr/pkg/var/db/pkg/*/
|
|
||||||
;;
|
|
||||||
|
|
||||||
SunOS)
|
|
||||||
has pkginfo && pkginfo -i
|
|
||||||
has pkg && pkg list
|
|
||||||
;;
|
|
||||||
esac | wc -l
|
esac | wc -l
|
||||||
`
|
`
|
||||||
|
|
||||||
@@ -513,14 +430,14 @@ get_pkgs() {
|
|||||||
|
|
||||||
get_memory() {
|
get_memory() {
|
||||||
case $os in
|
case $os in
|
||||||
# Used memory is calculated using the following "formula":
|
# Used memory is calculated using the following "formula" (Linux):
|
||||||
# MemUsed = MemTotal + Shmem - MemFree - Buffers - Cached - SReclaimable
|
# MemUsed = MemTotal + Shmem - MemFree - Buffers - Cached - SReclaimable
|
||||||
# Source: https://github.com/KittyKatt/screenFetch/issues/386
|
# Source: https://github.com/KittyKatt/screenFetch/issues/386
|
||||||
Linux*)
|
Linux*)
|
||||||
# Parse the '/proc/meminfo' file splitting on ':' and 'k'.
|
# Parse the '/proc/meminfo' file splitting on ':' and 'k'.
|
||||||
# The format of the file is 'key: 000kB' and an additional
|
# The format of the file is 'key: 000kB' and an additional
|
||||||
# split is used on 'k' to filter out 'kB'.
|
# split is used on 'k' to filter out 'kB'.
|
||||||
while IFS=':k ' read -r key val _; do
|
while IFS=:k read -r key val _; do
|
||||||
case $key in
|
case $key in
|
||||||
MemTotal)
|
MemTotal)
|
||||||
mem_used=$((mem_used + val))
|
mem_used=$((mem_used + val))
|
||||||
@@ -541,7 +458,7 @@ get_memory() {
|
|||||||
mem_full=$((mem_full / 1024))
|
mem_full=$((mem_full / 1024))
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# Used memory is calculated using the following "formula":
|
# Used memory is calculated using the following "formula" (MacOS):
|
||||||
# (wired + active + occupied) * 4 / 1024
|
# (wired + active + occupied) * 4 / 1024
|
||||||
Darwin*)
|
Darwin*)
|
||||||
mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
|
mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
|
||||||
@@ -551,7 +468,7 @@ get_memory() {
|
|||||||
# split is used on '.' to filter it out.
|
# split is used on '.' to filter it out.
|
||||||
while IFS=:. read -r key val; do
|
while IFS=:. read -r key val; do
|
||||||
case $key in
|
case $key in
|
||||||
*' wired'*|*' active'*|*' occupied'*)
|
*wired*|*active*|*occupied*)
|
||||||
mem_used=$((mem_used + ${val:-0}))
|
mem_used=$((mem_used + ${val:-0}))
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -591,9 +508,9 @@ get_memory() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# Used memory is calculated using the following "formula":
|
# Used memory is calculated using the following "formula" (FreeBSD):
|
||||||
# mem_full - ((inactive + free + cache) * page_size / 1024)
|
# (inactive_count + free_count + cache_count) * page_size / 1024
|
||||||
FreeBSD*|DragonFly*)
|
FreeBSD*)
|
||||||
mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
|
mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
|
||||||
|
|
||||||
# Use 'set --' to store the output of the command in the
|
# Use 'set --' to store the output of the command in the
|
||||||
@@ -615,7 +532,7 @@ get_memory() {
|
|||||||
# $2: vm.stats.vm.v_inactive_count
|
# $2: vm.stats.vm.v_inactive_count
|
||||||
# $3: vm.stats.vm.v_free_count
|
# $3: vm.stats.vm.v_free_count
|
||||||
# $4: vm.stats.vm.v_cache_count
|
# $4: vm.stats.vm.v_cache_count
|
||||||
mem_used=$((mem_full - (($2 + $3 + $4) * $1 / 1024 / 1024)))
|
mem_used=$((($2 + $3 + $4) * $1 / 1024 / 1024))
|
||||||
;;
|
;;
|
||||||
|
|
||||||
NetBSD*)
|
NetBSD*)
|
||||||
@@ -623,7 +540,7 @@ get_memory() {
|
|||||||
|
|
||||||
# NetBSD implements a lot of the Linux '/proc' filesystem,
|
# NetBSD implements a lot of the Linux '/proc' filesystem,
|
||||||
# this uses the same parser as the Linux memory detection.
|
# this uses the same parser as the Linux memory detection.
|
||||||
while IFS=':k ' read -r key val _; do
|
while IFS=:k read -r key val _; do
|
||||||
case $key in
|
case $key in
|
||||||
MemFree)
|
MemFree)
|
||||||
mem_free=$((val / 1024))
|
mem_free=$((val / 1024))
|
||||||
@@ -650,182 +567,135 @@ get_memory() {
|
|||||||
mem_used=$((mem_used / 1024 / 1024))
|
mem_used=$((mem_used / 1024 / 1024))
|
||||||
mem_full=$((mem_full / 1024 / 1024))
|
mem_full=$((mem_full / 1024 / 1024))
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Minix)
|
|
||||||
# Minix includes the '/proc' filesystem though the format
|
|
||||||
# differs from Linux. The '/proc/meminfo' file is only a
|
|
||||||
# single line with space separated elements and elements
|
|
||||||
# 2 and 3 contain the total and free memory numbers.
|
|
||||||
read -r _ mem_full mem_free _ < /proc/meminfo
|
|
||||||
|
|
||||||
mem_used=$(((mem_full - mem_free) / 1024))
|
|
||||||
mem_full=$(( mem_full / 1024))
|
|
||||||
;;
|
|
||||||
|
|
||||||
SunOS)
|
|
||||||
hw_pagesize=$(pagesize)
|
|
||||||
|
|
||||||
# 'kstat' outputs memory in the following format:
|
|
||||||
# unix:0:system_pages:pagestotal 1046397
|
|
||||||
# unix:0:system_pages:pagesfree 885018
|
|
||||||
#
|
|
||||||
# This simply uses the first "element" (white-space
|
|
||||||
# separated) as the key and the second element as the
|
|
||||||
# value.
|
|
||||||
#
|
|
||||||
# A variable is then assigned based on the key.
|
|
||||||
while read -r key val; do
|
|
||||||
case $key in
|
|
||||||
*total) pages_full=$val ;;
|
|
||||||
*free) pages_free=$val ;;
|
|
||||||
esac
|
|
||||||
done <<-EOF
|
|
||||||
$(kstat -p unix:0:system_pages:pagestotal \
|
|
||||||
unix:0:system_pages:pagesfree)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
mem_full=$((pages_full * hw_pagesize / 1024 / 1024))
|
|
||||||
mem_free=$((pages_free * hw_pagesize / 1024 / 1024))
|
|
||||||
mem_used=$((mem_full - mem_free))
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
|
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
get_wm() {
|
get_term() {
|
||||||
case $os in
|
# Workaround for macOS systems that don't support the
|
||||||
# Don't display window manager on macOS.
|
# "algorithm" of obtaining the terminal program name.
|
||||||
Darwin*) ;;
|
#
|
||||||
|
# This also doubles as a means of allowing the user to
|
||||||
*)
|
# set whatever value they like here through the
|
||||||
# xprop can be used to grab the window manager's properties
|
# '$TERM_PROGRAM' environment variable.
|
||||||
# which contains the window manager's name under '_NET_WM_NAME'.
|
case $TERM_PROGRAM in
|
||||||
#
|
iTerm.app) term=iTerm2 ;;
|
||||||
# The upside to using 'xprop' is that you don't need to hardcode
|
Terminal.app) term='Apple Terminal' ;;
|
||||||
# a list of known window manager names. The downside is that
|
Hyper) term=HyperTerm ;;
|
||||||
# not all window managers conform to setting the '_NET_WM_NAME'
|
*) term=${TERM_PROGRAM%%.app} ;;
|
||||||
# atom..
|
|
||||||
#
|
|
||||||
# List of window managers which fail to set the name atom:
|
|
||||||
# catwm, fvwm, dwm, 2bwm and monster.
|
|
||||||
#
|
|
||||||
# The final downside to this approach is that it does _not_
|
|
||||||
# support Wayland environments. The only solution which supports
|
|
||||||
# Wayland is the 'ps' parsing mentioned below.
|
|
||||||
#
|
|
||||||
# A more naive implementation is to parse the last line of
|
|
||||||
# '~/.xinitrc' to extract the second white-space separated
|
|
||||||
# element.
|
|
||||||
#
|
|
||||||
# The issue with an approach like this is that this line data
|
|
||||||
# does not always equate to the name of the window manager and
|
|
||||||
# could in theory be _anything_.
|
|
||||||
#
|
|
||||||
# This also fails when the user launches xorg through a display
|
|
||||||
# manager or other means.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Another naive solution is to parse 'ps' with a hardcoded list
|
|
||||||
# of window managers to detect the current window manager (based
|
|
||||||
# on what is running).
|
|
||||||
#
|
|
||||||
# The issue with this approach is the need to hardcode and
|
|
||||||
# maintain a list of known window managers.
|
|
||||||
#
|
|
||||||
# Another issue is that process names do not always equate to
|
|
||||||
# the name of the window manager. False-positives can happen too.
|
|
||||||
#
|
|
||||||
# This is the only solution which supports Wayland based
|
|
||||||
# environments sadly. It'd be nice if some kind of standard were
|
|
||||||
# established to identify Wayland environments.
|
|
||||||
#
|
|
||||||
# pfetch's goal is to remain _simple_, if you'd like a "full"
|
|
||||||
# implementation of window manager detection use 'neofetch'.
|
|
||||||
#
|
|
||||||
# Neofetch use a combination of 'xprop' and 'ps' parsing to
|
|
||||||
# support all window managers (including non-conforming and
|
|
||||||
# Wayland) though it's a lot more complicated!
|
|
||||||
|
|
||||||
# Don't display window manager if X isn't running.
|
|
||||||
[ "$DISPLAY" ] || return
|
|
||||||
|
|
||||||
# This is a two pass call to xprop. One call to get the window
|
|
||||||
# manager's ID and another to print its properties.
|
|
||||||
command -v xprop && {
|
|
||||||
# The output of the ID command is as follows:
|
|
||||||
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
|
|
||||||
#
|
|
||||||
# To extract the ID, everything before the last space
|
|
||||||
# is removed.
|
|
||||||
id=$(xprop -root -notype _NET_SUPPORTING_WM_CHECK)
|
|
||||||
id=${id##* }
|
|
||||||
|
|
||||||
# The output of the property command is as follows:
|
|
||||||
# _NAME 8t
|
|
||||||
# _NET_WM_PID = 252
|
|
||||||
# _NET_WM_NAME = "bspwm"
|
|
||||||
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
|
|
||||||
# WM_CLASS = "wm", "Bspwm"
|
|
||||||
#
|
|
||||||
# To extract the name, everything before '_NET_WM_NAME = \"'
|
|
||||||
# is removed and everything after the next '"' is removed.
|
|
||||||
wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t)
|
|
||||||
|
|
||||||
# Handle cases of a window manager _not_ populating the
|
|
||||||
# '_NET_WM_NAME' atom. Display nothing in this case.
|
|
||||||
case $wm in
|
|
||||||
*'_NET_WM_NAME = '*)
|
|
||||||
wm=${wm##*_NET_WM_NAME = \"}
|
|
||||||
wm=${wm%%\"*}
|
|
||||||
;;
|
|
||||||
|
|
||||||
*) wm= ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
log wm "$wm" >&6
|
# Special case for TosWin2 (FreeMiNT) which doesn't
|
||||||
}
|
# support the "algorithm" of obtaining the terminal
|
||||||
|
# program name.
|
||||||
|
[ "$TERM" = tw52 ] || [ "$TERM" = tw100 ] &&
|
||||||
|
term=TosWin2
|
||||||
|
|
||||||
|
# Special case for when 'pfetch' is run over SSH.
|
||||||
|
[ "$SSH_CONNECTION" ] &&
|
||||||
|
term=$SSH_TTY
|
||||||
|
|
||||||
get_de() {
|
# This surprisingly reliable method of detecting the current
|
||||||
# This only supports Xorg related desktop environments though
|
# terminal emulator is kinda neat.
|
||||||
# this is fine as knowing the desktop envrionment on Windows,
|
|
||||||
# macOS etc is useless (they'll always report the same value).
|
|
||||||
#
|
#
|
||||||
# Display the value of '$XDG_CURRENT_DESKTOP', if it's empty,
|
# It works by looping through each parent of each process
|
||||||
# display the value of '$DESKTOP_SESSION'.
|
# starting with '$PPID' (the parent process ID) until we
|
||||||
log de "${XDG_CURRENT_DESKTOP:-$DESKTOP_SESSION}" >&6
|
# find a match or hit PID 1 (init).
|
||||||
|
#
|
||||||
|
# On each iteration the name of the current parent process
|
||||||
|
# is checked against a list of good values and bad values.
|
||||||
|
# If no match is found we check the parent of the parent
|
||||||
|
# and so on.
|
||||||
|
#
|
||||||
|
# Using this method *no* terminal emulator names are
|
||||||
|
# hardcoded and the list remains small and general. In short
|
||||||
|
# it's basically a list of what *isn't* a terminal emulator
|
||||||
|
# and a list of places we should *stop*.
|
||||||
|
while [ -z "$term" ]; do
|
||||||
|
# This block is OS-specific and handles the fetching of
|
||||||
|
# the parent process (of the parent) and the fetching of
|
||||||
|
# said process' name.
|
||||||
|
case $os in
|
||||||
|
Linux*)
|
||||||
|
# On Linux some implementation of 'ps' aren't POSIX
|
||||||
|
# compliant, thankfully Linux provides this information
|
||||||
|
# though the '/proc' filesystem.
|
||||||
|
#
|
||||||
|
# This loops line by line over the '/proc/PID/status'
|
||||||
|
# file splitting at ':' and '<TAB>', we then look for
|
||||||
|
# the key containing 'PPid' and grab the value.
|
||||||
|
while IFS=': ' read -r key val; do
|
||||||
|
case $key in
|
||||||
|
PPid)
|
||||||
|
ppid=$val
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < "/proc/${ppid:-$PPID}/status"
|
||||||
|
|
||||||
|
# Get the name of the parent process.
|
||||||
|
read -r name < "/proc/$ppid/comm"
|
||||||
|
;;
|
||||||
|
|
||||||
|
Windows*)
|
||||||
|
# I need some assistance to add Windows support
|
||||||
|
# as the 'ps' command used in MINGW, MSYS and CYGWIN
|
||||||
|
# isn't POSIX compliant(?).
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
# POSIX compliant 'ps' makes this really easy,
|
||||||
|
# just two simple commands to grab the parent
|
||||||
|
# process ID and the ID's name.
|
||||||
|
ppid=$(ps -p "${ppid:-$PPID}" -o ppid=)
|
||||||
|
name=$(ps -p "$ppid" -o comm=)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Check the parent process name against a list of good and bad
|
||||||
|
# values. On a bad value we either keep iterating up the parent
|
||||||
|
# process list or we stop altogether (PID 1 for example).
|
||||||
|
case $name in
|
||||||
|
# If the parent process name matches the user's shell (or
|
||||||
|
# anything that looks like a shell), do another iteration.
|
||||||
|
#
|
||||||
|
# This also includes 'screen' and anything that looks like
|
||||||
|
# 'su' or 'sudo'.
|
||||||
|
${SHELL##*/} | *sh | screen | su* ) ;;
|
||||||
|
|
||||||
|
# If the parent process name matches 'login', 'init' or
|
||||||
|
# '*Login*' we're most likely in the TTY and not a graphical
|
||||||
|
# session. In this case 'term' is set to the current TTY and
|
||||||
|
# we end here.
|
||||||
|
login* | *Login* | init)
|
||||||
|
term=$(tty)
|
||||||
|
;;
|
||||||
|
|
||||||
|
# If the parent process name matches anything in this list
|
||||||
|
# we can no longer continue. We've either hit PID 1 or a parent
|
||||||
|
# which *won't* lead to the terminal emulator's PID.
|
||||||
|
ruby | systemd | python* | 1 | sshd* | tmux* |\
|
||||||
|
USER*PID* | kdeinit* | launchd* | '' )
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
|
||||||
|
# If none of the above have matched we've reached the terminal
|
||||||
|
# emulator's PID and we can end here.
|
||||||
|
*)
|
||||||
|
term=${name##*/}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
[ "$term" ] && log term "$term" >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
get_shell() {
|
get_shell() {
|
||||||
# Display the basename of the '$SHELL' environment variable.
|
|
||||||
log shell "${SHELL##*/}" >&6
|
log shell "${SHELL##*/}" >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
get_editor() {
|
|
||||||
# Display the value of '$VISUAL', if it's empty, display the
|
|
||||||
# value of '$EDITOR'.
|
|
||||||
log editor "${VISUAL:-$EDITOR}" >&6
|
|
||||||
}
|
|
||||||
|
|
||||||
get_palette() {
|
|
||||||
# Print the first 8 terminal colors. This uses the existing
|
|
||||||
# sequences to change text color with a sequence prepended
|
|
||||||
# to reverse the foreground and background colors.
|
|
||||||
#
|
|
||||||
# This allows us to save hardcoding a second set of sequences
|
|
||||||
# for background colors.
|
|
||||||
palette=" [7m$c1 $c2 $c3 $c4 $c5 $c6 $c7 "
|
|
||||||
|
|
||||||
# Print the palette with a newline before and after.
|
|
||||||
# The '\033[%sC' moves the text to the right, the
|
|
||||||
# length of the ascii art.
|
|
||||||
printf '\n[%sC%s[m\n' "${ascii_width-1}" "$palette" >&6
|
|
||||||
}
|
|
||||||
|
|
||||||
get_ascii() {
|
get_ascii() {
|
||||||
# This is a simple function to read the contents of
|
# This is a simple function to read the contents of
|
||||||
# an ascii file from 'stdin'. It allows for the use
|
# an ascii file from 'stdin'. It allows for the use
|
||||||
@@ -874,26 +744,15 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Aa]ndroid*)
|
|
||||||
read_ascii 2 <<-EOF
|
|
||||||
${c2} ;, ,;
|
|
||||||
';,.-----.,;'
|
|
||||||
,' ',
|
|
||||||
/ O O \\
|
|
||||||
| |
|
|
||||||
'-----------------'
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
|
|
||||||
[Aa]rch*)
|
[Aa]rch*)
|
||||||
read_ascii 4 <<-EOF
|
read_ascii 4 <<-EOF
|
||||||
${c6} /\\
|
${c6} /\\
|
||||||
/ \\
|
/^^\\
|
||||||
/\\ \\
|
/\\ \\
|
||||||
${c4} / \\
|
/${c7} __ \\
|
||||||
/ ,, \\
|
/ ( ) \\
|
||||||
/ | | -\\
|
/ __| |__\\\\
|
||||||
/_-'' ''-_\\
|
/// \\\\\\
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -944,18 +803,6 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Dd]ragon[Ff]ly*)
|
|
||||||
read_ascii 1 <<-EOF
|
|
||||||
,${c1}_${c7},
|
|
||||||
('-_${c1}|${c7}_-')
|
|
||||||
>--${c1}|${c7}--<
|
|
||||||
(_-'${c1}|${c7}'-_)
|
|
||||||
${c1}|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
|
|
||||||
[Ee]lementary*)
|
[Ee]lementary*)
|
||||||
read_ascii <<-EOF
|
read_ascii <<-EOF
|
||||||
${c7} _______
|
${c7} _______
|
||||||
@@ -982,12 +829,13 @@ get_ascii() {
|
|||||||
|
|
||||||
[Ff]ree[Bb][Ss][Dd]*)
|
[Ff]ree[Bb][Ss][Dd]*)
|
||||||
read_ascii 1 <<-EOF
|
read_ascii 1 <<-EOF
|
||||||
${c1}/\\,-'''''-,/\\
|
${c1} /\\ _____ /\\
|
||||||
\\_) (_/
|
\\_) (_/
|
||||||
|
/ \\
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
; ;
|
\ /
|
||||||
'-_____-'
|
--_____--
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -1003,7 +851,7 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Gg]uix[Ss][Dd]*|[Gg]uix*)
|
[Gg]uix[Ss][Dd]*|guix*)
|
||||||
read_ascii 3 <<-EOF
|
read_ascii 3 <<-EOF
|
||||||
${c3}|.__ __.|
|
${c3}|.__ __.|
|
||||||
|__ \\ / __|
|
|__ \\ / __|
|
||||||
@@ -1040,7 +888,7 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Ll]inux*[Ll]ite*|[Ll]ite*)
|
[Ll]inux*[Ll]ite*)
|
||||||
read_ascii 3 <<-EOF
|
read_ascii 3 <<-EOF
|
||||||
${c3} /\\
|
${c3} /\\
|
||||||
/ \\
|
/ \\
|
||||||
@@ -1113,19 +961,6 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Mm]inix*)
|
|
||||||
read_ascii 4 <<-EOF
|
|
||||||
${c4} ,, ,,
|
|
||||||
;${c7},${c4} ', ,' ${c7},${c4};
|
|
||||||
; ${c7}',${c4} ',,' ${c7},'${c4} ;
|
|
||||||
; ${c7}',${c4} ${c7},'${c4} ;
|
|
||||||
; ${c7};, '' ,;${c4} ;
|
|
||||||
; ${c7};${c4};${c7}',,'${c4};${c7};${c4} ;
|
|
||||||
', ${c7};${c4};; ;;${c7};${c4} ,'
|
|
||||||
'${c7};${c4}' '${c7};${c4}'
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
|
|
||||||
[Mm][Xx]*)
|
[Mm][Xx]*)
|
||||||
read_ascii <<-EOF
|
read_ascii <<-EOF
|
||||||
${c7} \\\\ /
|
${c7} \\\\ /
|
||||||
@@ -1174,7 +1009,7 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Oo]penSUSE*|[Oo]pen*SUSE*|SUSE*|suse*)
|
openSUSE*|open*SUSE*|SUSE*|suse*)
|
||||||
read_ascii 2 <<-EOF
|
read_ascii 2 <<-EOF
|
||||||
${c2} _______
|
${c2} _______
|
||||||
__| __ \\
|
__| __ \\
|
||||||
@@ -1233,27 +1068,6 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Ss]un[Oo][Ss]|[Ss]olaris*)
|
|
||||||
read_ascii 3 <<-EOF
|
|
||||||
${c3} . .; .
|
|
||||||
. :; :: ;: .
|
|
||||||
.;. .. .. .;.
|
|
||||||
.. .. .. ..
|
|
||||||
.;, ,;.
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
|
|
||||||
[Uu]buntu*)
|
|
||||||
read_ascii 3 <<-EOF
|
|
||||||
${c3} _
|
|
||||||
---(_)
|
|
||||||
_/ --- \\
|
|
||||||
(_) | |
|
|
||||||
\\ --- _/
|
|
||||||
---(_)
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
|
|
||||||
[Vv]oid*)
|
[Vv]oid*)
|
||||||
read_ascii 2 <<-EOF
|
read_ascii 2 <<-EOF
|
||||||
${c2} _______
|
${c2} _______
|
||||||
@@ -1290,12 +1104,8 @@ get_ascii() {
|
|||||||
# information. The 'sed' is used to strip '[3Xm' color codes from
|
# information. The 'sed' is used to strip '[3Xm' color codes from
|
||||||
# the ascii art so they don't affect the width variable.
|
# the ascii art so they don't affect the width variable.
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
ascii_height=$((${ascii_height:-0} + 1))
|
: $((ascii_height+=1))
|
||||||
|
ascii_width=$((${#line} > ascii_width ? ${#line} : ascii_width))
|
||||||
# This was a ternary operation but they aren't supported in
|
|
||||||
# Minix's shell.
|
|
||||||
[ "${#line}" -gt "${ascii_width:-0}" ] &&
|
|
||||||
ascii_width=${#line}
|
|
||||||
|
|
||||||
# Using '<<-EOF' is the only way to loop over a command's
|
# Using '<<-EOF' is the only way to loop over a command's
|
||||||
# output without the use of a pipe ('|').
|
# output without the use of a pipe ('|').
|
||||||
@@ -1306,17 +1116,24 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Add a gap between the ascii art and the information.
|
# Add a gap between the ascii art and the information.
|
||||||
ascii_width=$((ascii_width + 4))
|
: $((ascii_width+=4))
|
||||||
|
|
||||||
# Print the ascii art and position the cursor back where we
|
# Print the ascii art and position the cursor back where we
|
||||||
# started prior to printing it.
|
# started prior to printing it.
|
||||||
|
# '[?7l': Disable line-wrapping.
|
||||||
|
# '[?25l': Hide the cursor.
|
||||||
# '[1m': Print the ascii in bold.
|
# '[1m': Print the ascii in bold.
|
||||||
# '[m': Clear bold.
|
# '[m': Clear bold.
|
||||||
# '[%sA': Move the cursor up '$ascii_height' amount of lines.
|
# '[%sA': Move the cursor up '$ascii_height' amount of lines.
|
||||||
printf '[1m%s[m[%sA' "$ascii" "$ascii_height" >&6
|
printf '[?7l[?25l[1m%s[m[%sA' "$ascii" "$ascii_height" >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
|
# Leave the terminal how we found it on exit or Ctrl+C.
|
||||||
|
# '[?7h': Enable line-wrapping.
|
||||||
|
# '[?25h': Un-hide the cursor.
|
||||||
|
trap 'printf [?7h[?25h >&6' EXIT
|
||||||
|
|
||||||
# Hide 'stderr' unless the first argument is '-v'. This saves
|
# Hide 'stderr' unless the first argument is '-v'. This saves
|
||||||
# polluting the script with '2>/dev/null'.
|
# polluting the script with '2>/dev/null'.
|
||||||
[ "$1" = -v ] || exec 2>/dev/null
|
[ "$1" = -v ] || exec 2>/dev/null
|
||||||
@@ -1335,26 +1152,6 @@ main() {
|
|||||||
c7='[37m'; c8='[38m'
|
c7='[37m'; c8='[38m'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Avoid text-wrapping from wrecking the program output
|
|
||||||
# and hide the cursor to hide its moving around during
|
|
||||||
# the printing process.
|
|
||||||
#
|
|
||||||
# Some terminals don't support these sequences, nor do they
|
|
||||||
# silently conceal them if they're printed resulting in
|
|
||||||
# partial sequences being printed to the terminal!
|
|
||||||
[ "$TERM" = dumb ] ||
|
|
||||||
[ "$TERM" = minix ] ||
|
|
||||||
[ "$TERM" = cons25 ] || {
|
|
||||||
# '[?7l': Disable line-wrapping.
|
|
||||||
# '[?25l': Hide the cursor.
|
|
||||||
printf '[?7l[?25l' >&6
|
|
||||||
|
|
||||||
# Leave the terminal how we found it on exit or Ctrl+C.
|
|
||||||
# '[?7h': Enable line-wrapping.
|
|
||||||
# '[?25h': Show the cursor.
|
|
||||||
trap 'printf [?7h[?25h >&6' EXIT
|
|
||||||
}
|
|
||||||
|
|
||||||
# Store the output of 'uname' to avoid calling it multiple times
|
# Store the output of 'uname' to avoid calling it multiple times
|
||||||
# throughout the script. 'read <<EOF' is the simplest way of reading
|
# throughout the script. 'read <<EOF' is the simplest way of reading
|
||||||
# a command into a list of variables.
|
# a command into a list of variables.
|
||||||
@@ -1373,22 +1170,18 @@ main() {
|
|||||||
# Disable globbing and set the positional parameters to the
|
# Disable globbing and set the positional parameters to the
|
||||||
# contents of 'PF_INFO'.
|
# contents of 'PF_INFO'.
|
||||||
set -f
|
set -f
|
||||||
set +f ${PF_INFO-ascii title os host kernel uptime pkgs memory}
|
set +f ${PF_INFO-ascii title os host kernel term uptime pkgs memory}
|
||||||
|
|
||||||
# Iterate over the info functions to determine the lengths of the
|
# Iterate over the info functions to determine the lengths of the
|
||||||
# "info names" for output alignment. The option names and subtitles
|
# "info names" for output alignment. The option names and subtitles
|
||||||
# match 1:1 so this is thankfully simple.
|
# match 1:1 so this is thankfully simple.
|
||||||
for info; do
|
for info; do
|
||||||
command -v "get_$info" >/dev/null || continue
|
command -v "get_$info" >/dev/null &&
|
||||||
|
info_length=$((${#info} > info_length ? ${#info} : info_length))
|
||||||
# This was a ternary operation but they aren't supported in
|
|
||||||
# Minix's shell.
|
|
||||||
[ "${#info}" -gt "${info_length:-0}" ] &&
|
|
||||||
info_length=${#info}
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Add an additional space of length to act as a gap.
|
# Add an additional space of length to act as a gap.
|
||||||
info_length=$((info_length + 1))
|
: $((info_length+=1))
|
||||||
|
|
||||||
# Iterate over the above list and run any existing "get_" functions.
|
# Iterate over the above list and run any existing "get_" functions.
|
||||||
for info; do "get_$info"; done
|
for info; do "get_$info"; done
|
||||||
@@ -1396,19 +1189,15 @@ main() {
|
|||||||
|
|
||||||
# Position the cursor below both the ascii art and information lines
|
# Position the cursor below both the ascii art and information lines
|
||||||
# according to the height of both. If the information exceeds the ascii
|
# according to the height of both. If the information exceeds the ascii
|
||||||
# art in height, don't touch the cursor (0/unset), else move it down
|
# art in height, don't touch the cursor, else move it down N lines.
|
||||||
# N lines.
|
cursor_pos=$((info_height > ascii_height ? 0 : ascii_height - info_height))
|
||||||
#
|
|
||||||
# This was a ternary operation but they aren't supported in Minix's shell.
|
|
||||||
[ "${info_height:-0}" -lt "${ascii_height:-0}" ] &&
|
|
||||||
cursor_pos=$((ascii_height - info_height))
|
|
||||||
|
|
||||||
# Print '$cursor_pos' amount of newlines to correctly position the
|
# Print '$cursor_pos' amount of newlines to correctly position the
|
||||||
# cursor. This used to be a 'printf $(seq X X)' however 'seq' is only
|
# cursor. This used to be a 'printf $(seq X X)' however 'seq' is only
|
||||||
# typically available (by default) on GNU based systems!
|
# typically available (by default) on GNU based systems!
|
||||||
while [ "${i:=0}" -le "${cursor_pos:-0}" ]; do
|
while [ "${i:-0}" -le "$cursor_pos" ]; do
|
||||||
printf '\n'
|
printf '\n'
|
||||||
i=$((i + 1))
|
: $((i+=1))
|
||||||
done >&6
|
done >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user