From c2c76a380ab4c505b5800da471719bdb26d2dfa4 Mon Sep 17 00:00:00 2001 From: John D Pell <52194+gaelicWizard@users.noreply.github.com> Date: Tue, 28 Sep 2021 05:13:27 -0700 Subject: [PATCH] plugin/base: improvements (#1930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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. ♥ --- clean_files.txt | 1 + plugins/available/base.plugin.bash | 342 +++++++++++++---------------- test/lib/helpers.bats | 2 +- test/lib/log.bats | 3 +- test/plugins/base.plugin.bats | 2 + test/plugins/battery.plugin.bats | 2 + 6 files changed, 161 insertions(+), 191 deletions(-) mode change 100644 => 100755 test/plugins/battery.plugin.bats diff --git a/clean_files.txt b/clean_files.txt index cb715e8f..8388bb52 100644 --- a/clean_files.txt +++ b/clean_files.txt @@ -79,6 +79,7 @@ completion/available/wpscan.completion.bash # plugins/available/alias-completion.plugin.bash plugins/available/autojump.plugin.bash +plugins/available/base.plugin.bash plugins/available/basher.plugin.bash plugins/available/cmd-returned-notify.plugin.bash plugins/available/direnv.plugin.bash diff --git a/plugins/available/base.plugin.bash b/plugins/available/base.plugin.bash index b0899ce9..6490ab88 100644 --- a/plugins/available/base.plugin.bash +++ b/plugins/available/base.plugin.bash @@ -1,216 +1,180 @@ +# shellcheck shell=bash cite about-plugin about-plugin 'miscellaneous tools' -function ips () -{ - about 'display all ip addresses for this host' - group 'base' - if _command_exists ifconfig - then - ifconfig | awk '/inet /{ gsub(/addr:/, ""); print $2 }' - elif _command_exists ip - then - ip addr | grep -oP 'inet \K[\d.]+' - else - echo "You don't have ifconfig or ip command installed!" - fi +function ips() { + about 'display all ip addresses for this host' + group 'base' + if _command_exists ifconfig; then + ifconfig | awk '/inet /{ gsub(/addr:/, ""); print $2 }' + elif _command_exists ip; then + ip addr | grep -oP 'inet \K[\d.]+' + else + echo "You don't have ifconfig or ip command installed!" + fi } -function down4me () -{ - about 'checks whether a website is down for you, or everybody' - param '1: website url' - example '$ down4me http://www.google.com' - group 'base' - curl -Ls "http://downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g' +function down4me() { + about 'checks whether a website is down for you, or everybody' + param '1: website url' + example '$ down4me http://www.google.com' + group 'base' + curl -Ls "http://downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g' } -function myip () -{ - about 'displays your ip address, as seen by the Internet' - group 'base' - list=("http://myip.dnsomatic.com/" "http://checkip.dyndns.com/" "http://checkip.dyndns.org/") - for url in ${list[*]} - do - res=$(curl -fs "${url}") - if [[ $? -eq 0 ]];then - break; - fi - done - res=$(echo "$res" | grep -Eo '[0-9\.]+') - echo -e "Your public IP is: ${echo_bold_green} $res ${echo_normal}" +function myip() { + about 'displays your ip address, as seen by the Internet' + group 'base' + list=("http://myip.dnsomatic.com/" "http://checkip.dyndns.com/" "http://checkip.dyndns.org/") + for url in "${list[@]}"; do + if res="$(curl -fs "${url}")"; then + break + fi + done + res="$(echo "$res" | grep -Eo '[0-9\.]+')" + echo -e "Your public IP is: ${echo_bold_green-} $res ${echo_normal-}" } -function pickfrom () -{ - about 'picks random line from file' - param '1: filename' - example '$ pickfrom /usr/share/dict/words' - group 'base' - local file=$1 - [[ -z "$file" ]] && reference $FUNCNAME && return - length=$(cat $file | wc -l) - n=$(expr $RANDOM \* $length \/ 32768 + 1) - head -n $n $file | tail -1 +function pickfrom() { + about 'picks random line from file' + param '1: filename' + example '$ pickfrom /usr/share/dict/words' + group 'base' + local file=${1:-} + local -i n=0 length + if [[ ! -r "$file" ]]; then + reference "${FUNCNAME[0]}" && return + fi + length="$(wc -l < "$file")" + n=$((RANDOM * length / 32768 + 1)) + head -n "$n" "$file" | tail -1 } -function passgen () -{ - about 'generates random password from dictionary words' - param 'optional integer length' - param 'if unset, defaults to 4' - example '$ passgen' - example '$ passgen 6' - group 'base' - local i pass length=${1:-4} - pass=$(echo $(for i in $(eval echo "{1..$length}"); do pickfrom /usr/share/dict/words; done)) - echo "With spaces (easier to memorize): $pass" - echo "Without (use this as the password): $(echo $pass | tr -d ' ')" +function passgen() { + about 'generates random password from dictionary words' + param 'optional integer length' + param 'if unset, defaults to 4' + example '$ passgen' + example '$ passgen 6' + group 'base' + local -i i length=${1:-4} + local pass + # shellcheck disable=SC2034 + 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 # BASH_IT_LEGACY_PASS is true. -if ! _command_exists pass || [[ "${BASH_IT_LEGACY_PASS:-}" = true ]] -then - alias pass=passgen +if ! _command_exists pass || [[ "${BASH_IT_LEGACY_PASS:-}" = true ]]; then + alias pass=passgen fi -function pmdown () -{ - about 'preview markdown file in a browser' - param '1: markdown file' - example '$ pmdown README.md' - group 'base' - if _command_exists markdown - then - markdown $1 | browser - else - echo "You don't have a markdown command installed!" - fi -} +if _command_exists markdown && _command_exists browser; then + function pmdown() { + about 'preview markdown file in a browser' + param '1: markdown file' + example '$ pmdown README.md' + group 'base' -function mkcd () -{ - about 'make one or more directories and cd into the last one' - param 'one or more directories to create' - example '$ mkcd foo' - example '$ mkcd /tmp/img/photos/large' - example '$ mkcd foo foo1 foo2 fooN' - example '$ mkcd /tmp/img/photos/large /tmp/img/photos/self /tmp/img/photos/Beijing' - group 'base' - mkdir -p -- "$@" && eval cd -- "\"\$$#\"" -} - -function lsgrep () -{ - about 'search through directory contents with grep' - group 'base' - ls | grep "$*" -} - -function quiet () -{ - about 'what *does* this do?' - group 'base' - $* &> /dev/null & -} - -function banish-cookies () -{ - 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' - param '1: directory name' - group 'base' - if [[ "$OSTYPE" == 'darwin'* ]]; then - if [ -n "$1" ]; then - du -hd 1 "$1" - else - du -hd 1 - fi - - elif [[ "$OSTYPE" = 'linux'* ]]; then - 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" ]] -then -# if user has installed todo plugin, skip this... - function t () - { - about 'one thing todo' - param 'if not set, display todo item' - param '1: todo text' - if [[ "$*" == "" ]] ; then - cat ~/.t - else - echo "$*" > ~/.t - fi - } + markdown "${1?}" | browser + } fi -function command_exists () -{ - about 'checks for existence of a command' - param '1: command to check' - example '$ command_exists ls && echo exists' - group 'base' - type "$1" &> /dev/null ; +function mkcd() { + about 'make one or more directories and cd into the last one' + param 'one or more directories to create' + example '$ mkcd foo' + example '$ mkcd /tmp/img/photos/large' + example '$ mkcd foo foo1 foo2 fooN' + example '$ mkcd /tmp/img/photos/large /tmp/img/photos/self /tmp/img/photos/Beijing' + group 'base' + mkdir -p -- "$@" && cd -- "${!#}" || return } -mkiso () -{ - about 'creates iso from current dir in the parent dir (unless defined)' - param '1: ISO name' - param '2: dest/path' - param '3: src/path' - example 'mkiso' - example 'mkiso ISO-Name dest/path src/path' - group 'base' - - if type "mkisofs" > /dev/null; then - [[ -z ${1+x} ]] && local isoname=${PWD##*/} || local isoname=$1 - [[ -z ${2+x} ]] && local destpath=../ || local destpath=$2 - [[ -z ${3+x} ]] && local srcpath=${PWD} || local srcpath=$3 - - if [[ ! -f "${destpath}${isoname}.iso" ]]; then - echo "writing ${isoname}.iso to ${destpath} from ${srcpath}" - mkisofs -V ${isoname} -iso-level 3 -r -o "${destpath}${isoname}.iso" "${srcpath}" - else - echo "${destpath}${isoname}.iso already exists" - fi - else - echo "mkisofs cmd does not exist, please install cdrtools" - fi +# shellcheck disable=SC2010 +function lsgrep() { + about 'search through directory contents with grep' + group 'base' + ls | grep "$@" } +function quiet() { + about 'what *does* this do?' + group 'base' + nohup "$@" &> /dev/null < /dev/null & +} + +function usage() { + about 'disk usage per directory, in Mac OS X and Linux' + param '1: directory name' + group 'base' + case $OSTYPE in + *'darwin'*) + du -hd 1 "$@" + ;; + *'linux'*) + du -h --max-depth=1 "$@" + ;; + esac +} + +# shellcheck disable=SC2144 # the glob matches only one file +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... + function t() { + about 'one thing todo' + param 'if not set, display todo item' + param '1: todo text' + if [[ "$*" == "" ]]; then + cat ~/.t + else + echo "$*" > ~/.t + fi + } +fi + +if _command_exists mkisofs; then + function mkiso() { + about 'creates iso from current dir in the parent dir (unless defined)' + param '1: ISO name' + param '2: dest/path' + param '3: src/path' + example 'mkiso' + example 'mkiso ISO-Name dest/path src/path' + group 'base' + + local isoname="${1:-${PWD##*/}}" + local destpath="${2:-../}" + local srcpath="${3:-${PWD}}" + + if [[ ! -f "${destpath%/}/${isoname}.iso" ]]; then + echo "writing ${isoname}.iso to ${destpath} from ${srcpath}" + mkisofs -V "${isoname}" -iso-level 3 -r -o "${destpath%/}/${isoname}.iso" "${srcpath}" + else + echo "${destpath%/}/${isoname}.iso already exists" + fi + } +fi + # useful for administrators and configs -function buf () -{ - about 'back up file with timestamp' - param 'filename' - group 'base' - local filename=$1 - local filetime=$(date +%Y%m%d_%H%M%S) - cp -a "${filename}" "${filename}_${filetime}" +function buf() { + about 'back up file with timestamp' + param 'filename' + group 'base' + local filename="${1?}" filetime + filetime=$(date +%Y%m%d_%H%M%S) + cp -a "${filename}" "${filename}_${filetime}" } -function del() { - about 'move files to hidden folder in tmp, that gets cleared on each reboot' - param 'file or folder to be deleted' - example 'del ./file.txt' - group 'base' - mkdir -p /tmp/.trash && mv "$@" /tmp/.trash; -} +if ! _command_exists del; then + function del() { + about 'move files to hidden folder in tmp, that gets cleared on each reboot' + param 'file or folder to be deleted' + example 'del ./file.txt' + group 'base' + mkdir -p /tmp/.trash && mv "$@" /tmp/.trash + } +fi diff --git a/test/lib/helpers.bats b/test/lib/helpers.bats index e60d5542..7f6664e0 100644 --- a/test/lib/helpers.bats +++ b/test/lib/helpers.bats @@ -5,11 +5,11 @@ load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" load ../../lib/log load ../../lib/utilities load ../../lib/search -load ../../plugins/available/base.plugin cite _about _param _example _group _author _version load ../../lib/helpers +load ../../plugins/available/base.plugin function local_setup { setup_test_fixture diff --git a/test/lib/log.bats b/test/lib/log.bats index f4a04f0e..329386bd 100644 --- a/test/lib/log.bats +++ b/test/lib/log.bats @@ -3,10 +3,11 @@ load ../test_helper load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" load ../../lib/appearance -load ../../plugins/available/base.plugin cite _about _param _example _group _author _version load ../../lib/log +load ../../lib/helpers +load ../../plugins/available/base.plugin @test "lib log: basic debug logging with BASH_IT_LOG_LEVEL_ALL" { BASH_IT_LOG_LEVEL=$BASH_IT_LOG_LEVEL_ALL diff --git a/test/plugins/base.plugin.bats b/test/plugins/base.plugin.bats index 1def481e..6f1099cc 100755 --- a/test/plugins/base.plugin.bats +++ b/test/plugins/base.plugin.bats @@ -2,6 +2,8 @@ load ../test_helper load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh" +load ../../lib/log +load ../../lib/helpers load ../../plugins/available/base.plugin @test 'plugins base: ips()' { diff --git a/test/plugins/battery.plugin.bats b/test/plugins/battery.plugin.bats old mode 100644 new mode 100755 index 9af49697..fda52b02 --- a/test/plugins/battery.plugin.bats +++ b/test/plugins/battery.plugin.bats @@ -2,6 +2,8 @@ load ../test_helper 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