Скрипт, който инсталира ctop

install ctop

Това е скрипт за инсталиране на програмата ctop (измерване на използването на ресурси в контейнери на Linux).

Ето какво прави скриптът:

Извлича името на ядрото на операционната система и го запазва в променливата KERNEL.

Дефинира функция output(), която служи за извеждане на съобщения със зелен цвят.

Дефинира функция command_exists(), която проверява дали дадена команда съществува.

Дефинира функция extract_url(), която извлича URL адрес, отговарящ на даден модел, от текст.

Използва case конструкция, за да определи съответния MATCH_BUILD според операционната система.

Проверява дали командите curl и wget съществуват в системата.

Ако потребителят, който изпълнява скрипта, не е root, проверява дали командите sudo или su съществуват, за да може да се изпълняват команди с root права.

Създава временна директория с помощта на mktemp.

Променя текущата работна директория към временната директория.

Извежда съобщение за изтегляне на последната информация за версията от GitHub API.

Извлича URL адреса на файла с контролни суми от информацията за последната версия.

Изтегля файла с контролни суми.

Проверява дали вече е инсталирана последната версия на ctop. Ако да, извежда съобщение, че програмата вече е актуализирана.

Ако последната версия не е инсталирана, извлича URL адреса на файла за текущата операционна система и архитектура и го изтегля.

Проверява контролните суми на изтегления файл. Ако не съвпадат, прекратява скрипта с грешка.

Инсталира ctop като изпълним файл в /usr/local/bin.

Извежда съобщение, че инсталацията е успешна.

install-ctop.sh

#!/usr/bin/env bash
# скрипт за инсталиране на ctop

KERNEL=$(uname -s)

function output() { echo -e "3[32mctop-install3[0m $@"; }  # функция за извеждане на съобщение

function command_exists() {  # функция, която проверява дали дадена команда съществува
  command -v "$@" > /dev/null 2>&1
}

# функция за извличане на URL адрес, отговарящ на даден модел
function extract_url() {
  match=$1; shift
  echo "$@" | while read line; do
    case $line in
      *browser_download_url*${match}*)
        url=$(echo $line | sed -e 's/^.*"browser_download_url":[ ]*"//' -e 's/".*//;s/\ //g')
        echo $url
        break
      ;;
    esac
  done
}

case $KERNEL in
  Linux) MATCH_BUILD="linux-amd64" ;;  # ако операционната система е Linux, MATCH_BUILD става "linux-amd64"
  Darwin) MATCH_BUILD="darwin-amd64" ;;  # ако операционната система е Darwin (macOS), MATCH_BUILD става "darwin-amd64"
  *)
    echo "platform not supported by this install script"  # ако операционната система не се поддържа от скрипта за инсталиране, извежда грешка
    exit 1
    ;;
esac

for req in curl wget; do  # проверява дали командите curl и wget са инсталирани
  command_exists $req || {
    output "missing required $req binary"  # ако някоя от командите липсва, извежда съобщение за грешка
    req_failed=1
  }
done
[ "$req_failed" == 1 ] && exit 1  # ако липсваща команда е открита, скриптът се прекратява с код на грешка 1

sh_c='sh -c'
if [ "$CURRENT_USER" != 'root' ]; then
  if command_exists sudo; then
    sh_c='sudo -E sh -c'  # ако текущият потребител не е root и командата sudo е налична, използва sudo за изпълнение на команди с root права
  elif command_exists su; then
    sh_c='su -c'  # ако текущият потребител не е root и командата su е налична, използва su за изпълнение на команди с root права
  else
    output "Error: this installer needs the ability to run commands as root. We are unable to find either "sudo" or "su" available to make this happen."
    exit 1  # ако не са налични нито sudo, нито su, извежда съобщение за грешка и прекратява изпълнението на скрипта с код на грешка 1
  fi
fi

TMP=$(mktemp -d "${TMPDIR:-/tmp}/ctop.XXXXX")  # създава временна директория
cd ${TMP}  # променя текущата работна директория към временната директория

output "fetching latest release info"  # извежда съобщение за изтегляне на последната информация за версията
resp=$(curl -s https://api.github.com/repos/bcicen/ctop/releases/latest)  # извлича информацията за последната версия от GitHub API

output "fetching release checksums"  # извежда съобщение за изтегляне на контролни суми за версията
checksum_url=$(extract_url sha256sums.txt "$resp")  # извлича URL адреса на файла с контролни суми от информацията за версията
wget -q $checksum_url -O sha256sums.txt  # изтегля файла с контролни суми

# пропуска инсталацията, ако последната версия вече е инсталирана
cur_ctop=$(which ctop 2> /dev/null)
if [[ -n "$cur_ctop" ]]; then
  cur_sum=$(sha256sum $cur_ctop | sed 's/ .*//')
  (grep -q $cur_sum sha256sums.txt) && {
    output "already up-to-date"  # ако текущата версия е същата като последната, извежда съобщение, че вече е актуализирана
    exit 0
  }
fi

output "fetching latest ctop"  # извежда съобщение за изтегляне на последната версия на ctop
url=$(extract_url $MATCH_BUILD "$resp")  # извлича URL адреса на файла за текущата операционна система и архитектура
wget -q --show-progress $url  # изтегля файла за текущата операционна система и архитектура

(sha256sum -c --quiet --ignore-missing sha256sums.txt) || exit 1  # проверява контролните суми на файла, ако не съвпадат, прекратява изпълнението на скрипта с код на грешка 1

output "installing to /usr/local/bin"  # извежда съобщение за инсталиране в /usr/local/bin
chmod +x ctop-*  # прави файла за изпълним
$sh_c "mv ctop-* /usr/local/bin/ctop"  # премества файла в /usr/local/bin

output "done!"  # извежда съобщение, че инсталацията е завършена успешно

Това е основата на скрипта за инсталиране на ctop. Той проверява операционната система, наличието на необходимите команди и изтегля и инсталира последната версия на ctop.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: