diff --git a/README.md b/README.md index d946b8ec6..70b905803 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ You can install and setup servers automatically using our script: ```sh curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/install.sh -o simplex-server-install.sh \ -&& if echo 'b8cf2be103f21f9461d9a500bcd3db06ab7d01d68871b07f4bd245195cbead1d simplex-server-install.sh' | sha256sum -c; then chmod +x ./simplex-server-install.sh && ./simplex-server-install.sh; rm ./simplex-server-install.sh; else echo "SHA-256 checksum is incorrect!" && rm ./simplex-server-install.sh; fi +&& if echo '03d8dbc38736a9e58283b88c5f09599fbcab1673eefe803f305e80eaf9539873 simplex-server-install.sh' | sha256sum -c; then chmod +x ./simplex-server-install.sh && ./simplex-server-install.sh; rm ./simplex-server-install.sh; else echo "SHA-256 checksum is incorrect!" && rm ./simplex-server-install.sh; fi ``` ### Build from source diff --git a/install.sh b/install.sh index 18c2cdf11..a9418571f 100755 --- a/install.sh +++ b/install.sh @@ -3,8 +3,7 @@ set -eu # Links to scripts/configs bin="https://github.com/simplex-chat/simplexmq/releases/latest/download" -bin_smp="$bin/smp-server-ubuntu-20_04-x86-64" -bin_xftp="$bin/xftp-server-ubuntu-20_04-x86-64" +remote_version="$(curl --proto '=https' --tlsv1.2 -sSf -L https://api.github.com/repos/simplex-chat/simplexmq/releases/latest | grep -i "tag_name" | awk -F \" '{print $4}')" scripts="https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/scripts/main" scripts_systemd_smp="$scripts/smp-server.service" @@ -26,6 +25,8 @@ path_conf_var="/var/opt" path_conf_smp="$path_conf_etc/simplex $path_conf_var/simplex" path_conf_xftp="$path_conf_etc/simplex-xftp $path_conf_var/simplex-xftp /srv/xftp" +path_conf_info="$path_conf_etc/simplex-info" + path_systemd="/etc/systemd/system" path_systemd_smp="$path_systemd/smp-server.service" path_systemd_xftp="$path_systemd/xftp-server.service" @@ -65,7 +66,13 @@ ${GRN}4.${NC} Create systemd services: ${GRN}5.${NC} Install stopscript (systemd), update and uninstallation script: - all: ${YLW}${path_bin_update}${NC}, ${YLW}${path_bin_uninstall}${NC}, ${YLW}${path_bin_stopscript}${NC} -Press ${GRN}ENTER${NC} to continue or ${RED}Ctrl+C${NC} to cancel installation" +Press: + - ${GRN}ENTER${NC} to continue installing both xftp and smp servers + - ${GRN}1${NC} to install only smp server + - ${GRN}2${NC} to install only xftp server + - ${RED}Ctrl+C${NC} to cancel installation + +Selection: " end="Installtion is complete! @@ -76,27 +83,64 @@ Please checkout our server guides: To uninstall with full clean-up, simply run: ${YLW}sudo /usr/local/bin/simplex-servers-uninstall${NC} " +os_test() { + . /etc/os-release + + case "$VERSION_ID" in + 20.04) : ;; + 22.04) : ;; + *) printf "${RED}Unsupported Ubuntu version!${NC}\nPlease file Github issue with request to support Ubuntu %s: https://github.com/simplex-chat/simplexmq/issues/new" "$VERSION_ID" && exit 1 ;; + esac + + version="$(printf '%s' "$VERSION_ID" | tr '.' '_')" + arch="$(uname -p)" + + case "$arch" in + x86_64) arch="$(printf '%s' "$arch" | tr '_' '-')" ;; + *) printf "${RED}Unsupported architecture!${NC}\nPlease file Github issue with request to support %s architecture: https://github.com/simplex-chat/simplexmq/issues/new" "$arch" && exit 1 ;; + esac + + bin_smp="$bin/smp-server-ubuntu-${version}-${arch}" + bin_xftp="$bin/xftp-server-ubuntu-${version}-${arch}" +} + setup_bins() { - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_smp" -o "$path_bin_smp" && chmod +x "$path_bin_smp" - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_xftp" -o "$path_bin_xftp" && chmod +x "$path_bin_xftp" + eval "bin=\$bin_${1}" + eval "path=\$path_bin_${1}" + + curl --proto '=https' --tlsv1.2 -sSf -L "$bin" -o "$path" && chmod +x "$path" + + unset bin path } setup_users() { - useradd -M "$user_smp" 2> /dev/null || true - useradd -M "$user_xftp" 2> /dev/null || true + eval "user=\$user_${1}" + + useradd -M "$user" 2> /dev/null || true + + unset user } setup_dirs() { # Unquoted varibles, so field splitting can occur - mkdir -p $path_conf_smp - chown "$user_smp":"$user_smp" $path_conf_smp - mkdir -p $path_conf_xftp - chown "$user_xftp":"$user_xftp" $path_conf_xftp + eval "path_conf=\$path_conf_${1}" + eval "user=\$user_${1}" + + mkdir -p $path_conf + mkdir -p $path_conf_info + printf "local_version_%s='%s'\n" "$1" "$remote_version" >> "$path_conf_info/release" + chown -R "$user":"$user" $path_conf + + unset path_conf user } setup_systemd() { - curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd_smp" -o "$path_systemd_smp" - curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd_xftp" -o "$path_systemd_xftp" + eval "scripts_systemd=\$scripts_systemd_${1}" + eval "path_systemd=\$path_systemd_${1}" + + curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd" -o "$path_systemd" + + unset scripts_systemd path_systemd } setup_scripts() { @@ -110,32 +154,62 @@ checks() { printf "This script is intended to be run with root privileges. Please re-run script using sudo." exit 1 fi + + os_test + + mkdir -p $path_conf_info } main() { checks - printf "%b\n%b\n" "${BLU}$logo${NC}" "$welcome" + printf "%b\n%b" "${BLU}$logo${NC}" "$welcome" read ans + if [ "$ans" = '1' ]; then + setup='smp' + elif [ "$ans" = '2' ]; then + setup='xftp' + else + setup='smp xftp' + fi + printf "Installing binaries..." - setup_bins + + for i in $setup; do + setup_bins "$i" + done + printf "${GRN} Done!${NC}\n" printf "Creating users..." - setup_users + + for i in $setup; do + setup_users "$i" + done + printf "${GRN} Done!${NC}\n" printf "Creating directories..." - setup_dirs + + for i in $setup; do + setup_dirs "$i" + done + printf "${GRN} Done!${NC}\n" printf "Creating systemd services..." - setup_systemd + + for i in $setup; do + setup_systemd "$i" + done + printf "${GRN} Done!${NC}\n" printf "Installing stopscript, update and uninstallation script..." + setup_scripts + printf "${GRN} Done!${NC}\n" printf "%b" "$end" diff --git a/scripts/main/simplex-servers-uninstall b/scripts/main/simplex-servers-uninstall index 4860dff34..1855a249b 100755 --- a/scripts/main/simplex-servers-uninstall +++ b/scripts/main/simplex-servers-uninstall @@ -13,11 +13,15 @@ fi printf "${RED}This action will permanently remove all configs, directories, binaries from Installation Script. Please backup any relevant configs if they are needed.${NC}\n\nPress ${GRN}ENTER${NC} to continue or ${RED}Ctrl+C${NC} to cancel installation" read ans -systemctl stop smp-server -systemctl stop xftp-server +systemctl disable --now smp-server 2>/dev/null || true +systemctl revert smp-server 2>/dev/null || true +systemctl disable --now xftp-server 2>/dev/null || true +systemctl revert xftp-server 2>/dev/null || true +systemctl daemon-reload 2>/dev/null || true -rm -rf /var/opt/simplex /etc/opt/simplex /var/opt/simplex-xftp /etc/opt/simplex-xftp /srv/xftp /etc/systemd/system/smp-server.service /etc/systemd/system/xftp-server.service /usr/local/bin/smp-server /usr/local/bin/xftp-server /usr/local/bin/simplex-servers-update /usr/local/bin/simplex-servers-uninstall +rm -rf /var/opt/simplex /etc/opt/simplex /etc/opt/simplex-info /var/opt/simplex-xftp /etc/opt/simplex-xftp /srv/xftp /etc/systemd/system/smp-server.service /etc/systemd/system/xftp-server.service /usr/local/bin/smp-server /usr/local/bin/xftp-server /usr/local/bin/simplex-servers-update /usr/local/bin/simplex-servers-uninstall /usr/local/bin/simplex-servers-stopscript -userdel smp && userdel xftp +userdel smp 2>/dev/null || true +userdel xftp 2>/dev/null || true printf "Uninstallation is complete! Thanks for trying out SimpleX!\n" diff --git a/scripts/main/simplex-servers-update b/scripts/main/simplex-servers-update index c1c7aa738..e069fc813 100755 --- a/scripts/main/simplex-servers-update +++ b/scripts/main/simplex-servers-update @@ -3,8 +3,6 @@ set -eu # Links to scripts/configs bin="https://github.com/simplex-chat/simplexmq/releases/latest/download" -bin_smp="$bin/smp-server-ubuntu-20_04-x86-64" -bin_xftp="$bin/xftp-server-ubuntu-20_04-x86-64" scripts="https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/scripts/main" scripts_systemd_smp="$scripts/smp-server.service" @@ -33,6 +31,9 @@ path_tmp_bin_stopscript="$path_tmp_bin/simplex-servers-stopscript" path_tmp_systemd_smp="$path_tmp_bin/smp-server.service" path_tmp_systemd_xftp="$path_tmp_bin/xftp-server.service" +path_conf_etc='/etc/opt' +path_conf_info='/etc/opt/simplex-info' + GRN='\033[0;32m' BLU='\033[1;36m' YLW='\033[1;33m' @@ -40,8 +41,40 @@ RED='\033[0;31m' NC='\033[0m' # Currently, XFTP default to v0.1.0, so it doesn't make sense to check its version -local_version="$($path_bin_smp -v | awk '{print $3}')" -remote_version="$(curl --proto '=https' --tlsv1.2 -sSf -L https://api.github.com/repos/simplex-chat/simplexmq/releases/latest | grep -i "tag_name" | awk -F \" '{print $4}')" + +os_test() { + . /etc/os-release + + case "$VERSION_ID" in + 20.04) : ;; + 22.04) : ;; + *) printf "${RED}Unsupported Ubuntu version!${NC}\nPlease file Github issue with request to support Ubuntu %s: https://github.com/simplex-chat/simplexmq/issues/new" "$VERSION_ID" && exit 1 ;; + esac + + version="$(printf '%s' "$VERSION_ID" | tr '.' '_')" + arch="$(uname -p)" + + case "$arch" in + x86_64) arch="$(printf '%s' "$arch" | tr '_' '-')" ;; + *) printf "${RED}Unsupported architecture!${NC}\nPlease file Github issue with request to support %s architecture: https://github.com/simplex-chat/simplexmq/issues/new" "$arch" && exit 1 ;; + esac + + bin_smp="$bin/smp-server-ubuntu-${version}-${arch}" + bin_xftp="$bin/xftp-server-ubuntu-${version}-${arch}" +} + +installed_test() { + set +u + for i in $path_conf_etc/*; do + if [ -d "$i" ]; then + case "$i" in + *simplex) apps="smp $apps" ;; + *simplex-xftp) apps="xftp $apps" ;; + esac + fi + done + set -u +} update_scripts() { curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_update" -o "$path_tmp_bin_update" && chmod +x "$path_tmp_bin_update" @@ -56,6 +89,7 @@ update_scripts() { mv "$path_tmp_bin_uninstall" "$path_bin_uninstall" printf "${GRN}Done!${NC}\n" fi + if diff -q "$path_bin_stopscript" "$path_tmp_bin_stopscript" > /dev/null 2>&1; then printf -- "- ${YLW}Stopscript script is up-to-date${NC}.\n" rm "$path_tmp_bin_stopscript" @@ -64,6 +98,7 @@ update_scripts() { mv "$path_tmp_bin_stopscript" "$path_bin_stopscript" printf "${GRN}Done!${NC}\n" fi + if diff -q "$path_bin_update" "$path_tmp_bin_update" > /dev/null 2>&1; then printf -- "- ${YLW}Update script is up-to-date${NC}.\n" rm "$path_tmp_bin_update" @@ -71,75 +106,84 @@ update_scripts() { printf -- "- Updating update script..." mv "$path_tmp_bin_update" "$path_bin_update" printf "${GRN}Done!${NC}\n" - printf "Re-executing Update script with latest updates..." + printf -- "- Re-executing Update script with latest updates..." exec sh "$path_bin_update" "continue" fi } update_systemd() { - curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd_smp" -o "$path_tmp_systemd_smp" - curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd_xftp" -o "$path_tmp_systemd_xftp" + service="${1}-server" + eval "scripts_systemd=\$scripts_systemd_${1}" + eval "path_systemd=\$path_systemd_${1}" + eval "path_tmp_systemd=\$path_tmp_systemd_${1}" + + curl --proto '=https' --tlsv1.2 -sSf -L "$scripts_systemd" -o "$path_tmp_systemd" - if diff -q "$path_systemd_smp" "$path_tmp_systemd_smp" > /dev/null 2>&1; then - printf -- "- ${YLW}smp-server service is up-to-date${NC}.\n" - rm "$path_tmp_systemd_smp" + if diff -q "$path_systemd" "$path_tmp_systemd" > /dev/null 2>&1; then + printf -- "- ${YLW}%s service is up-to-date${NC}.\n" "$service" + rm "$path_tmp_systemd" else - printf -- "- Updating smp-server service..." - mv "$path_tmp_systemd_smp" "$path_systemd_smp" - systemctl daemon-reload - printf "${GRN}Done!${NC}\n" - fi - if diff -q "$path_systemd_xftp" "$path_tmp_systemd_xftp" > /dev/null 2>&1; then - printf -- "- ${YLW}xftp-server service is up-to-date${NC}.\n" - rm "$path_tmp_systemd_xftp" - else - printf -- "- Updating xftp-server service..." - mv "$path_tmp_systemd_xftp" "$path_systemd_xftp" + printf -- "- Updating %s service..." "$service" + mv "$path_tmp_systemd" "$path_systemd" systemctl daemon-reload printf "${GRN}Done!${NC}\n" fi + + unset service scripts_systemd path_systemd path_tmp_systemd } update_bins() { - if [ "$local_version" != "$remote_version" ]; then - if systemctl is-active --quiet smp-server; then - printf -- "- Stopping smp-server service..." - systemctl stop smp-server - printf "${GRN}Done!${NC}\n" + service="${1}-server" + eval "bin=\$bin_${1}" + eval "path_bin=\$path_bin_${1}" - printf -- "- Updating smp-server bin to %s..." "$remote_version" - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_smp" -o "$path_bin_smp" && chmod +x "$path_bin_smp" - printf "${GRN}Done!${NC}\n" - - printf -- "- Starting smp-server service..." - systemctl start smp-server - printf "${GRN}Done!${NC}\n" - else - printf -- "- Updating smp-server bin..." - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_smp" -o "$path_bin_smp" && chmod +x "$path_bin_smp" - printf "${GRN}Done!${NC}\n" + remote_version="$(curl --proto '=https' --tlsv1.2 -sSf -L https://api.github.com/repos/simplex-chat/simplexmq/releases/latest | grep -i "tag_name" | awk -F \" '{print $4}')" + + set_ver() { + local_version='unset' + sed -i -- "s/local_version_${1}=.*/local_version_${1}='${remote_version}'/" "$path_conf_info/release" + } + + if [ -f "$path_conf_info/release" ]; then + . "$path_conf_info/release" 2>/dev/null + + set +u + eval "local_version=\$local_version_${1}" + set -u + + if [ -z "${local_version}" ]; then + set_ver "$1" fi + else + printf 'local_version_xftp=\nlocal_version_smp=\n' > "$path_conf_info/release" + set_ver "$1" + fi - if systemctl is-active --quiet xftp-server; then - printf -- "- Stopping xftp-server service..." - systemctl stop xftp-server + if [ "$local_version" != "$remote_version" ]; then + if systemctl is-active --quiet "$service"; then + printf -- "- Stopping %s service..." "$service" + systemctl stop "$service" printf "${GRN}Done!${NC}\n" - printf -- "- Updating xftp-server bin to %s..." "$remote_version" - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_xftp" -o "$path_bin_xftp" && chmod +x "$path_bin_xftp" + printf -- "- Updating %s to %s..." "$service" "$remote_version" + curl --proto '=https' --tlsv1.2 -sSf -L "$bin" -o "$path_bin" && chmod +x "$path_bin" printf "${GRN}Done!${NC}\n" - printf -- "- Starting xftp-server service..." - systemctl start xftp-server + printf -- "- Starting %s service..." "$service" + systemctl start "$service" printf "${GRN}Done!${NC}\n" else - printf -- "- Updating xftp-server bin..." - curl --proto '=https' --tlsv1.2 -sSf -L "$bin_smp" -o "$path_bin_xftp" && chmod +x "$path_bin_xftp" + printf -- "- Updating %s to %s..." "$service" "$remote_version" + curl --proto '=https' --tlsv1.2 -sSf -L "$bin" -o "$path_bin" && chmod +x "$path_bin" printf "${GRN}Done!${NC}\n" fi else - printf -- "- ${YLW}smp-server and xftp-server binaries is up-to-date${NC}.\n" + printf -- "- ${YLW}%s is up-to-date${NC}.\n" "$service" fi + + set_ver "$1" + + unset service bin path_bin local_version } checks() { @@ -147,6 +191,11 @@ checks() { printf "This script is intended to be run with root privileges. Please re-run script using sudo.\n" exit 1 fi + + os_test + installed_test + + mkdir -p $path_conf_info } main() { @@ -163,10 +212,14 @@ main() { fi printf "Updating systemd services...\n" - update_systemd + for i in $apps; do + update_systemd "$i" + done - printf "Updating simplex server binaries...\n" - update_bins + printf "Updating simplex servers...\n" + for i in $apps; do + update_bins "$i" + done rm -rf "$path_tmp_bin" }