From 7fce3a98fe87efc03e1e89796528770052d5c2d5 Mon Sep 17 00:00:00 2001 From: Kroese Date: Tue, 18 Mar 2025 12:57:52 +0100 Subject: [PATCH] feat: Refactor helper functions (#935) --- src/entry.sh | 1 + src/progress.sh | 2 +- src/reset.sh | 148 +---------------------------------------- src/utils.sh | 171 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 176 insertions(+), 146 deletions(-) create mode 100644 src/utils.sh diff --git a/src/entry.sh b/src/entry.sh index 7b7bf0c..7180f7e 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -6,6 +6,7 @@ set -Eeuo pipefail cd /run +. utils.sh # Load functions . reset.sh # Initialize system . install.sh # Run installation . disk.sh # Initialize disks diff --git a/src/progress.sh b/src/progress.sh index 48daeda..9c7549f 100644 --- a/src/progress.sh +++ b/src/progress.sh @@ -26,7 +26,7 @@ do bytes=$(du -sb "$file" | cut -f1) if (( bytes > 1000 )); then if [ -z "$total" ] || [[ "$total" == "0" ]]; then - size=$(numfmt --to=iec --suffix=B "$bytes" | sed -r 's/([A-Z])/ \1/') + size=$(numfmt --to=iec --suffix=B "$bytes" | sed -r 's/([A-Z])/ \1/') else size="$(echo "$bytes" "$total" | awk '{printf "%.1f", $1 * 100 / $2}')" size="$size%" diff --git a/src/reset.sh b/src/reset.sh index 823fd41..2a7e5f6 100644 --- a/src/reset.sh +++ b/src/reset.sh @@ -1,10 +1,6 @@ #!/usr/bin/env bash set -Eeuo pipefail -info () { printf "%b%s%b" "\E[1;34m❯ \E[1;36m" "${1:-}" "\E[0m\n"; } -error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: ${1:-}" "\E[0m\n" >&2; } -warn () { printf "%b%s%b" "\E[1;31m❯ " "Warning: ${1:-}" "\E[0m\n" >&2; } - trap 'error "Status $? while: $BASH_COMMAND (line $LINENO/$BASH_LINENO)"' ERR [ ! -f "/run/entry.sh" ] && error "Script must run inside Docker container!" && exit 11 @@ -38,7 +34,7 @@ TEMPLATE="/var/www/index.html" FOOTER1="$APP for Docker v$(/dev/null; then - return 0 - fi - - return 1 -} - -pKill() { - local pid="$1" - - { kill -15 "$pid" || true; } 2>/dev/null - - while isAlive "$pid"; do - sleep 0.2 - done - - return 0 -} - -fWait() { - local name="$1" - - while pgrep -f -l "$name" >/dev/null; do - sleep 0.2 - done - - return 0 -} - -fKill() { - local name="$1" - - { pkill -f "$name" || true; } 2>/dev/null - fWait "$name" - - return 0 -} - -escape () { - local s - s=${1//&/\&} - s=${s///\>} - s=${s//'"'/\"} - printf -- %s "$s" - return 0 -} - -html() -{ - local title - local body - local script - local footer - - title=$(escape "$APP") - title="$title" - footer=$(escape "$FOOTER1") - - body=$(escape "$1") - if [[ "$body" == *"..." ]]; then - body="

${body/.../}

" - fi - - [ -n "${2:-}" ] && script="$2" || script="" - - local HTML - HTML=$(<"$TEMPLATE") - HTML="${HTML/\[1\]/$title}" - HTML="${HTML/\[2\]/$script}" - HTML="${HTML/\[3\]/$body}" - HTML="${HTML/\[4\]/$footer}" - HTML="${HTML/\[5\]/$FOOTER2}" - - echo "$HTML" > "$PAGE" - echo "$body" > "$INFO" - - return 0 -} - getCountry() { local url=$1 local query=$2 diff --git a/src/utils.sh b/src/utils.sh new file mode 100644 index 0000000..ed53adc --- /dev/null +++ b/src/utils.sh @@ -0,0 +1,171 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# Helper functions + +info () { printf "%b%s%b" "\E[1;34m❯ \E[1;36m" "${1:-}" "\E[0m\n"; } +error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: ${1:-}" "\E[0m\n" >&2; } +warn () { printf "%b%s%b" "\E[1;31m❯ " "Warning: ${1:-}" "\E[0m\n" >&2; } + +formatBytes() { + local result + result=$(numfmt --to=iec --suffix=B "$1" | sed -r 's/([A-Z])/ \1/' | sed 's/ B/ bytes/g;') + local unit="${result//[0-9. ]}" + result="${result//[a-zA-Z ]/}" + if [[ "${2:-}" == "up" ]]; then + if [[ "$result" == *"."* ]]; then + result="${result%%.*}" + result=$((result+1)) + fi + else + if [[ "${2:-}" == "down" ]]; then + result="${result%%.*}" + fi + fi + echo "$result $unit" + return 0 +} + +isAlive() { + local pid="$1" + + if kill -0 "$pid" 2>/dev/null; then + return 0 + fi + + return 1 +} + +pKill() { + local pid="$1" + + { kill -15 "$pid" || true; } 2>/dev/null + + while isAlive "$pid"; do + sleep 0.2 + done + + return 0 +} + +fWait() { + local name="$1" + + while pgrep -f -l "$name" >/dev/null; do + sleep 0.2 + done + + return 0 +} + +fKill() { + local name="$1" + + { pkill -f "$name" || true; } 2>/dev/null + fWait "$name" + + return 0 +} + +escape () { + local s + s=${1//&/\&} + s=${s///\>} + s=${s//'"'/\"} + printf -- %s "$s" + return 0 +} + +html() { + local title + local body + local script + local footer + + title=$(escape "$APP") + title="$title" + footer=$(escape "$FOOTER1") + + body=$(escape "$1") + if [[ "$body" == *"..." ]]; then + body="

${body/.../}

" + fi + + [ -n "${2:-}" ] && script="$2" || script="" + + local HTML + HTML=$(<"$TEMPLATE") + HTML="${HTML/\[1\]/$title}" + HTML="${HTML/\[2\]/$script}" + HTML="${HTML/\[3\]/$body}" + HTML="${HTML/\[4\]/$footer}" + HTML="${HTML/\[5\]/$FOOTER2}" + + echo "$HTML" > "$PAGE" + echo "$body" > "$INFO" + + return 0 +} + +cpu() { + local ret + local cpu="" + + ret=$(lscpu) + + if grep -qi "model name" <<< "$ret"; then + cpu=$(echo "$ret" | grep -m 1 -i 'model name' | cut -f 2 -d ":" | awk '{$1=$1}1' | sed 's# @.*##g' | sed s/"(R)"//g | sed 's/[^[:alnum:] ]\+/ /g' | sed 's/ */ /g') + fi + + if [ -z "${cpu// /}" ] && grep -qi "model:" <<< "$ret"; then + cpu=$(echo "$ret" | grep -m 1 -i 'model:' | cut -f 2 -d ":" | awk '{$1=$1}1' | sed 's# @.*##g' | sed s/"(R)"//g | sed 's/[^[:alnum:] ]\+/ /g' | sed 's/ */ /g') + fi + + cpu="${cpu// CPU/}" + cpu="${cpu// 4 Core/}" + cpu="${cpu// 6 Core/}" + cpu="${cpu// 8 Core/}" + cpu="${cpu// 10 Core/}" + cpu="${cpu// 12 Core/}" + cpu="${cpu// 16 Core/}" + cpu="${cpu// 32 Core/}" + cpu="${cpu// 64 Core/}" + cpu="${cpu//7th Gen /}" + cpu="${cpu//8th Gen /}" + cpu="${cpu//9th Gen /}" + cpu="${cpu//10th Gen /}" + cpu="${cpu//11th Gen /}" + cpu="${cpu//12th Gen /}" + cpu="${cpu//13th Gen /}" + cpu="${cpu//14th Gen /}" + cpu="${cpu//15th Gen /}" + cpu="${cpu// Processor/}" + cpu="${cpu// Quad core/}" + cpu="${cpu// Dual core/}" + cpu="${cpu// Octa core/}" + cpu="${cpu// Core TM/ Core}" + cpu="${cpu// with Radeon Graphics/}" + cpu="${cpu// with Radeon Vega Graphics/}" + + [ -z "${cpu// /}" ] && cpu="Unknown" + + echo "$cpu" + return 0 +} + +hasDisk() { + + [ -b "/disk" ] && return 0 + [ -b "/disk1" ] && return 0 + [ -b "/dev/disk1" ] && return 0 + [ -b "${DEVICE:-}" ] && return 0 + + [ -z "${DISK_NAME:-}" ] && DISK_NAME="data" + [ -s "$STORAGE/$DISK_NAME.img" ] && return 0 + [ -s "$STORAGE/$DISK_NAME.qcow2" ] && return 0 + + return 1 +} + +return 0