diff --git a/xo-appliance.sh b/xo-appliance.sh index ff1fc69..8327360 100755 --- a/xo-appliance.sh +++ b/xo-appliance.sh @@ -5,7 +5,7 @@ IMAGE_URL="https://xo-appliance.yawn.fi/downloads/image.xva" function OSCheck { set -e - if [[ -z $(which xe 2>/dev/null) ]]; then + if [[ -z $(command -v xe 2>/dev/null) ]]; then echo "this scripts needs xe command. make sure you're on xenserver/xcp-ng host" exit 1 fi @@ -24,6 +24,7 @@ function NetworkChoose { set +e + # shellcheck disable=SC1117 IFS=$'\n' read -r -d '' -a networks <<< "$(xe network-list | grep "uuid\|name-label" | cut -d':' -f2 | sed 's/^ //' | paste - -)" @@ -32,8 +33,9 @@ function NetworkChoose { local PS3="Pick a number. CTRL+C to exit: " select network in "${networks[@]}" do - read -a network_split <<< "$network" + read -r -a network_split <<< "$network" networkuuid=${network_split[0]} + # shellcheck disable=SC2124,SC2034 networkname=${network_split[@]:1} case $network in @@ -56,28 +58,28 @@ function NetworkSettings { echo "Set network settings for VM. Leave IP-address as blank to use DHCP" echo - read -p "IP address: " ipaddress + read -r -p "IP address: " ipaddress ipaddress=${ipaddress:-dhcp} if [[ "$ipaddress" != "dhcp" ]]; then if ! [[ $ipaddress =~ $ipregex ]]; then echo "Check ip-address format" exit 1 - fi - read -p "Netmask [255.255.255.0]: " netmask + fi + read -r -p "Netmask [255.255.255.0]: " netmask netmask=${netmask:-255.255.255.0} if ! [[ $netmask =~ $ipregex ]]; then echo "Check netmask format" exit 1 fi - read -p "Gateway: " gateway + read -r -p "Gateway: " gateway if [[ $gateway != "" ]]; then if ! [[ $gateway =~ $ipregex ]]; then echo "Check gateway format" exit 1 fi fi - read -p "DNS [8.8.8.8]: " dns + read -r -p "DNS [8.8.8.8]: " dns dns=${dns:-8.8.8.8} if ! [[ $dns =~ $ipregex ]]; then echo "Check dns format" @@ -89,7 +91,7 @@ function NetworkSettings { } function VMImport { - + set -e echo @@ -98,6 +100,7 @@ function VMImport { uuid=$(curl "$IMAGE_URL" | xe vm-import filename=/dev/stdin) + # shellcheck disable=SC2181 if [[ $? != "0" ]]; then echo "Import failed" exit 1 @@ -105,39 +108,39 @@ function VMImport { echo echo "Import complete" - xe vif-create network-uuid=$vifuuid vm-uuid=$uuid device=0 >/dev/null + xe vif-create network-uuid="$vifuuid" vm-uuid="$uuid" device=0 >/dev/null if [[ "$ipaddress" != "dhcp" ]]; then - xe vm-param-set uuid=$uuid xenstore-data:vm-data/ip=$ipaddress xenstore-data:vm-data/netmask=$netmask xenstore-data:vm-data/gateway=$gateway xenstore-data:vm-data/dns=$dns + xe vm-param-set uuid="$uuid" xenstore-data:vm-data/ip="$ipaddress" xenstore-data:vm-data/netmask="$netmask" xenstore-data:vm-data/gateway="$gateway" xenstore-data:vm-data/dns="$dns" fi - xe vm-param-remove uuid=$uuid param-name=HVM-boot-params param-key=order - xe vm-param-set uuid=$uuid HVM-boot-params:"order: c" + xe vm-param-remove uuid="$uuid" param-name=HVM-boot-params param-key=order + xe vm-param-set uuid="$uuid" HVM-boot-params:"order: c" echo echo "Starting VM..." - xe vm-start uuid=$uuid + xe vm-start uuid="$uuid" set +e count=0 limit=10 - ip=$(xe vm-param-get uuid=$uuid param-name=networks param-key=0/ip 2>/dev/null) + ip=$(xe vm-param-get uuid="$uuid" param-name=networks param-key=0/ip 2>/dev/null) while [[ -z "$ip" ]] && [[ "$count" -lt "$limit" ]]; do echo "Waiting for VM to start and announce it got IP-address" sleep 30 - ip=$(xe vm-param-get uuid=$uuid param-name=networks param-key=0/ip 2>/dev/null) + ip=$(xe vm-param-get uuid="$uuid" param-name=networks param-key=0/ip 2>/dev/null) (( count++ )) done if [[ "$ipaddress" != "dhcp" ]]; then - xe vm-param-remove param-name=xenstore-data param-key=vm-data/ip uuid=$uuid 2>/dev/null - xe vm-param-remove param-name=xenstore-data param-key=vm-data/netmask uuid=$uuid 2>/dev/null - xe vm-param-remove param-name=xenstore-data param-key=vm-data/gateway uuid=$uuid 2>/dev/null - xe vm-param-remove param-name=xenstore-data param-key=vm-data/dns uuid=$uuid 2>/dev/null + xe vm-param-remove param-name=xenstore-data param-key=vm-data/ip uuid="$uuid" 2>/dev/null + xe vm-param-remove param-name=xenstore-data param-key=vm-data/netmask uuid="$uuid" 2>/dev/null + xe vm-param-remove param-name=xenstore-data param-key=vm-data/gateway uuid="$uuid" 2>/dev/null + xe vm-param-remove param-name=xenstore-data param-key=vm-data/dns uuid="$uuid" 2>/dev/null fi - if [[ $ip != "" ]]; then + if [[ "$ip" != "" ]]; then echo echo "VM Started successfully" echo diff --git a/xo-install.sh b/xo-install.sh index e347740..f17d6ca 100755 --- a/xo-install.sh +++ b/xo-install.sh @@ -1,4 +1,5 @@ #!/bin/bash +# shellcheck disable=SC2155,SC2207,SC2015 ######################################################################### # Title: XenOrchestraInstallerUpdater # @@ -6,26 +7,27 @@ # Repository: https://github.com/ronivay/XenOrchestraInstallerUpdater # ######################################################################### -SAMPLE_CONFIG_FILE="$(dirname $0)/sample.xo-install.cfg" -CONFIG_FILE="$(dirname $0)/xo-install.cfg" +SAMPLE_CONFIG_FILE="$(dirname "$0")/sample.xo-install.cfg" +CONFIG_FILE="$(dirname "$0")/xo-install.cfg" # Deploy default configuration file if the user doesn't have their own yet. if [[ ! -s "$CONFIG_FILE" ]]; then - cp $SAMPLE_CONFIG_FILE $CONFIG_FILE + cp "$SAMPLE_CONFIG_FILE" "$CONFIG_FILE" fi # See this file for all script configuration variables. -source $CONFIG_FILE +# shellcheck disable=SC1090 +source "$CONFIG_FILE" # Set some default variables if sourcing config file fails for some reason PORT=${PORT:-80} INSTALLDIR=${INSTALLDIR:-"/opt/xo"} BRANCH=${BRANCH:-"master"} -LOGPATH=${LOGPATH:-$(dirname "$(realpath $0)")/logs} +LOGPATH=${LOGPATH:-$(dirname "$(realpath "$0")")/logs} AUTOUPDATE=${AUTOUPDATE:-"true"} PRESERVE=${PRESERVE:-"3"} XOUSER=${XOUSER:-"root"} -CONFIGPATH="$(getent passwd $XOUSER | cut -d: -f6)" +CONFIGPATH=$(getent passwd "$XOUSER" | cut -d: -f6) PLUGINS="${PLUGINS:-"none"}" ADDITIONAL_PLUGINS="${ADDITIONAL_PLUGINS:-"none"}" REPOSITORY="${REPOSITORY:-"https://github.com/vatesfr/xen-orchestra"}" @@ -56,15 +58,15 @@ PROGRESS="[${COLOR_BLUE}..${COLOR_N}]" # Protocol to use for webserver. If both of the X.509 certificate files exist, # then assume that we want to enable HTTPS for the server. -if [[ -s $PATH_TO_HTTPS_CERT ]] && [[ -s $PATH_TO_HTTPS_KEY ]]; then +if [[ -s "$PATH_TO_HTTPS_CERT" ]] && [[ -s "$PATH_TO_HTTPS_KEY" ]]; then HTTPS=true else HTTPS=false fi # create logpath if doesn't exist -if [[ ! -d $LOGPATH ]]; then - mkdir -p $LOGPATH +if [[ ! -d "$LOGPATH" ]]; then + mkdir -p "$LOGPATH" fi function CheckUser { @@ -80,34 +82,36 @@ function CheckUser { function scriptInfo { - SCRIPTVERSION=$(cd $(dirname $0) 2>/dev/null && git rev-parse --short HEAD 2>/dev/null) + SCRIPTVERSION=$(cd "$(dirname "$0")" 2>/dev/null && git rev-parse --short HEAD 2>/dev/null) - [ -z $SCRIPTVERSION ] && SCRIPTVERSION="undefined" - echo "Running script version $SCRIPTVERSION with config:" >> $LOGFILE - echo >> $LOGFILE - [ -s $CONFIG_FILE ] && echo "$(cat $CONFIG_FILE | grep -Eo '^[A-Z_]+.*')" >> $LOGFILE || echo "No config file found" >> $LOGFILE - echo >> $LOGFILE + [ -z "$SCRIPTVERSION" ] && SCRIPTVERSION="undefined" + echo "Running script version $SCRIPTVERSION with config:" >> "$LOGFILE" + echo >> "$LOGFILE" + # shellcheck disable=SC2005,SC2002 + [ -s "$CONFIG_FILE" ] && echo "$(cat "$CONFIG_FILE" | grep -Eo '^[A-Z_]+.*')" >> "$LOGFILE" || echo "No config file found" >> "$LOGFILE" + echo >> "$LOGFILE" } function cmdlog { - echo "=== CMD ===: $@" >> $LOGFILE - echo >> $LOGFILE + echo "=== CMD ===: $*" >> "$LOGFILE" + echo >> "$LOGFILE" } function printprog { - echo -ne "${PROGRESS} $@" + echo -ne "${PROGRESS} $*" } function printok { - echo -e "\r${OK} $@" + # shellcheck disable=SC1117 + echo -e "\r${OK} $*" } function printfail { - echo -e "${FAIL} $@" + echo -e "${FAIL} $*" } function printinfo { - echo -e "${INFO} $@" + echo -e "${INFO} $*" } function ErrorHandling { @@ -117,11 +121,11 @@ function ErrorHandling { echo printfail "Something went wrong, exiting. Check $LOGFILE for more details and use rollback feature if needed" - if [[ -d $INSTALLDIR/xo-builds/xen-orchestra-$TIME ]]; then + if [[ -d "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" ]]; then echo printfail "Removing $INSTALLDIR/xo-builds/xen-orchestra-$TIME because of failed installation." cmdlog "rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME >> $LOGFILE 2>&1 + rm -rf "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >> "$LOGFILE" 2>&1 fi exit 1 @@ -139,66 +143,66 @@ function InstallDependenciesRPM { echo printprog "Installing build dependencies, redis server, python, git, nfs-utils, cifs-utils" cmdlog "yum -y install gcc gcc-c++ make openssl-devel redis libpng-devel python3 git nfs-utils cifs-utils lvm2" - yum -y install gcc gcc-c++ make openssl-devel redis libpng-devel python3 git nfs-utils cifs-utils lvm2 >>$LOGFILE 2>&1 + yum -y install gcc gcc-c++ make openssl-devel redis libpng-devel python3 git nfs-utils cifs-utils lvm2 >>"$LOGFILE" 2>&1 printok "Installing build dependencies, redis server, python, git, nfs-utils, cifs-utils" # only run automated node install if executable not found - cmdlog "which node" - if [[ -z $(which node 2>>$LOGFILE) ]]; then + cmdlog "command -v node" + if [[ -z $(command -v node 2>>"$LOGFILE") ]]; then echo printprog "Installing node.js" cmdlog "curl -s -L https://rpm.nodesource.com/setup_${NODEVERSION}.x | bash -" - curl -s -L https://rpm.nodesource.com/setup_${NODEVERSION}.x | bash - >>$LOGFILE 2>&1 + curl -s -L "https://rpm.nodesource.com/setup_${NODEVERSION}.x" | bash - >>"$LOGFILE" 2>&1 printok "Installing node.js" else UpdateNodeYarn fi # only install yarn repo and package if not found - cmdlog "which yarn" - if [[ -z $(which yarn 2>>$LOGFILE) ]] ; then + cmdlog "command -v yarn" + if [[ -z $(command -v yarn 2>>"$LOGFILE") ]] ; then echo printprog "Installing yarn" cmdlog "curl -s -o /etc/yum.repos.d/yarn.repo https://dl.yarnpkg.com/rpm/yarn.repo && yum -y install yarn" - curl -s -o /etc/yum.repos.d/yarn.repo https://dl.yarnpkg.com/rpm/yarn.repo >>$LOGFILE 2>&1 && \ - yum -y install yarn >>$LOGFILE 2>&1 + curl -s -o /etc/yum.repos.d/yarn.repo "https://dl.yarnpkg.com/rpm/yarn.repo" >>"$LOGFILE" 2>&1 && \ + yum -y install yarn >>"$LOGFILE" 2>&1 printok "Installing yarn" fi # only install epel-release if doesn't exist cmdlog "rpm -q epel-release" - if [[ -z $(rpm -q epel-release 2>>$LOGFILE) ]] ; then + if [[ -z $(rpm -q epel-release 2>>"$LOGFILE") ]] ; then echo printprog "Installing epel-repo" cmdlog "yum -y install epel-release" - yum -y install epel-release >>$LOGFILE 2>&1 + yum -y install epel-release >>"$LOGFILE" 2>&1 printok "Installing epel-repo" fi # only install libvhdi-tools if vhdimount is not present - cmdlog "which vhdimount" - if [[ -z $(which vhdimount 2>>$LOGFILE) ]] ; then + cmdlog "command -v vhdimount" + if [[ -z $(command -v vhdimount 2>>"$LOGFILE") ]] ; then echo printprog "Installing libvhdi-tools from forensics repository" cmdlog "rpm -ivh https://forensics.cert.org/cert-forensics-tools-release-el8.rpm" - rpm -ivh https://forensics.cert.org/cert-forensics-tools-release-el8.rpm >>$LOGFILE 2>&1 + rpm -ivh https://forensics.cert.org/cert-forensics-tools-release-el8.rpm >>"$LOGFILE" 2>&1 cmdlog "sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/cert-forensics-tools.repo" - sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/cert-forensics-tools.repo >>$LOGFILE 2>&1 + sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/cert-forensics-tools.repo >>"$LOGFILE" 2>&1 cmdlog "yum --enablerepo=forensics install -y libvhdi-tools" - yum --enablerepo=forensics install -y libvhdi-tools >>$LOGFILE 2>&1 + yum --enablerepo=forensics install -y libvhdi-tools >>"$LOGFILE" 2>&1 printok "Installing libvhdi-tools from forensics repository" fi echo printprog "Enabling and starting redis service" cmdlog "/bin/systemctl enable redis && /bin/systemctl start redis" - /bin/systemctl enable redis >>$LOGFILE 2>&1 && /bin/systemctl start redis >>$LOGFILE 2>&1 || false + /bin/systemctl enable redis >>"$LOGFILE" 2>&1 && /bin/systemctl start redis >>"$LOGFILE" 2>&1 || false printok "Enabling and starting redis service" echo printprog "Enabling and starting rpcbind service" cmdlog "/bin/systemctl enable rpcbind && /bin/systemctl start rpcbind" - /bin/systemctl enable rpcbind >>$LOGFILE 2>&1 && /bin/systemctl start rpcbind >>$LOGFILE 2>&1 || false + /bin/systemctl enable rpcbind >>"$LOGFILE" 2>&1 && /bin/systemctl start rpcbind >>"$LOGFILE" 2>&1 || false printok "Enabling and starting rpcbind service" } @@ -211,22 +215,22 @@ function InstallDependenciesDeb { # Install necessary dependencies for XO build - if [[ $OSNAME == "Ubuntu" ]]; then + if [[ "$OSNAME" == "Ubuntu" ]]; then echo printprog "OS Ubuntu so making sure universe repository is enabled" cmdlog "add-apt-repository -y universe" - add-apt-repository -y universe >>$LOGFILE 2>&1 + add-apt-repository -y universe >>"$LOGFILE" 2>&1 printok "OS Ubuntu so making sure universe repository is enabled" fi echo printprog "Running apt-get update" cmdlog "apt-get update" - apt-get update >>$LOGFILE 2>&1 + apt-get update >>"$LOGFILE" 2>&1 printok "Running apt-get update" #determine which python package is needed. Ubuntu 20 requires python2-minimal, 16 and 18 are python-minimal - if [[ $OSNAME == "Ubuntu" ]] && [[ $OSVERSION == "20" ]]; then + if [[ "$OSNAME" == "Ubuntu" ]] && [[ "$OSVERSION" == "20" ]]; then PYTHON="python2-minimal" else PYTHON="python-minimal" @@ -236,83 +240,83 @@ function InstallDependenciesDeb { echo printprog "Installing build dependencies, redis server, python, git, libvhdi-utils, lvm2, nfs-common, cifs-utils, curl" cmdlog "apt-get install -y build-essential redis-server libpng-dev git libvhdi-utils $PYTHON lvm2 nfs-common cifs-utils curl" - apt-get install -y build-essential redis-server libpng-dev git libvhdi-utils $PYTHON lvm2 nfs-common cifs-utils curl >>$LOGFILE 2>&1 + apt-get install -y build-essential redis-server libpng-dev git libvhdi-utils "$PYTHON" lvm2 nfs-common cifs-utils curl >>"$LOGFILE" 2>&1 printok "Installing build dependencies, redis server, python, git, libvhdi-utils, lvm2, nfs-common, cifs-utils, curl" # Install apt-transport-https and ca-certificates because of yarn https repo url echo printprog "Installing apt-transport-https and ca-certificates packages to support https repos" cmdlog "apt-get install -y apt-transport-https ca-certificates" - apt-get install -y apt-transport-https ca-certificates >>$LOGFILE 2>&1 + apt-get install -y apt-transport-https ca-certificates >>"$LOGFILE" 2>&1 printok "Installing apt-transport-https and ca-certificates packages to support https repos" - if [[ $OSNAME == "Debian" ]] && [[ $OSVERSION == "10" ]]; then + if [[ "$OSNAME" == "Debian" ]] && [[ "$OSVERSION" == "10" ]]; then echo printprog "Debian 10, so installing gnupg also" cmdlog "apt-get install gnupg -y" - apt-get install gnupg -y >>$LOGFILE 2>&1 + apt-get install gnupg -y >>"$LOGFILE" 2>&1 printok "Debian 10, so installing gnupg also" fi # install setcap for non-root port binding if missing - cmdlog "which setcap" - if [[ -z $(which setcap 2>>$LOGFILE) ]]; then + cmdlog "command -v setcap" + if [[ -z $(command -v setcap 2>>"$LOGFILE") ]]; then echo printprog "Installing setcap" cmdlog "apt-get install -y libcap2-bin" - apt-get install -y libcap2-bin >>$LOGFILE 2>&1 + apt-get install -y libcap2-bin >>"$LOGFILE" 2>&1 printok "Installing setcap" fi # only run automated node install if executable not found - cmdlog "which node" - cmdlog "which npm" - if [[ -z $(which node 2>>$LOGFILE) ]] || [[ -z $(which npm 2>>$LOGFILE) ]]; then + cmdlog "command -v node" + cmdlog "command -v npm" + if [[ -z $(command -v node 2>>"$LOGFILE") ]] || [[ -z $(command -v npm 2>>"$LOGFILE") ]]; then echo printprog "Installing node.js" cmdlog "curl -sL https://deb.nodesource.com/setup_${NODEVERSION}.x | bash -" - curl -sL https://deb.nodesource.com/setup_${NODEVERSION}.x | bash - >>$LOGFILE 2>&1 + curl -sL "https://deb.nodesource.com/setup_${NODEVERSION}.x" | bash - >>"$LOGFILE" 2>&1 cmdlog "apt-get install -y nodejs" - apt-get install -y nodejs >>$LOGFILE 2>&1 + apt-get install -y nodejs >>"$LOGFILE" 2>&1 printok "Installing node.js" else UpdateNodeYarn fi # only install yarn repo and package if not found - cmdlog "which yarn" - if [[ -z $(which yarn 2>>$LOGFILE) ]]; then + cmdlog "command -v yarn" + if [[ -z $(command -v yarn 2>>"$LOGFILE") ]]; then echo printprog "Installing yarn" cmdlog "curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -" - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >>$LOGFILE 2>&1 + curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >>"$LOGFILE" 2>&1 cmdlog "echo \"deb https://dl.yarnpkg.com/debian/ stable main\" | tee /etc/apt/sources.list.d/yarn.list" - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list >>$LOGFILE 2>&1 + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list >>"$LOGFILE" 2>&1 cmdlog "apt-get update" - apt-get update >>$LOGFILE 2>&1 + apt-get update >>"$LOGFILE" 2>&1 cmdlog "apt-get install -y yarn" - apt-get install -y yarn >>$LOGFILE 2>&1 + apt-get install -y yarn >>"$LOGFILE" 2>&1 printok "Installing yarn" fi echo printprog "Enabling and starting redis service" cmdlog "/bin/systemctl enable redis-server && /bin/systemctl start redis-server" - /bin/systemctl enable redis-server >>$LOGFILE 2>&1 && /bin/systemctl start redis-server >>$LOGFILE 2>&1 || false + /bin/systemctl enable redis-server >>"$LOGFILE" 2>&1 && /bin/systemctl start redis-server >>"$LOGFILE" 2>&1 || false printok "Enabling and starting redis service" echo printprog "Enabling and starting rpcbind service" cmdlog "/bin/systemctl enable rpcbind && /bin/systemctl start rpcbind" - /bin/systemctl enable rpcbind >>$LOGFILE 2>&1 && /bin/systemctl start rpcbind >>$LOGFILE 2>&1 || false + /bin/systemctl enable rpcbind >>"$LOGFILE" 2>&1 && /bin/systemctl start rpcbind >>"$LOGFILE" 2>&1 || false printok "Enabling and starting rpcbind service" } function UpdateNodeYarn { - if [[ $AUTOUPDATE != "true" ]]; then + if [[ "$AUTOUPDATE" != "true" ]]; then return 0 fi @@ -320,14 +324,14 @@ function UpdateNodeYarn { printinfo "Checking current node.js version" NODEV=$(node -v 2>/dev/null| grep -Eo '[0-9.]+' | cut -d'.' -f1) - if [ $PKG_FORMAT == "rpm" ]; then - if [[ -n $NODEV ]] && [[ $NODEV -lt ${NODEVERSION} ]]; then + if [ "$PKG_FORMAT" == "rpm" ]; then + if [[ -n "$NODEV" ]] && [[ "$NODEV" -lt "${NODEVERSION}" ]]; then echo printprog "node.js version is $NODEV, upgrading to ${NODEVERSION}.x" cmdlog "curl -sL https://rpm.nodesource.com/setup_${NODEVERSION}.x | bash -" - curl -sL https://rpm.nodesource.com/setup_${NODEVERSION}.x | bash - >>$LOGFILE 2>&1 + curl -sL "https://rpm.nodesource.com/setup_${NODEVERSION}.x" | bash - >>"$LOGFILE" 2>&1 cmdlog "yum clean all" - yum clean all >> $LOGFILE 2>&1 + yum clean all >> "$LOGFILE" 2>&1 cmdlog "yum install -y nodejs" yum install -y nodejs >>LOGFILE 2>&1 printok "node.js version is $NODEV, upgrading to ${NODEVERSION}.x" @@ -336,7 +340,7 @@ function UpdateNodeYarn { echo printprog "node.js version already on $NODEV, checking updates" cmdlog "yum update -y nodejs yarn" - yum update -y nodejs yarn >>$LOGFILE 2>&1 + yum update -y nodejs yarn >>"$LOGFILE" 2>&1 printok "node.js version already on $NODEV, checking updates" elif [[ "$TASK" == "Installation" ]]; then echo @@ -345,21 +349,21 @@ function UpdateNodeYarn { fi fi - if [ $PKG_FORMAT == "deb" ]; then - if [[ -n $NODEV ]] && [[ $NODEV -lt ${NODEVERSION} ]]; then + if [ "$PKG_FORMAT" == "deb" ]; then + if [[ -n "$NODEV" ]] && [[ "$NODEV" -lt "${NODEVERSION}" ]]; then echo printprog "node.js version is $NODEV, upgrading to ${NODEVERSION}.x" cmdlog "curl -sL https://deb.nodesource.com/setup_${NODEVERSION}.x | bash -" - curl -sL https://deb.nodesource.com/setup_${NODEVERSION}.x | bash - >>$LOGFILE 2>&1 + curl -sL "https://deb.nodesource.com/setup_${NODEVERSION}.x" | bash - >>"$LOGFILE" 2>&1 cmdlog "apt-get install -y nodejs" - apt-get install -y nodejs >>$LOGFILE 2>&1 + apt-get install -y nodejs >>"$LOGFILE" 2>&1 printok "node.js version is $NODEV, upgrading to ${NODEVERSION}.x" else if [[ "$TASK" == "Update" ]]; then echo printprog "node.js version already on $NODEV, checking updates" cmdlog "apt-get install -y --only-upgrade nodejs yarn" - apt-get install -y --only-upgrade nodejs yarn >>$LOGFILE 2>&1 + apt-get install -y --only-upgrade nodejs yarn >>"$LOGFILE" 2>&1 printok "node.js version already on $NODEV, checking updates" elif [[ "$TASK" == "Installation" ]]; then echo @@ -393,18 +397,18 @@ function InstallAdditionalXOPlugins { cmdlog "mkdir -p \"$PLUGIN_SRC_DIR\"" mkdir -p "$PLUGIN_SRC_DIR" cmdlog "git clone \"${x}\" \"$PLUGIN_SRC_DIR\"" - git clone "${x}" "$PLUGIN_SRC_DIR" >>$LOGFILE 2>&1 + git clone "${x}" "$PLUGIN_SRC_DIR" >>"$LOGFILE" 2>&1 else cmdlog "cd \"$PLUGIN_SRC_DIR\"" - cd "$PLUGIN_SRC_DIR" >>$LOGFILE 2>&1 + cd "$PLUGIN_SRC_DIR" >>"$LOGFILE" 2>&1 cmdlog "git pull" - git pull >>$LOGFILE 2>&1 - cd $(dirname $0) >>$LOGFILE 2>&1 - cmdlog "cd $(dirname $0)" + git pull >>"$LOGFILE" 2>&1 + cd "$(dirname "$0")" >>"$LOGFILE" 2>&1 + cmdlog "cd $(dirname "$0")" fi cmdlog "cp -r $PLUGIN_SRC_DIR $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/" - cp -r "$PLUGIN_SRC_DIR" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/" >>$LOGFILE 2>&1 + cp -r "$PLUGIN_SRC_DIR" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/" >>"$LOGFILE" 2>&1 done printok "Installing additional plugins" } @@ -426,19 +430,19 @@ function InstallXOPlugins { if [[ "$PLUGINS" == "all" ]]; then cmdlog "find \"$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/\" -maxdepth 1 -mindepth 1 -not -name \"xo-server\" -not -name \"xo-web\" -not -name \"xo-server-cloud\" -exec ln -sn {} \"$INSTALLDIR/xo-builds/xen-orchestra-$TIME/\"" - find "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/" -maxdepth 1 -mindepth 1 -not -name "xo-server" -not -name "xo-web" -not -name "xo-server-cloud" -exec ln -sn {} "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/node_modules/" \; >>$LOGFILE 2>&1 + find "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/" -maxdepth 1 -mindepth 1 -not -name "xo-server" -not -name "xo-web" -not -name "xo-server-cloud" -exec ln -sn {} "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/node_modules/" \; >>"$LOGFILE" 2>&1 else local PLUGINSARRAY=($(echo "$PLUGINS" | tr ',' ' ')) for x in "${PLUGINSARRAY[@]}"; do - if [[ $(find $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages -type d -name "$x") ]]; then + if [[ $(find "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages" -type d -name "$x") ]]; then cmdlog "ln -sn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/$x $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/node_modules/" - ln -sn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/$x $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/node_modules/ >>$LOGFILE 2>&1 + ln -sn "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/$x" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/node_modules/" >>"$LOGFILE" 2>&1 fi done fi cmdlog "cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME && yarn && yarn build" - cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME && yarn >>$LOGFILE 2>&1 && yarn build >>$LOGFILE 2>&1 || false + cd "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" && yarn >>"$LOGFILE" 2>&1 && yarn build >>"$LOGFILE" 2>&1 || false printok "Installing plugins" } @@ -452,11 +456,11 @@ function InstallXO { # Create user if doesn't exist (if defined) if [[ "$XOUSER" != "root" ]]; then - if [[ -z $(getent passwd $XOUSER) ]]; then + if [[ -z $(getent passwd "$XOUSER") ]]; then echo printprog "Creating missing $XOUSER user" cmdlog "useradd -s /sbin/nologin $XOUSER" - useradd -s /sbin/nologin $XOUSER >>$LOGFILE 2>&1 + useradd -s /sbin/nologin "$XOUSER" >>"$LOGFILE" 2>&1 printok "Creating missing $XOUSER user" sleep 2 fi @@ -486,46 +490,46 @@ function InstallXO { cmdlog "mkdir -p \"$XO_SRC_DIR\"" mkdir -p "$XO_SRC_DIR" cmdlog "git clone \"${REPOSITORY}\" \"$XO_SRC_DIR\"" - git clone "${REPOSITORY}" "$XO_SRC_DIR" >>$LOGFILE 2>&1 + git clone "${REPOSITORY}" "$XO_SRC_DIR" >>"$LOGFILE" 2>&1 else cmdlog "cd \"$XO_SRC_DIR\"" - cd "$XO_SRC_DIR" >>$LOGFILE 2>&1 + cd "$XO_SRC_DIR" >>"$LOGFILE" 2>&1 cmdlog "git pull" - git pull >>$LOGFILE 2>&1 - cd $(dirname $0) >>$LOGFILE 2>&1 - cmdlog "cd $(dirname $0)" + git pull >>"$LOGFILE" 2>&1 + cd "$(dirname "$0")" >>"$LOGFILE" 2>&1 + cmdlog "cd $(dirname "$0")" fi # Deploy the latest xen-orchestra source to the new install directory. echo printinfo "Creating install directory: $INSTALLDIR/xo-builds/xen-orchestra-$TIME" cmdlog "rm -rf \"$INSTALLDIR/xo-builds/xen-orchestra-$TIME\"" - rm -rf "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>$LOGFILE 2>&1 + rm -rf "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 cmdlog "cp -r \"$XO_SRC_DIR" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME\"" - cp -r "$XO_SRC_DIR" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>$LOGFILE 2>&1 + cp -r "$XO_SRC_DIR" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 if [[ "$BRANCH" == "release" ]]; then cmdlog "cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME - TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) + cd "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" + TAG=$(git describe --tags "$(git rev-list --tags --max-count=1)") echo printinfo "Checking out latest tagged release '$TAG'" cmdlog "git checkout $TAG" - git checkout $TAG >>$LOGFILE 2>&1 - cmdlog "cd $(dirname $0)" - cd $(dirname $0) + git checkout "$TAG" >>"$LOGFILE" 2>&1 + cmdlog "cd $(dirname "$0")" + cd "$(dirname "$0")" elif [[ "$BRANCH" != "master" ]]; then echo printinfo "Checking out source code from branch '$BRANCH'" cmdlog "cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME >>$LOGFILE 2>&1 + cd "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 cmdlog "git checkout $BRANCH" - git checkout $BRANCH >>$LOGFILE 2>&1 - cmdlog "cd $(dirname $0)" - cd $(dirname $0) >>$LOGFILE 2>&1 + git checkout "$BRANCH" >>"$LOGFILE" 2>&1 + cmdlog "cd $(dirname "$0")" + cd "$(dirname "$0")" >>"$LOGFILE" 2>&1 fi # Check if the new repo is any different from the currently-installed @@ -533,25 +537,25 @@ function InstallXO { # Get the commit ID of the to-be-installed xen-orchestra. cmdlog "cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME + cd "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" cmdlog "git rev-parse HEAD" - NEW_REPO_HASH=$(git rev-parse HEAD 2>>$LOGFILE) + NEW_REPO_HASH=$(git rev-parse HEAD 2>>"$LOGFILE") cmdlog "git rev-parse --short HEAD" - NEW_REPO_HASH_SHORT=$(git rev-parse --short HEAD 2>>$LOGFILE) - cmdlog "cd $(dirname $0)" - cd $(dirname $0) >>$LOGFILE 2>&1 + NEW_REPO_HASH_SHORT=$(git rev-parse --short HEAD 2>>"$LOGFILE") + cmdlog "cd $(dirname "$0")" + cd "$(dirname "$0")" >>"$LOGFILE" 2>&1 # Get the commit ID of the currently-installed xen-orchestra (if one # exists). - if [[ -L $INSTALLDIR/xo-server ]] && [[ -n $(readlink -e $INSTALLDIR/xo-server) ]]; then + if [[ -L "$INSTALLDIR/xo-server" ]] && [[ -n $(readlink -e "$INSTALLDIR/xo-server") ]]; then cmdlog "cd $INSTALLDIR/xo-server" - cd $INSTALLDIR/xo-server >>$LOGFILE 2>&1 + cd "$INSTALLDIR/xo-server" >>"$LOGFILE" 2>&1 cmdlog "git rev-parse HEAD" - OLD_REPO_HASH=$(git rev-parse HEAD 2>>$LOGFILE) + OLD_REPO_HASH=$(git rev-parse HEAD 2>>"$LOGFILE") cmdlog "git rev-parse --short HEAD" - OLD_REPO_HASH_SHORT=$(git rev-parse --short HEAD 2>>$LOGFILE) - cmdlog "cd $(dirname $0)" - cd $(dirname $0) >>$LOGFILE 2>&1 + OLD_REPO_HASH_SHORT=$(git rev-parse --short HEAD 2>>"$LOGFILE") + cmdlog "cd $(dirname "$0")" + cd "$(dirname "$0")" >>"$LOGFILE" 2>&1 else # If there's no existing installation, then we definitely want # to proceed with the bulid. @@ -565,16 +569,16 @@ function InstallXO { echo if [[ "$INTERACTIVE" == "true" ]]; then printinfo "No changes to xen-orchestra since previous install. Run update anyway?" - read -p "[y/N]: " answer - answer=${answer:-n} - case $answer in + read -r -p "[y/N]: " answer + answer="${answer:-n}" + case "$answer" in y) : ;; n) printinfo "Cleaning up install directory: $INSTALLDIR/xo-builds/xen-orchestra-$TIME" cmdlog "rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME >>$LOGFILE 2>&1 + rm -rf "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 exit 0 ;; esac @@ -582,7 +586,7 @@ function InstallXO { printinfo "No changes to xen-orchestra since previous install. Skipping xo-server and xo-web build." printinfo "Cleaning up install directory: $INSTALLDIR/xo-builds/xen-orchestra-$TIME" cmdlog "rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - rm -rf $INSTALLDIR/xo-builds/xen-orchestra-$TIME >>$LOGFILE 2>&1 + rm -rf "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 exit 0 fi fi @@ -602,14 +606,14 @@ function InstallXO { echo if [[ "$FORCE" != "true" ]]; then printinfo "Updating xen-orchestra from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" - echo "Updating xen-orchestra from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" >> $LOGFILE + echo "Updating xen-orchestra from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" >> "$LOGFILE" else printinfo "Updating xen-orchestra (forced) from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" - echo "Updating xen-orchestra (forced) from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" >> $LOGFILE + echo "Updating xen-orchestra (forced) from '$OLD_REPO_HASH_SHORT' to '$NEW_REPO_HASH_SHORT'" >> "$LOGFILE" fi else printinfo "Installing xen-orchestra from branch: $BRANCH - commit: $NEW_REPO_HASH_SHORT" - echo "Installing xen-orchestra from branch: $BRANCH - commit: $NEW_REPO_HASH_SHORT" >> $LOGFILE + echo "Installing xen-orchestra from branch: $BRANCH - commit: $NEW_REPO_HASH_SHORT" >> "$LOGFILE" TASK="Installation" fi @@ -622,7 +626,7 @@ function InstallXO { echo printprog "Running installation" cmdlog "cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME && yarn && yarn build" - cd $INSTALLDIR/xo-builds/xen-orchestra-$TIME >>$LOGFILE 2>&1 && yarn >>$LOGFILE 2>&1 && yarn build >>$LOGFILE 2>&1 || false + cd "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 && yarn >>"$LOGFILE" 2>&1 && yarn build >>"$LOGFILE" 2>&1 || false printok "Running installation" # Install plugins @@ -630,27 +634,33 @@ function InstallXO { echo printinfo "Fixing binary path in systemd service configuration file" + # shellcheck disable=SC1117 cmdlog "sed -i \"s#ExecStart=.*#ExecStart=$INSTALLDIR\/xo-server\/dist\/cli.mjs#\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" - sed -i "s#ExecStart=.*#ExecStart=$INSTALLDIR\/xo-server\/dist\/cli.mjs#" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service + # shellcheck disable=SC1117 + sed -i "s#ExecStart=.*#ExecStart=$INSTALLDIR\/xo-server\/dist\/cli.mjs#" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" printinfo "Adding WorkingDirectory parameter to systemd service configuration file" + # shellcheck disable=SC1117 cmdlog "sed -i \"/ExecStart=.*/a WorkingDirectory=$INSTALLDIR/xo-server\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" - sed -i "/ExecStart=.*/a WorkingDirectory=$INSTALLDIR/xo-server" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + sed -i "/ExecStart=.*/a WorkingDirectory=$INSTALLDIR/xo-server" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" >>"$LOGFILE" 2>&1 if [[ "$XOUSER" != "root" ]]; then printinfo "Adding user to systemd config" + # shellcheck disable=SC1117 cmdlog "sed -i \"/SyslogIdentifier=.*/a User=$XOUSER\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" - sed -i "/SyslogIdentifier=.*/a User=$XOUSER" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + sed -i "/SyslogIdentifier=.*/a User=$XOUSER" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" >>"$LOGFILE" 2>&1 if [ "$PORT" -le "1024" ]; then - NODEBINARY="$(which node)" + NODEBINARY="$(command -v node)" if [[ -L "$NODEBINARY" ]]; then - NODEBINARY="$(readlink -e $NODEBINARY)" + NODEBINARY=$(readlink -e "$NODEBINARY") fi - if [[ -n $NODEBINARY ]]; then + if [[ -n "$NODEBINARY" ]]; then printprog "Attempting to set cap_net_bind_service permission for $NODEBINARY" cmdlog "setcap 'cap_net_bind_service=+ep' $NODEBINARY" - setcap 'cap_net_bind_service=+ep' $NODEBINARY >>$LOGFILE 2>&1 \ + setcap 'cap_net_bind_service=+ep' "$NODEBINARY" >>"$LOGFILE" 2>&1 \ && printok " Attempting to set cap_net_bind_service permission for $NODEBINARY" || { printfail "Attempting to set cap_net_bind_service permission for $NODEBINARY" ; echo " Non-privileged user might not be able to bind to <1024 port. xo-server won't start most likely" ; } else printfail "Can't find node executable, or it's a symlink to non existing file. Not trying to setcap. xo-server won't start most likely" @@ -658,38 +668,48 @@ function InstallXO { fi fi - if [[ ! -f $CONFIGPATH/.config/xo-server/config.toml ]] || [[ "$CONFIGUPDATE" == "true" ]]; then + if [[ ! -f "$CONFIGPATH/.config/xo-server/config.toml" ]] || [[ "$CONFIGUPDATE" == "true" ]]; then printinfo "Fixing relative path to xo-web installation in xo-server configuration file" - INSTALLDIRESC=$(echo $INSTALLDIR | sed 's/\//\\\//g') + INSTALLDIRESC=$(echo "$INSTALLDIR" | sed 's/\//\\\//g') + # shellcheck disable=SC1117 cmdlog "sed -i \"s/#'\/any\/url' = '\/path\/to\/directory'/'\/' = '$INSTALLDIRESC\/xo-web\/dist\/'/\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" - sed -i "s/#'\/any\/url' = '\/path\/to\/directory'/'\/' = '$INSTALLDIRESC\/xo-web\/dist\/'/" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + sed -i "s/#'\/any\/url' = '\/path\/to\/directory'/'\/' = '$INSTALLDIRESC\/xo-web\/dist\/'/" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" >>"$LOGFILE" 2>&1 sleep 2 - if [[ $PORT != "80" ]]; then + if [[ "$PORT" != "80" ]]; then printinfo "Changing port in xo-server configuration file" + # shellcheck disable=SC1117 cmdlog "sed -i \"s/port = 80/port = $PORT/\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" - sed -i "s/port = 80/port = $PORT/" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml >>$LOGFILE 2>&1 - sleep 2 + # shellcheck disable=SC1117 + sed -i "s/port = 80/port = $PORT/" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" >>"$LOGFILE" 2>&1 + sleep 2 fi if [[ "$HTTPS" == "true" ]] ; then printinfo "Enabling HTTPS in xo-server configuration file" + # shellcheck disable=SC1117 cmdlog "sed -i \"s%# cert = '.\/certificate.pem'%cert = '$PATH_TO_HTTPS_CERT'%\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" - sed -i "s%# cert = '.\/certificate.pem'%cert = '$PATH_TO_HTTPS_CERT'%" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + sed -i "s%# cert = '.\/certificate.pem'%cert = '$PATH_TO_HTTPS_CERT'%" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" >>"$LOGFILE" 2>&1 + # shellcheck disable=SC1117 cmdlog \"sed -i "s%# key = '.\/key.pem'%key = '$PATH_TO_HTTPS_KEY'%\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" - sed -i "s%# key = '.\/key.pem'%key = '$PATH_TO_HTTPS_KEY'%" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml >>$LOGFILE 2>&1 - cmdlog "sed -i \"s/# redirectToHttps/redirectToHttps/\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" - sed -i "s/# redirectToHttps/redirectToHttps/" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + sed -i "s%# key = '.\/key.pem'%key = '$PATH_TO_HTTPS_KEY'%" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" >>"$LOGFILE" 2>&1 + # shellcheck disable=SC1117 + cmdlog "sed -i \"s/# redirectToHttps/redirectToHttps/\" $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" + # shellcheck disable=SC1117 + sed -i "s/# redirectToHttps/redirectToHttps/" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" >>"$LOGFILE" 2>&1 sleep 2 fi printinfo "Activating modified configuration file" cmdlog "mkdir -p $CONFIGPATH/.config/xo-server" - mkdir -p $CONFIGPATH/.config/xo-server + mkdir -p "$CONFIGPATH/.config/xo-server" cmdlog "mv -f $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml $CONFIGPATH/.config/xo-server/config.toml" - mv -f $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml $CONFIGPATH/.config/xo-server/config.toml + mv -f "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/sample.config.toml" "$CONFIGPATH/.config/xo-server/config.toml" fi @@ -697,50 +717,50 @@ function InstallXO { echo printinfo "Symlinking fresh xo-server install/update to $INSTALLDIR/xo-server" cmdlog "ln -sfn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server $INSTALLDIR/xo-server" - ln -sfn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server $INSTALLDIR/xo-server >>$LOGFILE 2>&1 + ln -sfn "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server" "$INSTALLDIR/xo-server" >>"$LOGFILE" 2>&1 sleep 2 printinfo "Symlinking fresh xo-web install/update to $INSTALLDIR/xo-web" cmdlog "ln -sfn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-web $INSTALLDIR/xo-web" - ln -sfn $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-web $INSTALLDIR/xo-web >>$LOGFILE 2>&1 + ln -sfn "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-web" "$INSTALLDIR/xo-web" >>"$LOGFILE" 2>&1 if [[ "$XOUSER" != "root" ]]; then cmdlog "chown -R $XOUSER:$XOUSER $INSTALLDIR/xo-builds/xen-orchestra-$TIME" - chown -R $XOUSER:$XOUSER $INSTALLDIR/xo-builds/xen-orchestra-$TIME >>$LOGFILE 2>&1 + chown -R "$XOUSER:$XOUSER" "$INSTALLDIR/xo-builds/xen-orchestra-$TIME" >>"$LOGFILE" 2>&1 if [ ! -d /var/lib/xo-server ]; then cmdlog "mkdir /var/lib/xo-server" - mkdir /var/lib/xo-server >>$LOGFILE 2>&1 + mkdir /var/lib/xo-server >>"$LOGFILE" 2>&1 fi cmdlog "chown -R $XOUSER:$XOUSER /var/lib/xo-server" - chown -R $XOUSER:$XOUSER /var/lib/xo-server >>$LOGFILE 2>&1 + chown -R "$XOUSER:$XOUSER" /var/lib/xo-server >>"$LOGFILE" 2>&1 cmdlog "chown -R $XOUSER:$XOUSER $CONFIGPATH/.config/xo-server" - chown -R $XOUSER:$XOUSER $CONFIGPATH/.config/xo-server >>$LOGFILE 2>&1 + chown -R "$XOUSER:$XOUSER" "$CONFIGPATH/.config/xo-server" >>"$LOGFILE" 2>&1 fi # fix to prevent older installations to not update because systemd service is not symlinked anymore if [[ $(find /etc/systemd/system -maxdepth 1 -type l -name "xo-server.service") ]]; then cmdlog "rm -f /etc/systemd/system/xo-server.service" - rm -f /etc/systemd/system/xo-server.service >>$LOGFILE 2>&1 + rm -f /etc/systemd/system/xo-server.service >>"$LOGFILE" 2>&1 fi echo printinfo "Replacing systemd service configuration file" cmdlog "/bin/cp -f $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service /etc/systemd/system/xo-server.service" - /bin/cp -f $INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service /etc/systemd/system/xo-server.service >>$LOGFILE 2>&1 + /bin/cp -f "$INSTALLDIR/xo-builds/xen-orchestra-$TIME/packages/xo-server/xo-server.service" /etc/systemd/system/xo-server.service >>"$LOGFILE" 2>&1 sleep 2 printinfo "Reloading systemd configuration" echo cmdlog "/bin/systemctl daemon-reload" - /bin/systemctl daemon-reload >>$LOGFILE 2>&1 + /bin/systemctl daemon-reload >>"$LOGFILE" 2>&1 sleep 2 echo printinfo "Starting xo-server..." cmdlog "/bin/systemctl start xo-server" - /bin/systemctl start xo-server >>$LOGFILE 2>&1 + /bin/systemctl start xo-server >>"$LOGFILE" 2>&1 # no need to exit/trap on errors anymore set +eo pipefail @@ -748,15 +768,17 @@ function InstallXO { count=0 limit=6 + # shellcheck disable=SC1117 servicestatus="$(journalctl --since "$LOGTIME" -u xo-server | grep "https\{0,1\}:\/\/.*:$PORT")" while [[ -z "$servicestatus" ]] && [[ "$count" -lt "$limit" ]]; do echo " waiting for port to be open" sleep 10 + # shellcheck disable=SC1117 servicestatus="$(journalctl --since "$LOGTIME" -u xo-server | grep "https\{0,1\}:\/\/.*:$PORT")" (( count++ )) done - if [[ ! -z "$servicestatus" ]]; then + if [[ -n "$servicestatus" ]]; then echo echo -e " ${COLOR_GREEN}WebUI started in port $PORT. Make sure you have firewall rules in place to allow access.${COLOR_N}" if [[ "$TASK" == "Installation" ]]; then @@ -764,19 +786,20 @@ function InstallXO { fi echo printinfo "$TASK successful. Enabling xo-server service to start on reboot" - echo "" >> $LOGFILE - echo "$TASK succesful" >> $LOGFILE + echo "" >> "$LOGFILE" + echo "$TASK succesful" >> "$LOGFILE" cmdlog "/bin/systemctl enable xo-server" echo - /bin/systemctl enable xo-server >>$LOGFILE 2>&1 + /bin/systemctl enable xo-server >>"$LOGFILE" 2>&1 else echo printfail "$TASK completed, but looks like there was a problem when starting xo-server/reading journalctl. Please see logs for more details" - echo "" >> $LOGFILE - echo "$TASK failed" >> $LOGFILE - echo "xo-server service log:" >> $LOGFILE - echo "" >> $LOGFILE - journalctl --since "$LOGTIME" -u xo-server >> $LOGFILE + # shellcheck disable=SC2129 + echo "" >> "$LOGFILE" + echo "$TASK failed" >> "$LOGFILE" + echo "xo-server service log:" >> "$LOGFILE" + echo "" >> "$LOGFILE" + journalctl --since "$LOGTIME" -u xo-server >> "$LOGFILE" echo echo "Control xo-server service with systemctl for stop/start/restart etc." exit 1 @@ -800,7 +823,8 @@ function UpdateXO { echo printprog "Removing old installations. Leaving $PRESERVE latest" cmdlog "find $INSTALLDIR/xo-builds/ -maxdepth 1 -type d -name \"xen-orchestra*\" -printf \"%T@ %p\\n\" | sort -n | cut -d' ' -f2- | head -n -$PRESERVE | xargs -r rm -r" - find $INSTALLDIR/xo-builds/ -maxdepth 1 -type d -name "xen-orchestra*" -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- | head -n -$PRESERVE | xargs -r rm -r >>$LOGFILE 2>&1 + # shellcheck disable=SC1117 + find "$INSTALLDIR/xo-builds/" -maxdepth 1 -type d -name "xen-orchestra*" -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- | head -n -"$PRESERVE" | xargs -r rm -r >>"$LOGFILE" 2>&1 printok "Removing old installations. Leaving $PRESERVE latest" } @@ -809,8 +833,9 @@ function HandleArgs { OPTS=$(getopt -o: --long force,rollback,update,install -- "$@") + #shellcheck disable=SC2181 if [[ $? != 0 ]]; then - echo "Usage: $(dirname $0)/$(basename $0) [--install | --update | --rollback ] [--force]" + echo "Usage: $(dirname "$0")/$(basename "$0") [--install | --update | --rollback ] [--force]" exit 1 fi @@ -856,14 +881,14 @@ function HandleArgs { exit 1 fi - if [[ $UPDATEARG -gt 0 ]]; then + if [[ "$UPDATEARG" -gt 0 ]]; then UpdateNodeYarn UpdateXO exit fi - if [[ $INSTALLARG -gt 0 ]]; then - if [ $PKG_FORMAT == "rpm" ]; then + if [[ "$INSTALLARG" -gt 0 ]]; then + if [ "$PKG_FORMAT" == "rpm" ]; then InstallDependenciesRPM InstallXO exit @@ -874,7 +899,7 @@ function HandleArgs { fi fi - if [[ $ROLLBACKARG -gt 0 ]]; then + if [[ "$ROLLBACKARG" -gt 0 ]]; then RollBackInstallation exit fi @@ -885,9 +910,9 @@ function RollBackInstallation { set -euo pipefail - INSTALLATIONS=($(find $INSTALLDIR/xo-builds/ -maxdepth 1 -type d -name "xen-orchestra-*" 2>/dev/null)) + INSTALLATIONS=($(find "$INSTALLDIR/xo-builds/" -maxdepth 1 -type d -name "xen-orchestra-*" 2>/dev/null)) - if [[ $(echo ${#INSTALLATIONS[@]}) -le 1 ]]; then + if [[ ${#INSTALLATIONS[@]} -le 1 ]]; then printinfo "One or less installations exist, nothing to change" exit 0 fi @@ -901,20 +926,20 @@ function RollBackInstallation { echo printinfo "Setting $INSTALLDIR/xo-server symlink to $INSTALLATION/packages/xo-server" cmdlog "ln -sfn $INSTALLATION/packages/xo-server $INSTALLDIR/xo-server" - ln -sfn $INSTALLATION/packages/xo-server $INSTALLDIR/xo-server >>$LOGFILE 2>&1 + ln -sfn "$INSTALLATION/packages/xo-server" "$INSTALLDIR/xo-server" >>"$LOGFILE" 2>&1 printinfo "Setting $INSTALLDIR/xo-web symlink to $INSTALLATION/packages/xo-web" - cmdlog "ln -sfn $INSTALLATION/packages/xo-web $INSTALLDIR/xo-web" - ln -sfn $INSTALLATION/packages/xo-web $INSTALLDIR/xo-web >>$LOGFILE 2>&1 + cmdlog "ln -sfn $INSTALLATION/packages/xo-web $INSTALLDIR/xo-web" + ln -sfn "$INSTALLATION/packages/xo-web" "$INSTALLDIR/xo-web" >>"$LOGFILE" 2>&1 echo printinfo "Replacing xo.server.service systemd configuration file" cmdlog "/bin/cp -f $INSTALLATION/packages/xo-server/xo-server.service /etc/systemd/system/xo-server.service" - /bin/cp -f $INSTALLATION/packages/xo-server/xo-server.service /etc/systemd/system/xo-server.service >>$LOGFILE 2>&1 + /bin/cp -f "$INSTALLATION/packages/xo-server/xo-server.service" /etc/systemd/system/xo-server.service >>"$LOGFILE" 2>&1 cmdlog "/bin/systemctl daemon-reload" - /bin/systemctl daemon-reload >>$LOGFILE 2>&1 + /bin/systemctl daemon-reload >>"$LOGFILE" 2>&1 echo printinfo "Restarting xo-server..." cmdlog "/bin/systemctl restart xo-server" - /bin/systemctl restart xo-server >>$LOGFILE 2>&1 + /bin/systemctl restart xo-server >>"$LOGFILE" 2>&1 echo break ;; @@ -931,17 +956,17 @@ function CheckOS { OSVERSION=$(grep ^VERSION_ID /etc/os-release | cut -d'=' -f2 | grep -Eo "[0-9]{1,2}" | head -1) OSNAME=$(grep ^NAME /etc/os-release | cut -d'=' -f2 | sed 's/"//g' | awk '{print $1}') - cmdlog "which yum" - if [[ "$(which yum 2>>$LOGFILE)" ]]; then + cmdlog "command -v yum" + if [[ $(command -v yum 2>>"$LOGFILE") ]]; then PKG_FORMAT="rpm" fi - cmdlog "which apt-get" - if [[ "$(which apt-get 2>>$LOGFILE)" ]]; then + cmdlog "command -v apt-get" + if [[ $(command -v apt-get 2>>"$LOGFILE") ]]; then PKG_FORMAT="deb" - fi + fi - if [[ -z $PKG_FORMAT ]]; then + if [[ -z "$PKG_FORMAT" ]]; then printfail "this script requires either yum or apt-get" exit 1 fi @@ -950,39 +975,39 @@ function CheckOS { return 0 fi - if [[ ! $OSNAME =~ ^(Debian|Ubuntu|CentOS|Rocky|AlmaLinux)$ ]]; then + if [[ ! "$OSNAME" =~ ^(Debian|Ubuntu|CentOS|Rocky|AlmaLinux)$ ]]; then printfail "Only Ubuntu/Debian/CentOS/Rocky/AlmaLinux supported" exit 1 fi - if [[ $OSNAME == "CentOS" ]] && [[ $OSVERSION != "8" ]]; then + if [[ "$OSNAME" == "CentOS" ]] && [[ "$OSVERSION" != "8" ]]; then printfail "Only CentOS 8 supported" exit 1 fi - if [[ $OSNAME == "Rocky" ]] && [[ $OSVERSION != "8" ]]; then + if [[ "$OSNAME" == "Rocky" ]] && [[ "$OSVERSION" != "8" ]]; then printfail "Only Rocky Linux 8 supported" exit 1 fi # for future if/when something above 8 is released - if [[ $OSNAME == "AlmaLinux" ]] && [[ $OSVERSION != "8" ]]; then + if [[ "$OSNAME" == "AlmaLinux" ]] && [[ "$OSVERSION" != "8" ]]; then printfail "Only AlmaLinux 8 supported" exit 1 fi - if [[ $OSNAME == "Debian" ]] && [[ ! $OSVERSION =~ ^(8|9|10)$ ]]; then + if [[ "$OSNAME" == "Debian" ]] && [[ ! "$OSVERSION" =~ ^(8|9|10)$ ]]; then printfail "Only Debian 8/9/10 supported" exit 1 fi - if [[ $OSNAME == "Ubuntu" ]] && [[ ! $OSVERSION =~ ^(16|18|20)$ ]]; then + if [[ "$OSNAME" == "Ubuntu" ]] && [[ ! "$OSVERSION" =~ ^(16|18|20)$ ]]; then printfail "Only Ubuntu 16/18/20 supported" exit 1 fi - cmdlog "which xe" - if [[ $(which xe 2>>$LOGFILE) ]]; then + cmdlog "command -v xe" + if [[ $(command -v xe 2>>"$LOGFILE") ]]; then printfail "xe binary found, don't try to run install on xcp-ng/xenserver host. use xo-appliance.sh instead" exit 1 fi @@ -991,8 +1016,8 @@ function CheckOS { function CheckXE { - cmdlog "which xe" - if [[ $(which xe 2>>$LOGFILE) ]]; then + cmdlog "command -v xe" + if [[ $(command -v xe 2>>"$LOGFILE") ]]; then printfail "xe binary found, don't try to run install on xcp-ng/xenserver host. use xo-appliance.sh instead" exit 1 fi @@ -1012,7 +1037,7 @@ function CheckArch { function CheckSystemd { - if [[ -z $(which systemctl) ]]; then + if [[ -z $(command -v systemctl) ]]; then printfail "This tool is designed to work with systemd enabled systems only" exit 1 fi @@ -1039,11 +1064,11 @@ function CheckCertificate { function CheckMemory { SYSMEM=$(grep MemTotal /proc/meminfo | awk '{print $2}') - if [[ $SYSMEM -lt 3000000 ]]; then + if [[ "$SYSMEM" -lt 3000000 ]]; then echo echo -e "${COLOR_RED}WARNING: you have less than 3GB of RAM in your system. Installation might run out of memory, continue anyway?${COLOR_N}" echo - read -p "y/N: " answer + read -r -p "y/N: " answer case $answer in y) : @@ -1060,13 +1085,13 @@ function CheckMemory { } function CheckDiskFree { - FREEDISK=$(df -P -k ${INSTALLDIR%/*} | tail -1 | awk '{print $4}') + FREEDISK="$(df -P -k "${INSTALLDIR%/*}" | tail -1 | awk '{print $4}')" - if [[ $FREEDISK -lt 1048576 ]]; then + if [[ "$FREEDISK" -lt 1048576 ]]; then echo echo -e "${COLOR_RED}free disk space in ${INSTALLDIR%/*} seems to be less than 1GB. Install/update will most likely fail, continue anyway?${COLOR_N}" echo - read -p "y/N: " answer + read -r -p "y/N: " answer case $answer in y) : @@ -1092,7 +1117,7 @@ echo echo -e "OS: ${COLOR_WHITE}$OSNAME $OSVERSION ${COLOR_N}" echo -e "Basedir: ${COLOR_WHITE}$INSTALLDIR ${COLOR_N}" -if [ $XOUSER ]; then +if [ "$XOUSER" ]; then echo -e "User: ${COLOR_WHITE}$XOUSER ${COLOR_N}" else echo -e "User: ${COLOR_WHITE}root ${COLOR_N}" @@ -1101,7 +1126,7 @@ fi echo -e "Port: ${COLOR_WHITE}$PORT${COLOR_N}" echo -e "HTTPS: ${COLOR_WHITE}${HTTPS}${COLOR_N}" echo -e "Git Branch for source: ${COLOR_WHITE}$BRANCH${COLOR_N}" -echo -e "Following plugins will be installed: ${COLOR_WHITE}"$PLUGINS"${COLOR_N}" +echo -e "Following plugins will be installed: ${COLOR_WHITE}$PLUGINS${COLOR_N}" echo -e "Number of previous installations to preserve: ${COLOR_WHITE}$PRESERVE${COLOR_N}" echo -e "Node.js and yarn auto update: ${COLOR_WHITE}$AUTOUPDATE${COLOR_N}" echo @@ -1116,18 +1141,18 @@ echo -e "${COLOR_WHITE}2. Update / Install without packages${COLOR_N}" echo -e "${COLOR_WHITE}3. Rollback to another existing installation${COLOR_N}" echo -e "${COLOR_WHITE}4. Exit${COLOR_N}" echo -read -p ": " option +read -r -p ": " option case $option in 1) if [[ $(pgrep -f xo-server) ]]; then echo "Looks like xo-server process is already running, consider running update instead. Continue anyway?" - read -p "[y/N]: " answer + read -r -p "[y/N]: " answer case $answer in y) echo "Stopping xo-server..." cmdlog "/bin/systemctl stop xo-server" - /bin/systemctl stop xo-server >>$LOGFILE 2>&1 || { printfail "failed to stop service, exiting..." ; exit 1; } + /bin/systemctl stop xo-server >>"$LOGFILE" 2>&1 || { printfail "failed to stop service, exiting..." ; exit 1; } ;; n) exit 0 @@ -1138,14 +1163,14 @@ read -p ": " option esac fi - if [ $PKG_FORMAT == "rpm" ]; then + if [ "$PKG_FORMAT" == "rpm" ]; then TASK="Installation" INTERACTIVE="true" InstallDependenciesRPM InstallXO exit 0 fi - if [ $PKG_FORMAT == "deb" ]; then + if [ "$PKG_FORMAT" == "deb" ]; then TASK="Installation" INTERACTIVE="true" InstallDependenciesDeb