39 Commits
Author SHA1 Message Date
Dylan Araps af166966b9 pfetch: revert unrelated commit. 2019-10-14 19:11:26 +03:00
Dylan Araps 219d8f2117 pfetch: revert unrelated commit. 2019-10-14 19:10:42 +03:00
Dylan Araps 0834d53b2a pfetch: revert unrelated commit. 2019-10-14 19:06:31 +03:00
Dylan Araps 0f1d6845db pfetch: revert unrelated commit. 2019-10-14 19:05:36 +03:00
Dylan Araps 3895dd003d pfetch: disk support 2019-10-14 19:04:10 +03:00
Dylan Araps 6c3d5c3a87 pfetch: Fix android sed 2019-10-14 09:53:12 +03:00
Dylan Araps 616e1b0c3b pfetch: fix android issues 2019-10-14 09:04:15 +03:00
Dylan Araps 44dca45301 Merge branch 'master' of github.com:dylanaraps/pfetch 2019-10-14 08:45:25 +03:00
Dylan Araps 256c1678d6 pfetch: fix package count. 2019-10-14 08:45:07 +03:00
dylan a3bdc11167 Merge pull request #26 from turquoise-hexagon/master
pfetch: crux pkgs count support
2019-10-06 12:56:26 +03:00
turquoise-hexagon 2bc0fd87a5 add support for crux pkgs count 2019-10-06 11:21:59 +02:00
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 154 additions and 103 deletions

No files matched your search

