plugin/base: improvements (#1930)

* plugins/base: code style improvements

Quote variables, use $@ and $array[@] instead of $*, typeset some integers, remove unneccesasary binary invocation, use shell features when possible, remove `eval`, &c.

* plugins/base: conditional function definitions

Instead of functions failing when required tools aren't installed, just don't define the function.
Alsö, don't redefine del() if it already exists.

* plugins/base: rewrite `usage()`

Reimplement disk usage function using Bash syntax and simpler layout, without having to invoke an external binary.

* plugins/base: revamp `quiet()`

New implementation that is even quieter.

* plugins/base: `myip()`

* plugins/base: `pickfrom()`

* plugins/base: `passgen()`

Fix `passgen()` to not need `tr`, remove one subshell, and eliminate a useless `echo`.

* plugins/base: `mkcd()`

* plugins/base: `mkiso()`

* plugins/base: remove `banish-cookies()`

Adobe Flash is gone with the wind. Alsö, this would be something someone would do *once* and shouldn't be a function...

* plugins/base: `lsgrep` is SC2010

The `lsgrep()` function is *itself* explicitly forbidden by `shellcheck` rule SC2010.

Alsö, s/`$*`/`$@`

* plugins/base: `mkiso()`

Expressly handle unbound parameters.

* plugins/base: remove `command_exists`

* plugin/base: lint SC2154 && SC2144

Newly undisabled `shellcheck` rules

* plugin/base: import libs for tests

* plugin/base: `shfmt`

Apply `shfmt` using current project settings. My apologies to future `git blame` hunters. ♥
pull/1885/head
John D Pell 2021-09-28 05:13:27 -07:00 committed by GitHub
parent 127cbbd4e3
commit c2c76a380a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 161 additions and 191 deletions

View File

@ -79,6 +79,7 @@ completion/available/wpscan.completion.bash
# #
plugins/available/alias-completion.plugin.bash plugins/available/alias-completion.plugin.bash
plugins/available/autojump.plugin.bash plugins/available/autojump.plugin.bash
plugins/available/base.plugin.bash
plugins/available/basher.plugin.bash plugins/available/basher.plugin.bash
plugins/available/cmd-returned-notify.plugin.bash plugins/available/cmd-returned-notify.plugin.bash
plugins/available/direnv.plugin.bash plugins/available/direnv.plugin.bash

View File

@ -1,23 +1,20 @@
# shellcheck shell=bash
cite about-plugin cite about-plugin
about-plugin 'miscellaneous tools' about-plugin 'miscellaneous tools'
function ips () function ips() {
{
about 'display all ip addresses for this host' about 'display all ip addresses for this host'
group 'base' group 'base'
if _command_exists ifconfig if _command_exists ifconfig; then
then
ifconfig | awk '/inet /{ gsub(/addr:/, ""); print $2 }' ifconfig | awk '/inet /{ gsub(/addr:/, ""); print $2 }'
elif _command_exists ip elif _command_exists ip; then
then
ip addr | grep -oP 'inet \K[\d.]+' ip addr | grep -oP 'inet \K[\d.]+'
else else
echo "You don't have ifconfig or ip command installed!" echo "You don't have ifconfig or ip command installed!"
fi fi
} }
function down4me () function down4me() {
{
about 'checks whether a website is down for you, or everybody' about 'checks whether a website is down for you, or everybody'
param '1: website url' param '1: website url'
example '$ down4me http://www.google.com' example '$ down4me http://www.google.com'
@ -25,72 +22,67 @@ function down4me ()
curl -Ls "http://downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g' curl -Ls "http://downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g'
} }
function myip () function myip() {
{
about 'displays your ip address, as seen by the Internet' about 'displays your ip address, as seen by the Internet'
group 'base' group 'base'
list=("http://myip.dnsomatic.com/" "http://checkip.dyndns.com/" "http://checkip.dyndns.org/") list=("http://myip.dnsomatic.com/" "http://checkip.dyndns.com/" "http://checkip.dyndns.org/")
for url in ${list[*]} for url in "${list[@]}"; do
do if res="$(curl -fs "${url}")"; then
res=$(curl -fs "${url}") break
if [[ $? -eq 0 ]];then
break;
fi fi
done done
res=$(echo "$res" | grep -Eo '[0-9\.]+') res="$(echo "$res" | grep -Eo '[0-9\.]+')"
echo -e "Your public IP is: ${echo_bold_green} $res ${echo_normal}" echo -e "Your public IP is: ${echo_bold_green-} $res ${echo_normal-}"
} }
function pickfrom () function pickfrom() {
{
about 'picks random line from file' about 'picks random line from file'
param '1: filename' param '1: filename'
example '$ pickfrom /usr/share/dict/words' example '$ pickfrom /usr/share/dict/words'
group 'base' group 'base'
local file=$1 local file=${1:-}
[[ -z "$file" ]] && reference $FUNCNAME && return local -i n=0 length
length=$(cat $file | wc -l) if [[ ! -r "$file" ]]; then
n=$(expr $RANDOM \* $length \/ 32768 + 1) reference "${FUNCNAME[0]}" && return
head -n $n $file | tail -1 fi
length="$(wc -l < "$file")"
n=$((RANDOM * length / 32768 + 1))
head -n "$n" "$file" | tail -1
} }
function passgen () function passgen() {
{
about 'generates random password from dictionary words' about 'generates random password from dictionary words'
param 'optional integer length' param 'optional integer length'
param 'if unset, defaults to 4' param 'if unset, defaults to 4'
example '$ passgen' example '$ passgen'
example '$ passgen 6' example '$ passgen 6'
group 'base' group 'base'
local i pass length=${1:-4} local -i i length=${1:-4}
pass=$(echo $(for i in $(eval echo "{1..$length}"); do pickfrom /usr/share/dict/words; done)) local pass
echo "With spaces (easier to memorize): $pass" # shellcheck disable=SC2034
echo "Without (use this as the password): $(echo $pass | tr -d ' ')" pass="$(for i in $(eval "echo {1..$length}"); do pickfrom /usr/share/dict/words; done)"
echo "With spaces (easier to memorize): ${pass//$'\n'/ }"
echo "Without spaces (easier to brute force): ${pass//$'\n'/}"
} }
# Create alias pass to passgen when pass isn't installed or # Create alias pass to passgen when pass isn't installed or
# BASH_IT_LEGACY_PASS is true. # BASH_IT_LEGACY_PASS is true.
if ! _command_exists pass || [[ "${BASH_IT_LEGACY_PASS:-}" = true ]] if ! _command_exists pass || [[ "${BASH_IT_LEGACY_PASS:-}" = true ]]; then
then
alias pass=passgen alias pass=passgen
fi fi
function pmdown () if _command_exists markdown && _command_exists browser; then
{ function pmdown() {
about 'preview markdown file in a browser' about 'preview markdown file in a browser'
param '1: markdown file' param '1: markdown file'
example '$ pmdown README.md' example '$ pmdown README.md'
group 'base' group 'base'
if _command_exists markdown
then
markdown $1 | browser
else
echo "You don't have a markdown command installed!"
fi
}
function mkcd () markdown "${1?}" | browser
{ }
fi
function mkcd() {
about 'make one or more directories and cd into the last one' about 'make one or more directories and cd into the last one'
param 'one or more directories to create' param 'one or more directories to create'
example '$ mkcd foo' example '$ mkcd foo'
@ -98,58 +90,41 @@ function mkcd ()
example '$ mkcd foo foo1 foo2 fooN' example '$ mkcd foo foo1 foo2 fooN'
example '$ mkcd /tmp/img/photos/large /tmp/img/photos/self /tmp/img/photos/Beijing' example '$ mkcd /tmp/img/photos/large /tmp/img/photos/self /tmp/img/photos/Beijing'
group 'base' group 'base'
mkdir -p -- "$@" && eval cd -- "\"\$$#\"" mkdir -p -- "$@" && cd -- "${!#}" || return
} }
function lsgrep () # shellcheck disable=SC2010
{ function lsgrep() {
about 'search through directory contents with grep' about 'search through directory contents with grep'
group 'base' group 'base'
ls | grep "$*" ls | grep "$@"
} }
function quiet () function quiet() {
{
about 'what *does* this do?' about 'what *does* this do?'
group 'base' group 'base'
$* &> /dev/null & nohup "$@" &> /dev/null < /dev/null &
} }
function banish-cookies () function usage() {
{
about 'redirect .adobe and .macromedia files to /dev/null'
group 'base'
rm -r ~/.macromedia ~/.adobe
ln -s /dev/null ~/.adobe
ln -s /dev/null ~/.macromedia
}
function usage ()
{
about 'disk usage per directory, in Mac OS X and Linux' about 'disk usage per directory, in Mac OS X and Linux'
param '1: directory name' param '1: directory name'
group 'base' group 'base'
if [[ "$OSTYPE" == 'darwin'* ]]; then case $OSTYPE in
if [ -n "$1" ]; then *'darwin'*)
du -hd 1 "$1" du -hd 1 "$@"
else ;;
du -hd 1 *'linux'*)
fi du -h --max-depth=1 "$@"
;;
elif [[ "$OSTYPE" = 'linux'* ]]; then esac
if [[ -n "$1" ]]; then
du -h --max-depth=1 "$1"
else
du -h --max-depth=1
fi
fi
} }
if [[ ! -e "${BASH_IT}/plugins/enabled/todo.plugin.bash" ]] && [[ ! -e "${BASH_IT}/plugins/enabled/*${BASH_IT_LOAD_PRIORITY_SEPARATOR}todo.plugin.bash" ]] # shellcheck disable=SC2144 # the glob matches only one file
then if [[ ! -e "${BASH_IT?}/plugins/enabled/todo.plugin.bash" &&
! -e "${BASH_IT?}/plugins/enabled"/*"${BASH_IT_LOAD_PRIORITY_SEPARATOR-}todo.plugin.bash" ]]; then
# if user has installed todo plugin, skip this... # if user has installed todo plugin, skip this...
function t () function t() {
{
about 'one thing todo' about 'one thing todo'
param 'if not set, display todo item' param 'if not set, display todo item'
param '1: todo text' param '1: todo text'
@ -161,17 +136,8 @@ then
} }
fi fi
function command_exists () if _command_exists mkisofs; then
{ function mkiso() {
about 'checks for existence of a command'
param '1: command to check'
example '$ command_exists ls && echo exists'
group 'base'
type "$1" &> /dev/null ;
}
mkiso ()
{
about 'creates iso from current dir in the parent dir (unless defined)' about 'creates iso from current dir in the parent dir (unless defined)'
param '1: ISO name' param '1: ISO name'
param '2: dest/path' param '2: dest/path'
@ -180,37 +146,35 @@ mkiso ()
example 'mkiso ISO-Name dest/path src/path' example 'mkiso ISO-Name dest/path src/path'
group 'base' group 'base'
if type "mkisofs" > /dev/null; then local isoname="${1:-${PWD##*/}}"
[[ -z ${1+x} ]] && local isoname=${PWD##*/} || local isoname=$1 local destpath="${2:-../}"
[[ -z ${2+x} ]] && local destpath=../ || local destpath=$2 local srcpath="${3:-${PWD}}"
[[ -z ${3+x} ]] && local srcpath=${PWD} || local srcpath=$3
if [[ ! -f "${destpath}${isoname}.iso" ]]; then if [[ ! -f "${destpath%/}/${isoname}.iso" ]]; then
echo "writing ${isoname}.iso to ${destpath} from ${srcpath}" echo "writing ${isoname}.iso to ${destpath} from ${srcpath}"
mkisofs -V ${isoname} -iso-level 3 -r -o "${destpath}${isoname}.iso" "${srcpath}" mkisofs -V "${isoname}" -iso-level 3 -r -o "${destpath%/}/${isoname}.iso" "${srcpath}"
else else
echo "${destpath}${isoname}.iso already exists" echo "${destpath%/}/${isoname}.iso already exists"
fi
else
echo "mkisofs cmd does not exist, please install cdrtools"
fi fi
} }
fi
# useful for administrators and configs # useful for administrators and configs
function buf () function buf() {
{
about 'back up file with timestamp' about 'back up file with timestamp'
param 'filename' param 'filename'
group 'base' group 'base'
local filename=$1 local filename="${1?}" filetime
local filetime=$(date +%Y%m%d_%H%M%S) filetime=$(date +%Y%m%d_%H%M%S)
cp -a "${filename}" "${filename}_${filetime}" cp -a "${filename}" "${filename}_${filetime}"
} }
if ! _command_exists del; then
function del() { function del() {
about 'move files to hidden folder in tmp, that gets cleared on each reboot' about 'move files to hidden folder in tmp, that gets cleared on each reboot'
param 'file or folder to be deleted' param 'file or folder to be deleted'
example 'del ./file.txt' example 'del ./file.txt'
group 'base' group 'base'
mkdir -p /tmp/.trash && mv "$@" /tmp/.trash; mkdir -p /tmp/.trash && mv "$@" /tmp/.trash
} }
fi

