diff --git a/conf/nginx-top.conf b/conf/nginx-top.conf index c3f4c0d6..12622593 100644 --- a/conf/nginx-top.conf +++ b/conf/nginx-top.conf @@ -7,6 +7,6 @@ ## your own --- please do not ask for help from us. upstream php-fpm { - server unix:/var/run/php/php8.0-fpm.sock; + server unix:/var/run/php/php{{phpver}}-fpm.sock; } diff --git a/management/backup.py b/management/backup.py index 311db3c3..9797ba8f 100755 --- a/management/backup.py +++ b/management/backup.py @@ -13,7 +13,7 @@ from datetime import date import rtyaml from exclusiveprocess import Lock -from utils import load_environment, shell, wait_for_service +from utils import load_environment, shell, wait_for_service, get_php_version def backup_status(env): # If backups are disabled, return no status. @@ -266,6 +266,7 @@ def get_target_type(config): def perform_backup(full_backup): env = load_environment() + php_fpm = f"php{get_php_version()}-fpm" # Create an global exclusive lock so that the backup script # cannot be run more than one. @@ -301,7 +302,7 @@ def perform_backup(full_backup): if quit: sys.exit(code) - service_command("php8.0-fpm", "stop", quit=True) + service_command(php_fpm, "stop", quit=True) service_command("postfix", "stop", quit=True) service_command("dovecot", "stop", quit=True) service_command("postgrey", "stop", quit=True) @@ -339,7 +340,7 @@ def perform_backup(full_backup): service_command("postgrey", "start", quit=False) service_command("dovecot", "start", quit=False) service_command("postfix", "start", quit=False) - service_command("php8.0-fpm", "start", quit=False) + service_command(php_fpm, "start", quit=False) # Remove old backups. This deletes all backup data no longer needed # from more than 3 days ago. diff --git a/management/utils.py b/management/utils.py index 1dbbeb7e..f2df5ad0 100644 --- a/management/utils.py +++ b/management/utils.py @@ -179,6 +179,11 @@ def wait_for_service(port, public, env, timeout): return False time.sleep(min(timeout/4, 1)) +def get_php_version(): + # Gets the version of PHP used by Mail-in-a-Box + # To modify PHP version, also update variable PHP_VER in functions.sh + return "8.1" + def get_ssh_port(): port_value = get_ssh_config_value("port") diff --git a/management/web_update.py b/management/web_update.py index c31fe8fc..cef15f6e 100644 --- a/management/web_update.py +++ b/management/web_update.py @@ -7,7 +7,7 @@ import os.path, re, rtyaml from mailconfig import get_mail_domains from dns_update import get_custom_dns_config, get_dns_zones from ssl_certificates import get_ssl_certificates, get_domain_ssl_files, check_certificate -from utils import shell, safe_domain_name, sort_domains +from utils import shell, safe_domain_name, sort_domains, get_php_version def get_web_domains(env, include_www_redirects=True, include_auto=True, exclude_dns_elsewhere=True): # What domains should we serve HTTP(S) for? @@ -82,6 +82,8 @@ def do_web_update(env): # Build an nginx configuration file. nginx_conf = read_conf("nginx-top.conf") + # Hardcode php version in the nginx configuration file + nginx_conf = re.sub("{{phpver}}", get_php_version(), nginx_conf) # Load the templates. template0 = read_conf("nginx.conf") diff --git a/setup/functions.sh b/setup/functions.sh index 6a96cc1f..46355dde 100644 --- a/setup/functions.sh +++ b/setup/functions.sh @@ -5,7 +5,8 @@ # -o pipefail: don't ignore errors in the non-last command in a pipeline set -euo pipefail -PHP_VER=8.0 +# To modify PHP version, also update method get_php_version() in utils.py +PHP_VER=8.1 function hide_output { # This function hides the output of a command unless the command fails diff --git a/setup/nextcloud.sh b/setup/nextcloud.sh index 496ca0c0..d368c77b 100755 --- a/setup/nextcloud.sh +++ b/setup/nextcloud.sh @@ -62,12 +62,15 @@ user_external_hash=280d24eb2a6cb56b4590af8847f925c28d8d853e # 5.3 You still can create, edit and delete users # 5.4 Go to Administration > Logs and ensure no new errors are shown +# Set a local variable for the PHP version +NC_PHP_VER=$PHP_VER + # Clear prior packages and install dependencies from apt. apt-get purge -qq -y owncloud* # we used to use the package manager apt_install curl php"${PHP_VER}" php"${PHP_VER}"-fpm \ php"${PHP_VER}"-cli php"${PHP_VER}"-sqlite3 php"${PHP_VER}"-gd php"${PHP_VER}"-imap php"${PHP_VER}"-curl \ - php"${PHP_VER}"-dev php"${PHP_VER}"-gd php"${PHP_VER}"-xml php"${PHP_VER}"-mbstring php"${PHP_VER}"-zip php"${PHP_VER}"-apcu \ + php"${PHP_VER}"-dev php"${PHP_VER}"-xml php"${PHP_VER}"-mbstring php"${PHP_VER}"-zip php"${PHP_VER}"-apcu \ php"${PHP_VER}"-intl php"${PHP_VER}"-imagick php"${PHP_VER}"-gmp php"${PHP_VER}"-bcmath # Enable APC before Nextcloud tools are run. @@ -138,23 +141,23 @@ InstallNextcloud() { if [ -e "$STORAGE_ROOT/owncloud/owncloud.db" ]; then # ownCloud 8.1.1 broke upgrades. It may fail on the first attempt, but # that can be OK. - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ upgrade + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ upgrade E=$? if [ $E -ne 0 ] && [ $E -ne 3 ]; then echo "Trying ownCloud upgrade again to work around ownCloud upgrade bug..." - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ upgrade + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ upgrade E=$? if [ $E -ne 0 ] && [ $E -ne 3 ]; then exit 1; fi - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ maintenance:mode --off + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ maintenance:mode --off echo "...which seemed to work." fi # Add missing indices. NextCloud didn't include this in the normal upgrade because it might take some time. - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ db:add-missing-indices - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ db:add-missing-primary-keys + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ db:add-missing-indices + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ db:add-missing-primary-keys # Run conversion to BigInt identifiers, this process may take some time on large tables. - sudo -u www-data php"$PHP_VER" /usr/local/lib/owncloud/occ db:convert-filecache-bigint --no-interaction + sudo -u www-data php"$NC_PHP_VER" /usr/local/lib/owncloud/occ db:convert-filecache-bigint --no-interaction fi } @@ -214,10 +217,27 @@ if [ ! -d /usr/local/lib/owncloud/ ] || [[ ! ${CURRENT_NEXTCLOUD_VER} =~ ^$nextc return 0 fi - # Hint: whenever you bump, remember this: - # - Run a server with the previous version - # - On a new if-else block, copy the versions/hashes from the previous version - # - Run sudo ./setup/start.sh on the new machine. Upon completion, test its basic functionalities. + # Install php 8.0 for older versions of nextcloud that don't support 8.1 + if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^2[0123] ]]; then + # Version 20 is the latest version from the 18.04 version of miab. To upgrade to version 21, install php8.0. This is + # not supported by version 20, but that does not matter, as the InstallNextcloud function only runs the version 21 code. + # We need php 8.0 for nextcloud 21-23, as php 8.1 is supported starting nextcloud 24 + + # Prevent installation of old packages + apt-mark hold php7.0-apcu php7.1-apcu php7.2-apcu php7.3-apcu php7.4-apcu + + # Install php version 8.0 + apt_install php8.0 php8.0-fpm php8.0-apcu php8.0-cli php8.0-sqlite3 php8.0-gd php8.0-imap \ + php8.0-curl php8.0-dev php8.0-xml php8.0-mbstring php8.0-zip + + # set php version 8.0 as default + NC_PHP_VER=8.0 + + # Make sure apc is enabled + tools/editconf.py /etc/php/$NC_PHP_VER/mods-available/apcu.ini -c ';' \ + apc.enabled=1 \ + apc.enable_cli=1 + fi if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^20 ]]; then InstallNextcloud 21.0.7 f5c7079c5b56ce1e301c6a27c0d975d608bb01c9 4.0.7 45e7cf4bfe99cd8d03625cf9e5a1bb2e90549136 3.0.4 d0284b68135777ec9ca713c307216165b294d0fe @@ -235,10 +255,31 @@ if [ ! -d /usr/local/lib/owncloud/ ] || [[ ! ${CURRENT_NEXTCLOUD_VER} =~ ^$nextc InstallNextcloud 24.0.12 7aa5d61632c1ccf4ca3ff00fb6b295d318c05599 4.1.0 697f6b4a664e928d72414ea2731cb2c9d1dc3077 3.2.2 ce4030ab57f523f33d5396c6a81396d440756f5f 3.0.0 0df781b261f55bbde73d8c92da3f99397000972f CURRENT_NEXTCLOUD_VER="24.0.12" fi - if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^24 ]]; then + + if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^2[456] ]]; then + # From nextcloud 24 and higher, php8.1 is supported, so we can now remove the php8.0 ppa and packages + + # Reset the default php version used + NC_PHP_VER=8.1 + + # Remove older php version + apt-get purge -qq -y php8.0 php8.0-fpm php8.0-apcu php8.0-cli php8.0-sqlite3 php8.0-gd \ + php8.0-imap php8.0-curl php8.0-dev php8.0-xml php8.0-mbstring php8.0-zip \ + php8.0-common php8.0-opcache php8.0-readline + + # Unhold packages + apt-mark unhold php7.0-apcu php7.1-apcu php7.2-apcu php7.3-apcu php7.4-apcu + fi + + if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^24 ]]; then InstallNextcloud 25.0.7 a5a565c916355005c7b408dd41a1e53505e1a080 5.3.0 4b0a6666374e3b55cfd2ae9b72e1d458b87d4c8c 4.4.2 21a42e15806adc9b2618760ef94f1797ef399e2f 3.2.0 a494073dcdecbbbc79a9c77f72524ac9994d2eec CURRENT_NEXTCLOUD_VER="25.0.7" fi + + # Hint: whenever you bump, remember this: + # - Run a server with the previous version + # - On a new if-else block, copy the versions/hashes from the previous version + # - Run sudo ./setup/start.sh on the new machine. Upon completion, test its basic functionalities. fi InstallNextcloud $nextcloud_ver $nextcloud_hash $contacts_ver $contacts_hash $calendar_ver $calendar_hash $user_external_ver $user_external_hash diff --git a/setup/zpush.sh b/setup/zpush.sh index 397ee4a9..2099d3d9 100755 --- a/setup/zpush.sh +++ b/setup/zpush.sh @@ -41,18 +41,18 @@ if [ $needs_update == 1 ]; then mv /tmp/z-push/*/src /usr/local/lib/z-push rm -rf /tmp/z-push.zip /tmp/z-push - # Create admin and top scripts with PHP_VER - rm -f /usr/sbin/z-push-{admin,top} - echo '#!/bin/bash' > /usr/sbin/z-push-admin - echo php"$PHP_VER" /usr/local/lib/z-push/z-push-admin.php '"$@"' >> /usr/sbin/z-push-admin - chmod 755 /usr/sbin/z-push-admin - echo '#!/bin/bash' > /usr/sbin/z-push-top - echo php"$PHP_VER" /usr/local/lib/z-push/z-push-top.php '"$@"' >> /usr/sbin/z-push-top - chmod 755 /usr/sbin/z-push-top - echo $VERSION > /usr/local/lib/z-push/version fi +# Create admin and top scripts with PHP_VER +rm -f /usr/sbin/z-push-{admin,top} +echo '#!/bin/bash' > /usr/sbin/z-push-admin +echo php"$PHP_VER" /usr/local/lib/z-push/z-push-admin.php '"$@"' >> /usr/sbin/z-push-admin +chmod 755 /usr/sbin/z-push-admin +echo '#!/bin/bash' > /usr/sbin/z-push-top +echo php"$PHP_VER" /usr/local/lib/z-push/z-push-top.php '"$@"' >> /usr/sbin/z-push-top +chmod 755 /usr/sbin/z-push-top + # Configure default config. sed -i "s^define('TIMEZONE', .*^define('TIMEZONE', '$(cat /etc/timezone)');^" /usr/local/lib/z-push/config.php sed -i "s/define('BACKEND_PROVIDER', .*/define('BACKEND_PROVIDER', 'BackendCombined');/" /usr/local/lib/z-push/config.php diff --git a/tools/owncloud-restore.sh b/tools/owncloud-restore.sh index 05d57641..7288e63c 100755 --- a/tools/owncloud-restore.sh +++ b/tools/owncloud-restore.sh @@ -2,6 +2,7 @@ # # This script will restore the backup made during an installation source /etc/mailinabox.conf # load global vars +source ./setup/functions.sh if [ -z "$1" ]; then echo "Usage: owncloud-restore.sh " @@ -26,7 +27,7 @@ if [ ! -f "$1/config.php" ]; then fi echo "Restoring backup from $1" -service php8.0-fpm stop +service "php$PHP_VER-fpm" stop # remove the current ownCloud/Nextcloud installation rm -rf /usr/local/lib/owncloud/ @@ -45,5 +46,5 @@ chown www-data:www-data "$STORAGE_ROOT/owncloud/config.php" sudo -u www-data "php$PHP_VER" /usr/local/lib/owncloud/occ maintenance:mode --off -service php8.0-fpm start +service "php$PHP_VER-fpm" start echo "Done" diff --git a/tools/owncloud-unlockadmin.sh b/tools/owncloud-unlockadmin.sh index 8fcaf593..5618ddd4 100755 --- a/tools/owncloud-unlockadmin.sh +++ b/tools/owncloud-unlockadmin.sh @@ -7,8 +7,9 @@ # purpopses only. After this point you are on your own. source /etc/mailinabox.conf # load global vars +source ./setup/functions.sh -ADMIN=$(./mail.py user admins | head -n 1) +ADMIN=$(./management/cli.py user admins | head -n 1) test -z "$1" || ADMIN=$1 echo "I am going to unlock admin features for $ADMIN."