MIAOU-BASH is a collection of scripts and configurations designed to enhance your terminal experience. As the name suggests, it is built on Bash and is designed to work on most modern GNU/Linux systems.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
4.5 KiB

## library of useful functions, usually prefixed with '_'
function sudo_root {
[[ "$UID" -ne 0 ]] && sudo -vp 'SUDO privilege required: '
true
}
## ASSERT Functions
function assert_root {
[[ "$UID" -ne 0 ]] && echo 'root privilege required' && return 1
true
}
function assert_container {
[[ $(systemd-detect-virt -c) == lxc ]]
}
function fetch_mode {
[[ -v MIAOU_BASH_MODE ]] && return
MIAOU_BASH_MODE_OWNER=$(stat -c '%U' "$MIAOU_BASH_DIR"/)
if [[ -L "$MIAOU_BASH_DIR" ]]; then
MIAOU_BASH_MODE='development'
elif [[ "$MIAOU_BASH_MODE_OWNER" == root ]]; then
MIAOU_BASH_MODE='system'
elif [[ "$MIAOU_BASH_MODE_OWNER" == nobody ]]; then
MIAOU_BASH_MODE='hosted'
else
>&2 echo "MIAOU ERROR: unknown mode: $(realpath "$MIAOU_BASH_DIR") owned by: $MIAOU_BASH_MODE_OWNER" &&
return 3
fi
}
function assert_system_mode {
[[ -L "$MIAOU_BASH_DIR" ]] &&
>&2 echo "ERROR: development mode: $(realpath "$MIAOU_BASH_DIR")" &&
return 3
assert_container && [[ $(stat -c '%U' "$MIAOU_BASH_DIR") == 'nobody' ]] &&
>&2 echo "ERROR: hosted mode" &&
return 4
true
}
## ===============
## ARRAY Functions
## ===============
function _array_contains {
local -n array=$1
local element=$2
for item in "${array[@]}"; do
[[ "$item" == "$element" ]] && return 0
done
return 1
}
function _array_intersect {
local -n arr1=$1
local -n arr2=$2
local -n result=$3
declare -A include
for item in "${arr2[@]}"; do include["$item"]=1; done
result=()
for item in "${arr1[@]}"; do [[ -n ${include["$item"]} ]] && result+=("$item"); done
}
function _array_subtract {
local -n arr1 arr2 result
arr1=$1 # First array
arr2=$2 # Array to subtract
result=$3 # Output array
[[ ${#arr2[@]} == 0 ]] && result=("${arr1[@]}") && return
declare -A exclude
for item in "${arr2[@]}"; do exclude["$item"]=1; done
for item in "${arr1[@]}"; do [[ -z ${exclude["$item"]} ]] && result+=("$item"); done
}
## ==============
## TEXT Functions
## ==============
function _pluralize_simple {
echo -n "$1 "
[[ $1 -eq 1 || $1 -eq -1 ]] && echo "${2}" || echo "${2}s"
}
## ==============
## READ Functions
## ==============
function fetch_distro_like {
if grep -qE '^ID=debian|^ID_LIKE=debian' /etc/os-release; then
DISTRO_LIKE=debian
elif grep -qE '^ID=arch|^ID_LIKE=arch' /etc/os-release; then
DISTRO_LIKE=arch
else
local unsupported_distro
unsupported_distro=$(grep ^ID= /etc/os-release | cut -d= -f2)
>&2 echo -n "MIAOU ERROR: unsupported distro: $unsupported_distro"
return 99
fi
export DISTRO_LIKE
}
function _confirm_destructive {
local message="${1:-This cannot be undone!}"
echo "⚠️ WARNING: $message"
read -rp "Type YES to confirm: " response
case "$response" in
[yY][eE][sS] | [yY]) return 0 ;;
*) echo "canceled!" && return 1 ;;
esac
}
## =================
## OPTIONS Functions
## =================
function _flatten_short_options {
local -n args=$1
local result=()
for word in "${args[@]}"; do
[[ $word == -- ]] && break
if [[ $word =~ ^-[a-z][a-z] ]]; then
word=${word:1}
for ((i = 0; i < ${#word}; i++)); do result+=("-${word:i:1}"); done
else
result+=("$word")
fi
done
args=("${result[@]}")
}
# DISTRO
function get_distro_like {
mapfile -t release </etc/os-release
for line in "${release[@]}"; do
case "$line" in
ID=debian | ID_LIKE=debian)
echo debian
return
;;
ID=arch | ID_LIKE=arch)
echo arch
return
;;
esac
done
return 1
}
## FIXME: Deprecated -> to remove
## ==============
##
# return 0 (true) if array (passed by name) contains element
# usage:
# ARRAY=( a b c )
# containsElement ARRAY 'a' => 0
function containsElement {
isArray "$1" || (echo >&2 "ERROR: <$1> not an array!" && return 2)
array_inter="$1[@]"
array=("${!array_inter}")
for i in "${array[@]}"; do [[ "$i" == "$2" ]] && return 0; done
return 1
}
## return 0 (true) if arg1 (passed by name) is an array
function isArray {
[[ "$(declare -p "$1" 2>/dev/null)" =~ "declare -a" ]] || return 1
}
function isDebian {
grep -q ^ID=debian /etc/os-release
}
function isArch {
grep -q ^ID=arch /etc/os-release
}
function os-release {
grep ^ID= /etc/os-release | cut -d '=' -f2
}
function askConfirmation {
case "$1" in
y | Y | yes | YES)
QUESTION="(Y/n)?"
DEFAULT=0
;;
*)
QUESTION="(y/N)?"
DEFAULT=1
;;
esac
read -rp "$QUESTION : " choice
case "$choice" in
y | Y | yes | YES) return 0 ;; #true
n | no | N | NO) return 1 ;; #false
*) return $DEFAULT ;;
esac
}