View File

@ -5,11 +5,11 @@ load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
load ../../lib/log load ../../lib/log
load ../../lib/utilities load ../../lib/utilities
load ../../lib/search load ../../lib/search
load ../../plugins/available/base.plugin
cite _about _param _example _group _author _version cite _about _param _example _group _author _version
load ../../lib/helpers load ../../lib/helpers
load ../../plugins/available/base.plugin
function local_setup { function local_setup {
setup_test_fixture setup_test_fixture

View File

@ -3,10 +3,11 @@
load ../test_helper load ../test_helper
load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
load ../../lib/appearance load ../../lib/appearance
load ../../plugins/available/base.plugin
cite _about _param _example _group _author _version cite _about _param _example _group _author _version
load ../../lib/log load ../../lib/log
load ../../lib/helpers
load ../../plugins/available/base.plugin
@test "lib log: basic debug logging with BASH_IT_LOG_LEVEL_ALL" { @test "lib log: basic debug logging with BASH_IT_LOG_LEVEL_ALL" {
BASH_IT_LOG_LEVEL=$BASH_IT_LOG_LEVEL_ALL BASH_IT_LOG_LEVEL=$BASH_IT_LOG_LEVEL_ALL

View File

@ -2,6 +2,8 @@
load ../test_helper load ../test_helper
load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
load ../../lib/log
load ../../lib/helpers
load ../../plugins/available/base.plugin load ../../plugins/available/base.plugin
@test 'plugins base: ips()' { @test 'plugins base: ips()' {

2
test/plugins/battery.plugin.bats 100644 → 100755
View File

@ -2,6 +2,8 @@
load ../test_helper load ../test_helper
load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
load "${BASH_IT}/lib/log.bash"
load "${BASH_IT}/lib/helpers.bash"
cite _about _param _example _group _author _version cite _about _param _example _group _author _version