28 Commits

Author SHA1 Message Date
Dylan Araps
8b9c409650 macOS: fix memory issue 2019-10-03 21:06:51 +03:00
Dylan Araps
52617b2e6e arch: new logo 2019-10-03 18:34:32 +03:00
Dylan Araps
77dce6a678 freebsd: better ascii 2019-10-03 13:59:36 +03:00
Dylan Araps
812f9ef231 docs: update 2019-10-03 12:30:25 +03:00
Dylan Araps
87effdbc5a host: add another dummy word 2019-10-03 12:29:31 +03:00
Dylan Araps
3f5845e20c pfetch: android support 2019-10-03 10:18:34 +03:00
Dylan Araps
c94e2c5d9d wm: handle non-matches 2019-10-02 15:36:09 +03:00
Dylan Araps
d8d8899ad2 macOS: Fix port false positive 2019-10-01 23:24:26 +03:00
Dylan Araps
1ff17055b9 pfetch: fix bug 2019-10-01 15:09:43 +03:00
Dylan Araps
d1d3b7b740 pfetch: fix bug 2019-10-01 15:07:50 +03:00
Dylan Araps
9564246e6c pfetch: fix bug 2019-10-01 15:06:37 +03:00
Dylan Araps
08d9834854 pfetch: fix bug 2019-10-01 15:05:42 +03:00
Dylan Araps
b7c7bc6c4c pfetch: fix bug 2019-10-01 15:03:56 +03:00
Dylan Araps
11d1c2e789 docs: update 2019-10-01 11:19:52 +03:00
Dylan Araps
55408239db docs: update 2019-10-01 11:19:32 +03:00
Dylan Araps
35ae795068 docs: update 2019-10-01 11:18:59 +03:00
Dylan Araps
e1228975fd docs: update 2019-10-01 11:17:57 +03:00
Dylan Araps
4d1be75c20 docs: update 2019-10-01 11:13:45 +03:00
Dylan Araps
8d1ab2d0dd docs: update 2019-10-01 11:13:13 +03:00
Dylan Araps
301c52dd5f docs: update 2019-10-01 11:12:55 +03:00
Dylan Araps
0d1a340ef2 docs: update 2019-10-01 11:12:16 +03:00
Dylan Araps
49a3db1653 docs: update 2019-10-01 11:03:39 +03:00
Dylan Araps
d828d1e718 docs: update 2019-10-01 11:02:48 +03:00
Dylan Araps
9963de75d5 docs: update 2019-10-01 11:02:31 +03:00
Dylan Araps
3e58031fe0 docs: update 2019-10-01 11:01:38 +03:00
Dylan Araps
405fc20eef docs: update 2019-10-01 11:00:58 +03:00
Dylan Araps
133d63137c docs: update 2019-10-01 11:00:01 +03:00
Dylan Araps
3686c06238 docs: update 2019-10-01 10:59:35 +03:00
2 changed files with 80 additions and 126 deletions

View File