+27 -65
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
➜ pfetch
___ goldie@KISS
(.· | os KISS Linux
(<> | host Lenovo YOGA 900-13ISK
/ __ \ kernel 5.3.1-coffee
( / \ /| uptime 6h 20m
_/\ __)/_) pkgs 130
\/-____\/ memory 1721M / 7942M
```
<br>
<br>
<br>
<br>
## 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**
- **MacOS**
- **Minix**
- **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
+127 -38
View File
@@ -129,7 +129,7 @@ get_os() {
case $os in
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
# distributions identification packages or files.
#
@@ -154,6 +154,12 @@ get_os() {
if command -v lsb_release; then
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
# This used to be a simple '. /etc/os-release' but I believe
# this is insecure as we blindly executed whatever was in the
@@ -210,27 +216,19 @@ get_os() {
# says "populate $line with the third field's contents".
while IFS='<>' read -r _ _ line _; do
case $line in
# Match the key and read the next line
# Match 'ProductVersion' and read the next line
# directly as it contains the key's value.
#
# Define a shell variable using the key's value.
ProductName|ProductVersion)
IFS='<>' read -r _ _ "${line?}" _
ProductVersion)
IFS='<>' read -r _ _ mac_version _
break
;;
esac
done < /System/Library/CoreServices/SystemVersion.plist
case ${ProductName?} in
iPhone*)
distro="iOS ${ProductVersion?}"
;;
*)
# Use the ProductVersion to determine which macOS/OS X
# codename the system has. As far as I'm aware there's
# no "dynamic" way of grabbing this information.
case ${ProductVersion?} in
# Use the ProductVersion to determine which macOS/OS X codename
# the system has. As far as I'm aware there's no "dynamic" way
# of grabbing this information.
case $mac_version in
10.4*) distro='Mac OS X Tiger' ;;
10.5*) distro='Mac OS X Leopard' ;;
10.6*) distro='Mac OS X Snow Leopard' ;;
@@ -246,9 +244,7 @@ get_os() {
*) distro='macOS' ;;
esac
distro="$distro ${ProductVersion?}"
;;
esac
distro="$distro $mac_version"
;;
Haiku)
@@ -349,7 +345,7 @@ get_host() {
case $word in
To | [Bb]e | [Ff]illed | by | O.E.M. | OEM |\
Not | Applicable | Specified | System | Product | Name |\
Version | Undefined | Default | string | INVALID | � )
Version | Undefined | Default | string | INVALID | � | os )
continue
;;
esac
@@ -442,6 +438,7 @@ get_pkgs() {
Linux*)
# Commands which print packages one per line.
has bonsai && bonsai list
has crux && pkginfo -i
has pacman-key && pacman -Qq
has dpkg && dpkg-query -f '.\n' -W
has rpm && rpm -qa
@@ -465,10 +462,24 @@ get_pkgs() {
Darwin*)
# Commands which print packages one per line.
has pkgin && pkgin list
has port && port installed
# Directories containing packages.
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*)
@@ -498,7 +509,7 @@ get_pkgs() {
esac | wc -l
`
log pkgs "${packages:-?}" >&6
[ "$packages" -gt 1 ] && log pkgs "$packages" >&6
}
get_memory() {
@@ -541,7 +552,7 @@ get_memory() {
# split is used on '.' to filter it out.
while IFS=:. read -r key val; do
case $key in
*wired*|*active*|*occupied*)
*' wired'*|*' active'*|*' occupied'*)
mem_used=$((mem_used + ${val:-0}))
;;
esac
@@ -683,6 +694,67 @@ get_memory() {
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
}
get_disk() {
# Store the version of the 'df' command as the available
# flags, options and implementation differs between operating
# systems and we need to handle these edge-cases.
df_version=$(df --version 2>&1)
case $df_version in
# The 'df' command is from AIX.
*IMitv*)
set -- -P -g
;;
# The 'df' command is from IRIX.
*befhikm*)
set -- -P -k
;;
# The 'df' command is from OpenBSD.
*hiklnP*)
set -- -h
;;
# The 'df' command is from Haiku and is wildly
# different and provides no workable output,
# end here.
*Tracker*) # Haiku
return
;;
# From testing it is saffe to assume that
# any other 'df' version provides these flags.
*)
set -- -P -h
;;
esac
# Read the output of 'df' line by line. The first line
# contains header information for the "table" so it is
# skipped.
#
# The next lines are then split to grab the relevant
# information and thankfully the output remains the
# same between all but one 'df' implementation.
#
# TODO: Configure disks to send to 'df'. Do we need to
# do this? I'd love to _not_ do it.
df "$@" / | while read -r name full used _ perc _; do
[ "$header" ] || { header=1; continue; }
case $df_version in
# The 'df' command is from IRIX.
*befhikm*)
used=$((used/1024/1024))G
full=$((full/1024/1024))G
;;
esac
log disk "$name [$used / $full ($perc)]" >&6
done
}
get_wm() {
case $os in
# Don't display window manager on macOS.
@@ -761,8 +833,17 @@ get_wm() {
# 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
@@ -869,12 +950,12 @@ get_ascii() {
[Aa]rch*)
read_ascii 4 <<-EOF
${c6} /\\
/^^\\
/ \\
/\\ \\
/${c7} __ \\
/ ( ) \\
/ __| |__\\\\
/// \\\\\\
${c4} / \\
/ ,, \\
/ | | -\\
/_-'' ''-_\\
EOF
;;
@@ -963,13 +1044,12 @@ get_ascii() {
[Ff]ree[Bb][Ss][Dd]*)
read_ascii 1 <<-EOF
${c1} /\\ _____ /\\
${c1}/\\,-'''''-,/\\
\\_) (_/
/ \\
| |
| |
\ /
--_____--
; ;
'-_____-'
EOF
;;
@@ -985,7 +1065,7 @@ get_ascii() {
EOF
;;
[Gg]uix[Ss][Dd]*|guix*)
[Gg]uix[Ss][Dd]*|[Gg]uix*)
read_ascii 3 <<-EOF
${c3}|.__ __.|
|__ \\ / __|
@@ -1022,7 +1102,7 @@ get_ascii() {
EOF
;;
[Ll]inux*[Ll]ite*)
[Ll]inux*[Ll]ite*|[Ll]ite*)
read_ascii 3 <<-EOF
${c3} /\\
/ \\
@@ -1156,7 +1236,7 @@ get_ascii() {
EOF
;;
openSUSE*|open*SUSE*|SUSE*|suse*)
[Oo]penSUSE*|[Oo]pen*SUSE*|SUSE*|suse*)
read_ascii 2 <<-EOF
${c2} _______
__| __ \\
@@ -1215,7 +1295,7 @@ get_ascii() {
EOF
;;
[Ss]un[Oo][Ss])
[Ss]un[Oo][Ss]|[Ss]olaris*)
read_ascii 3 <<-EOF
${c3} . .; .
. :; :: ;: .
@@ -1283,8 +1363,12 @@ get_ascii() {
# output without the use of a pipe ('|').
# This ensures that any variables defined in the while loop
# are still accessible in the script.
#
# The 'awk' command below used to be a simple 'sed', however
# some versions of Android shipped with a totally broken 'sed'
# command from 'toybox' and so we're forced to avoid 'sed'.
done <<-EOF
$(printf %s "$ascii" | sed 's/\[3.m//g')
$(printf %s "$ascii" | awk '{gsub("\\[3.m","");print}')
EOF
# Add a gap between the ascii art and the information.
@@ -1307,6 +1391,11 @@ main() {
# This gives full control over what it displayed on the screen.
exec 6>&1 >/dev/null
# Ensure that the 'TMPDIR' is writable as heredocs use it and
# fail without the write permission. This was found to be the
# case on Android where the temporary directory requires root.
[ -w "${TMPDIR:-/tmp}" ] || export TMPDIR=~
# Generic color list.
# Disable warning about unused variables.
# shellcheck disable=2034
@@ -1382,7 +1471,7 @@ main() {
# N lines.
#
# 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))
# Print '$cursor_pos' amount of newlines to correctly position the