vm/lib.sh

1757 строки
53 KiB
Bash
Исходник Обычный вид История

2017-04-09 23:43:30 +03:00
#!/bin/bash
true
# see https://github.com/koalaman/shellcheck/wiki/Directive
2019-09-03 03:25:46 +03:00
## VARIABLES
2017-04-09 23:43:30 +03:00
# Dirs
SCRIPTS=/var/scripts
NCPATH=/var/www/nextcloud
HTML=/var/www
2020-05-02 22:44:12 +03:00
POOLNAME=ncdata
NCDATA=/mnt/"$POOLNAME"
2017-04-09 23:43:30 +03:00
SNAPDIR=/var/snap/spreedme
GPGDIR=/tmp/gpg
2021-03-04 20:48:08 +03:00
SHA256_DIR=/tmp/sha256
BACKUP=/mnt/NCBACKUP
2018-08-05 18:20:42 +03:00
RORDIR=/opt/es/
2019-03-17 15:22:19 +03:00
NC_APPS_PATH=$NCPATH/apps
2019-09-04 06:38:37 +03:00
VMLOGS=/var/log/nextcloud
2018-08-05 18:20:42 +03:00
2020-03-01 13:14:16 +03:00
# Helper function for generating random passwords
gen_passwd() {
local length=$1
local charset="$2"
local password=""
while [ ${#password} -lt "$length" ]
do
password=$(echo "$password""$(head -c 100 /dev/urandom | LC_ALL=C tr -dc "$charset")" | fold -w "$length" | head -n 1)
done
echo "$password"
}
2017-04-09 23:43:30 +03:00
# Ubuntu OS
2020-04-21 23:31:21 +03:00
DISTRO=$(lsb_release -sr)
KEYBOARD_LAYOUT=$(localectl status | grep "Layout" | awk '{print $3}')
2020-07-13 23:10:38 +03:00
# Hypervisor
# HYPERVISOR=$(dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | head -1 | tr -d ' ') TODO
SYSVENDOR=$(cat /sys/devices/virtual/dmi/id/sys_vendor)
2017-04-09 23:43:30 +03:00
# Network
IFACE=$(ip r | grep "default via" | awk '{print $5}')
2017-04-09 23:43:30 +03:00
IFACE2=$(ip -o link show | awk '{print $2,$9}' | grep 'UP' | cut -d ':' -f 1)
REPO=$(grep "^deb " /etc/apt/sources.list | grep http | awk '{print $2}' | head -1)
2017-04-09 23:43:30 +03:00
ADDRESS=$(hostname -I | cut -d ' ' -f 1)
# WANIP4=$(dig +short myip.opendns.com @resolver1.opendns.com) # as an alternative
2019-01-17 15:24:55 +03:00
WANIP4=$(curl -s -k -m 5 https://ipv4bot.whatismyipaddress.com)
INTERFACES="/etc/netplan/nextcloud.yaml"
2018-09-05 10:39:12 +03:00
GATEWAY=$(ip route | grep default | awk '{print $3}')
# Internet DNS required when a check needs to be made to a server outside the home/SME
INTERNET_DNS="9.9.9.9"
# Default Quad9 DNS servers, overwritten by the systemd global DNS defined servers, if set
2018-05-06 19:08:18 +03:00
DNS1="9.9.9.9"
DNS2="149.112.112.112"
2021-05-17 21:53:42 +03:00
NONO_PORTS=(22 25 53 80 443 1024 3012 3306 5178 5179 5432 7867 7983 8983 10000 8081 8443 9443)
use_global_systemd_dns() {
if [ -f "/etc/systemd/resolved.conf" ]
then
local resolvedDns1
resolvedDns1=$(grep -m 1 -E "^DNS=.+" /etc/systemd/resolved.conf | sed s/^DNS=// | awk '{print $1}')
if [ -n "$resolvedDns1" ]
then
DNS1="$resolvedDns1"
local resolvedDns2
resolvedDns2=$(grep -m 1 -E "^DNS=.+" /etc/systemd/resolved.conf | sed s/^DNS=// | awk '{print $2}')
if [ -n "$resolvedDns2" ]
then
DNS2="$resolvedDns2"
else
DNS2=
fi
fi
fi
}
use_global_systemd_dns
# Whiptails
TITLE="Nextcloud VM - $(date +%Y)"
[ -n "$SCRIPT_NAME" ] && TITLE+=" - $SCRIPT_NAME"
CHECKLIST_GUIDE="Navigate with the [ARROW] keys and (de)select with the [SPACE] key. \
Confirm by pressing [ENTER]. Cancel by pressing [ESC]."
MENU_GUIDE="Navigate with the [ARROW] keys and confirm by pressing [ENTER]. Cancel by pressing [ESC]."
RUN_LATER_GUIDE="You can view this script later by running 'sudo bash $SCRIPTS/menu.sh'."
2017-04-09 23:43:30 +03:00
# Repo
2018-08-09 14:25:11 +03:00
GITHUB_REPO="https://raw.githubusercontent.com/nextcloud/vm/master"
2017-04-09 23:43:30 +03:00
STATIC="$GITHUB_REPO/static"
LETS_ENC="$GITHUB_REPO/lets-encrypt"
APP="$GITHUB_REPO/apps"
2020-06-15 21:13:16 +03:00
OLD="$GITHUB_REPO/old"
ADDONS="$GITHUB_REPO/addons"
MENU="$GITHUB_REPO/menu"
DISK="$GITHUB_REPO/disk"
NETWORK="$GITHUB_REPO/network"
2020-06-15 21:13:16 +03:00
VAGRANT_DIR="$GITHUB_REPO/vagrant"
NOT_SUPPORTED_FOLDER="$GITHUB_REPO/not-supported"
GEOBLOCKDAT="$GITHUB_REPO/geoblockdat"
2017-04-09 23:43:30 +03:00
NCREPO="https://download.nextcloud.com/server/releases"
ISSUES="https://github.com/nextcloud/vm/issues"
# User information
NCPASS=nextcloud
NCUSER=ncadmin
UNIXUSER=$SUDO_USER
2017-04-09 23:43:30 +03:00
UNIXUSER_PROFILE="/home/$UNIXUSER/.bash_profile"
ROOT_PROFILE="/root/.bash_profile"
# User for Bitwarden
BITWARDEN_USER=bitwarden
BITWARDEN_HOME=/home/"$BITWARDEN_USER"
2018-05-06 19:08:18 +03:00
# Database
2017-04-09 23:43:30 +03:00
SHUF=$(shuf -i 25-29 -n 1)
PGDB_PASS=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
NEWPGPASS=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
2020-09-09 14:50:58 +03:00
ncdb() {
NCCONFIGDB=$(grep "dbname" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")
}
[ -n "$NCDB" ] && ncdb # TODO: remove this line someday
ncdbpass() {
NCCONFIGDBPASS=$(grep "dbpassword" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")
}
[ -n "$NCDBPASS" ] && ncdbpass # TODO: remove this line someday
2017-04-09 23:43:30 +03:00
# Path to specific files
SECURE="$SCRIPTS/setup_secure_permissions_nextcloud.sh"
# Nextcloud version
2020-09-09 14:50:58 +03:00
nc_update() {
CURRENTVERSION=$(sudo -u www-data php $NCPATH/occ status | grep "versionstring" | awk '{print $3}')
NCVERSION=$(curl -s -m 900 $NCREPO/ | sed --silent 's/.*href="nextcloud-\([^"]\+\).zip.asc".*/\1/p' | sort --version-sort | tail -1)
STABLEVERSION="nextcloud-$NCVERSION"
NCMAJOR="${NCVERSION%%.*}"
NCBAD=$((NCMAJOR-2))
2021-03-09 22:51:28 +03:00
NCNEXT="$((${CURRENTVERSION%%.*}+1))"
2020-09-09 14:50:58 +03:00
}
[ -n "$NC_UPDATE" ] && nc_update # TODO: remove this line someday
# Set the hour for automatic updates. This would be 18:00 as only the hour is configurable.
AUT_UPDATES_TIME="18"
2017-04-09 23:43:30 +03:00
# Keys
OpenPGP_fingerprint='28806A878AE423A28372792ED75899B9A724937A'
# Letsencrypt
SITES_AVAILABLE="/etc/apache2/sites-available"
2017-04-09 23:43:30 +03:00
LETSENCRYPTPATH="/etc/letsencrypt"
CERTFILES="$LETSENCRYPTPATH/live"
DHPARAMS_TLS="$CERTFILES/$TLSDOMAIN/dhparam.pem"
DHPARAMS_SUB="$CERTFILES/$SUBDOMAIN/dhparam.pem"
TLS_CONF="nextcloud_tls_domain_self_signed.conf"
HTTP_CONF="nextcloud_http_domain_self_signed.conf"
2017-04-09 23:43:30 +03:00
# Collabora App
HTTPS_CONF="$SITES_AVAILABLE/$SUBDOMAIN.conf"
2018-05-06 19:08:18 +03:00
HTTP2_CONF="/etc/apache2/mods-available/http2.conf"
2018-08-09 02:23:48 +03:00
# PHP-FPM
2020-04-21 23:31:21 +03:00
PHPVER=7.4
2019-11-07 23:13:19 +03:00
PHP_FPM_DIR=/etc/php/$PHPVER/fpm
2019-11-07 23:33:52 +03:00
PHP_INI=$PHP_FPM_DIR/php.ini
PHP_POOL_DIR=$PHP_FPM_DIR/pool.d
2020-07-19 22:33:53 +03:00
PHP_MODS_DIR=/etc/php/"$PHPVER"/mods-available
2018-08-06 21:33:39 +03:00
# Adminer
ADMINERDIR=/usr/share/adminer
ADMINER_CONF="$SITES_AVAILABLE/adminer.conf"
2017-04-09 23:43:30 +03:00
# Redis
REDIS_CONF=/etc/redis/redis.conf
2018-05-06 19:08:18 +03:00
REDIS_SOCK=/var/run/redis/redis-server.sock
REDIS_PASS=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
2017-04-09 23:43:30 +03:00
# Extra security
SPAMHAUS=/etc/spamhaus.wl
ENVASIVE=/etc/apache2/mods-available/mod-evasive.load
APACHE2=/etc/apache2/apache2.conf
2018-03-02 00:18:53 +03:00
# Full text Search
2020-09-09 14:50:58 +03:00
es_install() {
INDEX_USER=$(gen_passwd "$SHUF" '[:lower:]')
ROREST=$(gen_passwd "$SHUF" "A-Za-z0-9")
nc_fts="ark74/nc_fts"
fts_es_name="fts_esror"
}
[ -n "$ES_INSTALL" ] && es_install # TODO: remove this line someday
# Talk
2020-09-09 14:50:58 +03:00
turn_install() {
TURN_CONF="/etc/turnserver.conf"
TURN_PORT=3478
TURN_DOMAIN=$(sudo -u www-data /var/www/nextcloud/occ config:system:get overwrite.cli.url | sed 's|https://||;s|/||')
SHUF=$(shuf -i 25-29 -n 1)
TURN_SECRET=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
JANUS_API_KEY=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
NC_SECRET=$(gen_passwd "$SHUF" "a-zA-Z0-9@#*=")
SIGNALING_SERVER_CONF=/etc/signaling/server.conf
}
[ -n "$TURN_INSTALL" ] && turn_install # TODO: remove this line someday
2017-04-09 23:43:30 +03:00
2019-09-03 03:25:46 +03:00
## FUNCTIONS
2017-04-09 23:43:30 +03:00
# If script is running as root?
#
# Example:
# if is_root
# then
# # do stuff
# else
# print_text_in_color "$IRed" "You are not root..."
2017-04-09 23:43:30 +03:00
# exit 1
# fi
#
is_root() {
if [[ "$EUID" -ne 0 ]]
then
return 1
else
return 0
fi
}
# Check if root
root_check() {
if ! is_root
then
msg_box "Sorry, you are not root. You now have two options:
2017-12-05 23:36:37 +03:00
2020-12-13 22:08:13 +03:00
1. Use SUDO directly:
2017-12-06 00:02:51 +03:00
a) :~$ sudo bash $SCRIPTS/name-of-script.sh
2. Become ROOT and then type your command:
a) :~$ sudo -i
2019-06-25 21:28:36 +03:00
b) :~# bash $SCRIPTS/name-of-script.sh
2017-12-06 00:02:51 +03:00
2017-12-06 00:05:36 +03:00
In both cases above you can leave out $SCRIPTS/ if the script
2017-12-06 00:02:51 +03:00
is directly in your PATH.
2017-12-06 00:05:36 +03:00
More information can be found here: https://unix.stackexchange.com/a/3064"
exit 1
fi
}
2017-04-09 23:43:30 +03:00
debug_mode() {
if [ "$DEBUG" -eq 1 ]
then
set -ex
fi
}
msg_box() {
[ -n "$2" ] && local SUBTITLE=" - $2"
whiptail --title "$TITLE$SUBTITLE" --msgbox "$1" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3
}
yesno_box_yes() {
[ -n "$2" ] && local SUBTITLE=" - $2"
if (whiptail --title "$TITLE$SUBTITLE" --yesno "$1" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3)
then
return 0
else
return 1
fi
}
yesno_box_no() {
[ -n "$2" ] && local SUBTITLE=" - $2"
if (whiptail --title "$TITLE$SUBTITLE" --defaultno --yesno "$1" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3)
then
return 0
else
return 1
fi
}
input_box() {
[ -n "$2" ] && local SUBTITLE=" - $2"
local RESULT && RESULT=$(whiptail --title "$TITLE$SUBTITLE" --nocancel --inputbox "$1" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3)
echo "$RESULT"
}
input_box_flow() {
local RESULT
while :
do
RESULT=$(input_box "$1" "$2")
if [ -z "$RESULT" ]
then
msg_box "Input is empty, please try again." "$2"
elif ! yesno_box_yes "Is this correct? $RESULT" "$2"
then
msg_box "OK, please try again." "$2"
else
break
fi
done
echo "$RESULT"
}
2020-10-14 21:03:02 +03:00
install_popup() {
msg_box "$SCRIPT_EXPLAINER"
2020-10-14 21:03:02 +03:00
if yesno_box_yes "Do you want to install $1?"
then
2020-10-14 21:03:02 +03:00
print_text_in_color "$ICyan" "Installing $1..."
else
if [ -z "$2" ] || [ "$2" = "exit" ]
then
exit 1
elif [ "$2" = "sleep" ]
then
sleep 1
elif [ "$2" = "return" ]
then
return 1
else
exit 1
fi
fi
}
2020-09-13 22:37:08 +03:00
reinstall_remove_menu() {
2020-10-14 21:03:02 +03:00
REINSTALL_REMOVE=$(whiptail --title "$TITLE" --menu \
"It seems like $1 is already installed.\nChoose what you want to do.
$MENU_GUIDE\n\n$RUN_LATER_GUIDE" "$WT_HEIGHT" "$WT_WIDTH" 4 \
2020-10-14 22:59:38 +03:00
"Reinstall" " $1" \
"Uninstall" " $1" 3>&1 1>&2 2>&3)
2020-10-14 21:03:02 +03:00
if [ "$REINSTALL_REMOVE" = "Reinstall" ]
then
2020-10-14 21:03:02 +03:00
print_text_in_color "$ICyan" "Reinstalling $1..."
elif [ "$REINSTALL_REMOVE" = "Uninstall" ]
then
print_text_in_color "$ICyan" "Uninstalling $1..."
elif [ -z "$REINSTALL_REMOVE" ]
then
if [ -z "$2" ] || [ "$2" = "exit" ]
then
exit 1
elif [ "$2" = "sleep" ]
then
sleep 1
elif [ "$2" = "return" ]
then
return 1
else
exit 1
fi
fi
}
2020-09-13 22:37:08 +03:00
removal_popup() {
2020-10-14 21:03:02 +03:00
if [ "$REINSTALL_REMOVE" = "Uninstall" ]
then
2020-10-14 21:03:02 +03:00
msg_box "$1 was successfully uninstalled."
if [ -z "$2" ] || [ "$2" = "exit" ]
then
exit 1
elif [ "$2" = "sleep" ]
then
sleep 1
elif [ "$2" = "return" ]
then
return 1
else
exit 1
fi
elif [ "$REINSTALL_REMOVE" = "Reinstall" ]
then
print_text_in_color "$ICyan" "Reinstalling $1..."
2020-09-13 22:37:08 +03:00
else
2020-12-13 22:08:13 +03:00
msg_box "It seems like neither Uninstall nor Reinstall was selected, \
2020-10-14 21:03:02 +03:00
something is wrong here. Please report this to $ISSUES"
exit 1
fi
}
# Used in geoblock.sh
get_newest_dat_files() {
# IPv4
IPV4_NAME=$(curl -s https://github.com/nextcloud/vm/tree/master/geoblockdat \
| grep -oP '202[0-9]-[01][0-9]-Maxmind-Country-IPv4\.dat' | sort -r | head -1)
if [ -z "$IPV4_NAME" ]
then
2020-12-13 22:08:13 +03:00
print_text_in_color "$IRed" "Could not get the latest IPv4 name. Not updating the .dat file"
sleep 1
else
if ! [ -f "$SCRIPTS/$IPV4_NAME" ]
then
print_text_in_color "$ICyan" "Downloading new IPv4 dat file..."
sleep 1
check_command curl_to_dir "$GEOBLOCKDAT" "$IPV4_NAME" "$SCRIPTS"
mkdir -p /usr/share/GeoIP
rm -f /usr/share/GeoIP/GeoIP.dat
check_command cp "$SCRIPTS/$IPV4_NAME" /usr/share/GeoIP
check_command mv "/usr/share/GeoIP/$IPV4_NAME" /usr/share/GeoIP/GeoIP.dat
chown root:root /usr/share/GeoIP/GeoIP.dat
chmod 644 /usr/share/GeoIP/GeoIP.dat
find /var/scripts -type f -regex \
"$SCRIPTS/202[0-9]-[01][0-9]-Maxmind-Country-IPv4\.dat" -not -name "$IPV4_NAME" -delete
else
print_text_in_color "$ICyan" "The latest IPv4 dat file is already downloaded."
sleep 1
fi
fi
# IPv6
IPV6_NAME=$(curl -s https://github.com/nextcloud/vm/tree/master/geoblockdat \
| grep -oP '202[0-9]-[01][0-9]-Maxmind-Country-IPv6\.dat' | sort -r | head -1)
if [ -z "$IPV6_NAME" ]
then
2020-12-13 22:08:13 +03:00
print_text_in_color "$IRed" "Could not get the latest IPv6 name. Not updating the .dat file"
sleep 1
else
if ! [ -f "$SCRIPTS/$IPV6_NAME" ]
then
print_text_in_color "$ICyan" "Downloading new IPv6 dat file..."
sleep 1
check_command curl_to_dir "$GEOBLOCKDAT" "$IPV6_NAME" "$SCRIPTS"
mkdir -p /usr/share/GeoIP
rm -f /usr/share/GeoIP/GeoIPv6.dat
check_command cp "$SCRIPTS/$IPV6_NAME" /usr/share/GeoIP
check_command mv "/usr/share/GeoIP/$IPV6_NAME" /usr/share/GeoIP/GeoIPv6.dat
chown root:root /usr/share/GeoIP/GeoIPv6.dat
chmod 644 /usr/share/GeoIP/GeoIPv6.dat
find /var/scripts -type f -regex \
"$SCRIPTS/202[0-9]-[01][0-9]-Maxmind-Country-IPv6\.dat" -not -name "$IPV6_NAME" -delete
else
print_text_in_color "$ICyan" "The latest IPv6 dat file is already downloaded."
sleep 1
fi
fi
}
2017-08-20 23:36:37 +03:00
# Check if process is runnnig: is_process_running dpkg
is_process_running() {
PROCESS="$1"
while :
do
RESULT=$(pgrep "${PROCESS}")
if [ "${RESULT:-null}" = null ]; then
break
else
print_text_in_color "$ICyan" "${PROCESS} is running, waiting for it to stop. Please be patient..."
sleep 30
2017-08-20 23:36:37 +03:00
fi
done
}
# Checks if site is reachable with a HTTP 200 status
site_200() {
2019-04-26 13:37:43 +03:00
print_text_in_color "$ICyan" "Checking connection..."
2020-08-06 12:52:15 +03:00
CURL_STATUS="$(curl -LI "${1}" -o /dev/null -w '%{http_code}\n' -s)"
2019-04-11 22:02:05 +03:00
if [[ "$CURL_STATUS" = "200" ]]
then
return 0
else
2020-09-17 13:07:51 +03:00
print_text_in_color "$IRed" "curl didn't produce a 200 status, is ${1} reachable?"
2019-04-11 22:02:05 +03:00
return 1
fi
}
2019-05-10 16:23:23 +03:00
# Do a DNS lookup and compare the WAN address with the A record
2019-04-11 22:02:05 +03:00
domain_check_200() {
print_text_in_color "$ICyan" "Doing a DNS lookup for ${1}..."
install_if_not dnsutils
2019-05-10 17:09:06 +03:00
# Try to resolve the domain with nslookup using $DNS as resolver
2021-04-16 15:47:16 +03:00
if nslookup "${1}" "$INTERNET_DNS"
then
2019-05-10 16:23:23 +03:00
print_text_in_color "$IGreen" "DNS seems correct when checking with nslookup!"
else
2021-04-16 15:47:16 +03:00
msg_box "DNS lookup failed with nslookup. \
Please check your DNS settings! Maybe the domain isn't propagated?
You can use this site to check if the IP seems correct: https://www.whatsmydns.net/#A/${1}"
if ! yesno_box_no "Are you 100% sure the domain is correct?"
then
exit
fi
fi
2019-05-10 17:09:06 +03:00
# Is the DNS record same as the external IP address of the server?
if dig +short "${1}" @resolver1.opendns.com | grep -q "$WANIP4"
2019-05-10 16:23:23 +03:00
then
print_text_in_color "$IGreen" "DNS seems correct when checking with dig!"
else
msg_box "DNS lookup failed with dig. The external IP ($WANIP4) \
address of this server is not the same as the A-record ($DIG).
2020-12-13 22:08:13 +03:00
Please check your DNS settings! Maybe the domain hasn't propagated?
Please check https://www.whatsmydns.net/#A/${1} if the IP seems correct."
msg_box "As you noticed your WAN IP and DNS record doesn't match. \
2020-12-13 22:08:13 +03:00
This can happen when using DDNS for example, or in other edge cases.
If you feel brave, or are sure that everything is set up correctly, \
then you can choose to skip this test in the next step.
2020-12-13 22:08:13 +03:00
If needed, you can always contact us for further support: \
https://shop.hanssonit.se/product/premium-support-per-30-minutes/"
if ! yesno_box_no "Do you feel brave and want to continue?"
2021-04-16 15:47:16 +03:00
then
exit
fi
fi
}
# A function to set the systemd-resolved default DNS servers based on the
# current Internet facing interface. This is needed for docker interfaces
# that might not use the same DNS servers otherwise.
set_systemd_resolved_dns() {
local iface="$1"
local pattern="$iface(?:.|\n)*?DNS Servers: ((?:[0-9a-f.: ]|\n)*?)\s*(?=\n\S|\n.+: |$)"
local dnss
dnss=$( systemd-resolve --status | perl -0777 -ne "if ((\$v) = (/$pattern/)) {\$v=~s/(?:\s|\n)+/ /g;print \"\$v\n\";}" )
if [ -n "$dnss" ]
then
sed -i "s/^#\?DNS=.*$/DNS=${dnss}/" /etc/systemd/resolved.conf
systemctl restart systemd-resolved &>/dev/null
sleep 1
fi
}
# A function to fetch a file with curl to a directory
# 1 = https://example.com
# 2 = name of file
# 3 = directory that the file should end up in
curl_to_dir() {
2019-04-10 23:22:53 +03:00
if [ ! -d "$3" ]
then
mkdir -p "$3"
fi
2019-06-07 18:12:02 +03:00
rm -f "$3"/"$2"
2019-04-11 23:23:28 +03:00
curl -sfL "$1"/"$2" -o "$3"/"$2"
}
2019-01-24 00:38:38 +03:00
start_if_stopped() {
if ! pgrep "$1"
then
print_text_in_color "$ICyan" "Starting $1..."
systemctl start "$1".service
2019-01-24 00:38:38 +03:00
fi
}
2018-08-09 02:23:48 +03:00
# Warn user that HTTP/2 will be disabled if installing app that use Apache2 PHP instead of PHP-FPM
# E.g: http2_warn Modsecurity
http2_warn() {
msg_box "This VM has HTTP/2 enabled by default.
2018-08-09 02:23:48 +03:00
If you continue with installing $1, HTTP/2 will be disabled since it's not compatible with the mpm module used by $1.
This is what Apache will say in the error.log if you enable $1 anyway:
'The mpm module (prefork.c) is not supported by mod_http2.
2018-08-09 02:23:48 +03:00
The mpm determines how things are processed in your server.
HTTP/2 has more demands in this regard and the currently selected mpm will just not do.
This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.'"
2018-08-09 02:23:48 +03:00
if ! yesno_box_yes "Do you really want to enable $1 anyway?"
2018-08-09 02:23:48 +03:00
then
exit 1
fi
}
calculate_php_fpm() {
2020-06-26 21:34:26 +03:00
# Get current PHP version
check_php
# Minimum amount of max children (lower than this won't work with 2 GB RAM)
min_max_children=8
# If start servers are lower than this then it's likely that there are room for max_spare_servers
min_start_servers=20
# Maximum amount of children is only set if the min_start_servers value are met
min_max_spare_servers=35
# Calculate the sum of the current values
2019-11-07 23:13:19 +03:00
CURRENT_START="$(grep pm.start_servers "$PHP_POOL_DIR"/nextcloud.conf | awk '{ print $3}')"
CURRENT_MAX="$(grep pm.max_spare_servers "$PHP_POOL_DIR"/nextcloud.conf | awk '{ print $3}')"
CURRENT_MIN="$(grep pm.min_spare_servers "$PHP_POOL_DIR"/nextcloud.conf | awk '{ print $3}')"
CURRENT_SUM="$((CURRENT_START + CURRENT_MAX + CURRENT_MIN))"
# Calculate max_children depending on RAM
# Tends to be between 30-50MB per children
average_php_memory_requirement=50
available_memory=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
PHP_FPM_MAX_CHILDREN=$((available_memory/average_php_memory_requirement))
2018-08-09 02:23:48 +03:00
# Lowest possible value is 8
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Automatically configures pm.max_children for php-fpm..."
if [ $PHP_FPM_MAX_CHILDREN -lt $min_max_children ]
2018-08-09 02:23:48 +03:00
then
msg_box "The current max_children value available to set is \
2020-12-13 22:08:13 +03:00
$PHP_FPM_MAX_CHILDREN, and PHP-FPM won't function properly with that value.
The minimum value is 8, and the value is calculated depening on how much available RAM you have left.
2018-08-09 02:23:48 +03:00
The absolute minimum amount of RAM required to run the VM is 2 GB, but we recommend 4 GB.
2018-08-09 02:23:48 +03:00
You now have two choices:
2020-12-13 22:08:13 +03:00
1. Import this VM again, raise the amount of RAM with at least 1 GB, and run this script
in the same way as you just have.
2018-08-09 02:23:48 +03:00
2. Import this VM again without raising the RAM, but don't install any of the following apps:
1) Collabora
2) OnlyOffice
3) Full Text Search
This script will now exit.
2018-08-09 02:23:48 +03:00
The installation was not successful, sorry for the inconvenience.
If you think this is a bug, please report it to $ISSUES"
exit 1
else
2019-11-07 23:13:19 +03:00
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" "$PHP_POOL_DIR"/nextcloud.conf
2018-12-18 01:27:01 +03:00
print_text_in_color "$IGreen" "pm.max_children was set to $PHP_FPM_MAX_CHILDREN"
# Check if the sum of all the current values are more than $PHP_FPM_MAX_CHILDREN and only continue it is
if [ $PHP_FPM_MAX_CHILDREN -gt $CURRENT_SUM ]
then
# Set pm.max_spare_servers
if [ $PHP_FPM_MAX_CHILDREN -ge $min_max_spare_servers ]
then
2019-11-07 23:13:19 +03:00
if [ "$(grep pm.start_servers "$PHP_POOL_DIR"/nextcloud.conf | awk '{ print $3}')" -lt $min_start_servers ]
then
2019-11-07 23:13:19 +03:00
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = $((PHP_FPM_MAX_CHILDREN - 30))|g" "$PHP_POOL_DIR"/nextcloud.conf
print_text_in_color "$IGreen" "pm.max_spare_servers was set to $((PHP_FPM_MAX_CHILDREN - 30))"
fi
fi
fi
fi
# If $PHP_FPM_MAX_CHILDREN is lower than the current sum of all values, revert to default settings
if [ $PHP_FPM_MAX_CHILDREN -lt $CURRENT_SUM ]
then
2019-11-07 23:13:19 +03:00
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" "$PHP_POOL_DIR"/nextcloud.conf
check_command sed -i "s|pm.start_servers.*|pm.start_servers = 3|g" "$PHP_POOL_DIR"/nextcloud.conf
check_command sed -i "s|pm.min_spare_servers.*|pm.min_spare_servers = 2|g" "$PHP_POOL_DIR"/nextcloud.conf
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = 3|g" "$PHP_POOL_DIR"/nextcloud.conf
print_text_in_color "$ICyan" "All PHP-INI values were set back to default values as the value for pm.max_children ($PHP_FPM_MAX_CHILDREN) was lower than the sum of all the current values ($CURRENT_SUM)"
print_text_in_color "$ICyan" "Please run this again to set optimal values"
2018-08-09 02:23:48 +03:00
fi
restart_webserver
2018-08-09 02:23:48 +03:00
}
# Compatibility with older VMs
calculate_max_children() {
calculate_php_fpm
}
2018-05-06 19:08:18 +03:00
test_connection() {
version(){
local h t v
[[ $2 = "$1" || $2 = "$3" ]] && return 0
v=$(printf '%s\n' "$@" | sort -V)
h=$(head -n1 <<<"$v")
t=$(tail -n1 <<<"$v")
[[ $2 != "$h" && $2 != "$t" ]]
}
2021-03-18 00:38:29 +03:00
if ! version 18.04 "$DISTRO" 20.04.10
then
print_text_in_color "$IRed" "Your current Ubuntu version is $DISTRO but must be between \
2021-03-18 00:38:29 +03:00
18.04 - 20.04.10 to run this script."
2020-12-13 22:08:13 +03:00
print_text_in_color "$ICyan" "Please contact us for support upgrading your server:"
print_text_in_color "$ICyan" "https://www.hanssonit.se/#contact"
print_text_in_color "$ICyan" "https://shop.hanssonit.se/"
2020-05-01 11:32:49 +03:00
sleep 300
fi
# Install dnsutils if not existing
2019-01-17 15:43:00 +03:00
if ! dpkg-query -W -f='${Status}' "dnsutils" | grep -q "ok installed"
then
2019-01-17 15:43:00 +03:00
apt update -q4 & spinner_loading && apt install dnsutils -y
fi
2020-04-21 23:31:21 +03:00
# Install net-tools if not existing
if ! dpkg-query -W -f='${Status}' "net-tools" | grep -q "ok installed"
then
2020-04-21 23:31:21 +03:00
apt update -q4 & spinner_loading && apt install net-tools -y
fi
# After applying Netplan settings, try a DNS lookup.
# Restart systemd-networkd if this fails and try again.
# If this second check also fails, consider this a problem.
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Checking connection..."
2020-04-21 23:31:21 +03:00
netplan apply
2018-05-22 23:15:18 +03:00
sleep 2
if ! nslookup github.com
then
2020-04-21 23:31:21 +03:00
print_text_in_color "$ICyan" "Trying to restart netplan service..."
check_command systemctl restart systemd-networkd && sleep 2
2018-05-22 23:15:18 +03:00
if ! nslookup github.com
then
2020-12-13 22:08:13 +03:00
msg_box "Network is NOT OK. You must have a working network connection to run this script.
2018-05-06 19:08:18 +03:00
If you think that this is a bug, please report it to https://github.com/nextcloud/vm/issues."
return 1
2018-05-22 23:15:18 +03:00
fi
2018-05-06 19:08:18 +03:00
fi
print_text_in_color "$IGreen" "Online!"
return 0
2018-05-06 19:08:18 +03:00
}
# Check that the script can see the external IP (apache fails otherwise), used e.g. in the adminer app script.
check_external_ip() {
if [ -z "$WANIP4" ]
then
print_text_in_color "$IRed" "WANIP4 is an empty value, Apache will fail on reboot due to this. \
Please check your network and try again."
sleep 3
exit 1
fi
}
# Check if Nextcloud is installed with TLS
check_nextcloud_https() {
2020-10-08 20:51:21 +03:00
if ! nextcloud_occ_no_check config:system:get overwrite.cli.url | grep -q "https"
then
2020-12-13 22:08:13 +03:00
msg_box "Sorry, but Nextcloud needs to be run on HTTPS.
You can easily activate TLS (HTTPS) by running the Let's Encrypt script.
More info here: https://bit.ly/37wRCin
To run this script again, just exectue 'sudo bash $SCRIPTS/menu.sh' and choose:
Additional Apps --> Documentserver --> $1."
exit
fi
}
2018-08-09 02:23:48 +03:00
restart_webserver() {
2020-04-21 23:31:21 +03:00
check_command systemctl restart apache2.service
2019-07-29 16:08:46 +03:00
if is_this_installed php"$PHPVER"-fpm
then
2019-05-17 13:51:36 +03:00
check_command systemctl restart php"$PHPVER"-fpm.service
fi
2018-08-09 02:23:48 +03:00
}
2017-07-23 00:28:35 +03:00
# Install certbot (Let's Encrypt)
install_certbot() {
certbot --version 2> /dev/null
LE_IS_AVAILABLE=$?
if [ $LE_IS_AVAILABLE -eq 0 ]
then
2018-09-28 17:36:57 +03:00
certbot --version 2> /dev/null
2017-07-23 00:28:35 +03:00
else
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Installing certbot (Let's Encrypt)..."
2020-04-25 00:47:49 +03:00
install_if_not snapd
2020-08-04 22:06:37 +03:00
snap install certbot --classic
2020-04-25 00:47:49 +03:00
# Update $PATH in current session (login and logout is required otherwise)
2020-06-04 03:28:43 +03:00
check_command hash -r
2017-07-23 00:28:35 +03:00
fi
}
2020-08-19 10:56:59 +03:00
# Generate certs and configure it automatically
# https://certbot.eff.org/docs/using.html#certbot-command-line-options
generate_cert() {
uir_hsts=""
if [ -z "$SUBDOMAIN" ]
then
uir_hsts="--uir --hsts"
fi
2017-08-31 08:24:08 +03:00
a2dissite 000-default.conf
2020-04-21 23:31:21 +03:00
systemctl reload apache2.service
default_le="--rsa-key-size 4096 --renew-by-default --no-eff-email --agree-tos $uir_hsts --server https://acme-v02.api.letsencrypt.org/directory -d $1"
#http-01
2020-04-21 23:31:21 +03:00
local standalone="certbot certonly --standalone --pre-hook \"systemctl stop apache2.service\" --post-hook \"systemctl start apache2.service\" $default_le"
#tls-alpn-01
local tls_alpn_01="certbot certonly --preferred-challenges tls-alpn-01 $default_le"
#dns
local dns="certbot certonly --manual --manual-public-ip-logging-ok --preferred-challenges dns $default_le"
local methods=(standalone dns)
for f in ${methods[*]}
do
print_text_in_color "${ICyan}" "Trying to generate certs and validate them with $f method."
current_method=""
eval current_method="\$$f"
if eval "$current_method"
then
return 0
elif [ "$f" != "${methods[$((${#methods[*]} - 1))]}" ]
then
msg_box "It seems like no certs were generated when trying \
2020-12-13 22:08:13 +03:00
to validate them with the $f method. We will retry."
else
msg_box "It seems like no certs were generated when trying \
2020-12-13 22:08:13 +03:00
to validate them with the $f method. We have exhausted all the methods. Please check your DNS and try again."
return 1;
fi
done
}
# Last message depending on with script that is being run when using the generate_cert() function
last_fail_tls() {
msg_box "All methods failed. :/
2020-08-19 10:56:59 +03:00
You can run the script again by executing: sudo bash $SCRIPTS/menu.sh
Please try to run it again some other time with other settings.
There are different configs you can try in Let's Encrypt's user guide:
https://letsencrypt.readthedocs.org/en/latest/index.html
2020-04-21 23:31:21 +03:00
Please check the guide for further information on how to enable TLS.
This script is developed on GitHub, feel free to contribute:
https://github.com/nextcloud/vm"
if [ -n "$2" ]
then
msg_box "The script will now do some cleanup and revert the settings."
# Cleanup
snap remove certbot
rm -f "$SCRIPTS"/test-new-config.sh
fi
# Restart webserver services
restart_webserver
2017-08-31 08:24:08 +03:00
}
# Use like this: open_port 443 TCP
# or e.g. open_port 3478 UDP
open_port() {
install_if_not miniupnpc
print_text_in_color "$ICyan" "Trying to open port $1 automatically..."
if ! upnpc -a "$ADDRESS" "$1" "$1" "$2" &>/dev/null
then
msg_box "Failed to open port $1 $2 automatically. You have to do this manually."
FAIL=1
fi
}
cleanup_open_port() {
if [ -n "$FAIL" ]
then
apt-get purge miniupnpc -y
apt autoremove -y
fi
}
2018-05-06 19:08:18 +03:00
# Check if port is open # check_open_port 443 domain.example.com
2017-10-04 21:23:13 +03:00
check_open_port() {
2020-05-09 22:41:22 +03:00
print_text_in_color "$ICyan" "Checking if port ${1} is open with https://www.networkappers.com/tools/open-port-checker..."
2019-07-18 15:48:23 +03:00
install_if_not curl
# WAN Address
2020-05-09 22:41:22 +03:00
if check_command curl -s -H 'Cache-Control: no-cache' -H 'Referer: https://www.networkappers.com/tools/open-port-checker' "https://networkappers.com/api/port.php?ip=${WANIP4}&port=${1}" | grep -q "open"
2017-10-04 21:23:13 +03:00
then
print_text_in_color "$IGreen" "Port ${1} is open on ${WANIP4}!"
2019-07-18 15:48:23 +03:00
# Domain name
2020-05-09 22:41:22 +03:00
elif check_command curl -s -H 'Cache-Control: no-cache' -H 'Referer: https://www.networkappers.com/tools/open-port-checker' "https://www.networkappers.com/api/port.php?ip=${2}&port=${1}" | grep -q "open"
2017-10-04 21:23:13 +03:00
then
print_text_in_color "$IGreen" "Port ${1} is open on ${2}!"
2017-10-04 21:23:13 +03:00
else
msg_box "It seems like the port ${1} is closed. This could happened when your
2020-12-13 22:08:13 +03:00
ISP has blocked the port, or the port isn't open.
2020-12-13 22:08:13 +03:00
If you are 100% sure the port ${1} is open, you can choose to
continue. There are no guarantees that it will work though,
since the service depends on port ${1} being open and
accessible from outside your network."
if ! yesno_box_no "Are you 100% sure the port ${1} is open?"
then
msg_box "Port $1 is not open on either ${WANIP4} or ${2}.
Please follow this guide to open ports in your router or firewall:\nhttps://www.techandme.se/open-port-80-443/"
any_key "Press any key to exit..."
exit 1
fi
2017-10-04 21:23:13 +03:00
fi
}
2018-05-06 19:08:18 +03:00
check_distro_version() {
# Check Ubuntu version
2020-04-21 23:31:21 +03:00
if lsb_release -sc | grep -ic "bionic" &> /dev/null || lsb_release -sc | grep -ic "focal" &> /dev/null
2018-11-16 22:31:55 +03:00
then
OS=1
elif lsb_release -i | grep -ic "Ubuntu" &> /dev/null
then
2018-11-16 22:31:55 +03:00
OS=1
2020-04-21 23:31:21 +03:00
elif uname -a | grep -ic "bionic" &> /dev/null || uname -a | grep -ic "focal" &> /dev/null
2018-07-09 16:23:46 +03:00
then
OS=1
2018-08-09 02:23:48 +03:00
elif uname -v | grep -ic "Ubuntu" &> /dev/null
then
2018-07-09 16:23:46 +03:00
OS=1
fi
2018-05-06 19:08:18 +03:00
if [ "$OS" != 1 ]
then
msg_box "Ubuntu Server is required to run this script.
2018-05-06 19:08:18 +03:00
Please install that distro and try again.
You can find the download link here: https://www.ubuntu.com/download/server"
exit 1
fi
2021-03-18 00:38:29 +03:00
if ! version 18.04 "$DISTRO" 20.04.10; then
msg_box "Your current Ubuntu version is $DISTRO but must be between 18.04 - 20.04.10 to run this script."
msg_box "Please contact us to get support for upgrading your server:
2020-04-21 23:31:21 +03:00
https://www.hanssonit.se/#contact
https://shop.hanssonit.se/"
2018-05-06 19:08:18 +03:00
exit 1
fi
}
2019-07-29 16:08:46 +03:00
# Check if program is installed (stop_if_installed apache2)
stop_if_installed() {
2017-06-23 16:09:40 +03:00
if [ "$(dpkg-query -W -f='${Status}' "${1}" 2>/dev/null | grep -c "ok installed")" == "1" ]
then
2019-07-29 16:08:46 +03:00
print_text_in_color "$IRed" "${1} is installed, it must be a clean server."
2017-06-23 16:09:40 +03:00
exit 1
fi
}
2019-07-29 16:08:46 +03:00
# Check if program is installed (is_this_installed apache2)
is_this_installed() {
if dpkg-query -W -f='${Status}' "${1}" | grep -q "ok installed"
then
return 0
else
return 1
fi
}
# Install_if_not program
2019-01-17 15:21:23 +03:00
install_if_not() {
if ! dpkg-query -W -f='${Status}' "${1}" | grep -q "ok installed"
then
apt update -q4 & spinner_loading && RUNLEVEL=1 apt install "${1}" -y
fi
}
2018-12-18 01:27:01 +03:00
# Test RAM size
# Call it like this: ram_check [amount of min RAM in GB] [for which program]
# Example: ram_check 2 Nextcloud
ram_check() {
install_if_not bc
mem_available="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
2020-10-17 23:49:29 +03:00
mem_available_gb="$(LC_NUMERIC="en_US.UTF-8" printf '%0.2f\n' "$(echo "scale=3; $mem_available/(1024*1024)" | bc)")"
mem_required="$((${1}*(924*1024)))" # 100MiB/GiB margin and allow 90% to be able to run on physical machines
if [ "${mem_available}" -lt "${mem_required}" ]
then
print_text_in_color "$IRed" "Error: ${1} GB RAM required to install ${2}!" >&2
print_text_in_color "$IRed" "Current RAM is: ($mem_available_gb GB)" >&2
sleep 3
msg_box "** Error: insufficient memory. ${mem_available_gb}GB RAM installed, ${1}GB required.
2018-12-18 01:27:01 +03:00
To bypass this check, comment out (add # before the line) 'ram_check X' in the script that you are trying to run.
2018-12-18 01:27:01 +03:00
In nextcloud_install_production.sh you can find the check somewhere around line #98.
2020-12-13 22:08:13 +03:00
Please note this may affect performance. USE AT YOUR OWN RISK!"
exit 1
else
print_text_in_color "$IGreen" "RAM for ${2} OK! ($mem_available_gb GB)"
fi
}
# Test number of CPU
# Call it like this: cpu_check [amount of min CPU] [for which program]
# Example: cpu_check 2 Nextcloud
cpu_check() {
nr_cpu="$(nproc)"
if [ "${nr_cpu}" -lt "${1}" ]
then
print_text_in_color "$IRed" "Error: ${1} CPU required to install ${2}!" >&2
print_text_in_color "$IRed" "Current CPU: ($((nr_cpu)))" >&2
sleep 3
exit 1
else
print_text_in_color "$IGreen" "CPU for ${2} OK! ($((nr_cpu)))"
fi
}
2017-04-09 23:43:30 +03:00
check_command() {
if ! "$@";
then
print_text_in_color "$ICyan" "Sorry but something went wrong. Please report \
this issue to $ISSUES and include the output of the error message. Thank you!"
print_text_in_color "$IRed" "$* failed"
2020-10-08 20:51:21 +03:00
if nextcloud_occ_no_check -V > /dev/null
then
notify_admin_gui \
"Sorry but something went wrong. Please report this issue to \
$ISSUES and include the output of the error message. Thank you!" \
"$* failed"
fi
2017-04-09 23:43:30 +03:00
exit 1
fi
2017-04-09 23:43:30 +03:00
}
2020-10-08 20:51:21 +03:00
# Example: nextcloud_occ 'maintenance:mode --on'
nextcloud_occ() {
2018-03-07 02:25:24 +03:00
check_command sudo -u www-data php "$NCPATH"/occ "$@";
}
2020-10-08 20:51:21 +03:00
# Example: nextcloud_occ_no_check 'maintenance:mode --on'
nextcloud_occ_no_check() {
sudo -u www-data php "$NCPATH"/occ "$@";
}
2020-10-08 20:51:21 +03:00
# Backwards compatibility (2020-10-08)
occ_command() {
2020-10-08 21:48:21 +03:00
nextcloud_occ "$@";
2020-10-08 20:51:21 +03:00
}
occ_command_no_check() {
2020-10-08 21:48:21 +03:00
nextcloud_occ_no_check "$@";
2020-10-08 20:51:21 +03:00
}
2017-04-09 23:43:30 +03:00
network_ok() {
version(){
local h t v
[[ $2 = "$1" || $2 = "$3" ]] && return 0
v=$(printf '%s\n' "$@" | sort -V)
h=$(head -n1 <<<"$v")
t=$(tail -n1 <<<"$v")
[[ $2 != "$h" && $2 != "$t" ]]
}
2021-03-18 00:38:29 +03:00
if version 18.04 "$DISTRO" 20.04.10
then
print_text_in_color "$ICyan" "Testing if network is OK..."
if site_200 github.com
then
return
fi
if ! netplan apply
then
systemctl restart systemd-networkd > /dev/null
fi
# Check the connention
countdown 'Waiting for network to restart...' 3
if ! site_200 github.com
then
# sleep 10 seconds so that some slow networks have time to restart
countdown 'Not online yet, waiting a bit more...' 10
if ! site_200 github.com
then
# sleep 30 seconds so that some REALLY slow networks have time to restart
2020-12-13 22:08:13 +03:00
countdown 'Not online yet, waiting a bit more (final attempt)...' 30
site_200 github.com
fi
fi
else
2021-03-18 00:38:29 +03:00
msg_box "Your current Ubuntu version is $DISTRO but must be between 18.04 - 20.04.10 to run this script."
msg_box "Please contact us to get support for upgrading your server:
https://www.hanssonit.se/#contact
https://shop.hanssonit.se/"
msg_box "We will now pause for 60 seconds. Please press CTRL+C when prompted to do so."
countdown "Please press CTRL+C to abort..." 60
fi
2017-04-09 23:43:30 +03:00
}
# Whiptail auto-size
calc_wt_size() {
WT_HEIGHT=17
WT_WIDTH=$(tput cols)
if [ -z "$WT_WIDTH" ] || [ "$WT_WIDTH" -lt 60 ]; then
WT_WIDTH=80
fi
if [ "$WT_WIDTH" -gt 178 ]; then
WT_WIDTH=120
fi
WT_MENU_HEIGHT=$((WT_HEIGHT-7))
export WT_MENU_HEIGHT
}
# example: is_app_enabled documentserver_community
is_app_enabled() {
2020-10-08 20:51:21 +03:00
if nextcloud_occ app:list | sed '/Disabled/,$d' | awk '{print$2}' | tr -d ':' | sed '/^$/d' | grep -q "^$1$"
then
return 0
else
return 1
fi
}
#example: is_app_installed documentserver_community
is_app_installed() {
2020-10-18 23:52:17 +03:00
if nextcloud_occ app:list | grep -wq "$1"
then
return 0
else
return 1
fi
}
2018-02-06 19:09:44 +03:00
install_and_enable_app() {
# Download and install $1
if ! is_app_installed "$1"
2018-02-06 19:09:44 +03:00
then
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Installing $1..."
2020-10-08 20:51:21 +03:00
# nextcloud_occ not possible here because it uses check_command and will exit if nextcloud_occ fails
installcmd="$(nextcloud_occ_no_check app:install "$1")"
2019-08-27 02:28:07 +03:00
if grep 'not compatible' <<< "$installcmd"
then
msg_box "The $1 app could not be installed.
2020-10-08 20:51:21 +03:00
It's probably not compatible with $(nextcloud_occ -V).
You can try to install the app manually after the script has finished,
or when a new version of the app is released with the following command:
'sudo -u www-data php ${NCPATH}/occ app:install $1'"
2019-08-27 02:28:07 +03:00
rm -Rf "$NCPATH/apps/$1"
else
2020-10-19 01:30:58 +03:00
# Enable $1 if it's installed but not enabled
if is_app_installed "$1"
2019-08-27 02:28:07 +03:00
then
2020-10-19 01:30:58 +03:00
if ! is_app_enabled "$1"
then
nextcloud_occ_no_check app:enable "$1"
2020-10-19 01:30:58 +03:00
chown -R www-data:www-data "$NC_APPS_PATH"
fi
2019-08-27 02:28:07 +03:00
fi
fi
2019-08-27 02:28:07 +03:00
else
2019-08-27 11:56:10 +03:00
print_text_in_color "$ICyan" "It seems like $1 is installed already, trying to enable it..."
2020-10-08 20:51:21 +03:00
nextcloud_occ_no_check app:enable "$1"
2018-02-06 19:09:44 +03:00
fi
}
2017-04-09 23:43:30 +03:00
download_verify_nextcloud_stable() {
2020-01-19 12:46:24 +03:00
# Check the current Nextcloud version
2019-07-03 21:56:04 +03:00
while [ -z "$NCVERSION" ]
do
2019-10-17 22:01:47 +03:00
print_text_in_color "$ICyan" "Fetching the latest Nextcloud version..."
NCVERSION=$(curl -s -m 900 $NCREPO/ | sed --silent 's/.*href="nextcloud-\([^"]\+\).zip.asc".*/\1/p' | sort --version-sort | tail -1)
STABLEVERSION="nextcloud-$NCVERSION"
2019-07-03 23:16:43 +03:00
print_text_in_color "$IGreen" "$NCVERSION"
2019-07-03 21:56:04 +03:00
done
2020-01-19 12:46:24 +03:00
# Download the file
rm -f "$HTML/$STABLEVERSION.tar.bz2"
2019-05-23 21:14:20 +03:00
cd $HTML
2019-07-04 14:49:39 +03:00
print_text_in_color "$ICyan" "Downloading $STABLEVERSION..."
2020-01-19 12:46:24 +03:00
if network_ok
then
curl -fSLO --retry 3 "$NCREPO"/"$STABLEVERSION".tar.bz2
else
2020-12-13 22:08:13 +03:00
msg_box "There seems to be an issue with your network, please try again later.\nThis script will now exit."
2020-01-19 12:46:24 +03:00
exit 1
fi
# Checksum of the downloaded file
print_text_in_color "$ICyan" "Checking SHA256 checksum..."
mkdir -p "$SHA256_DIR"
curl_to_dir "$NCREPO" "$STABLEVERSION.tar.bz2.sha256" "$SHA256_DIR"
SHA256SUM="$(tail "$SHA256_DIR"/"$STABLEVERSION".tar.bz2.sha256 | awk '{print$1}')"
if ! echo "$SHA256SUM" "$STABLEVERSION.tar.bz2" | sha256sum -c
then
msg_box "The SHA256 checksums of $STABLEVERSION.tar.bz2 didn't match, please try again."
exit 1
fi
2020-01-20 11:30:36 +03:00
# integrity of the downloaded file
print_text_in_color "$ICyan" "Checking GPG integrity..."
2020-01-19 12:46:24 +03:00
install_if_not gnupg
2017-04-09 23:43:30 +03:00
mkdir -p "$GPGDIR"
curl_to_dir "$NCREPO" "$STABLEVERSION.tar.bz2.asc" "$GPGDIR"
2017-04-09 23:43:30 +03:00
chmod -R 600 "$GPGDIR"
gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$OpenPGP_fingerprint"
gpg --verify "$GPGDIR/$STABLEVERSION.tar.bz2.asc" "$HTML/$STABLEVERSION.tar.bz2"
2020-01-20 11:30:36 +03:00
rm -r "$SHA256_DIR"
2017-04-09 23:43:30 +03:00
rm -r "$GPGDIR"
2017-09-23 19:32:38 +03:00
rm -f releases
2017-04-09 23:43:30 +03:00
}
# call like: download_script folder_variable name_of_script
# e.g. download_script MENU additional_apps
# Use it for functions like download_static_script
download_script() {
rm -f "${SCRIPTS}/${2}.sh" "${SCRIPTS}/${2}.php" "${SCRIPTS}/${2}.py"
if ! { curl_to_dir "${!1}" "${2}.sh" "$SCRIPTS" || curl_to_dir "${!1}" "${2}.php" "$SCRIPTS" || curl_to_dir "${!1}" "${2}.py" "$SCRIPTS"; }
2017-04-09 23:43:30 +03:00
then
2021-01-08 11:45:40 +03:00
print_text_in_color "$IRed" "Downloading ${2} failed"
2020-10-09 21:05:12 +03:00
sleep 2
2021-01-08 11:45:40 +03:00
msg_box "Script failed to download. Please run: \
'sudo curl -sLO ${!1}/${2}.sh|php|py' and try again.
2020-10-09 21:05:12 +03:00
If it still fails, please report this issue to: $ISSUES."
2017-04-09 23:43:30 +03:00
exit 1
2020-10-10 09:03:05 +03:00
fi
2017-04-09 23:43:30 +03:00
}
# call like: run_script folder_variable name_of_script
# e.g. run_script MENU additional_apps
# Use it for functions like run_script STATIC
run_script() {
rm -f "${SCRIPTS}/${2}.sh" "${SCRIPTS}/${2}.php" "${SCRIPTS}/${2}.py"
if download_script "${1}" "${2}"
2017-04-09 23:43:30 +03:00
then
if [ -f "${SCRIPTS}/${2}".sh ]
then
bash "${SCRIPTS}/${2}.sh"
rm -f "${SCRIPTS}/${2}.sh"
elif [ -f "${SCRIPTS}/${2}".php ]
then
php "${SCRIPTS}/${2}.php"
rm -f "${SCRIPTS}/${2}.php"
elif [ -f "${SCRIPTS}/${2}".py ]
then
install_if_not python3
python3 "${SCRIPTS}/${2}.py"
rm -f "${SCRIPTS}/${2}.py"
fi
else
print_text_in_color "$IRed" "Running ${2} failed"
2021-01-08 11:45:40 +03:00
sleep 2
msg_box "Script failed to execute. Please run: \
'sudo curl -sLO ${!1}/${2}.sh|php|py' and try again.
If it still fails, please report this issue to: $ISSUES."
2017-04-09 23:43:30 +03:00
exit 1
fi
}
# Run any script in ../master
# call like: run_main_script name_of_script
run_main_script() {
run_script GITHUB_REPO "${1}"
}
# Backwards compatibility (2020-10-25) Needed for update.sh to run in all VMs, even those several years old
run_static_script() {
run_script STATIC "${1}"
}
2017-04-09 23:43:30 +03:00
version(){
local h t v
[[ $2 = "$1" || $2 = "$3" ]] && return 0
v=$(printf '%s\n' "$@" | sort -V)
h=$(head -n1 <<<"$v")
t=$(tail -n1 <<<"$v")
[[ $2 != "$h" && $2 != "$t" ]]
}
version_gt() {
local v1 v2 IFS=.
read -ra v1 <<< "$1"
read -ra v2 <<< "$2"
printf -v v1 %03d "${v1[@]}"
printf -v v2 %03d "${v2[@]}"
[[ $v1 > $v2 ]]
}
spinner_loading() {
pid=$!
spin='-\|/'
i=0
while kill -0 $pid 2>/dev/null
do
i=$(( (i+1) %4 ))
printf "\r[${spin:$i:1}] " # Add text here, something like "Please be patient..." maybe?
2017-04-09 23:43:30 +03:00
sleep .1
done
}
any_key() {
local PROMPT="$1"
2018-12-18 00:24:50 +03:00
read -r -sn 1 -p "$(printf "%b" "${IGreen}${PROMPT}${Color_Off}")";echo
2017-04-09 23:43:30 +03:00
}
2018-03-02 00:18:53 +03:00
lowest_compatible_nc() {
2020-09-09 14:50:58 +03:00
if [ -z "$NCVERSION" ]
2020-03-02 23:58:47 +03:00
then
2020-09-09 14:50:58 +03:00
nc_update
2020-03-02 23:58:47 +03:00
fi
2018-03-02 02:12:52 +03:00
if [ "${CURRENTVERSION%%.*}" -lt "$1" ]
2018-03-02 00:18:53 +03:00
then
msg_box "This script is developed to work with Nextcloud $1 and later.
2018-03-07 02:25:24 +03:00
This means we can't use our own script for now. But don't worry,
2020-12-13 22:08:13 +03:00
we automated the update process and we will now use Nextcloud's updater instead.
2018-03-07 02:25:24 +03:00
Press [OK] to continue the update, or press [CTRL+C] to abort.
2018-03-02 00:18:53 +03:00
If you are using Nextcloud $1 and later and still see this message,
2018-03-07 02:25:24 +03:00
or experience other issues then please report this to $ISSUES"
2018-03-31 15:12:33 +03:00
# Download the latest updater
# cd $NCPATH
# curl sLO https://github.com/nextcloud/updater/archive/master.zip
2018-03-31 15:12:33 +03:00
# install_if_not unzip
# unzip -q master.zip
# rm master.zip*
# rm updater/ -R
# mv updater-master/ updater/
# download_script STATIC setup_secure_permissions_nextcloud -P $SCRIPTS
2018-03-31 15:12:33 +03:00
# bash $SECURE
# cd
2018-03-07 02:25:24 +03:00
# Do the upgrade
chown -R www-data:www-data "$NCPATH"
rm -rf "$NCPATH"/assets
yes | sudo -u www-data php /var/www/nextcloud/updater/updater.phar
download_script STATIC setup_secure_permissions_nextcloud -P $SCRIPTS
2018-03-31 15:12:33 +03:00
bash $SECURE
2020-10-08 20:51:21 +03:00
nextcloud_occ maintenance:mode --off
2018-03-02 00:18:53 +03:00
fi
2018-03-02 02:07:54 +03:00
2018-03-07 02:25:24 +03:00
# Check new version
# shellcheck source=lib.sh
2020-09-09 14:50:58 +03:00
if [ -z "$NCVERSION" ]
2020-03-02 23:58:47 +03:00
then
2020-09-09 14:50:58 +03:00
nc_update
2020-03-02 23:58:47 +03:00
fi
2018-03-07 02:25:24 +03:00
if [ "${CURRENTVERSION%%.*}" -ge "$1" ]
then
sleep 1
else
2020-12-13 22:08:13 +03:00
msg_box "Your current version is still not compatible with the version required to run this script.
2020-02-19 16:14:17 +03:00
To upgrade between major versions, please check this out:
2020-02-19 16:14:17 +03:00
https://shop.hanssonit.se/product/upgrade-between-major-owncloud-nextcloud-versions/"
2020-10-08 20:51:21 +03:00
nextcloud_occ -V
2020-02-19 16:12:11 +03:00
exit
2018-03-07 02:25:24 +03:00
fi
}
2018-08-08 22:47:47 +03:00
# Check universe reposiroty
check_universe() {
UNIV=$(apt-cache policy | grep http | awk '{print $3}' | grep universe | head -n 1 | cut -d "/" -f 2)
if [ "$UNIV" != "universe" ]
2018-08-08 22:47:47 +03:00
then
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Adding required repo (universe)."
add-apt-repository universe
fi
}
# Check universe reposiroty
check_multiverse() {
MULTIV=$(apt-cache policy | grep http | awk '{print $3}' | grep multiverse | head -n 1 | cut -d "/" -f 2)
if [ "$MULTIV" != "multiverse" ]
then
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Adding required repo (multiverse)."
add-apt-repository multiverse
2018-08-08 22:47:47 +03:00
fi
}
2018-08-05 18:20:42 +03:00
set_max_count() {
if grep -F 'vm.max_map_count=262144' /etc/sysctl.conf ; then
print_text_in_color "$ICyan" "Max map count already set, skipping..."
2018-08-05 18:20:42 +03:00
else
sysctl -w vm.max_map_count=262144
{
echo "###################################################################"
echo "# Docker ES max virtual memory"
echo "vm.max_map_count=262144"
} >> /etc/sysctl.conf
2018-08-05 18:20:42 +03:00
fi
}
# Check if docker is installed
is_docker_running() {
docker ps -a > /dev/null 2>&1
}
# Check if specific docker image is present
is_image_present() {
[[ $(docker images -q "$1") ]]
}
# Check if old docker exists
# FULL NAME e.g. ark74/nc_fts or containrrr/watchtower or collabora/code
does_this_docker_exist() {
is_docker_running && is_image_present "$1";
}
2018-08-05 18:20:42 +03:00
install_docker() {
if ! is_docker_running
2018-08-09 02:23:48 +03:00
then
2020-07-18 12:16:46 +03:00
is_process_running dpkg
is_process_running apt
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Installing Docker CE..."
2019-06-06 23:46:08 +03:00
apt update -q4 & spinner_loading
2020-06-14 04:59:35 +03:00
install_if_not curl
curl -fsSL get.docker.com | sh
2018-08-05 18:20:42 +03:00
fi
2018-11-26 22:54:59 +03:00
# Set overlay2
cat << OVERLAY2 > /etc/docker/daemon.json
{
"storage-driver": "overlay2"
}
OVERLAY2
systemctl daemon-reload
2020-04-21 23:31:21 +03:00
systemctl restart docker.service
2018-08-05 18:20:42 +03:00
}
# Remove all dockers excluding one
# docker_prune_except_this fts_esror 'Full Text Search'
docker_prune_except_this() {
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "Checking if there are any old images and removing them..."
DOCKERPS=$(docker ps -a | grep -v "$1" | awk 'NR>1 {print $1}')
if [ "$DOCKERPS" != "" ]
then
msg_box "Removing old Docker instance(s)... ($DOCKERPS)
Please note that we will not remove $1 ($2).
You will be given the option to abort when you hit OK."
any_key "Press any key to continue. Press CTRL+C to abort"
docker stop "$(docker ps -a | grep -v "$1" | awk 'NR>1 {print $1}')"
docker container prune -f
docker image prune -a -f
docker volume prune -f
fi
}
# Remove selected Docker image
2019-06-06 23:46:08 +03:00
# docker_prune_this 'collabora/code' 'onlyoffice/documentserver' 'ark74/nc_fts'
docker_prune_this() {
if does_this_docker_exist "$1"
then
msg_box "Removing old Docker image: $1
You will be given the option to abort when you hit OK."
any_key "Press any key to continue. Press CTRL+C to abort"
docker stop "$(docker container ls | grep "$1" | awk '{print $1}' | tail -1)"
docker container prune -f
docker image prune -a -f
docker volume prune -f
fi
}
# Update specific Docker image
# docker_update_specific 'bitwarden_rs' 'Bitwarden RS' (docker conainter name = $1, the name in text = $2)
docker_update_specific() {
if is_docker_running && docker ps -a --format "{{.Names}}" | grep -q "^$1$"
then
docker run --rm --name temporary_watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once "$1"
print_text_in_color "$IGreen" "$2 docker image just got updated!"
echo "Docker image just got updated! We just updated $2 docker image automatically! $(date +%Y%m%d)" >> "$VMLOGS"/update.log
fi
}
2018-10-15 23:04:27 +03:00
# countdown 'message looks like this' 10
countdown() {
2018-12-18 01:27:01 +03:00
print_text_in_color "$ICyan" "$1"
2018-10-15 23:04:27 +03:00
secs="$(($2))"
while [ $secs -gt 0 ]; do
echo -ne "$secs\033[0K\r"
sleep 1
: $((secs--))
done
}
print_text_in_color() {
printf "%b%s%b\n" "$1" "$2" "$Color_Off"
}
2019-07-08 16:33:23 +03:00
# Apply patch
# git_apply_patch 15992 server 16.0.2
2019-07-06 16:09:53 +03:00
# 1 = pull
# 2 = repository
2019-07-08 16:33:23 +03:00
# Nextcloud version
2019-07-06 16:09:53 +03:00
git_apply_patch() {
2020-09-09 14:50:58 +03:00
if [ -z "$NCVERSION" ]
2020-03-02 23:58:47 +03:00
then
2020-09-09 14:50:58 +03:00
nc_update
2020-03-02 23:58:47 +03:00
fi
2019-07-08 16:33:23 +03:00
if [[ "$CURRENTVERSION" = "$3" ]]
2019-07-06 16:09:53 +03:00
then
2019-07-08 16:33:23 +03:00
curl_to_dir "https://patch-diff.githubusercontent.com/raw/nextcloud/${2}/pull" "${1}.patch" "/tmp"
install_if_not git
cd "$NCPATH"
if git apply --check /tmp/"${1}".patch >/dev/null 2>&1
then
print_text_in_color "$IGreen" "Applying patch https://github.com/nextcloud/${2}/pull/${1} ..."
git apply /tmp/"${1}".patch
2019-07-08 16:33:23 +03:00
fi
2019-07-06 16:09:53 +03:00
fi
}
# Check if it's the Home/SME Server
2020-08-19 19:27:34 +03:00
# if home_sme_server
# then
# do something
2020-08-19 19:27:34 +03:00
# fi
home_sme_server() {
2020-05-06 00:18:23 +03:00
# OLD DISKS: "Samsung SSD 860" || ST5000LM000-2AN1 || ST5000LM015-2E81
2020-07-01 00:08:58 +03:00
# OLD MEMORY: BLS16G4 (Balistix Sport) || 18ASF2G72HZ (ECC)
2020-08-19 19:27:34 +03:00
if lshw -c system | grep -q "NUC8i3BEH\|NUC10i3FNH"
then
2021-05-13 22:03:49 +03:00
if lshw -c memory | grep -q "BLS16G4\|18ASF2G72HZ\|16ATF2G64HZ\|CT16G4SFD8266\|M471A4G43MB1\|9905744\|HMA82GS6JJR8N"
then
2020-08-19 19:27:34 +03:00
if lshw -c disk | grep -q "ST2000LM015-2E81\|WDS400\|ST5000LM000-2AN1\|ST5000LM015-2E81\|Samsung SSD 860\|WDS500G1R0B"
then
NEXTCLOUDHOMESME=yes-this-is-the-home-sme-server
fi
fi
fi
if [ -n "$NEXTCLOUDHOMESME" ]
then
return 0
else
return 1
fi
}
# Check if the value is a number
# EXAMPLE: https://github.com/nextcloud/vm/pull/1012
check_if_number() {
case "${1}" in
''|*[!0-9]*) return 1 ;;
*) return 0 ;;
esac
}
2020-01-13 18:37:52 +03:00
# Example:
# notify_admin_gui \
2020-01-13 18:37:52 +03:00
# "Subject" \
# "Message"
#
2020-10-08 20:51:21 +03:00
# nextcloud_occ_no_check notification:generate -l "$2" "$admin" "$1"
notify_admin_gui() {
local NC_USERS
local user
local admin
if ! is_app_enabled notifications
then
2020-03-01 17:15:55 +03:00
print_text_in_color "$IRed" "The notifications app isn't enabled - unable to send notifications"
return 1
fi
print_text_in_color "$ICyan" "Posting notification to users that are admins, this might take a while..."
2020-10-02 22:05:16 +03:00
send_mail "$1" "$2"
if [ -z "${NC_ADMIN_USER[*]}" ]
then
2020-10-08 20:51:21 +03:00
NC_USERS=$(nextcloud_occ_no_check user:list | sed 's|^ - ||g' | sed 's|:.*||')
mapfile -t NC_USERS <<< "$NC_USERS"
for user in "${NC_USERS[@]}"
do
2020-10-08 20:51:21 +03:00
if nextcloud_occ_no_check user:info "$user" | cut -d "-" -f2 | grep -x -q " admin"
then
NC_ADMIN_USER+=("$user")
fi
done
fi
for admin in "${NC_ADMIN_USER[@]}"
2020-01-13 18:37:52 +03:00
do
print_text_in_color "$IGreen" "Posting '$1' to: $admin"
2020-10-08 20:51:21 +03:00
nextcloud_occ_no_check notification:generate -l "$2" "$admin" "$1"
2020-01-13 18:37:52 +03:00
done
}
2020-10-02 22:05:16 +03:00
# Use this to send system mails
# e.g.: send_mail "subject" "text"
send_mail() {
local RECIPIENT
if [ -f /etc/msmtprc ]
then
RECIPIENT=$(grep "recipient=" /etc/msmtprc)
RECIPIENT="${RECIPIENT##*recipient=}"
if [ -n "$RECIPIENT" ]
then
print_text_in_color "$ICyan" "Sending '$1' to $RECIPIENT"
if echo -e "$2" | mail -s "NcVM - $1" "$RECIPIENT"
then
return 0
fi
2020-10-02 22:05:16 +03:00
fi
fi
return 1
2020-10-02 22:05:16 +03:00
}
2020-05-02 22:44:12 +03:00
zpool_import_if_missing() {
# ZFS needs to be installed
if ! is_this_installed zfsutils-linux
2020-05-02 22:44:12 +03:00
then
print_text_in_color "$IRed" "This function is only intened to be run if you have ZFS installed."
return 1
elif [ -z "$POOLNAME" ]
then
2020-12-13 22:08:13 +03:00
print_text_in_color "$IRed" "Please define the POOLNAME variable, as we can't continue without it."
2020-05-02 22:44:12 +03:00
return 1
fi
# Import zpool in case missing
if ! zpool list "$POOLNAME" >/dev/null 2>&1
then
zpool import -f "$POOLNAME"
fi
2020-05-02 23:36:15 +03:00
# Check if UUID is used
if zpool list -v | grep sdb
2020-05-02 22:44:12 +03:00
then
2020-05-02 23:36:15 +03:00
# Get UUID
check_command partprobe -s
2020-05-02 23:36:15 +03:00
if fdisk -l /dev/sdb1 >/dev/null 2>&1
then
UUID_SDB1=$(blkid -o value -s UUID /dev/sdb1)
fi
# Export / import the correct way (based on UUID)
check_command zpool export "$POOLNAME"
check_command zpool import -d /dev/disk/by-uuid/"$UUID_SDB1" "$POOLNAME"
2020-05-02 22:44:12 +03:00
fi
}
2020-10-10 09:21:42 +03:00
# Check for free space on the ubuntu-vg
check_free_space() {
if vgs &>/dev/null
then
FREE_SPACE=$(vgs | grep ubuntu-vg | awk '{print $7}' | grep g | grep -oP "[0-9]+\.[0-9]" | sed 's|\.||')
fi
if [ -z "$FREE_SPACE" ]
then
FREE_SPACE=0
fi
}
# Check if snapshotname already exists
does_snapshot_exist() {
local SNAPSHOTS
local snapshot
if lvs &>/dev/null
then
SNAPSHOTS="$(lvs | grep ubuntu-vg | awk '{print $1}' | grep -v ubuntu-lv)"
fi
if [ -z "$SNAPSHOTS" ]
then
return 1
fi
mapfile -t SNAPSHOTS <<< "$SNAPSHOTS"
for snapshot in "${SNAPSHOTS[@]}"
do
if [ "$snapshot" = "$1" ]
then
return 0
fi
done
return 1
}
2020-06-03 01:23:33 +03:00
check_php() {
print_text_in_color "$ICyan" "Getting current PHP-version..."
GETPHP="$(php -v | grep -m 1 PHP | awk '{print $2}' | cut -d '-' -f1)"
if [ -z "$GETPHP" ]
then
print_text_in_color "$IRed" "Can't find proper PHP version, aborting..."
exit 1
fi
if grep 7.0 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=7.0
elif grep 7.1 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=7.1
elif grep 7.2 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=7.2
elif grep 7.3 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=7.3
elif grep 7.4 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=7.4
2021-03-15 17:06:47 +03:00
elif grep 8.0 <<< "$GETPHP" >/dev/null 2>&1
then
export PHPVER=8.0
2020-06-03 01:23:33 +03:00
fi
2021-02-20 02:36:45 +03:00
# Export other PHP variables based on PHPVER
export PHP_FPM_DIR=/etc/php/$PHPVER/fpm
export PHP_INI=$PHP_FPM_DIR/php.ini
export PHP_POOL_DIR=$PHP_FPM_DIR/pool.d
export PHP_MODS_DIR=/etc/php/"$PHPVER"/mods-available
2020-06-03 01:23:33 +03:00
2021-02-20 02:36:45 +03:00
# Show version
2020-06-03 01:23:33 +03:00
print_text_in_color "$IGreen" PHPVER="$PHPVER"
}
add_dockerprune() {
if ! crontab -u root -l | grep -q 'dockerprune.sh'
then
print_text_in_color "$ICyan" "Adding cronjob for Docker weekly prune..."
2020-08-15 00:48:29 +03:00
mkdir -p "$SCRIPTS"
crontab -u root -l | { cat; echo "@weekly $SCRIPTS/dockerprune.sh > /dev/null"; } | crontab -u root -
check_command echo "#!/bin/bash" > "$SCRIPTS/dockerprune.sh"
check_command echo "docker system prune -a --force" >> "$SCRIPTS/dockerprune.sh"
check_command echo "exit" >> "$SCRIPTS/dockerprune.sh"
chmod a+x "$SCRIPTS"/dockerprune.sh
print_text_in_color "$IGreen" "Docker automatic prune job added."
fi
}
2021-05-17 21:53:42 +03:00
test_nono_ports() {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
check_nono_ports() {
if test_nono_ports "${1}" "${NONO_PORTS[@]}"
then
msg_box "You have to choose another port than $1. Please start over.\n
Please keep in mind NOT to use the following ports as they are likely in use already:
${NONO_PORTS[*]}"
2021-05-17 21:53:42 +03:00
return 1
fi
}
2017-04-09 23:43:30 +03:00
## bash colors
# Reset
Color_Off='\e[0m' # Text Reset
# Regular Colors
Black='\e[0;30m' # Black
Red='\e[0;31m' # Red
Green='\e[0;32m' # Green
Yellow='\e[0;33m' # Yellow
Blue='\e[0;34m' # Blue
Purple='\e[0;35m' # Purple
Cyan='\e[0;36m' # Cyan
White='\e[0;37m' # White
# Bold
BBlack='\e[1;30m' # Black
BRed='\e[1;31m' # Red
BGreen='\e[1;32m' # Green
BYellow='\e[1;33m' # Yellow
BBlue='\e[1;34m' # Blue
BPurple='\e[1;35m' # Purple
BCyan='\e[1;36m' # Cyan
BWhite='\e[1;37m' # White
# Underline
UBlack='\e[4;30m' # Black
URed='\e[4;31m' # Red
UGreen='\e[4;32m' # Green
UYellow='\e[4;33m' # Yellow
UBlue='\e[4;34m' # Blue
UPurple='\e[4;35m' # Purple
UCyan='\e[4;36m' # Cyan
UWhite='\e[4;37m' # White
# Background
On_Black='\e[40m' # Black
On_Red='\e[41m' # Red
On_Green='\e[42m' # Green
On_Yellow='\e[43m' # Yellow
On_Blue='\e[44m' # Blue
On_Purple='\e[45m' # Purple
On_Cyan='\e[46m' # Cyan
On_White='\e[47m' # White
# High Intensity
IBlack='\e[0;90m' # Black
IRed='\e[0;91m' # Red
IGreen='\e[0;92m' # Green
IYellow='\e[0;93m' # Yellow
IBlue='\e[0;94m' # Blue
IPurple='\e[0;95m' # Purple
ICyan='\e[0;96m' # Cyan
IWhite='\e[0;97m' # White
# Bold High Intensity
BIBlack='\e[1;90m' # Black
BIRed='\e[1;91m' # Red
BIGreen='\e[1;92m' # Green
BIYellow='\e[1;93m' # Yellow
BIBlue='\e[1;94m' # Blue
BIPurple='\e[1;95m' # Purple
BICyan='\e[1;96m' # Cyan
BIWhite='\e[1;97m' # White
# High Intensity backgrounds
On_IBlack='\e[0;100m' # Black
On_IRed='\e[0;101m' # Red
On_IGreen='\e[0;102m' # Green
On_IYellow='\e[0;103m' # Yellow
On_IBlue='\e[0;104m' # Blue
On_IPurple='\e[0;105m' # Purple
On_ICyan='\e[0;106m' # Cyan
On_IWhite='\e[0;107m' # White