@@ -1,80 +1,42 @@
# pfetch <p align="center"><img src="https://user-images.githubusercontent.com/6799467/65944518-68834d80-e421-11e9-9b14-6ca26a16108a.png" width="350px"></p>
<h1 align="center">pfetch</h1>
<p align="center">A pretty system information tool written in POSIX sh</p><br>
A pretty system information tool written in POSIX `sh`. <img src="https://user-images.githubusercontent.com/6799467/65945384-5bfff480-e423-11e9-863e-4e7cf16eb648.png" width="40%" align="right">
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*). 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*).
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. 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.
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"! 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"!
```sh <br>
➜ pfetch <br>
___ goldie@KISS <br>
(| os KISS Linux <br>
(<> | host Lenovo YOGA 900-13ISK
/ __ \ kernel 5.3.1-coffee
( / \ /| uptime 6h 20m
_/\ __)/_) pkgs 130
\/-____\/ memory 1721M / 7942M
```
## OS support ## OS support
- **Linux**
- 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.
- All other distributions are supported with a generic penguin logo.
- **Android**
- **BSD**
- DragonflyBSD, FreeBSD, NetBSD and OpenBSD.
- **Windows**
- Windows subsystem for Linux.
- **Haiku** - **Haiku**
- **MacOS** - **MacOS**
- **Minix** - **Minix**
- **Solaris** - **Solaris**
- **BSD**
- DragonflyBSD
- FreeBSD
- NetBSD
- OpenBSD
- **Windows**
- Windows subsystem for Linux.
- **Linux**
- 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
- Void Linux
- Other distributions are supported with a generic penguin logo.
## TODO
- [ ] Add optional and additional information detection.
- [ ] Terminal Emulator ([#12](https://github.com/dylanaraps/pfetch/pull/12))
- The way I implement this in `neofetch` is interesting.
- [ ] Expand operating system support.
- [ ] Android
- [ ] iOS
- [ ] 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
## Configuration ## Configuration

114
pfetch
View File

@@ -129,7 +129,7 @@ get_os() {
case $os in case $os in
Linux*) Linux*)
# Some Linux disttributions (which are based on others) # Some Linux distributions (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,6 +154,12 @@ 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 # This used to be a simple '. /etc/os-release' but I believe
# this is insecure as we blindly executed whatever was in the # this is insecure as we blindly executed whatever was in the
@@ -261,19 +267,6 @@ get_os() {
IFS='(' read -r distro _ < /etc/release IFS='(' read -r distro _ < /etc/release
;; ;;
CYGWIN*|MSYS*|MINGW*)
# Grab everything after the first instance of
# white-space in the command output of 'wmic'.
#
# The format of 'wmic' is as follows:
# Caption=Microsoft Windows 7 Enterprise
#
# This extracts: ^^^^^^^^^^^^^^^^^^^^
read -r _ distro <<-EOF
$(wmic os get Caption /value)
EOF
;;
*) *)
# Catch all to ensure '$distro' is never blank. # Catch all to ensure '$distro' is never blank.
# This also handles the BSDs. # This also handles the BSDs.
@@ -320,21 +313,6 @@ get_host() {
*BSD*) *BSD*)
host=$(sysctl -n hw.vendor hw.product) host=$(sysctl -n hw.vendor hw.product)
;; ;;
CYGWIN*|MSYS*|MINGW*)
# Grab everything after the first instance of '=' in each
# line of the command output of 'wmic'. Append the output
# of each line to the '$host' variable.
#
# The format of 'wmic' is as follows:
# Manufacturer=VMware, Inc.
# Model=VMware Virtual Platform
while IFS='=' read -r _ val; do
host="${host}${val:+ $val}"
done <<-EOF
$(wmic computersystem get manufacturer,model /value)
EOF
;;
esac esac
# Turn the host string into an argument list so we can iterate # Turn the host string into an argument list so we can iterate
@@ -367,7 +345,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> ) Version | Undefined | Default | string | INVALID | <20> | os )
continue continue
;; ;;
esac esac
@@ -384,7 +362,7 @@ 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*|CYGWIN*|MSYS*|MINGW*) Linux*|Minix*)
IFS=. read -r s _ < /proc/uptime IFS=. read -r s _ < /proc/uptime
;; ;;
@@ -483,10 +461,24 @@ get_pkgs() {
Darwin*) Darwin*)
# Commands which print packages one per line. # Commands which print packages one per line.
has pkgin && pkgin list has pkgin && pkgin list
has port && port installed
# Directories containing packages. # Directories containing packages.
has brew && printf '%s\n' /usr/local/Cellar/* has 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*|DragonFly*)
@@ -513,14 +505,6 @@ get_pkgs() {
has pkginfo && pkginfo -i has pkginfo && pkginfo -i
has pkg && pkg list has pkg && pkg list
;; ;;
CYGWIN*)
cygcheck -cd
;;
MSYS*)
pacman -Qq
;;
esac | wc -l esac | wc -l
` `
@@ -532,7 +516,7 @@ get_memory() {
# Used memory is calculated using the following "formula": # Used memory is calculated using the following "formula":
# 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*|CYGWIN*|MSYS*|MINGW*) 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'.
@@ -567,7 +551,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
@@ -787,8 +771,17 @@ get_wm() {
# To extract the name, everything before '_NET_WM_NAME = \"' # To extract the name, everything before '_NET_WM_NAME = \"'
# is removed and everything after the next '"' is removed. # is removed and everything after the next '"' is removed.
wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t) wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t)
wm=${wm##*_NET_WM_NAME = \"}
wm=${wm%%\"*} # 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
@@ -894,13 +887,13 @@ get_ascii() {
[Aa]rch*) [Aa]rch*)
read_ascii 4 <<-EOF read_ascii 4 <<-EOF
${c6} /\\ ${c6} /\\
/^^\\ / \\
/\\ \\ /\\ \\
/${c7} __ \\ ${c4} / \\
/ ( ) \\ / ,, \\
/ __| |__\\\\ / | | -\\
/// \\\\\\ /_-'' ''-_\\
EOF EOF
;; ;;
@@ -989,13 +982,12 @@ get_ascii() {
[Ff]ree[Bb][Ss][Dd]*) [Ff]ree[Bb][Ss][Dd]*)
read_ascii 1 <<-EOF read_ascii 1 <<-EOF
${c1} /\\ _____ /\\ ${c1}/\\,-'''''-,/\\
\\_) (_/ \\_) (_/
/ \\
| | | |
| | | |
\ / ; ;
--_____-- '-_____-'
EOF EOF
;; ;;
@@ -1011,7 +1003,7 @@ get_ascii() {
EOF EOF
;; ;;
[Gg]uix[Ss][Dd]*|guix*) [Gg]uix[Ss][Dd]*|[Gg]uix*)
read_ascii 3 <<-EOF read_ascii 3 <<-EOF
${c3}|.__ __.| ${c3}|.__ __.|
|__ \\ / __| |__ \\ / __|
@@ -1048,7 +1040,7 @@ get_ascii() {
EOF EOF
;; ;;
[Ll]inux*[Ll]ite*) [Ll]inux*[Ll]ite*|[Ll]ite*)
read_ascii 3 <<-EOF read_ascii 3 <<-EOF
${c3} /\\ ${c3} /\\
/ \\ / \\
@@ -1182,7 +1174,7 @@ get_ascii() {
EOF EOF
;; ;;
openSUSE*|open*SUSE*|SUSE*|suse*) [Oo]penSUSE*|[Oo]pen*SUSE*|SUSE*|suse*)
read_ascii 2 <<-EOF read_ascii 2 <<-EOF
${c2} _______ ${c2} _______
__| __ \\ __| __ \\
@@ -1241,7 +1233,7 @@ get_ascii() {
EOF EOF
;; ;;
[Ss]un[Oo][Ss]) [Ss]un[Oo][Ss]|[Ss]olaris*)
read_ascii 3 <<-EOF read_ascii 3 <<-EOF
${c3} . .; . ${c3} . .; .
. :; :: ;: . . :; :: ;: .
@@ -1408,7 +1400,7 @@ main() {
# N lines. # N lines.
# #
# This was a ternary operation but they aren't supported in Minix's shell. # This was a ternary operation but they aren't supported in Minix's shell.
[ "$info_height" -lt "$ascii_height" ] && [ "${info_height:-0}" -lt "${ascii_height:-0}" ] &&
cursor_pos=$((ascii_height - info_height)) 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