diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/setup-unit | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/tools/setup-unit b/tools/setup-unit new file mode 100755 index 00000000..2e10e54d --- /dev/null +++ b/tools/setup-unit @@ -0,0 +1,311 @@ +#!/bin/sh + +##################################################################### +# +# Copyright (C) NGINX, Inc. +# +# Author: NGINX Unit Team, F5 Inc. +# Version: 0.0.1 +# Date: 2022-05-05 +# +# This script will configure the repositories for NGINX Unit on Ubuntu, +# Debian, RedHat, CentOS, Oracle Linux, Amazon Linux, Fedora. +# It must be run as root. +# +# Note: curl and awk are required by this script, so the script checks to make +# sure they are installed. +# +##################################################################### + +export LC_ALL=C + +checkOSPrereqs () { + + if ! command -v curl > /dev/null 2>&1 + then + echo "Error: curl not found in PATH. It must be installed to run this script." + exit 1 + fi + + if ! command -v awk > /dev/null 2>&1 + then + echo "Error: awk not found in PATH. It must be installed to run this script." + exit 1 + fi + + return 0 +} + +##################################################################### +# Function getOS +# +# Getting the OS is not the same on all distributions. First, we use +# uname to find out if we are running on Linux or FreeBSD. For all the +# supported versions of Debian and Ubuntu, we expect to find the +# /etc/os-release file which has multiple lines with name-value pairs +# from which we can get the OS name and version. For RedHat and its +# variants, the os-release file may or may not exist, depending on the +# version. If it doesn't, then we look for the release package and +# get the OS and version from the package name. For FreeBSD, we use the +# "uname -rs" command. +# +# A string is written to stdout with three values separated by ":": +# OS +# OS Name +# OS Version +# +# If none of these files was found, an empty string is written. +# +# Return: 0 for success, 1 for error +##################################################################### +getOS () { + + os="" + osName="" + osVersion="" + + LC_ALL=C + + os=$(uname | tr '[:upper:]' '[:lower:]') + + if [ "$os" != "linux" ] && [ "$os" != "freebsd" ]; then + echoErr "Error: Operating system is not Linux or FreeBSD, can't proceed" + echo "On macOS, try 'brew install nginx/unit/unit'" + echo + return 1 + fi + + if [ "$os" = "linux" ]; then + if [ -f "$osRelease" ]; then + # The value for the ID and VERSION_ID may or may not be in quotes + osName=$( grep "^ID=" "$osRelease" | sed s/\"//g | awk -F= '{ print $2 }') + osVersion=$(grep "^VERSION_ID=" "$osRelease" | sed s/\"//g | awk -F= '{ print $2 }') + else + # rhel or centos 6.* + if rpm -q redhat-release-server >/dev/null 2>&1; then + osName=rhel + osVersion=$(rpm -q redhat-release-server |sed 's/.*-//' | awk -F. '{print $1"."$2;}') + elif rpm -q centos-release >/dev/null 2>&1; then + osName=centos + osVersion=$(rpm -q centos-release | sed 's/centos-release-//' | sed 's/\..*//' | awk -F- '{print $1"."$2;}') + else + echoErr "Error: Unable to determine the operating system and version, or the OS is not supported" + echo + return 1 + fi + fi + else + osName=$os + osVersion=$(uname -rs | awk -F '[ -]' '{print $2}') + if [ -z "$osVersion" ]; then + echoErr "Unable to get the FreeBSD version" + echo + return 1 + fi + fi + + # Force osName to lowercase + osName=$(echo "$osName" | tr '[:upper:]' '[:lower:]') + echoDebug "getOS: os=$os osName=$osName osVersion=$osVersion" + echo "$os:$osName:$osVersion" + + return 0 +} + + +installDebian () { + + echoDebug "Install on Debian" + + curl --output /usr/share/keyrings/nginx-keyring.gpg https://unit.nginx.org/keys/nginx-keyring.gpg + + apt install -y apt-transport-https lsb-release ca-certificates + + printf "deb [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/debian/ %s unit\n" "$(lsb_release -cs)" | tee /etc/apt/sources.list.d/unit.list + printf "deb-src [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/debian/ %s unit\n" "$(lsb_release -cs)" | tee -a /etc/apt/sources.list.d/unit.list + + apt update + + return 0 +} + +installUbuntu () { + + echoDebug "Install on Ubuntu" + + curl --output /usr/share/keyrings/nginx-keyring.gpg https://unit.nginx.org/keys/nginx-keyring.gpg + + apt install -y apt-transport-https lsb-release ca-certificates + + printf "deb [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ %s unit\n" "$(lsb_release -cs)" | tee /etc/apt/sources.list.d/unit.list + printf "deb-src [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ %s unit\n" "$(lsb_release -cs)" | tee -a /etc/apt/sources.list.d/unit.list + + apt update + + return 0 +} + +installRedHat () { + + echoDebug "Install on RedHat/CentOS/Oracle" + + case "$osVersion" in + 6|6.*|7|7.*|8|8.*) + cat << __EOF__ > /etc/yum.repos.d/unit.repo +[unit] +name=unit repo +baseurl=https://packages.nginx.org/unit/rhel/\$releasever/\$basearch/ +gpgcheck=0 +enabled=1 +__EOF__ + ;; + *) + echo "Unsupported $osName version: $osVersion" + exit 1 + ;; + esac + + yum makecache + + return 0 +} + +installAmazon () { + + echoDebug "Install on Amazon" + + case "$osVersion" in + 2) + cat << __EOF__ > /etc/yum.repos.d/unit.repo +[unit] +name=unit repo +baseurl=https://packages.nginx.org/unit/amzn2/\$releasever/\$basearch/ +gpgcheck=0 +enabled=1 +__EOF__ + ;; + *) + cat << __EOF__ > /etc/yum.repos.d/unit.repo +[unit] +name=unit repo +baseurl=https://packages.nginx.org/unit/amzn/\$releasever/\$basearch/ +gpgcheck=0 +enabled=1 +__EOF__ + ;; + esac + + yum makecache + + return 0 +} + +installFedora () { + + echoDebug "Install on Fedora" + + cat << __EOF__ > /etc/yum.repos.d/unit.repo +[unit] +name=unit repo +baseurl=https://packages.nginx.org/unit/fedora/\$releasever/\$basearch/ +gpgcheck=0 +enabled=1 +__EOF__ + + dnf makecache + + return 0 +} + + +am_i_root() { + + USERID=$(id -u) + if [ 0 -ne "$USERID" ]; then + echoErr "This script requires root privileges to run; now exiting." + exit 1 + fi + + return 0 +} + +echoErr () { + + echo "$*" 1>&2; +} + +echoDebug () { + + if [ "$debug" -eq 1 ]; then + echo "$@" 1>&2; + fi +} + +main() { +debug=0 # If set to 1, debug message will be displayed + +checkOSPrereqs + +# The name and location of the files that will be used to get Linux +# release info +osRelease="/etc/os-release" + +os="" # Will be "linux" or "freebsd" +osName="" # Will be "ubuntu", "debian", "rhel", + # "centos", "suse", "amzn", or "freebsd" +osVersion="" + +am_i_root + +echo "This script will setup repositories for NGINX Unit" + +# Check the OS +osNameVersion=$(getOS) +if [ -z "$osNameVersion" ]; then + echoErr "Error getting the operating system information" + exit 1 +fi + +# Break out the OS, name, and version +os=$(echo "$osNameVersion" | awk -F: '{print $1}') +osName=$(echo "$osNameVersion" | awk -F: '{print $2}') +osVersion=$(echo "$osNameVersion" | awk -F: '{print $3}') + +# Call the appropriate installation function +case "$osName" in + debian) + installDebian + ;; + ubuntu) + installUbuntu + ;; + rhel) + installRedHat + ;; + centos) + installRedHat + ;; + ol) + installRedHat + ;; + amzn) + installAmazon + ;; + fedora) + installFedora + ;; + *) + echo "$osName is not supported" + exit 1 + ;; +esac + +echo +echo "All done - NGINX Unit repositories for "$osName" "$osVersion" are set up" +echo "Further steps: https://unit.nginx.org/installation/#official-packages" + +} + +main + +exit 0 |