From b775698f39220832c92f8566e17728c7be2b1e35 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 9 Oct 2020 14:27:52 +0200 Subject: [PATCH 01/83] Upgrade to v.3.9.2 --- conf/app.src | 6 +++--- issue_template.md | 6 +++--- manifest.json | 6 +++--- scripts/install | 8 ++++---- scripts/remove | 4 ++-- scripts/restore | 4 ++-- scripts/upgrade | 8 ++++---- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/conf/app.src b/conf/app.src index 28e9bcd..f61e421 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://download.moodle.org/stable39/moodle-3.9.zip -SOURCE_SUM=b976f3c9446a98c0b15d0467ec83cfe25fa32d30f4f56eb4e98f2efe96f6f24ed4039667cdcbb47cc767e91ada2cd484f4b4c2660ce57479b9f361c6bbf54b3c -SOURCE_SUM_PRG=sha512sum +SOURCE_URL=https://download.moodle.org/download.php/stable39/moodle-3.9.2.zip +SOURCE_SUM=ca66ffbaf9360f2342d46a5ab1e754b1b50b17e1c2ab3d078355b34a7c5985e7 +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true SOURCE_FILENAME=moodle.zip diff --git a/issue_template.md b/issue_template.md index d82d230..ae65abb 100644 --- a/issue_template.md +++ b/issue_template.md @@ -7,7 +7,7 @@ about: Create a report to help us debug, it would be nice to fill the template a **How to post a meaningful bug report** 1. *Read this whole template first.* 2. *Determine if you are on the right place:* - - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change url...), you are on the right place!* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* - *Otherwise, the issue may be due to Moodle itself. Refer to its documentation or repository for help.* - *If you have a doubt, post here, we will figure it out together.* 3. *Delete the italic comments as you write over them below, and remove this guide.* @@ -34,8 +34,8 @@ about: Create a report to help us debug, it would be nice to fill the template a - *If you used the webadmin, please perform the equivalent command from the CLI first.* - *If the error occurs in your browser, explain what you did:* 1. *Go to '...'* - 2. *Click on '....'* - 3. *Scroll down to '....'* + 2. *Click on '...'* + 3. *Scroll down to '...'* 4. *See error* **Expected behavior** diff --git a/manifest.json b/manifest.json index d5e07e9..3693e18 100644 --- a/manifest.json +++ b/manifest.json @@ -3,10 +3,10 @@ "id": "moodle", "packaging_format": 1, "description": { - "en": "An online learning platform", - "fr": "Une plateforme d'apprentissage en ligne" + "en": "Online learning platform", + "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.9.0~ynh1", + "version": "3.9.2~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index e7b9a98..33743ca 100644 --- a/scripts/install +++ b/scripts/install @@ -87,7 +87,7 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=2 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated nginx config ynh_add_nginx_config @@ -103,7 +103,7 @@ ynh_system_user_create --username="$app" #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring php-fpm..." --weight=1 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=1 # Create a dedicated php-fpm config ynh_add_fpm_config --package="$extra_php_dependencies" @@ -133,7 +133,7 @@ ynh_store_file_checksum "$final_path/config.php" #================================================= # ACTIVATE LDAP SUPPORT #================================================= -ynh_script_progression --message="Activate ldap support..." +ynh_script_progression --message="Activate LDAP support..." ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" @@ -187,7 +187,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 63371c6..ed6fafb 100644 --- a/scripts/remove +++ b/scripts/remove @@ -51,7 +51,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." # Remove the dedicated nginx config ynh_remove_nginx_config @@ -59,7 +59,7 @@ ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing php-fpm configuration..." --weight=20 +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=20 # Remove the dedicated php-fpm config ynh_remove_fpm_config diff --git a/scripts/restore b/scripts/restore index e7c6461..1d15f01 100644 --- a/scripts/restore +++ b/scripts/restore @@ -48,7 +48,7 @@ test ! -d "$data_path" \ #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the nginx configuration..." +ynh_script_progression --message="Restoring the NGINX configuration..." ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" @@ -121,7 +121,7 @@ ynh_restore_file --origin_path="/etc/cron.d/$app" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading nginx web server and php-fpm..." +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." ynh_systemd_action --service_name=php"$phpversion"-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index b5c73ad..c0e4120 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -72,7 +72,7 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." +ynh_script_progression --message="Upgrading NGINX web server configuration..." # Create a dedicated nginx config ynh_add_nginx_config @@ -95,7 +95,7 @@ ynh_system_user_create --username="$app" #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated php-fpm config ynh_add_fpm_config --package="$extra_php_dependencies" @@ -126,7 +126,7 @@ chown -R "$app": "$final_path" #================================================= # ACTIVATE LDAP SUPPORT #================================================= -ynh_script_progression --message="Activate ldap support..." +ynh_script_progression --message="Activate LDAP support..." ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" @@ -180,7 +180,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload From 73b38c1b3c6bafe82e216e6213000e4500199bdf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 9 Oct 2020 14:34:48 +0200 Subject: [PATCH 02/83] Update app.src --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index f61e421..943ce1e 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://download.moodle.org/download.php/stable39/moodle-3.9.2.zip -SOURCE_SUM=ca66ffbaf9360f2342d46a5ab1e754b1b50b17e1c2ab3d078355b34a7c5985e7 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.9.2.zip +SOURCE_SUM=eecb0e1247b9a1de4d3bcd3962946005d8e052a6bf311163cc2d330a9bfe172d SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true From a5fd10d4cee4621c8352f3888aeb12b9424e38c4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 9 Oct 2020 16:08:48 +0200 Subject: [PATCH 03/83] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1923715..ef93cc9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Moodle app for YunoHost +# Moodle for YunoHost [![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) [![Install Moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=moodle) @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.9.0 +**Shipped version:** 3.9.2 ## Screenshots @@ -50,8 +50,7 @@ How to configure this app: by an admin panel. --- -Developer info ----------------- +## Developer info Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/moodle_ynh/tree/testing). From bc0641c268a051c6c2b11b613dfbee92c7535f94 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 13 Oct 2020 16:09:29 +0200 Subject: [PATCH 04/83] Small typos --- manifest.json | 2 +- scripts/backup | 1 - scripts/install | 2 +- scripts/remove | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/manifest.json b/manifest.json index 3693e18..c321887 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 3.5" + "yunohost": ">= 3.8.1" }, "multi_instance": true, "services": [ diff --git a/scripts/backup b/scripts/backup index 18f6094..fe82eec 100644 --- a/scripts/backup +++ b/scripts/backup @@ -6,7 +6,6 @@ # IMPORT GENERIC HELPERS #================================================= -#Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers diff --git a/scripts/install b/scripts/install index 33743ca..60d4b7c 100644 --- a/scripts/install +++ b/scripts/install @@ -89,7 +89,7 @@ ynh_setup_source --dest_dir="$final_path" #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicatedNGINX config ynh_add_nginx_config #================================================= diff --git a/scripts/remove b/scripts/remove index ed6fafb..72b2347 100644 --- a/scripts/remove +++ b/scripts/remove @@ -53,7 +53,7 @@ ynh_secure_remove --file="$final_path" #================================================= ynh_script_progression --message="Removing NGINX web server configuration..." -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= diff --git a/scripts/restore b/scripts/restore index 1d15f01..c218fbb 100644 --- a/scripts/restore +++ b/scripts/restore @@ -85,7 +85,7 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Recreate a dedicated php-fpm config +# Recreate a dedicated PHP-FPM config ynh_add_fpm_config --package="$extra_php_dependencies" #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c0e4120..79687fc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,7 +97,7 @@ ynh_system_user_create --username="$app" #================================================= ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) From ecdda12753bbecdcd500f85f80f33337b3078bfe Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 13 Oct 2020 18:55:21 +0200 Subject: [PATCH 05/83] Cleaning up --- scripts/backup | 2 +- scripts/install | 2 +- scripts/remove | 4 ++-- scripts/restore | 4 ++-- scripts/upgrade | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/backup b/scripts/backup index fe82eec..9c2f9f5 100644 --- a/scripts/backup +++ b/scripts/backup @@ -73,4 +73,4 @@ ynh_psql_dump_db --database="$db_name" > db.sql # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." +ynh_print_info --message="Backup script completed for Moodle. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index 60d4b7c..3a0b12a 100644 --- a/scripts/install +++ b/scripts/install @@ -195,4 +195,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of $app completed" --last +ynh_script_progression --message="Installation of Moodle completed" --last diff --git a/scripts/remove b/scripts/remove index 72b2347..5bcf4e5 100644 --- a/scripts/remove +++ b/scripts/remove @@ -43,7 +43,7 @@ ynh_remove_app_dependencies #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." +ynh_script_progression --message="Removing Moodle main directory..." # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -91,4 +91,4 @@ ynh_system_user_delete --username="$app" # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of $app completed" --last +ynh_script_progression --message="Removal of Moodle completed" --last diff --git a/scripts/restore b/scripts/restore index c218fbb..396d9b6 100644 --- a/scripts/restore +++ b/scripts/restore @@ -55,7 +55,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." +ynh_script_progression --message="Restoring Moodle main directory..." ynh_restore_file --origin_path="$final_path" @@ -130,4 +130,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for $app" --last +ynh_script_progression --message="Restoration completed for Moodle" --last diff --git a/scripts/upgrade b/scripts/upgrade index 79687fc..fb33027 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -44,7 +44,7 @@ fi #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=30 +ynh_script_progression --message="Backing up Moodle before upgrading (may take a while)..." --weight=30 # Backup the current version of the app ynh_backup_before_upgrade @@ -188,4 +188,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --last +ynh_script_progression --message="Upgrade of Moodle completed" --last From 4a8d88c1258b8bc6425cf731c90bea9082e2c58a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 14 Nov 2020 12:23:01 +0100 Subject: [PATCH 06/83] Upgrade to 3.10.0 --- README.md | 2 +- check_process | 1 - conf/app.src | 4 ++-- manifest.json | 4 ++-- scripts/_common.sh | 2 +- scripts/install | 6 +++--- scripts/restore | 2 +- scripts/upgrade | 2 +- 8 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ef93cc9..87b7322 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.9.2 +**Shipped version:** 3.10.0 ## Screenshots diff --git a/check_process b/check_process index f57fbdf..7714d41 100644 --- a/check_process +++ b/check_process @@ -19,7 +19,6 @@ port_already_use=0 change_url=0 ;;; Levels - # If the level 5 (Package linter) is forced to 1. Please add justifications here. Level 5=auto ;;; Options Email= diff --git a/conf/app.src b/conf/app.src index 943ce1e..e83f1b3 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.9.2.zip -SOURCE_SUM=eecb0e1247b9a1de4d3bcd3962946005d8e052a6bf311163cc2d330a9bfe172d +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.0.zip +SOURCE_SUM=c80cfa811acda62363cccdd876bf001e802ceccb1f261846c9e59c6a66f6b125 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index c321887..8071890 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.9.2~ynh1", + "version": "3.10.0~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 3.8.1" + "yunohost": ">= 4.0.0" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index 0a05c81..956370d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,7 +9,7 @@ pkg_dependencies="postgresql" YNH_PHP_VERSION="7.3" -extra_php_dependencies="php$YNH_PHP_VERSION-common php$YNH_PHP_VERSION-mbstring php$YNH_PHP_VERSION-curl php$YNH_PHP_VERSION-xmlrpc php$YNH_PHP_VERSION-soap php$YNH_PHP_VERSION-zip php$YNH_PHP_VERSION-gd php$YNH_PHP_VERSION-xml php$YNH_PHP_VERSION-intl php$YNH_PHP_VERSION-json php$YNH_PHP_VERSION-pgsql php$YNH_PHP_VERSION-ldap" +extra_php_dependencies="php${YNH_PHP_VERSION}-common php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-xmlrpc php${YNH_PHP_VERSION}-soap php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-intl php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-pgsql php${YNH_PHP_VERSION}-ldap" #================================================= # PERSONAL HELPERS diff --git a/scripts/install b/scripts/install index 3a0b12a..3f39060 100644 --- a/scripts/install +++ b/scripts/install @@ -157,9 +157,9 @@ ynh_script_progression --message="Adding cron job..." # Set up poller cp "../conf/cron" "/etc/cron.d/$app" -ynh_replace_string "__APP__" "$app" "/etc/cron.d/$app" -ynh_replace_string "__FINAL_PATH__" "$final_path" "/etc/cron.d/$app" -ynh_replace_string "__PHPVERSION__" "$phpversion" "/etc/cron.d/$app" +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__FINAL_PATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" +ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/restore b/scripts/restore index 396d9b6..175cc7f 100644 --- a/scripts/restore +++ b/scripts/restore @@ -123,7 +123,7 @@ ynh_restore_file --origin_path="/etc/cron.d/$app" #================================================= ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." -ynh_systemd_action --service_name=php"$phpversion"-fpm --action=reload +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index fb33027..db792ac 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -38,7 +38,7 @@ ynh_script_progression --message="Ensuring downward compatibility..." # If the admin is not defined, We can't upgrade this app if [ -z "$admin" ]; then - ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall Moodle_ynh" + ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall moodle_ynh" fi #================================================= From 625875788e5b001bd9c9b074b85aea62a1dd60dc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 21 Nov 2020 10:05:39 +0100 Subject: [PATCH 07/83] Fix small typo --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 3f39060..6bb04fb 100644 --- a/scripts/install +++ b/scripts/install @@ -89,7 +89,7 @@ ynh_setup_source --dest_dir="$final_path" #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicatedNGINX config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= From 52dfb1be4d5ba8b91d3ea9d87273eea6bc695678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 19 Dec 2020 22:54:58 +0100 Subject: [PATCH 08/83] Set badge in SVG --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87b7322..a915a45 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Moodle for YunoHost [![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) -[![Install Moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=moodle) +[![Install Moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=moodle) > *This package allows you to install Moodle quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* From e06c440642a7a9b567c888987f01c50f84966185 Mon Sep 17 00:00:00 2001 From: Benjamin Hartmann <42138517+benjaminwolkchen@users.noreply.github.com> Date: Wed, 3 Feb 2021 18:44:27 +0100 Subject: [PATCH 09/83] Fix typo (#30) "setuping" -> "setting up" --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 6bb04fb..10afeb4 100644 --- a/scripts/install +++ b/scripts/install @@ -123,7 +123,7 @@ chown -R "$app": "$final_path" #================================================= # SETUP APPLICATION #================================================= -ynh_script_progression --message="Setuping the application..." --weight=190 +ynh_script_progression --message="Setting up the application..." --weight=190 exec_as "$app" php"$phpversion" "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license From 030e915e68a8cd72bfd0cdcb953b18bca2c9a3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Feb 2021 22:37:29 +0100 Subject: [PATCH 10/83] Upgrade to 3.10.1 (#31) * Upgrade to 3.10.1 --- README.md | 2 +- check_process | 2 -- conf/app.src | 4 +-- manifest.json | 2 +- pull_request_template.md | 4 +-- scripts/install | 31 +++++++++++---------- scripts/remove | 16 +++++------ scripts/restore | 24 ++++++++--------- scripts/upgrade | 58 ++++++++++++++++++---------------------- 9 files changed, 66 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index a915a45..ddf8163 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.10.0 +**Shipped version:** 3.10.1 ## Screenshots diff --git a/check_process b/check_process index 7714d41..004eec0 100644 --- a/check_process +++ b/check_process @@ -18,8 +18,6 @@ multi_instance=1 port_already_use=0 change_url=0 -;;; Levels - Level 5=auto ;;; Options Email= Notification=none diff --git a/conf/app.src b/conf/app.src index e83f1b3..dbbb542 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.0.zip -SOURCE_SUM=c80cfa811acda62363cccdd876bf001e802ceccb1f261846c9e59c6a66f6b125 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.1.zip +SOURCE_SUM=e61c53ce6e972e18e9ef34ad4406654dacc9b627059f7fb1437d6db0a801c308 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 8071890..3e23b67 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.10.0~ynh1", + "version": "3.10.1~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/pull_request_template.md b/pull_request_template.md index d2922c1..6c28fc5 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -13,6 +13,4 @@ ## Package_check results --- -*If you have access to [App Continuous Integration for packagers](https://yunohost.org/#/packaging_apps_ci) you can provide a link to the package_check results like below, replacing '-NUM-' in this link by the PR number and USERNAME by your username on the ci-apps-dev. Or you provide a screenshot or a pastebin of the results* - -[![Build Status](https://ci-apps-dev.yunohost.org/jenkins/job/moodle_ynh%20PR-NUM-%20(USERNAME)/badge/icon)](https://ci-apps-dev.yunohost.org/jenkins/job/moodle_ynh%20PR-NUM-%20(USERNAME)/) +* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* diff --git a/scripts/install b/scripts/install index 10afeb4..c4aac41 100644 --- a/scripts/install +++ b/scripts/install @@ -32,7 +32,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= -ynh_script_progression --message="Validating installation parameters..." +ynh_script_progression --message="Validating installation parameters..." --weight=1 final_path=/var/www/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" @@ -45,7 +45,7 @@ ynh_webpath_register --app="$app" --domain="$domain" --path_url="$path_url" #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." +ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app="$app" --key=domain --value="$domain" ynh_app_setting_set --app="$app" --key=path --value="$path_url" @@ -57,7 +57,7 @@ ynh_app_setting_set --app="$app" --key=is_public --value="$is_public" #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." +ynh_script_progression --message="Installing dependencies..." --weight=1 ynh_install_app_dependencies "$pkg_dependencies" @@ -117,15 +117,15 @@ phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) ynh_app_setting_set --app="$app" --key=data_path --value="$data_path" mkdir -p "$data_path" -chown -R "$app": "$data_path" -chown -R "$app": "$final_path" +chown -R $app: "$data_path" +chown -R $app: "$final_path" #================================================= # SETUP APPLICATION #================================================= ynh_script_progression --message="Setting up the application..." --weight=190 -exec_as "$app" php"$phpversion" "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license +exec_as $app php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license # Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.php" @@ -133,7 +133,7 @@ ynh_store_file_checksum "$final_path/config.php" #================================================= # ACTIVATE LDAP SUPPORT #================================================= -ynh_script_progression --message="Activate LDAP support..." +ynh_script_progression --message="Activate LDAP support..." --weight=3 ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" @@ -148,12 +148,12 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -exec_as "$app" php"$phpversion" "$final_path/admin/cli/purge_caches.php" +exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" #================================================= # ADD CRON JOB #================================================= -ynh_script_progression --message="Adding cron job..." +ynh_script_progression --message="Adding cron job..." --weight=2 # Set up poller cp "../conf/cron" "/etc/cron.d/$app" @@ -166,22 +166,21 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion #================================================= # SECURE FILES AND DIRECTORIES #================================================= -ynh_script_progression --message="Securing files and directories..." +ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files -chown -R "$app": "$data_path" -chown -R "$app": "$final_path" +chown -R $app: "$data_path" +chown -R $app: "$final_path" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary -if [ "$is_public" -eq 1 ] +if [ $is_public -eq 1 ] then - # unprotected_uris allows SSO credentials to be passed anyway. - ynh_app_setting_set --app="$app" --key=unprotected_uris --value="/" + ynh_permission_update --permission="main" --add="visitors" fi #================================================= diff --git a/scripts/remove b/scripts/remove index 5bcf4e5..e0c47e8 100644 --- a/scripts/remove +++ b/scripts/remove @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -27,7 +27,7 @@ data_path=$(ynh_app_setting_get --app="$app" --key=data_path) #================================================= # REMOVE THE POSTGRESQL DATABASE #================================================= -ynh_script_progression --message="Removing the PostgreSQL database..." +ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 # Remove a database if it exists, along with the associated user ynh_psql_remove_db --db_user="$db_user" --db_name="$db_name" @@ -35,7 +35,7 @@ ynh_psql_remove_db --db_user="$db_user" --db_name="$db_name" #================================================= # REMOVE DEPENDENCIES #================================================= -ynh_script_progression --message="Removing dependencies..." +ynh_script_progression --message="Removing dependencies..." --weight=1 # Remove metapackage and its dependencies ynh_remove_app_dependencies @@ -43,7 +43,7 @@ ynh_remove_app_dependencies #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing Moodle main directory..." +ynh_script_progression --message="Removing Moodle main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -51,7 +51,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 # Remove the dedicated NGINX config ynh_remove_nginx_config @@ -69,7 +69,7 @@ ynh_remove_fpm_config #================================================= # REMOVE VARIOUS FILES #================================================= -ynh_script_progression --message="Removing various files..." +ynh_script_progression --message="Removing various files..." --weight=2 # Remove a cron file ynh_secure_remove --file="/etc/cron.d/$app" @@ -82,10 +82,10 @@ ynh_secure_remove --file="$data_path" #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user -ynh_system_user_delete --username="$app" +ynh_system_user_delete --username=$app #================================================= # END OF SCRIPT diff --git a/scripts/restore b/scripts/restore index 175cc7f..b8fea29 100644 --- a/scripts/restore +++ b/scripts/restore @@ -19,7 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading settings..." +ynh_script_progression --message="Loading settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -34,7 +34,7 @@ phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -ynh_script_progression --message="Validating restoration parameters..." +ynh_script_progression --message="Validating restoration parameters..." --weight=1 ynh_webpath_available --domain="$domain" --path_url="$path_url" \ || ynh_die --message="Path not available: ${domain}${path_url}" @@ -48,14 +48,14 @@ test ! -d "$data_path" \ #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the NGINX configuration..." +ynh_script_progression --message="Restoring the NGINX configuration..." --weight=1 ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring Moodle main directory..." +ynh_script_progression --message="Restoring Moodle main directory..." --weight=1 ynh_restore_file --origin_path="$final_path" @@ -64,10 +64,10 @@ ynh_restore_file --origin_path="$data_path" #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system user..." +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 # Create the dedicated user (if not existing) -ynh_system_user_create --username="$app" +ynh_system_user_create --username=$app #================================================= # RESTORE USER RIGHTS @@ -75,13 +75,13 @@ ynh_system_user_create --username="$app" ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R "$app": "$final_path" -chown -R "$app": "$data_path" +chown -R $app: "$final_path" +chown -R $app: "$data_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Restoring PHP-FPM configuration..." +ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=1 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" @@ -93,7 +93,7 @@ ynh_add_fpm_config --package="$extra_php_dependencies" #================================================= # REINSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Reinstalling dependencies..." +ynh_script_progression --message="Reinstalling dependencies..." --weight=3 # Define and install dependencies ynh_install_app_dependencies "$pkg_dependencies" @@ -112,7 +112,7 @@ ynh_psql_connect_as --user="$db_user" --password="$db_pwd" --database="$db_name" #================================================= # RESTORE THE CRON FILE #================================================= -ynh_script_progression --message="Restoring the cron file..." +ynh_script_progression --message="Restoring the cron file..." --weight=3 ynh_restore_file --origin_path="/etc/cron.d/$app" @@ -121,7 +121,7 @@ ynh_restore_file --origin_path="/etc/cron.d/$app" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index db792ac..242595d 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -27,20 +27,26 @@ db_name=$(ynh_app_setting_get --app="$app" --key=db_name) #================================================= # CHECK VERSION #================================================= -ynh_script_progression --message="Checking version..." upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If the admin is not defined, We can't upgrade this app if [ -z "$admin" ]; then ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall moodle_ynh" fi +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -72,7 +78,7 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 # Create a dedicated nginx config ynh_add_nginx_config @@ -80,22 +86,22 @@ ynh_add_nginx_config #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." +ynh_script_progression --message="Upgrading dependencies..." --weight=1 -ynh_install_app_dependencies "$pkg_dependencies" +ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=4 # Create a dedicated user (if not existing) -ynh_system_user_create --username="$app" +ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config ynh_add_fpm_config --package="$extra_php_dependencies" @@ -106,11 +112,11 @@ phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) #================================================= # UPGRADING THE APPLICATION #================================================= -ynh_script_progression --message="Upgrading the application..." +ynh_script_progression --message="Upgrading the application..." --weight=1 ynh_backup_if_checksum_is_different --file="$final_path/config.php" -exec_as "$app" php"$phpversion" "$final_path/admin/cli/upgrade.php" --non-interactive +exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/config.php" @@ -120,13 +126,13 @@ ynh_store_file_checksum --file="$final_path/config.php" #================================================= # Set permissions on app files -chown -R "$app": "$data_path" -chown -R "$app": "$final_path" +chown -R $app: "$data_path" +chown -R $app: "$final_path" #================================================= # ACTIVATE LDAP SUPPORT #================================================= -ynh_script_progression --message="Activate LDAP support..." +ynh_script_progression --message="Activate LDAP support..." --weight=20 ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" @@ -141,12 +147,12 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -exec_as "$app" php"$phpversion" "$final_path/admin/cli/purge_caches.php" +exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" #================================================= # ADD CRON JOB #================================================= -ynh_script_progression --message="Adding cron job..." +ynh_script_progression --message="Adding cron job..." --weight=4 # Set up poller cp "../conf/cron" "/etc/cron.d/$app" @@ -159,28 +165,16 @@ ynh_replace_string "__PHPVERSION__" "$phpversion" "/etc/cron.d/$app" #================================================= # SECURE FILES AND DIRECTORIES #================================================= -ynh_script_progression --message="Securing files and directories..." +ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files -chown -R "$app": "$data_path" -chown -R "$app": "$final_path" - -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Upgrading SSOwat configuration..." - -# Make app public if necessary -if [ "$is_public" -eq 1 ] -then - # unprotected_uris allows SSO credentials to be passed anyway - ynh_app_setting_set --app="$app" --key=unprotected_uris --value="/" -fi +chown -R $app: "$data_path" +chown -R $app: "$final_path" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 49a84afe1cefb1c43e7489caf0369e203b316a79 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Feb 2021 22:41:22 +0100 Subject: [PATCH 11/83] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 3e23b67..a63de83 100644 --- a/manifest.json +++ b/manifest.json @@ -19,7 +19,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.0-fpm" + "php7.3-fpm" ], "arguments": { "install" : [ From 554efae3857c26db5474acee1a088a0479a68b85 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 14 Feb 2021 22:43:36 +0100 Subject: [PATCH 12/83] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index c4aac41..e714bad 100644 --- a/scripts/install +++ b/scripts/install @@ -24,7 +24,7 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC -email=$(ynh_user_get_info "$admin" mail) +email=$(ynh_user_get_info --username=$admin --key=mail) password=$(ynh_string_random --length=30) app=$YNH_APP_INSTANCE_NAME From ef91727302d9b0d2c3ea41f9e94750d32509ee87 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 16 Feb 2021 15:11:47 +0100 Subject: [PATCH 13/83] Update install --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index e714bad..d329c20 100644 --- a/scripts/install +++ b/scripts/install @@ -50,7 +50,6 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app="$app" --key=domain --value="$domain" ynh_app_setting_set --app="$app" --key=path --value="$path_url" ynh_app_setting_set --app="$app" --key=admin --value="$admin" -ynh_app_setting_set --app="$app" --key=is_public --value="$is_public" #================================================= # STANDARD MODIFICATIONS From 3cbed24eaf2b77a30774d52a3f7fe9abb9f46639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 25 Feb 2021 15:11:16 +0100 Subject: [PATCH 14/83] small fixes (#33) --- conf/cron | 2 +- scripts/install | 42 +++++++++++++++++++----------------------- scripts/restore | 28 ++++++++++++++-------------- scripts/upgrade | 30 +++++++++++++----------------- 4 files changed, 47 insertions(+), 55 deletions(-) diff --git a/conf/cron b/conf/cron index c07ace5..777ceb2 100644 --- a/conf/cron +++ b/conf/cron @@ -1 +1 @@ -*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ -f __FINAL_PATH__/admin/cli/cron.php +*/15 * * * * __USER__ /usr/bin/php__PHPVERSION__ -f __FINALPATH__/admin/cli/cron.php diff --git a/scripts/install b/scripts/install index d329c20..da23858 100644 --- a/scripts/install +++ b/scripts/install @@ -40,16 +40,16 @@ data_path=/home/yunohost.app/$app test ! -e "$data_path" || ynh_die --message="This path already contains a folder" # Register (book) web path -ynh_webpath_register --app="$app" --domain="$domain" --path_url="$path_url" +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= ynh_script_progression --message="Storing installation settings..." --weight=1 -ynh_app_setting_set --app="$app" --key=domain --value="$domain" -ynh_app_setting_set --app="$app" --key=path --value="$path_url" -ynh_app_setting_set --app="$app" --key=admin --value="$admin" +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url +ynh_app_setting_set --app=$app --key=admin --value=$admin #================================================= # STANDARD MODIFICATIONS @@ -58,7 +58,7 @@ ynh_app_setting_set --app="$app" --key=admin --value="$admin" #================================================= ynh_script_progression --message="Installing dependencies..." --weight=1 -ynh_install_app_dependencies "$pkg_dependencies" +ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE POSTGRESQL DATABASE @@ -67,10 +67,10 @@ ynh_script_progression --message="Creating a PostgreSQL database..." --weight=4 ynh_psql_test_if_first_run -db_name=$(ynh_sanitize_dbid --db_name="$app") +db_name=$(ynh_sanitize_dbid --db_name=$app) db_user=$db_name -ynh_app_setting_set --app="$app" --key=db_name --value="$db_name" -ynh_psql_setup_db --db_user="$db_user" --db_name="$db_name" +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_psql_setup_db --db_user=$db_user --db_name=$db_name db_pwd=$(ynh_app_setting_get "$app" psqlpwd) @@ -79,7 +79,7 @@ db_pwd=$(ynh_app_setting_get "$app" psqlpwd) #================================================= ynh_script_progression --message="Setting up source files..." --weight=6 -ynh_app_setting_set --app="$app" --key=final_path --value="$final_path" +ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" @@ -97,7 +97,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring system user..." --weight=2 # Create a system user -ynh_system_user_create --username="$app" +ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION @@ -106,7 +106,7 @@ ynh_script_progression --message="Configuring PHP-FPM..." --weight=1 # Create a dedicated php-fpm config ynh_add_fpm_config --package="$extra_php_dependencies" -phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC SETUP @@ -114,10 +114,10 @@ phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) # SECURE FILES AND DIRECTORIES #================================================= -ynh_app_setting_set --app="$app" --key=data_path --value="$data_path" -mkdir -p "$data_path" -chown -R $app: "$data_path" -chown -R $app: "$final_path" +ynh_app_setting_set --app=$app --key=data_path --value=$data_path +mkdir -p $data_path +chown -R $app: $data_path +chown -R $app: $final_path #================================================= # SETUP APPLICATION @@ -147,18 +147,14 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" +exec_as $app php$phpversion "$final_path/admin/cli/purge_caches.php" #================================================= # ADD CRON JOB #================================================= ynh_script_progression --message="Adding cron job..." --weight=2 -# Set up poller -cp "../conf/cron" "/etc/cron.d/$app" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__FINAL_PATH__" --replace_string="$final_path" --target_file="/etc/cron.d/$app" -ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="/etc/cron.d/$app" +ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION @@ -168,8 +164,8 @@ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions to app files -chown -R $app: "$data_path" -chown -R $app: "$final_path" +chown -R $app: $data_path +chown -R $app: $final_path #================================================= # SETUP SSOWAT diff --git a/scripts/restore b/scripts/restore index b8fea29..3f1f034 100644 --- a/scripts/restore +++ b/scripts/restore @@ -23,13 +23,13 @@ ynh_script_progression --message="Loading settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app="$app" --key=domain) -path_url=$(ynh_app_setting_get --app="$app" --key=path) -final_path=$(ynh_app_setting_get --app="$app" --key=final_path) -data_path=$(ynh_app_setting_get --app="$app" --key=data_path) -db_name=$(ynh_app_setting_get --app="$app" --key=db_name) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name -phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -57,9 +57,9 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= ynh_script_progression --message="Restoring Moodle main directory..." --weight=1 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path=$final_path -ynh_restore_file --origin_path="$data_path" +ynh_restore_file --origin_path=$data_path #================================================= # RECREATE THE DEDICATED USER @@ -75,8 +75,8 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R $app: "$final_path" -chown -R $app: "$data_path" +chown -R $app: $final_path +chown -R $app: $data_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION @@ -96,7 +96,7 @@ ynh_add_fpm_config --package="$extra_php_dependencies" ynh_script_progression --message="Reinstalling dependencies..." --weight=3 # Define and install dependencies -ynh_install_app_dependencies "$pkg_dependencies" +ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE THE POSTGRESQL DATABASE @@ -105,9 +105,9 @@ ynh_script_progression --message="Restoring the PostgreSQL database..." --weight ynh_psql_test_if_first_run -db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) -ynh_psql_setup_db --db_user="$db_user" --db_name="$db_name" --db_pwd="$db_pwd" -ynh_psql_connect_as --user="$db_user" --password="$db_pwd" --database="$db_name" < ./db.sql +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql #================================================= # RESTORE THE CRON FILE diff --git a/scripts/upgrade b/scripts/upgrade index 242595d..8535b11 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -16,13 +16,13 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app="$app" --key=domain) -path_url=$(ynh_app_setting_get --app="$app" --key=path) -admin=$(ynh_app_setting_get --app="$app" --key=admin) -is_public=$(ynh_app_setting_get --app="$app" --key=is_public) -final_path=$(ynh_app_setting_get --app="$app" --key=final_path) -data_path=$(ynh_app_setting_get --app="$app" --key=data_path) -db_name=$(ynh_app_setting_get --app="$app" --key=db_name) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +admin=$(ynh_app_setting_get --app=$app --key=admin) +is_public=$(ynh_app_setting_get --app=$app --key=is_public) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= # CHECK VERSION @@ -105,7 +105,7 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config ynh_add_fpm_config --package="$extra_php_dependencies" -phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC UPGRADE @@ -126,8 +126,8 @@ ynh_store_file_checksum --file="$final_path/config.php" #================================================= # Set permissions on app files -chown -R $app: "$data_path" -chown -R $app: "$final_path" +chown -R $app: $data_path +chown -R $app: $final_path #================================================= # ACTIVATE LDAP SUPPORT @@ -154,11 +154,7 @@ exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" #================================================= ynh_script_progression --message="Adding cron job..." --weight=4 -# Set up poller -cp "../conf/cron" "/etc/cron.d/$app" -ynh_replace_string "__APP__" "$app" "/etc/cron.d/$app" -ynh_replace_string "__FINAL_PATH__" "$final_path" "/etc/cron.d/$app" -ynh_replace_string "__PHPVERSION__" "$phpversion" "/etc/cron.d/$app" +ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION @@ -168,8 +164,8 @@ ynh_replace_string "__PHPVERSION__" "$phpversion" "/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files -chown -R $app: "$data_path" -chown -R $app: "$final_path" +chown -R $app: $data_path +chown -R $app: $final_path #================================================= # RELOAD NGINX From 7fdd2137b23ecec2324fa514b19f4fd36c70c30e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Mar 2021 14:11:58 +0100 Subject: [PATCH 15/83] Upgrade to 3.10.2 (#35) * Upgrade to 3.10.2 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/backup | 10 +++++----- scripts/install | 4 ++-- scripts/remove | 10 +++++----- scripts/restore | 2 +- scripts/upgrade | 3 +-- 8 files changed, 18 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index ddf8163..6bdf324 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.10.1 +**Shipped version:** 3.10.2 ## Screenshots diff --git a/conf/app.src b/conf/app.src index dbbb542..012418c 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.1.zip -SOURCE_SUM=e61c53ce6e972e18e9ef34ad4406654dacc9b627059f7fb1437d6db0a801c308 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.2.zip +SOURCE_SUM=6c54328ca6c40fb5cb4eb66a449b3c5fe7fe03bb04ab21df1156ba3c9c2ed1c6 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index a63de83..73293d3 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.10.1~ynh1", + "version": "3.10.2~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/backup b/scripts/backup index 9c2f9f5..6afafdf 100644 --- a/scripts/backup +++ b/scripts/backup @@ -23,11 +23,11 @@ ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get --app="$app" --key=final_path) -data_path=$(ynh_app_setting_get --app="$app" --key=data_path) -domain=$(ynh_app_setting_get --app="$app" --key=domain) -db_name=$(ynh_app_setting_get --app="$app" --key=db_name) -phpversion=$(ynh_app_setting_get --app="$app" --key=phpversion) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP diff --git a/scripts/install b/scripts/install index da23858..6f05f87 100644 --- a/scripts/install +++ b/scripts/install @@ -58,7 +58,7 @@ ynh_app_setting_set --app=$app --key=admin --value=$admin #================================================= ynh_script_progression --message="Installing dependencies..." --weight=1 -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE POSTGRESQL DATABASE @@ -72,7 +72,7 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_psql_setup_db --db_user=$db_user --db_name=$db_name -db_pwd=$(ynh_app_setting_get "$app" psqlpwd) +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE diff --git a/scripts/remove b/scripts/remove index e0c47e8..81e2e53 100644 --- a/scripts/remove +++ b/scripts/remove @@ -16,11 +16,11 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app="$app" --key=domain) -db_name=$(ynh_app_setting_get --app="$app" --key=db_name) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name -final_path=$(ynh_app_setting_get --app="$app" --key=final_path) -data_path=$(ynh_app_setting_get --app="$app" --key=data_path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) #================================================= # STANDARD REMOVE @@ -30,7 +30,7 @@ data_path=$(ynh_app_setting_get --app="$app" --key=data_path) ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 # Remove a database if it exists, along with the associated user -ynh_psql_remove_db --db_user="$db_user" --db_name="$db_name" +ynh_psql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE DEPENDENCIES diff --git a/scripts/restore b/scripts/restore index 3f1f034..1ca08a6 100644 --- a/scripts/restore +++ b/scripts/restore @@ -96,7 +96,7 @@ ynh_add_fpm_config --package="$extra_php_dependencies" ynh_script_progression --message="Reinstalling dependencies..." --weight=3 # Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE THE POSTGRESQL DATABASE diff --git a/scripts/upgrade b/scripts/upgrade index 8535b11..cf1a4e0 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -19,7 +19,6 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) admin=$(ynh_app_setting_get --app=$app --key=admin) -is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) data_path=$(ynh_app_setting_get --app=$app --key=data_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) @@ -88,7 +87,7 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Upgrading dependencies..." --weight=1 -ynh_install_app_dependencies $pkg_dependencies +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER From 1b6ad3f87ee3e386e0f18d53317d808bafd7c587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:34:55 +0100 Subject: [PATCH 16/83] Remove ask (#36) --- manifest.json | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/manifest.json b/manifest.json index 73293d3..1cba9b7 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.0.0" + "yunohost": ">= 4.1.7" }, "multi_instance": true, "services": [ @@ -26,38 +26,22 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Moodle", - "fr": "Choisissez un nom de domaine pour Moodle" - }, "example": "example.com" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Moodle", - "fr": "Choisissez un chemin pour Moodle" - }, "example": "/moodle", "default": "/moodle" }, { "name": "admin", "type": "user", - "ask": { - "en": "Choose the Moodle administrator (must be an existing YunoHost user)", - "fr": "Administrateur du site (doit être un utilisateur YunoHost existant)" - }, "example": "johndoe" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "default": true } ] From f764d11977f255a7b0ec64e84cab50c6efba7107 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 24 Mar 2021 20:48:03 +0100 Subject: [PATCH 17/83] Protect final_path --- scripts/install | 1 + scripts/restore | 1 + scripts/upgrade | 1 + 3 files changed, 3 insertions(+) diff --git a/scripts/install b/scripts/install index 6f05f87..cf19625 100644 --- a/scripts/install +++ b/scripts/install @@ -118,6 +118,7 @@ ynh_app_setting_set --app=$app --key=data_path --value=$data_path mkdir -p $data_path chown -R $app: $data_path chown -R $app: $final_path +chmod o-rwx $final_path #================================================= # SETUP APPLICATION diff --git a/scripts/restore b/scripts/restore index 1ca08a6..7ddb5f8 100644 --- a/scripts/restore +++ b/scripts/restore @@ -77,6 +77,7 @@ ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files chown -R $app: $final_path chown -R $app: $data_path +chmod o-rwx $final_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index cf1a4e0..8ffdb0a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -165,6 +165,7 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files chown -R $app: $data_path chown -R $app: $final_path +chmod o-rwx $final_path #================================================= # RELOAD NGINX From 5a60143ebe24240a84f7dd902df416b8bd137464 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 24 Mar 2021 20:51:25 +0100 Subject: [PATCH 18/83] Revert "Protect final_path" This reverts commit f764d11977f255a7b0ec64e84cab50c6efba7107. --- scripts/install | 1 - scripts/restore | 1 - scripts/upgrade | 1 - 3 files changed, 3 deletions(-) diff --git a/scripts/install b/scripts/install index cf19625..6f05f87 100644 --- a/scripts/install +++ b/scripts/install @@ -118,7 +118,6 @@ ynh_app_setting_set --app=$app --key=data_path --value=$data_path mkdir -p $data_path chown -R $app: $data_path chown -R $app: $final_path -chmod o-rwx $final_path #================================================= # SETUP APPLICATION diff --git a/scripts/restore b/scripts/restore index 7ddb5f8..1ca08a6 100644 --- a/scripts/restore +++ b/scripts/restore @@ -77,7 +77,6 @@ ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files chown -R $app: $final_path chown -R $app: $data_path -chmod o-rwx $final_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index 8ffdb0a..cf1a4e0 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -165,7 +165,6 @@ ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files chown -R $app: $data_path chown -R $app: $final_path -chmod o-rwx $final_path #================================================= # RELOAD NGINX From d8695144de0b407d498be4bf60987671ef22bce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 4 Apr 2021 19:20:08 +0200 Subject: [PATCH 19/83] Add change url (#38) * Update change_url --- README.md | 8 ++-- README_fr.md | 62 ++++++++++++++++++++++++ check_process | 7 ++- conf/app.src | 4 +- manifest.json | 2 +- scripts/change_url | 114 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 188 insertions(+), 9 deletions(-) create mode 100644 README_fr.md create mode 100644 scripts/change_url diff --git a/README.md b/README.md index 6bdf324..b15d0f7 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,15 @@ [![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) [![Install Moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=moodle) +*[Lire ce readme en français.](./README_fr.md)* + > *This package allows you to install Moodle quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -[Moodle](https://moodle.org) is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. +[Moodle](https://moodle.org) is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. - -**Shipped version:** 3.10.2 +**Shipped version:** 3.10.3 ## Screenshots diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..791dc4b --- /dev/null +++ b/README_fr.md @@ -0,0 +1,62 @@ +# Moodle pour YunoHost + +[![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) +[![Installer Moodle avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=moodle) + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d'installer Moodle rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* + +## Vue d'ensemble +[Moodle](https://moodle.org) est une plateforme d'apprentissage conçue pour fournir aux enseignants, aux administrateurs et aux apprenants un système unique robuste, sécurisé et intégré pour créer des environnements d'apprentissage personnalisés. Moodle est largement utilisé dans le monde entier par les universités, les écoles, les entreprises et toutes sortes d'organisations et d'individus. + +**Version incluse :** 3.10.3 + +## Captures d'écran + +![](https://upload.wikimedia.org/wikipedia/commons/3/36/Moodle_2.0_on_Firefox_4.0.png) + +## Démo + +* [Démo officielle](https://sandbox.moodledemo.net/) + +## Configuration + +How to configure this app: by an admin panel. + +## Documentation + + * Documentation officielle : https://docs.moodle.org/39/en/Main_page + +## Caractéristiques spécifiques YunoHost + +#### Support multi-utilisateur + +* L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** +* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** + +#### Architectures supportées + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) + +## Liens + + * Signaler un bug :https://github.com/YunoHost-Apps/moodle_ynh/issues + * Site de l'application : https://moodle.org/ + * Dépôt de l'application principale : http://git.moodle.org/ - https://github.com/moodle/moodle + * Site web YunoHost : https://yunohost.org/ + +--- + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/moodle_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug +ou +sudo yunohost app upgrade moodle -u https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug +``` diff --git a/check_process b/check_process index 004eec0..97bfdd4 100644 --- a/check_process +++ b/check_process @@ -14,13 +14,16 @@ upgrade=1 # 3.8.2~ynh2 upgrade=1 from_commit=3bdecdeabdcaaf1fdfade6e5b7dcfa30704c665c + # 3.10.2~ynh1 + upgrade=1 from_commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 backup_restore=1 multi_instance=1 - port_already_use=0 - change_url=0 + change_url=1 ;;; Options Email= Notification=none ;;; Upgrade options ; commit=3bdecdeabdcaaf1fdfade6e5b7dcfa30704c665c name=3.8.2~ynh2 + ; commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 + name=3.10.2~ynh1 \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index 012418c..621f625 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.2.zip -SOURCE_SUM=6c54328ca6c40fb5cb4eb66a449b3c5fe7fe03bb04ab21df1156ba3c9c2ed1c6 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.3.zip +SOURCE_SUM=f92e603a261d013b1c6f2956d1511b7e5d65ac1e9f05de77a94183bc3faaba7d SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 1cba9b7..f668490 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.10.2~ynh1", + "version": "3.10.3~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..93fb5b9 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,114 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +# SETUP APPLICATION +#================================================= +ynh_script_progression --message="Setting up the application..." --weight=3 + +ynh_replace_string --match_string="\$CFG->wwwroot = '*';" --replace_string="\$CFG->wwwroot = 'https://$new_domain${new_path%/}';" --target_file=$final_path/config.php + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last From 2f9edf1745c6128bfa7123e7a3a121bf92cebbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 4 Apr 2021 19:21:50 +0200 Subject: [PATCH 20/83] 3.10.3 (#37) * Upgrade to version 3.10.3 * Add README_fr * Small fixes --- README_fr.md | 6 +++--- scripts/upgrade | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README_fr.md b/README_fr.md index 791dc4b..ac1f275 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,6 +1,6 @@ # Moodle pour YunoHost -[![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) [![Installer Moodle avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=moodle) *[Read this readme in english.](./README.md)* @@ -23,11 +23,11 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Configuration -How to configure this app: by an admin panel. +* Comment configurer cette application : via le panneau d'administration. ## Documentation - * Documentation officielle : https://docs.moodle.org/39/en/Main_page +* Documentation officielle : https://docs.moodle.org/39/en/Main_page ## Caractéristiques spécifiques YunoHost diff --git a/scripts/upgrade b/scripts/upgrade index cf1a4e0..7cc7354 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -36,7 +36,7 @@ ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If the admin is not defined, We can't upgrade this app if [ -z "$admin" ]; then - ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall moodle_ynh" + ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall Moodle" fi # Cleaning legacy permissions @@ -79,7 +79,7 @@ fi #================================================= ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= From 246a9e69a378f2f3a821902d37322825451dd9ba Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 4 Apr 2021 19:24:29 +0200 Subject: [PATCH 21/83] Fix badges --- README.md | 4 ++-- README_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b15d0f7..28216db 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,8 @@ How to configure this app: by an admin panel. #### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) ## Links diff --git a/README_fr.md b/README_fr.md index ac1f275..8ccc57f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -38,8 +38,8 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install #### Architectures supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) ## Liens From ad0477a737a932d748129d6824aba9d3edc9067f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 4 Apr 2021 23:52:20 +0200 Subject: [PATCH 22/83] Remove not yet working script --- check_process | 2 +- scripts/change_url | 114 --------------------------------------------- 2 files changed, 1 insertion(+), 115 deletions(-) delete mode 100644 scripts/change_url diff --git a/check_process b/check_process index 97bfdd4..209432d 100644 --- a/check_process +++ b/check_process @@ -18,7 +18,7 @@ upgrade=1 from_commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 backup_restore=1 multi_instance=1 - change_url=1 + change_url=0 ;;; Options Email= Notification=none diff --git a/scripts/change_url b/scripts/change_url deleted file mode 100644 index 93fb5b9..0000000 --- a/scripts/change_url +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/bash - -#================================================= -# GENERIC STARTING -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - -source _common.sh -source /usr/share/yunohost/helpers - -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH - -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -# Needed for helper "ynh_add_nginx_config" -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. - ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" - - # Restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# CHECK WHICH PARTS SHOULD BE CHANGED -#================================================= - -change_domain=0 -if [ "$old_domain" != "$new_domain" ] -then - change_domain=1 -fi - -change_path=0 -if [ "$old_path" != "$new_path" ] -then - change_path=1 -fi - -#================================================= -# MODIFY URL IN NGINX CONF -#================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 - -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf - -# Change the path in the NGINX config file -if [ $change_path -eq 1 ] -then - # Make a backup of the original NGINX config file if modified - ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" - # Create a dedicated NGINX config - ynh_add_nginx_config -fi - -# Change the domain for NGINX -if [ $change_domain -eq 1 ] -then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file="$nginx_conf_path" - mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi - -#================================================= -# SPECIFIC MODIFICATIONS -#================================================= -# SETUP APPLICATION -#================================================= -ynh_script_progression --message="Setting up the application..." --weight=3 - -ynh_replace_string --match_string="\$CFG->wwwroot = '*';" --replace_string="\$CFG->wwwroot = 'https://$new_domain${new_path%/}';" --target_file=$final_path/config.php - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - -#================================================= -# END OF SCRIPT -#================================================= - -ynh_script_progression --message="Change of URL completed for $app" --last From a4301a12dd3906db7a18d722fb17a3201640c8d5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 26 Apr 2021 18:42:29 +0200 Subject: [PATCH 23/83] Fix links --- README.md | 4 ++-- README_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 28216db..3dbb79d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ *[Lire ce readme en français.](./README_fr.md)* > *This package allows you to install Moodle quickly and simply on a YunoHost server. -If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* +If you don't have YunoHost, please consult [the guide](https://yunohost.org/install) to learn how to install it.* ## Overview [Moodle](https://moodle.org) is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. @@ -27,7 +27,7 @@ How to configure this app: by an admin panel. ## Documentation - * Official documentation: https://docs.moodle.org/39/en/Main_page + * Official documentation: https://docs.moodle.org/311/en/Main_page ## YunoHost specific features diff --git a/README_fr.md b/README_fr.md index 8ccc57f..9f3643b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -6,7 +6,7 @@ *[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer Moodle rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* +Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) pour apprendre comment l'installer.* ## Vue d'ensemble [Moodle](https://moodle.org) est une plateforme d'apprentissage conçue pour fournir aux enseignants, aux administrateurs et aux apprenants un système unique robuste, sécurisé et intégré pour créer des environnements d'apprentissage personnalisés. Moodle est largement utilisé dans le monde entier par les universités, les écoles, les entreprises et toutes sortes d'organisations et d'individus. @@ -27,7 +27,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install ## Documentation -* Documentation officielle : https://docs.moodle.org/39/en/Main_page +* Documentation officielle : https://docs.moodle.org/3x/fr/Accueil ## Caractéristiques spécifiques YunoHost From 13d0c60e91fcec84aeafa9d8b86c83e056f69f50 Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Tue, 11 May 2021 08:32:38 +0200 Subject: [PATCH 24/83] [autopatch] Update issue and PR templates (#41) Co-authored-by: Yunohost-Bot <> --- issue_template.md | 46 ---------------------------------------- pull_request_template.md | 16 -------------- 2 files changed, 62 deletions(-) delete mode 100644 issue_template.md delete mode 100644 pull_request_template.md diff --git a/issue_template.md b/issue_template.md deleted file mode 100644 index ae65abb..0000000 --- a/issue_template.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -name: Bug report -about: Create a report to help us debug, it would be nice to fill the template as much as you can to help us, help you and help us all. - ---- - -**How to post a meaningful bug report** -1. *Read this whole template first.* -2. *Determine if you are on the right place:* - - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* - - *Otherwise, the issue may be due to Moodle itself. Refer to its documentation or repository for help.* - - *If you have a doubt, post here, we will figure it out together.* -3. *Delete the italic comments as you write over them below, and remove this guide.* ---- - -**Describe the bug** -*A clear and concise description of what the bug is.* - -**Versions** -- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* -- YunoHost version: x.x.x -- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* -- Are you in a special context or did you perform some particular tweaking on your YunoHost instance ?: *no / yes* - - If yes, please explain: -- Using, or trying to install package version/branch: -- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* - -**To Reproduce** -*Steps to reproduce the behavior.* -- *If you performed a command from the CLI, the command itself is enough. For example:* - ```sh - sudo yunohost app install moodle - ``` -- *If you used the webadmin, please perform the equivalent command from the CLI first.* -- *If the error occurs in your browser, explain what you did:* - 1. *Go to '...'* - 2. *Click on '...'* - 3. *Scroll down to '...'* - 4. *See error* - -**Expected behavior** -*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* - -**Logs** -*After a failed command, YunoHost makes the log available to you, but also to others, thanks to `yunohost log display [log name] --share`. The actual command, with the correct log name, is displayed at the end of the failed attempt in the CLI. Execute it and copy here the share link it outputs.* -*If applicable and useful, add screenshots to help explain your problem.* diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index 6c28fc5..0000000 --- a/pull_request_template.md +++ /dev/null @@ -1,16 +0,0 @@ -## Problem -- *Description of why you made this PR* - -## Solution -- *And how do you fix that problem* - -## PR Status -- [ ] Code finished. -- [ ] Tested with Package_check. -- [ ] Fix or enhancement tested. -- [ ] Upgrade from last version tested. -- [ ] Can be reviewed and tested. - -## Package_check results ---- -* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* From f8345b978790182417bb57679c22f16f6c386bf1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 11 May 2021 11:06:13 +0200 Subject: [PATCH 25/83] Add templates --- .github/ISSUE_TEMPLATE.md | 55 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ 2 files changed, 71 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2729a6b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,55 @@ +--- +name: Bug report +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. + +--- + +**How to post a meaningful bug report** +1. *Read this whole template first.* +2. *Determine if you are on the right place:* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* + - *Otherwise, the issue may be due to the app itself. Refer to its documentation or repository for help.* + - *When in doubt, post here and we will figure it out together.* +3. *Delete the italic comments as you write over them below, and remove this guide.* +--- + +### Describe the bug + +*A clear and concise description of what the bug is.* + +### Context + +- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* +- YunoHost version: x.x.x +- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* +- Are you in a special context or did you perform some particular tweaking on your YunoHost instance?: *no / yes* + - If yes, please explain: +- Using, or trying to install package version/branch: +- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* + +### Steps to reproduce + +- *If you performed a command from the CLI, the command itself is enough. For example:* + ```sh + sudo yunohost app install the_app + ``` +- *If you used the webadmin, please perform the equivalent command from the CLI first.* +- *If the error occurs in your browser, explain what you did:* + 1. *Go to '...'* + 2. *Click on '...'* + 3. *Scroll down to '...'* + 4. *See error* + +### Expected behavior + +*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* + +### Logs + +*When an operation fails, YunoHost provides a simple way to share the logs.* +- *In the webadmin, the error message contains a link to the relevant log page. On that page, you will be able to 'Share with Yunopaste'. If you missed it, the logs of previous operations are also available under Tools > Logs.* +- *In command line, the command to share the logs is displayed at the end of the operation and looks like `yunohost log display [log name] --share`. If you missed it, you can find the log ID of a previous operation using `yunohost log list`.* + +*After sharing the log, please copypaste directly the link provided by YunoHost (to help readability, no need to copypaste the entire content of the log here, just the link is enough...)* + +*If applicable and useful, add screenshots to help explain your problem.* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ef70e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Problem + +- *Description of why you made this PR* + +## Solution + +- *And how do you fix that problem* + +## PR Status + +- [ ] Code finished and ready to be reviewed/tested +- [ ] The fix/enhancement were manually tested (if applicable) + +## Automatic tests + +Automatic tests can be triggered on https://ci-apps-dev.yunohost.org/ *after creating the PR*, by commenting "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!". (N.B. : for this to work you need to be a member of the Yunohost-Apps organization) From 10b6ea211cdb55c12f2a0258ed90da9bddf38099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 4 Jun 2021 11:25:56 +0200 Subject: [PATCH 26/83] 3.10.4 (#42) * 3.10.4 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- scripts/install | 4 ++-- scripts/restore | 2 +- scripts/upgrade | 8 -------- 7 files changed, 8 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 3dbb79d..778d024 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/inst ## Overview [Moodle](https://moodle.org) is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.10.3 +**Shipped version:** 3.10.4 ## Screenshots diff --git a/README_fr.md b/README_fr.md index 9f3643b..5d8f724 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) ## Vue d'ensemble [Moodle](https://moodle.org) est une plateforme d'apprentissage conçue pour fournir aux enseignants, aux administrateurs et aux apprenants un système unique robuste, sécurisé et intégré pour créer des environnements d'apprentissage personnalisés. Moodle est largement utilisé dans le monde entier par les universités, les écoles, les entreprises et toutes sortes d'organisations et d'individus. -**Version incluse :** 3.10.3 +**Version incluse :** 3.10.4 ## Captures d'écran diff --git a/conf/app.src b/conf/app.src index 621f625..d917c00 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.3.zip -SOURCE_SUM=f92e603a261d013b1c6f2956d1511b7e5d65ac1e9f05de77a94183bc3faaba7d +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.4.zip +SOURCE_SUM=00b6020496e4a7d7d107bbb398d56425c2ba57188bf16756f0480ac973229c33 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f668490..c3ac22f 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.10.3~ynh1", + "version": "3.10.4~ynh1", "url": "https://moodle.org/", "license": "GPL-3.0-or-later", "maintainer": { diff --git a/scripts/install b/scripts/install index 6f05f87..9cc7165 100644 --- a/scripts/install +++ b/scripts/install @@ -50,6 +50,7 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin +ynh_app_setting_set --app=$app --key=data_path --value=$data_path #================================================= # STANDARD MODIFICATIONS @@ -114,10 +115,9 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # SECURE FILES AND DIRECTORIES #================================================= -ynh_app_setting_set --app=$app --key=data_path --value=$data_path +chown -R $app: "$final_path" mkdir -p $data_path chown -R $app: $data_path -chown -R $app: $final_path #================================================= # SETUP APPLICATION diff --git a/scripts/restore b/scripts/restore index 1ca08a6..51c7010 100644 --- a/scripts/restore +++ b/scripts/restore @@ -75,7 +75,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Restoring user rights..." # Restore permissions on app files -chown -R $app: $final_path +chown -R $app: "$final_path" chown -R $app: $data_path #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 7cc7354..936df4c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -120,14 +120,6 @@ exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interact # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/config.php" -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -# Set permissions on app files -chown -R $app: $data_path -chown -R $app: $final_path - #================================================= # ACTIVATE LDAP SUPPORT #================================================= From 3ac60feb345276dd3c0da602649274774f11fc0b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Jun 2021 11:31:24 +0200 Subject: [PATCH 27/83] Cleaning up --- check_process | 12 ++++-------- manifest.json | 2 +- scripts/_common.sh | 13 ------------- scripts/install | 20 ++++++++++---------- scripts/restore | 16 ++++++++-------- scripts/upgrade | 20 ++++++++++---------- 6 files changed, 33 insertions(+), 50 deletions(-) diff --git a/check_process b/check_process index 209432d..671162b 100644 --- a/check_process +++ b/check_process @@ -1,9 +1,9 @@ ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + admin="john" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 @@ -12,8 +12,6 @@ setup_private=1 setup_public=1 upgrade=1 - # 3.8.2~ynh2 - upgrade=1 from_commit=3bdecdeabdcaaf1fdfade6e5b7dcfa30704c665c # 3.10.2~ynh1 upgrade=1 from_commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 backup_restore=1 @@ -23,7 +21,5 @@ Email= Notification=none ;;; Upgrade options - ; commit=3bdecdeabdcaaf1fdfade6e5b7dcfa30704c665c - name=3.8.2~ynh2 ; commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 name=3.10.2~ynh1 \ No newline at end of file diff --git a/manifest.json b/manifest.json index c3ac22f..1524f4c 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.2.0" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index 956370d..3730b16 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -19,19 +19,6 @@ extra_php_dependencies="php${YNH_PHP_VERSION}-common php${YNH_PHP_VERSION}-mbstr # EXPERIMENTAL HELPERS #================================================= -# Execute a command as another user -# usage: exec_as USER COMMAND [ARG ...] -exec_as() { - local USER=$1 - shift 1 - - if [[ $USER = $(whoami) ]]; then - eval "$@" - else - sudo -u "$USER" "$@" - fi -} - #================================================= # FUTURE OFFICIAL HELPERS #================================================= diff --git a/scripts/install b/scripts/install index 9cc7165..32e06ad 100644 --- a/scripts/install +++ b/scripts/install @@ -75,6 +75,14 @@ ynh_psql_setup_db --db_user=$db_user --db_name=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -92,14 +100,6 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= @@ -124,7 +124,7 @@ chown -R $app: $data_path #================================================= ynh_script_progression --message="Setting up the application..." --weight=190 -exec_as $app php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license +ynh_exec_as $app php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license # Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.php" @@ -147,7 +147,7 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -exec_as $app php$phpversion "$final_path/admin/cli/purge_caches.php" +ynh_exec_as $app php$phpversion "$final_path/admin/cli/purge_caches.php" #================================================= # ADD CRON JOB diff --git a/scripts/restore b/scripts/restore index 51c7010..b5b8eae 100644 --- a/scripts/restore +++ b/scripts/restore @@ -52,6 +52,14 @@ ynh_script_progression --message="Restoring the NGINX configuration..." --weight ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -61,14 +69,6 @@ ynh_restore_file --origin_path=$final_path ynh_restore_file --origin_path=$data_path -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # RESTORE USER RIGHTS #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 936df4c..3c70089 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -60,6 +60,14 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=4 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -89,14 +97,6 @@ ynh_script_progression --message="Upgrading dependencies..." --weight=1 ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=4 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= @@ -115,7 +115,7 @@ ynh_script_progression --message="Upgrading the application..." --weight=1 ynh_backup_if_checksum_is_different --file="$final_path/config.php" -exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive +ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/config.php" @@ -138,7 +138,7 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" +ynh_exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" #================================================= # ADD CRON JOB From 193b296277f0aeabf0a3d15a7a385a1c7a6e215b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 17 Jun 2021 08:26:55 +0200 Subject: [PATCH 28/83] Set rights (#45) * Set rights --- README.md | 46 +++++++++--------- README_fr.md | 44 ++++++++--------- conf/app.src | 4 +- doc/DISCLAIMER.md | 10 ++++ doc/DISCLAIMER_fr.md | 10 ++++ doc/screenshots/Moodle_2.0_on_Firefox_4.0.png | Bin 0 -> 310823 bytes manifest.json | 11 ++++- scripts/install | 18 ++----- scripts/restore | 13 ++--- scripts/upgrade | 23 +++------ 10 files changed, 88 insertions(+), 91 deletions(-) create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md create mode 100644 doc/screenshots/Moodle_2.0_on_Firefox_4.0.png diff --git a/README.md b/README.md index 778d024..a3e5e44 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ + + # Moodle for YunoHost [![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) @@ -5,30 +10,27 @@ *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install Moodle quickly and simply on a YunoHost server. -If you don't have YunoHost, please consult [the guide](https://yunohost.org/install) to learn how to install it.* +> *This package allows you to install Moodle quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -[Moodle](https://moodle.org) is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. -**Shipped version:** 3.10.4 +Online learning platform + +**Shipped version:** 3.11.0~ynh1 + +**Demo:** https://sandbox.moodledemo.net/ ## Screenshots -![](https://upload.wikimedia.org/wikipedia/commons/3/36/Moodle_2.0_on_Firefox_4.0.png) +![](./doc/screenshots/Moodle_2.0_on_Firefox_4.0.png) -## Demo - -* [Official demo](https://sandbox.moodledemo.net/) +## Disclaimers / important information ## Configuration How to configure this app: by an admin panel. -## Documentation - - * Official documentation: https://docs.moodle.org/311/en/Main_page - ## YunoHost specific features #### Multi-user support @@ -36,19 +38,13 @@ How to configure this app: by an admin panel. * Are LDAP and HTTP auth supported? **Yes** * Can the app be used by multiple users? **Yes** -#### Supported architectures +## Documentation and resources -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/moodle_ynh/issues - * App website: https://moodle.org/ - * Upstream app repository: http://git.moodle.org/ - https://github.com/moodle/moodle - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://moodle.org/ +* Official admin documentation: https://docs.moodle.org/311/en/Main_page +* Upstream app code repository: https://github.com/moodle/moodle +* YunoHost documentation for this app: https://yunohost.org/app_moodle +* Report a bug: https://github.com/YunoHost-Apps/moodle_ynh/issues ## Developer info @@ -60,3 +56,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/moodle_ynh/tree/testi or sudo yunohost app upgrade moodle -u https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md index 5d8f724..9b5a6bf 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,32 +3,30 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) ![](https://ci-apps.yunohost.org/ci/badges/moodle.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/moodle.maintain.svg) [![Installer Moodle avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=moodle) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer Moodle rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) pour apprendre comment l'installer.* +> *Ce package vous permet d'installer Moodle rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* ## Vue d'ensemble -[Moodle](https://moodle.org) est une plateforme d'apprentissage conçue pour fournir aux enseignants, aux administrateurs et aux apprenants un système unique robuste, sécurisé et intégré pour créer des environnements d'apprentissage personnalisés. Moodle est largement utilisé dans le monde entier par les universités, les écoles, les entreprises et toutes sortes d'organisations et d'individus. -**Version incluse :** 3.10.4 +Plateforme d'apprentissage en ligne + +**Version incluse :** 3.11.0~ynh1 + +**Démo :** https://sandbox.moodledemo.net/ ## Captures d'écran -![](https://upload.wikimedia.org/wikipedia/commons/3/36/Moodle_2.0_on_Firefox_4.0.png) +![](./doc/screenshots/Moodle_2.0_on_Firefox_4.0.png) -## Démo - -* [Démo officielle](https://sandbox.moodledemo.net/) +## Avertissements / informations importantes ## Configuration * Comment configurer cette application : via le panneau d'administration. -## Documentation - -* Documentation officielle : https://docs.moodle.org/3x/fr/Accueil - ## Caractéristiques spécifiques YunoHost #### Support multi-utilisateur @@ -36,19 +34,13 @@ Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/install) * L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** * L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** -#### Architectures supportées +## Documentations et ressources -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) - -## Liens - - * Signaler un bug :https://github.com/YunoHost-Apps/moodle_ynh/issues - * Site de l'application : https://moodle.org/ - * Dépôt de l'application principale : http://git.moodle.org/ - https://github.com/moodle/moodle - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://moodle.org/ +* Documentation officielle de l'admin : https://docs.moodle.org/311/en/Main_page +* Dépôt de code officiel de l'app : https://github.com/moodle/moodle +* Documentation YunoHost pour cette app : https://yunohost.org/app_moodle +* Signaler un bug : https://github.com/YunoHost-Apps/moodle_ynh/issues ## Informations pour les développeurs @@ -60,3 +52,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/moodle_ynh/tree/testi ou sudo yunohost app upgrade moodle -u https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index d917c00..eb56b1d 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.10.4.zip -SOURCE_SUM=00b6020496e4a7d7d107bbb398d56425c2ba57188bf16756f0480ac973229c33 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.0.zip +SOURCE_SUM=03f878da9f4aeb10c0222d5f9addce7f6c64b216881221bcbac2fec8e34bde5a SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..1e932a1 --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,10 @@ +## Configuration + +How to configure this app: by an admin panel. + +## YunoHost specific features + +#### Multi-user support + +* Are LDAP and HTTP auth supported? **Yes** +* Can the app be used by multiple users? **Yes** diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..a1befe8 --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,10 @@ +## Configuration + +* Comment configurer cette application : via le panneau d'administration. + +## Caractéristiques spécifiques YunoHost + +#### Support multi-utilisateur + +* L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** +* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** diff --git a/doc/screenshots/Moodle_2.0_on_Firefox_4.0.png b/doc/screenshots/Moodle_2.0_on_Firefox_4.0.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8e6ae44724ac799e78e99b5ba460b93b420d57 GIT binary patch literal 310823 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

j|BE`aC?ik~L#~Rvw^1GYJz9^Q$a}1A}4eBhJ!~ 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%0AthV>tq>)fj%0!)|P~EzK<5N6IOQ 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

1b-`BE*69nmCW{%+{1D_8XQ3 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 1524f4c..d54ce1e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,15 +6,22 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.10.4~ynh1", + "version": "3.11.0~ynh1", "url": "https://moodle.org/", + "upstream": { + "license": "GPL-3.0-or-later", + "website": "https://moodle.org/", + "demo": "https://sandbox.moodledemo.net/", + "admindoc": "https://docs.moodle.org/311/en/Main_page", + "code": "https://github.com/moodle/moodle" + }, "license": "GPL-3.0-or-later", "maintainer": { "name": "Anmol Sharma", "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.2.0" + "yunohost": ">= 4.2.4" }, "multi_instance": true, "services": [ diff --git a/scripts/install b/scripts/install index 32e06ad..973538d 100644 --- a/scripts/install +++ b/scripts/install @@ -92,6 +92,10 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -115,9 +119,8 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # SECURE FILES AND DIRECTORIES #================================================= -chown -R $app: "$final_path" mkdir -p $data_path -chown -R $app: $data_path +chown -R $app:www-data "$data_path" #================================================= # SETUP APPLICATION @@ -156,17 +159,6 @@ ynh_script_progression --message="Adding cron job..." --weight=2 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." --weight=1 - -# Set permissions to app files -chown -R $app: $data_path -chown -R $app: $final_path - #================================================= # SETUP SSOWAT #================================================= diff --git a/scripts/restore b/scripts/restore index b5b8eae..2b70759 100644 --- a/scripts/restore +++ b/scripts/restore @@ -67,16 +67,13 @@ ynh_script_progression --message="Restoring Moodle main directory..." --weight=1 ynh_restore_file --origin_path=$final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + ynh_restore_file --origin_path=$data_path -#================================================= -# RESTORE USER RIGHTS -#================================================= -ynh_script_progression --message="Restoring user rights..." - -# Restore permissions on app files -chown -R $app: "$final_path" -chown -R $app: $data_path +chown -R $app:www-data $data_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index 3c70089..b517364 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -79,9 +79,13 @@ then ynh_script_progression --message="Upgrading source files..." --weight=6 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/admin/cli/upgrade.php" fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -106,20 +110,6 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -#================================================= -# SPECIFIC UPGRADE -#================================================= -# UPGRADING THE APPLICATION -#================================================= -ynh_script_progression --message="Upgrading the application..." --weight=1 - -ynh_backup_if_checksum_is_different --file="$final_path/config.php" - -ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive - -# Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum --file="$final_path/config.php" - #================================================= # ACTIVATE LDAP SUPPORT #================================================= @@ -155,8 +145,7 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" ynh_script_progression --message="Securing files and directories..." --weight=1 # Set permissions on app files -chown -R $app: $data_path -chown -R $app: $final_path +chown -R $app:www-data $data_path #================================================= # RELOAD NGINX From 947ca7126f1e3202955489d9b51e04a41b5c23d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 17 Jun 2021 23:15:52 +0200 Subject: [PATCH 29/83] Fix (#47) --- scripts/backup | 2 +- scripts/install | 2 +- scripts/restore | 6 +++--- scripts/upgrade | 10 +--------- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/scripts/backup b/scripts/backup index 6afafdf..09f8c44 100644 --- a/scripts/backup +++ b/scripts/backup @@ -40,7 +40,7 @@ ynh_print_info --message="Declaring files to be backed up..." ynh_backup --src_path="$final_path" -ynh_backup --src_path="$data_path" +ynh_backup --src_path="$data_path" --is_big #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/install b/scripts/install index 973538d..325ba44 100644 --- a/scripts/install +++ b/scripts/install @@ -120,7 +120,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= mkdir -p $data_path -chown -R $app:www-data "$data_path" +chown -R $app:www-data $data_path #================================================= # SETUP APPLICATION diff --git a/scripts/restore b/scripts/restore index 2b70759..bdb931e 100644 --- a/scripts/restore +++ b/scripts/restore @@ -67,12 +67,12 @@ ynh_script_progression --message="Restoring Moodle main directory..." --weight=1 ynh_restore_file --origin_path=$final_path +ynh_restore_file --origin_path=$data_path --not_mandatory + +# Restore permissions on app files chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" - -ynh_restore_file --origin_path=$data_path - chown -R $app:www-data $data_path #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index b517364..8d561e4 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -137,15 +137,7 @@ ynh_script_progression --message="Adding cron job..." --weight=4 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= -ynh_script_progression --message="Securing files and directories..." --weight=1 - -# Set permissions on app files -chown -R $app:www-data $data_path +chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX From 966b0a1a3375d343d89bde779a829a617c4e6742 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 18 Jun 2021 08:54:41 +0200 Subject: [PATCH 30/83] Update upgrade --- scripts/upgrade | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 8d561e4..d3a497c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,6 +110,18 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +#================================================= +# UPGRADING THE APPLICATION +#================================================= +ynh_script_progression --message="Upgrading the application..." --weight=1 + +ynh_backup_if_checksum_is_different --file="$final_path/config.php" + +exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive + +# Recalculate and store the checksum of the file for the next upgrade. +ynh_store_file_checksum --file="$final_path/config.php" + #================================================= # ACTIVATE LDAP SUPPORT #================================================= From ad366f674195e6fba7f978ccae72904e48de07d5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 18 Jun 2021 08:56:04 +0200 Subject: [PATCH 31/83] Update upgrade --- scripts/upgrade | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index d3a497c..8f892f3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -78,8 +78,11 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=6 + # Remove the app directory securely + ynh_secure_remove --file="$final_path" + # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" --keep="$final_path/admin/cli/upgrade.php" + ynh_setup_source --dest_dir="$final_path" fi chmod 750 "$final_path" From c2c725c522ed955219911165b8d63817d7268266 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 18 Jun 2021 14:06:06 +0200 Subject: [PATCH 32/83] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8f892f3..46eaacc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -120,7 +120,7 @@ ynh_script_progression --message="Upgrading the application..." --weight=1 ynh_backup_if_checksum_is_different --file="$final_path/config.php" -exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive +ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/config.php" From 6ba0052c7d6d56d3ab82be29889e40a1c40656fc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 19 Jun 2021 09:01:57 +0200 Subject: [PATCH 33/83] Update upgrade --- scripts/upgrade | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 46eaacc..a47efdc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -78,11 +78,23 @@ if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=6 +# Create a temporary directory + tmpdir="$(mktemp -d)" + + # Backup the config file in the temp dir + cp -a "$final_path/config.php" "$tmpdir/config.php" + # Remove the app directory securely ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" + + # Copy the admin saved settings from tmp directory to final path + cp -a "$tmpdir/config.php" "$final_path/config.php" + + # Remove the tmp directory securely + ynh_secure_remove --file="$tmpdir" fi chmod 750 "$final_path" @@ -116,14 +128,14 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # UPGRADING THE APPLICATION #================================================= -ynh_script_progression --message="Upgrading the application..." --weight=1 +# ynh_script_progression --message="Upgrading the application..." --weight=1 -ynh_backup_if_checksum_is_different --file="$final_path/config.php" +# ynh_backup_if_checksum_is_different --file="$final_path/config.php" -ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive +# ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive -# Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum --file="$final_path/config.php" +# # Recalculate and store the checksum of the file for the next upgrade. +# ynh_store_file_checksum --file="$final_path/config.php" #================================================= # ACTIVATE LDAP SUPPORT From 804e3db9da2a774eb3fb0f64cc739a1efec40997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 19 Jun 2021 16:50:42 +0200 Subject: [PATCH 34/83] Update doc/DISCLAIMER_fr.md Co-authored-by: Alexandre Aubin --- doc/DISCLAIMER_fr.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index a1befe8..f8b8e3b 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -1,10 +1 @@ -## Configuration - -* Comment configurer cette application : via le panneau d'administration. - -## Caractéristiques spécifiques YunoHost - -#### Support multi-utilisateur - -* L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** -* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** +- Cette app est intégrée avec le LDAP / SSO de Yunohost From d0af22c6d0bdeda5f6f19e963d912be41ff9318c Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 19 Jun 2021 14:50:44 +0000 Subject: [PATCH 35/83] Auto-update README --- README_fr.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/README_fr.md b/README_fr.md index 9b5a6bf..9cc2494 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,16 +23,7 @@ Plateforme d'apprentissage en ligne ## Avertissements / informations importantes -## Configuration - -* Comment configurer cette application : via le panneau d'administration. - -## Caractéristiques spécifiques YunoHost - -#### Support multi-utilisateur - -* L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** -* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** +- Cette app est intégrée avec le LDAP / SSO de Yunohost ## Documentations et ressources From 0e7a81a533d8a527f4a96e842bc618a854aac342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 29 Jun 2021 19:07:49 +0200 Subject: [PATCH 36/83] apply exemple for data dir (#48) * Update install --- scripts/backup | 2 +- scripts/install | 20 ++++++++++++-------- scripts/remove | 5 +---- scripts/restore | 28 ++++++++++++++++++---------- scripts/upgrade | 4 +++- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/scripts/backup b/scripts/backup index 09f8c44..6229a5b 100644 --- a/scripts/backup +++ b/scripts/backup @@ -73,4 +73,4 @@ ynh_psql_dump_db --database="$db_name" > db.sql # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for Moodle. (YunoHost will then actually copy those files to the archive)." +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index 325ba44..1da150a 100644 --- a/scripts/install +++ b/scripts/install @@ -36,8 +36,6 @@ ynh_script_progression --message="Validating installation parameters..." --weigh final_path=/var/www/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -data_path=/home/yunohost.app/$app -test ! -e "$data_path" || ynh_die --message="This path already contains a folder" # Register (book) web path ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url @@ -50,7 +48,6 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin -ynh_app_setting_set --app=$app --key=data_path --value=$data_path #================================================= # STANDARD MODIFICATIONS @@ -114,13 +111,18 @@ ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= -# SPECIFIC SETUP -#================================================= -# SECURE FILES AND DIRECTORIES +# CREATE DATA DIRECTORY #================================================= +ynh_script_progression --message="Creating a data directory..." --weight=1 + +data_path=/home/yunohost.app/$app +ynh_app_setting_set --app=$app --key=data_path --value=$data_path mkdir -p $data_path -chown -R $app:www-data $data_path + +chmod 750 "$data_path" +chmod -R o-rwx "$data_path" +chown -R $app:www-data "$data_path" #================================================= # SETUP APPLICATION @@ -158,6 +160,8 @@ ynh_exec_as $app php$phpversion "$final_path/admin/cli/purge_caches.php" ynh_script_progression --message="Adding cron job..." --weight=2 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # SETUP SSOWAT @@ -181,4 +185,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of Moodle completed" --last +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index 81e2e53..2c7cc30 100644 --- a/scripts/remove +++ b/scripts/remove @@ -74,9 +74,6 @@ ynh_script_progression --message="Removing various files..." --weight=2 # Remove a cron file ynh_secure_remove --file="/etc/cron.d/$app" -# Remove a directory securely -ynh_secure_remove --file="$data_path" - #================================================= # GENERIC FINALIZATION #================================================= @@ -91,4 +88,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of Moodle completed" --last +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index bdb931e..9d1d15d 100644 --- a/scripts/restore +++ b/scripts/restore @@ -36,12 +36,10 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain="$domain" --path_url="$path_url" \ +ynh_webpath_available --domain=$domain --path_url=$path_url \ || ynh_die --message="Path not available: ${domain}${path_url}" -test ! -d "$final_path" \ +test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " -test ! -d "$data_path" \ - || ynh_die --message="There is already a directory: $data_path " #================================================= # STANDARD RESTORATION STEPS @@ -63,17 +61,27 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring Moodle main directory..." --weight=1 +ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path=$final_path - -ynh_restore_file --origin_path=$data_path --not_mandatory +ynh_restore_file --origin_path="$final_path" # Restore permissions on app files chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -chown -R $app:www-data $data_path + +#================================================= +# RESTORE THE DATA DIRECTORY +#================================================= +ynh_script_progression --message="Restoring the data directory..." --weight=1 + +ynh_restore_file --origin_path="$data_path" --not_mandatory + +mkdir -p $data_path + +chmod 750 "$data_path" +chmod -R o-rwx "$data_path" +chown -R $app:www-data "$data_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION @@ -127,4 +135,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for Moodle" --last +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index a47efdc..8526cc8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -163,6 +163,8 @@ ynh_exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" ynh_script_progression --message="Adding cron job..." --weight=4 ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" chown -R $app:www-data "$final_path" @@ -177,4 +179,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of Moodle completed" --last +ynh_script_progression --message="Upgrade of $app completed" --last From 881c809af80cd64ef4b0f5ba6d9c6c9190256a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 18 Jul 2021 09:08:30 +0200 Subject: [PATCH 37/83] 3.11.1 (#50) * 3.11.1 --- conf/app.src | 4 ++-- conf/php-fpm.conf | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index eb56b1d..75751b0 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.0.zip -SOURCE_SUM=03f878da9f4aeb10c0222d5f9addce7f6c64b216881221bcbac2fec8e34bde5a +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.1.zip +SOURCE_SUM=571f1a59ae6af515932618ba757e98aeae7b9d2c5b10931f9b5296b24b222dfe SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 77b381e..2b6ffa2 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -421,10 +421,12 @@ chdir = __FINALPATH__ ; Common values to change to increase file upload limit php_admin_value[upload_max_filesize] = 1G php_admin_value[post_max_size] = 1G +php_admin_value[max_input_vars] = 1G +php_value[max_input_vars] = 1G ; php_admin_flag[mail.add_x_header] = Off ; Other common parameters ; php_admin_value[max_execution_time] = 600 ; php_admin_value[max_input_time] = 300 ; php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On \ No newline at end of file +; php_admin_flag[short_open_tag] = On From 214ccd277c44ec1c93947ef31ef0f5737aecd4b6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 18 Jul 2021 11:06:47 +0200 Subject: [PATCH 38/83] Update php-fpm.conf --- conf/php-fpm.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 2b6ffa2..84db00f 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -421,7 +421,6 @@ chdir = __FINALPATH__ ; Common values to change to increase file upload limit php_admin_value[upload_max_filesize] = 1G php_admin_value[post_max_size] = 1G -php_admin_value[max_input_vars] = 1G php_value[max_input_vars] = 1G ; php_admin_flag[mail.add_x_header] = Off From 50756fe400e3102b7d707a2852f33b649a6d2385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 30 Jul 2021 10:43:25 +0200 Subject: [PATCH 39/83] 3.11.2 (#51) * 3.11.2 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a3e5e44..3d118bc 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 3.11.0~ynh1 +**Shipped version:** 3.11.2~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index 9cc2494..e4c9a51 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 3.11.0~ynh1 +**Version incluse :** 3.11.2~ynh1 **Démo :** https://sandbox.moodledemo.net/ diff --git a/conf/app.src b/conf/app.src index 75751b0..734f5be 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.1.zip -SOURCE_SUM=571f1a59ae6af515932618ba757e98aeae7b9d2c5b10931f9b5296b24b222dfe +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.2.zip +SOURCE_SUM=b4ad9b8243ce55fc28d592dd43d734bf7949b6a10e8b936e2a85644c087012f8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index d54ce1e..74ccb14 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.11.0~ynh1", + "version": "3.11.2~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", From 802b2922854663b17389911be55ebd3a1892f85b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 30 Jul 2021 13:44:46 +0200 Subject: [PATCH 40/83] Update php-fpm.conf --- conf/php-fpm.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 84db00f..49f8800 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -421,7 +421,7 @@ chdir = __FINALPATH__ ; Common values to change to increase file upload limit php_admin_value[upload_max_filesize] = 1G php_admin_value[post_max_size] = 1G -php_value[max_input_vars] = 1G +php_value[max_input_vars] = 5000 ; php_admin_flag[mail.add_x_header] = Off ; Other common parameters From 7cefa74aa29fd73987c2f048b1752d186e88e9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Aug 2021 15:46:31 +0200 Subject: [PATCH 41/83] Add config file (#54) * Update upgrade --- check_process | 13 +- conf/config-dist.php | 1157 ++++++++++++++++++++++++++++++++++++++++++ conf/cron | 2 +- manifest.json | 22 +- scripts/change_url | 114 +++++ scripts/install | 18 +- scripts/restore | 2 + scripts/upgrade | 106 ++-- 8 files changed, 1374 insertions(+), 60 deletions(-) create mode 100644 conf/config-dist.php create mode 100644 scripts/change_url diff --git a/check_process b/check_process index 671162b..9f6d87f 100644 --- a/check_process +++ b/check_process @@ -3,6 +3,8 @@ domain="domain.tld" path="/path" admin="john" + language="fr" + site_name="Moodle" is_public=1 ; Checks pkg_linter=1 @@ -12,14 +14,15 @@ setup_private=1 setup_public=1 upgrade=1 - # 3.10.2~ynh1 - upgrade=1 from_commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 + # 3.11.1~ynh1 + upgrade=1 from_commit=b2abcd9cefa16e5c5e0e6963a92ebc961be12d1a backup_restore=1 multi_instance=1 - change_url=0 + change_url=1 ;;; Options Email= Notification=none ;;; Upgrade options - ; commit=499ac857a9e80bbf56c93e448086e84e09e97ac6 - name=3.10.2~ynh1 \ No newline at end of file + ; commit=b2abcd9cefa16e5c5e0e6963a92ebc961be12d1a + name=3.11.1~ynh1 + \ No newline at end of file diff --git a/conf/config-dist.php b/conf/config-dist.php new file mode 100644 index 0000000..30df842 --- /dev/null +++ b/conf/config-dist.php @@ -0,0 +1,1157 @@ +dbtype = 'pgsql'; // 'pgsql', 'mariadb', 'mysqli', 'auroramysql', 'sqlsrv' or 'oci' +$CFG->dblibrary = 'native'; // 'native' only at the moment +$CFG->dbhost = 'localhost'; // eg 'localhost' or 'db.isp.com' or IP +$CFG->dbname = '__DB_NAME__';// database name, eg moodle +$CFG->dbuser = '__DB_NAME__';// your database username +$CFG->dbpass = '__DB_PWD__'; // your database password +$CFG->prefix = 'mdl_'; // prefix to use for all table names +$CFG->dboptions = array( + 'dbpersist' => false, // should persistent database connections be + // used? set to 'false' for the most stable + // setting, 'true' can improve performance + // sometimes + 'dbsocket' => false, // should connection via UNIX socket be used? + // if you set it to 'true' or custom path + // here set dbhost to 'localhost', + // (please note mysql is always using socket + // if dbhost is 'localhost' - if you need + // local port connection use '127.0.0.1') + 'dbport' => '', // the TCP port number to use when connecting + // to the server. keep empty string for the + // default port + 'dbhandlesoptions' => false,// On PostgreSQL poolers like pgbouncer don't + // support advanced options on connection. + // If you set those in the database then + // the advanced settings will not be sent. + 'dbcollation' => 'utf8mb4_unicode_ci', // MySQL has partial and full UTF-8 + // support. If you wish to use partial UTF-8 + // (three bytes) then set this option to + // 'utf8_unicode_ci', otherwise this option + // can be removed for MySQL (by default it will + // use 'utf8mb4_unicode_ci'. This option should + // be removed for all other databases. + // 'fetchbuffersize' => 100000, // On PostgreSQL, this option sets a limit + // on the number of rows that are fetched into + // memory when doing a large recordset query + // (e.g. search indexing). Default is 100000. + // Uncomment and set to a value to change it, + // or zero to turn off the limit. You need to + // set to zero if you are using pg_bouncer in + // 'transaction' mode (it is fine in 'session' + // mode). + /* + 'connecttimeout' => null, // Set connect timeout in seconds. Not all drivers support it. + 'readonly' => [ // Set to read-only slave details, to get safe reads + // from there instead of the master node. Optional. + // Currently supported by pgsql and mysqli variety classes. + // If not supported silently ignored. + 'instance' => [ // Readonly slave connection parameters + [ + 'dbhost' => 'slave.dbhost', + 'dbport' => '', // Defaults to master port + 'dbuser' => '', // Defaults to master user + 'dbpass' => '', // Defaults to master password + ], + [...], + ], + + Instance(s) can alternatively be specified as: + + 'instance' => 'slave.dbhost', + 'instance' => ['slave.dbhost1', 'slave.dbhost2'], + 'instance' => ['dbhost' => 'slave.dbhost', 'dbport' => '', 'dbuser' => '', 'dbpass' => ''], + + 'connecttimeout' => 2, // Set read-only slave connect timeout in seconds. See above. + 'latency' => 0.5, // Set read-only slave sync latency in seconds. + // When 'latency' seconds have lapsed after an update to a table + // it is deemed safe to use readonly slave for reading from the table. + // It is optional. If omitted once written to a table it will always + // use master handle for reading. + // Lower values increase the performance, but setting it too low means + // missing the master-slave sync. + 'exclude_tables' => [ // Tables to exclude from read-only slave feature. + 'table1', // Should not be used, unless in rare cases when some area of the system + 'table2', // is malfunctioning and you still want to use readonly feature. + ], // Then one can exclude offending tables while investigating. + + More info available in lib/dml/moodle_read_slave_trait.php where the feature is implemented. + ] + */ +// For all database config settings see https://docs.moodle.org/en/Database_settings +); + + +//========================================================================= +// 2. WEB SITE LOCATION +//========================================================================= +// Now you need to tell Moodle where it is located. Specify the full +// web address to where moodle has been installed. If your web site +// is accessible via multiple URLs then choose the most natural one +// that your students would use. Do not include a trailing slash +// +// If you need both intranet and Internet access please read +// http://docs.moodle.org/en/masquerading + +$CFG->wwwroot = 'https://__DOMAIN____PATH__'; + + +//========================================================================= +// 3. DATA FILES LOCATION +//========================================================================= +// Now you need a place where Moodle can save uploaded files. This +// directory should be readable AND WRITEABLE by the web server user +// (usually 'nobody' or 'apache'), but it should not be accessible +// directly via the web. +// +// - On hosting systems you might need to make sure that your "group" has +// no permissions at all, but that "others" have full permissions. +// +// - On Windows systems you might specify something like 'c:\moodledata' + +$CFG->dataroot = '__DATA_PATH__'; + + +//========================================================================= +// 4. DATA FILES PERMISSIONS +//========================================================================= +// The following parameter sets the permissions of new directories +// created by Moodle within the data directory. The format is in +// octal format (as used by the Unix utility chmod, for example). +// The default is usually OK, but you may want to change it to 0750 +// if you are concerned about world-access to the files (you will need +// to make sure the web server process (eg Apache) can access the files. +// NOTE: the prefixed 0 is important, and don't use quotes. + +$CFG->directorypermissions = 02777; + + +//========================================================================= +// 5. DIRECTORY LOCATION (most people can just ignore this setting) +//========================================================================= +// A very few webhosts use /admin as a special URL for you to access a +// control panel or something. Unfortunately this conflicts with the +// standard location for the Moodle admin pages. You can work around this +// by renaming the admin directory in your installation, and putting that +// new name here. eg "moodleadmin". This should fix all admin links in Moodle. +// After any change you need to visit your new admin directory +// and purge all caches. + +$CFG->admin = 'admin'; + + +//========================================================================= +// 6. OTHER MISCELLANEOUS SETTINGS (ignore these for new installations) +//========================================================================= +// +// These are additional tweaks for which no GUI exists in Moodle yet. +// +// Starting in PHP 5.3 administrators should specify default timezone +// in PHP.ini, you can also specify it here if needed. +// See details at: http://php.net/manual/en/function.date-default-timezone-set.php +// List of time zones at: http://php.net/manual/en/timezones.php +// date_default_timezone_set('Australia/Perth'); +// +// Change the key pair lifetime for Moodle Networking +// The default is 28 days. You would only want to change this if the key +// was not getting regenerated for any reason. You would probably want +// make it much longer. Note that you'll need to delete and manually update +// any existing key. +// $CFG->mnetkeylifetime = 28; +// +// Not recommended: Set the following to true to allow the use +// off non-Moodle standard characters in usernames. +// $CFG->extendedusernamechars = true; +// +// Allow user passwords to be included in backup files. Very dangerous +// setting as far as it publishes password hashes that can be unencrypted +// if the backup file is publicy available. Use it only if you can guarantee +// that all your backup files remain only privacy available and are never +// shared out from your site/institution! +// $CFG->includeuserpasswordsinbackup = true; +// +// Completely disable user creation when restoring a course, bypassing any +// permissions granted via roles and capabilities. Enabling this setting +// results in the restore process stopping when a user attempts to restore a +// course requiring users to be created. +// $CFG->disableusercreationonrestore = true; +// +// Keep the temporary directories used by backup and restore without being +// deleted at the end of the process. Use it if you want to debug / view +// all the information stored there after the process has ended. Note that +// those directories may be deleted (after some ttl) both by cron and / or +// by new backup / restore invocations. +// $CFG->keeptempdirectoriesonbackup = true; +// +// Modify the restore process in order to force the "user checks" to assume +// that the backup originated from a different site, so detection of matching +// users is performed with different (more "relaxed") rules. Note that this is +// only useful if the backup file has been created using Moodle < 1.9.4 and the +// site has been rebuilt from scratch using backup files (not the best way btw). +// If you obtain user conflicts on restore, rather than enabling this setting +// permanently, try restoring the backup on a different site, back it up again +// and then restore on the target server. +// $CFG->forcedifferentsitecheckingusersonrestore = true; +// +// Force the backup system to continue to create backups in the legacy zip +// format instead of the new tgz format. Does not affect restore, which +// auto-detects the underlying file format. +// $CFG->usezipbackups = true; +// +// Prevent stats processing and hide the GUI +// $CFG->disablestatsprocessing = true; +// +// Setting this to true will enable admins to edit any post at any time +// $CFG->admineditalways = true; +// +// These variables define DEFAULT block variables for new courses +// If this one is set it overrides all others and is the only one used. +// $CFG->defaultblocks_override = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; +// +// These variables define the specific settings for defined course formats. +// They override any settings defined in the formats own config file. +// $CFG->defaultblocks_site = 'site_main_menu,course_list:course_summary,calendar_month'; +// $CFG->defaultblocks_social = 'search_forums,calendar_month,calendar_upcoming,social_activities,recent_activity,course_list'; +// $CFG->defaultblocks_topics = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; +// $CFG->defaultblocks_weeks = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; +// +// These blocks are used when no other default setting is found. +// $CFG->defaultblocks = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; +// +// You can specify a different class to be created for the $PAGE global, and to +// compute which blocks appear on each page. However, I cannot think of any good +// reason why you would need to change that. It just felt wrong to hard-code the +// the class name. You are strongly advised not to use these to settings unless +// you are absolutely sure you know what you are doing. +// $CFG->moodlepageclass = 'moodle_page'; +// $CFG->moodlepageclassfile = "$CFG->dirroot/local/myplugin/mypageclass.php"; +// $CFG->blockmanagerclass = 'block_manager'; +// $CFG->blockmanagerclassfile = "$CFG->dirroot/local/myplugin/myblockamanagerclass.php"; +// +// Seconds for files to remain in caches. Decrease this if you are worried +// about students being served outdated versions of uploaded files. +// $CFG->filelifetime = 60*60*6; +// +// Some web servers can offload the file serving from PHP process, +// comment out one the following options to enable it in Moodle: +// $CFG->xsendfile = 'X-Sendfile'; // Apache {@see https://tn123.org/mod_xsendfile/} +// $CFG->xsendfile = 'X-LIGHTTPD-send-file'; // Lighttpd {@see http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file} +// $CFG->xsendfile = 'X-Accel-Redirect'; // Nginx {@see http://wiki.nginx.org/XSendfile} +// If your X-Sendfile implementation (usually Nginx) uses directory aliases specify them +// in the following array setting: +// $CFG->xsendfilealiases = array( +// '/dataroot/' => $CFG->dataroot, +// '/cachedir/' => '/var/www/moodle/cache', // for custom $CFG->cachedir locations +// '/localcachedir/' => '/var/local/cache', // for custom $CFG->localcachedir locations +// '/tempdir/' => '/var/www/moodle/temp', // for custom $CFG->tempdir locations +// '/filedir' => '/var/www/moodle/filedir', // for custom $CFG->filedir locations +// ); +// +// YUI caching may be sometimes improved by slasharguments: +// $CFG->yuislasharguments = 1; +// Some servers may need a special rewrite rule to work around internal path length limitations: +// RewriteRule (^.*/theme/yui_combo\.php)(/.*) $1?file=$2 +// +// +// Following settings may be used to select session driver, uncomment only one of the handlers. +// Database session handler (not compatible with MyISAM): +// $CFG->session_handler_class = '\core\session\database'; +// $CFG->session_database_acquire_lock_timeout = 120; +// +// File session handler (file system locking required): +// $CFG->session_handler_class = '\core\session\file'; +// $CFG->session_file_save_path = $CFG->dataroot.'/sessions'; +// +// Memcached session handler (requires memcached server and extension): +// $CFG->session_handler_class = '\core\session\memcached'; +// $CFG->session_memcached_save_path = '127.0.0.1:11211'; +// $CFG->session_memcached_prefix = 'memc.sess.key.'; +// $CFG->session_memcached_acquire_lock_timeout = 120; +// $CFG->session_memcached_lock_expire = 7200; // Ignored if PECL memcached is below version 2.2.0 +// $CFG->session_memcached_lock_retry_sleep = 150; // Spin-lock retry sleeptime (msec). Only effective +// // for tuning php-memcached 3.0.x (PHP 7) +// +// Redis session handler (requires redis server and redis extension): +// $CFG->session_handler_class = '\core\session\redis'; +// $CFG->session_redis_host = '127.0.0.1'; +// $CFG->session_redis_port = 6379; // Optional. +// $CFG->session_redis_database = 0; // Optional, default is db 0. +// $CFG->session_redis_auth = ''; // Optional, default is don't set one. +// $CFG->session_redis_prefix = ''; // Optional, default is don't set one. +// $CFG->session_redis_acquire_lock_timeout = 120; +// $CFG->session_redis_lock_expire = 7200; +// $CFG->session_redis_lock_retry = 100; // Optional wait between lock attempts in ms, default is 100. +// // After 5 seconds it will throttle down to once per second. +// Use the igbinary serializer instead of the php default one. Note that phpredis must be compiled with +// igbinary support to make the setting to work. Also, if you change the serializer you have to flush the database! +// $CFG->session_redis_serializer_use_igbinary = false; // Optional, default is PHP builtin serializer. +// $CFG->session_redis_compressor = 'none'; // Optional, possible values are: +// // 'gzip' - PHP GZip compression +// // 'zstd' - PHP Zstandard compression +// +// Please be aware that when selecting Memcached for sessions that it is advised to use a dedicated +// memcache server. The memcached extension does not provide isolated environments for individual uses. +// Using the same server for other purposes (MUC for example) can lead to sessions being prematurely removed should +// the other uses of the server purge the cache. +// +// Following setting allows you to alter how frequently is timemodified updated in sessions table. +// $CFG->session_update_timemodified_frequency = 20; // In seconds. +// +// If this setting is set to true, then Moodle will track the IP of the +// current user to make sure it hasn't changed during a session. This +// will prevent the possibility of sessions being hijacked via XSS, but it +// may break things for users coming using proxies that change all the time, +// like AOL. +// $CFG->tracksessionip = true; +// +// The following lines are for handling email bounces. +// $CFG->handlebounces = true; +// $CFG->minbounces = 10; +// $CFG->bounceratio = .20; +// The next lines are needed both for bounce handling and any other email to module processing. +// mailprefix must be EXACTLY four characters. +// Uncomment and customise this block for Postfix +// $CFG->mailprefix = 'mdl+'; // + is the separator for Exim and Postfix. +// $CFG->mailprefix = 'mdl-'; // - is the separator for qmail +// $CFG->maildomain = 'youremaildomain.com'; +// +// Enable when setting up advanced reverse proxy load balancing configurations, +// it may be also necessary to enable this when using port forwarding. +// $CFG->reverseproxy = true; +// +// Enable when using external SSL appliance for performance reasons. +// Please note that site may be accessible via http: or https:, but not both! +// $CFG->sslproxy = true; +// +// This setting will cause the userdate() function not to fix %d in +// date strings, and just let them show with a zero prefix. +// $CFG->nofixday = true; +// +// This setting will make some graphs (eg user logs) use lines instead of bars +// $CFG->preferlinegraphs = true; +// +// This setting allows you to specify a class to rewrite outgoing urls +// enabling 'clean urls' in conjunction with an apache / nginx handler. +// The handler must implement \core\output\url_rewriter. +// $CFG->urlrewriteclass = '\local_cleanurls\url_rewriter'; +// +// Enabling this will allow custom scripts to replace existing moodle scripts. +// For example: if $CFG->customscripts/course/view.php exists then +// it will be used instead of $CFG->wwwroot/course/view.php +// At present this will only work for files that include config.php and are called +// as part of the url (index.php is implied). +// Some examples are: +// http://my.moodle.site/course/view.php +// http://my.moodle.site/index.php +// http://my.moodle.site/admin (index.php implied) +// Custom scripts should not include config.php +// Warning: Replacing standard moodle scripts may pose security risks and/or may not +// be compatible with upgrades. Use this option only if you are aware of the risks +// involved. +// Specify the full directory path to the custom scripts +// $CFG->customscripts = '/home/example/customscripts'; +// +// Performance profiling +// +// If you set Debug to "Yes" in the Configuration->Variables page some +// performance profiling data will show up on your footer (in default theme). +// With these settings you get more granular control over the capture +// and printout of the data +// +// Capture performance profiling data +// define('MDL_PERF' , true); +// +// Capture additional data from DB +// define('MDL_PERFDB' , true); +// +// Print to log (for passive profiling of production servers) +// define('MDL_PERFTOLOG' , true); +// +// Print to footer (works with the default theme) +// define('MDL_PERFTOFOOT', true); +// +// Enable earlier profiling that causes more code to be covered +// on every request (db connections, config load, other inits...). +// Requires extra configuration to be defined in config.php like: +// profilingincluded, profilingexcluded, profilingautofrec, +// profilingallowme, profilingallowall, profilinglifetime +// $CFG->earlyprofilingenabled = true; +// +// Disable database storage for profile data. +// When using an exernal plugin to store profiling data it is often +// desirable to not store the data in the database. +// +// $CFG->disableprofilingtodatabase = true; +// +// Force displayed usernames +// A little hack to anonymise user names for all students. If you set these +// then all non-teachers will always see these for every person. +// $CFG->forcefirstname = 'Bruce'; +// $CFG->forcelastname = 'Simpson'; +// +// The following setting will turn on username logging into Apache log. For full details regarding setting +// up of this function please refer to the install section of the document. +// $CFG->apacheloguser = 0; // Turn this feature off. Default value. +// $CFG->apacheloguser = 1; // Log user id. +// $CFG->apacheloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. +// $CFG->apacheloguser = 3; // Log username. +// To get the values logged in Apache's log, add to your httpd.conf +// the following statements. In the General part put: +// LogFormat "%h %l %{MOODLEUSER}n %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\"" moodleformat +// And in the part specific to your Moodle install / virtualhost: +// CustomLog "/your/path/to/log" moodleformat +// +// Alternatively for other webservers such as nginx, you can instead have the username sent via a http header +// 'X-MOODLEUSER' which can be saved in the logfile and then stripped out before being sent to the browser: +// $CFG->headerloguser = 0; // Turn this feature off. Default value. +// $CFG->headerloguser = 1; // Log user id. +// $CFG->headerloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. +// $CFG->headerloguser = 3; // Log username. +// +// CAUTION: Use of this option will expose usernames in the Apache / nginx log, +// If you are going to publish your log, or the output of your web stats analyzer +// this will weaken the security of your website. +// +// Email database connection errors to someone. If Moodle cannot connect to the +// database, then email this address with a notice. +// +// $CFG->emailconnectionerrorsto = 'your@emailaddress.com'; +// +// Set the priority of themes from highest to lowest. This is useful (for +// example) in sites where the user theme should override all other theme +// settings for accessibility reasons. You can also disable types of themes +// (other than site) by removing them from the array. The default setting is: +// +// $CFG->themeorder = array('course', 'category', 'session', 'user', 'cohort', 'site'); +// +// NOTE: course, category, session, user, cohort themes still require the +// respective settings to be enabled +// +// It is possible to add extra themes directory stored outside of $CFG->dirroot. +// This local directory does not have to be accessible from internet. +// +// $CFG->themedir = '/location/of/extra/themes'; +// +// It is possible to specify different cache and temp directories, use local fast filesystem +// for normal web servers. Server clusters MUST use shared filesystem for cachedir! +// Localcachedir is intended for server clusters, it does not have to be shared by cluster nodes. +// The directories must not be accessible via web. +// +// $CFG->tempdir = '/var/www/moodle/temp'; // Directory MUST BE SHARED by all cluster nodes. +// $CFG->cachedir = '/var/www/moodle/cache'; // Directory MUST BE SHARED by all cluster nodes, locking required. +// $CFG->localcachedir = '/var/local/cache'; // Intended for local node caching. +// $CFG->localrequestdir = '/tmp'; // Intended for local only temporary files. The defaults uses sys_get_temp_dir(). +// +// It is possible to specify a different backup temp directory, use local fast filesystem +// for normal web servers. Server clusters MUST use shared filesystem for backuptempdir! +// The directory must not be accessible via web. +// +// $CFG->backuptempdir = '/var/www/moodle/backuptemp'; // Directory MUST BE SHARED by all cluster nodes. +// +// Some filesystems such as NFS may not support file locking operations. +// Locking resolves race conditions and is strongly recommended for production servers. +// $CFG->preventfilelocking = false; +// +// Site default language can be set via standard administration interface. If you +// want to have initial error messages for eventual database connection problems +// localized too, you have to set your language code here. +// + $CFG->lang = '__LANGUAGE__'; // for example 'cs' +// +// When Moodle is about to perform an intensive operation it raises PHP's memory +// limit. The following setting should be used on large sites to set the raised +// memory limit to something higher. +// The value for the settings should be a valid PHP memory value. e.g. 512M, 1G +// +// $CFG->extramemorylimit = '1024M'; +// +// Moodle 2.4 introduced a new cache API. +// The cache API stores a configuration file within the Moodle data directory and +// uses that rather than the database in order to function in a stand-alone manner. +// Using altcacheconfigpath you can change the location where this config file is +// looked for. +// It can either be a directory in which to store the file, or the full path to the +// file if you want to take full control. Either way it must be writable by the +// webserver. +// +// $CFG->altcacheconfigpath = '/var/www/shared/moodle.cache.config.php +// +// Use the following flag to completely disable the Available update notifications +// feature and hide it from the server administration UI. +// +// $CFG->disableupdatenotifications = true; +// +// Use the following flag to completely disable the installation of plugins +// (new plugins, available updates and missing dependencies) and related +// features (such as cancelling the plugin installation or upgrade) via the +// server administration web interface. +// +// $CFG->disableupdateautodeploy = true; +// +// Use the following flag to disable the warning on the system notifications page +// about present development libraries. This flag will not disable the warning within +// the security overview report. Use this flag only if you really have prohibited web +// access to the development libraries in your webserver configuration. +// +// $CFG->disabledevlibdirscheck = true; +// +// Use the following flag to disable modifications to scheduled tasks +// whilst still showing the state of tasks. +// +// $CFG->preventscheduledtaskchanges = true; +// +// As of version 2.4 Moodle serves icons as SVG images if the users browser appears +// to support SVG. +// For those wanting to control the serving of SVG images the following setting can +// be defined in your config.php. +// If it is not defined then the default (browser detection) will occur. +// +// To ensure they are always used when available: +// $CFG->svgicons = true; +// +// To ensure they are never used even when available: +// $CFG->svgicons = false; +// +// Some administration options allow setting the path to executable files. This can +// potentially cause a security risk. Set this option to true to disable editing +// those config settings via the web. They will need to be set explicitly in the +// config.php file +// $CFG->preventexecpath = true; +// +// Use the following flag to set userid for noreply user. If not set then moodle will +// create dummy user and use -ve value as user id. +// $CFG->noreplyuserid = -10; +// +// As of version 2.6 Moodle supports admin to set support user. If not set, all mails +// will be sent to supportemail. +// $CFG->supportuserid = -20; +// +// Moodle 2.7 introduces a locking api for critical tasks (e.g. cron). +// The default locking system to use is DB locking for Postgres, MySQL, MariaDB and +// file locking for Oracle and SQLServer. If $CFG->preventfilelocking is set, then the +// default will always be DB locking. It can be manually set to one of the lock +// factory classes listed below, or one of your own custom classes implementing the +// \core\lock\lock_factory interface. +// +// $CFG->lock_factory = "auto"; +// +// The list of available lock factories is: +// +// "\\core\\lock\\file_lock_factory" - File locking +// Uses lock files stored by default in the dataroot. Whether this +// works on clusters depends on the file system used for the dataroot. +// +// "\\core\\lock\\db_record_lock_factory" - DB locking based on table rows. +// +// "\\core\\lock\\mysql_lock_factory" - DB locking based on MySQL / MariaDB locks. +// +// "\\core\\lock\\postgres_lock_factory" - DB locking based on postgres advisory locks. +// +// Settings used by the lock factories +// +// Location for lock files used by the File locking factory. This must exist +// on a shared file system that supports locking. +// $CFG->file_lock_root = $CFG->dataroot . '/lock'; +// +// +// Alternative task logging. +// Since Moodle 3.7 the output of al scheduled and adhoc tasks is stored in the database and it is possible to use an +// alternative task logging mechanism. +// To set the alternative task logging mechanism in config.php you can use the following settings, providing the +// alternative class name that will be auto-loaded. +// +// $CFG->task_log_class = '\\local_mytasklogger\\logger'; +// +// Moodle 2.9 allows administrators to customise the list of supported file types. +// To add a new filetype or override the definition of an existing one, set the +// customfiletypes variable like this: +// +// $CFG->customfiletypes = array( +// (object)array( +// 'extension' => 'frog', +// 'icon' => 'archive', +// 'type' => 'application/frog', +// 'customdescription' => 'Amphibian-related file archive' +// ) +// ); +// +// The extension, icon, and type fields are required. The icon field can refer to +// any icon inside the pix/f folder. You can also set the customdescription field +// (shown above) and (for advanced use) the groups, string, and defaulticon fields. +// +// Upgrade key +// +// If the upgrade key is defined here, then the value must be provided every time +// the site is being upgraded though the web interface, regardless of whether the +// administrator is logged in or not. This prevents anonymous access to the upgrade +// screens where the real authentication and authorization mechanisms can not be +// relied on. +// +// It is strongly recommended to use a value different from your real account +// password. +// +// $CFG->upgradekey = 'put_some_password-like_value_here'; +// +// Document conversion limit +// +// How many times the background task should attempt to convert a given attempt +// before removing it from the queue. Currently this limit is only used by the +// mod_assign conversion task. +// +// $CFG->conversionattemptlimit = 3; +// +// Font used in exported PDF files. When generating a PDF, Moodle embeds a subset of +// the font in the PDF file so it will be readable on the widest range of devices. +// The default font is 'freesans' which is part of the GNU FreeFont collection. +// +// $CFG->pdfexportfont = 'freesans'; +// +// Use the following flag to enable messagingallusers and set the default preference +// value for existing users to allow them to be contacted by other site users. +// +// $CFG->keepmessagingallusersenabled = true; +// +// Disable login token validation for login pages. Login token validation is enabled +// by default unless $CFG->alternateloginurl is set. +// +// $CFG->disablelogintoken = true; +// +// Moodle 3.7+ checks that cron is running frequently. If the time between cron runs +// is greater than this value (in seconds), you get a warning on the admin page. (This +// setting only controls whether or not the warning appears, it has no other effect.) +// +// $CFG->expectedcronfrequency = 200; +// +// Moodle 3.9+ checks how old tasks are in the ad hoc queue and warns at 10 minutes +// and errors at 4 hours. Set these to override these limits: +// +// $CFG->adhoctaskagewarn = 10 * 60; +// $CFG->adhoctaskageerror = 4 * 60 * 60; +// +// Session lock warning threshold. Long running pages should release the session using \core\session\manager::write_close(). +// Set this threshold to any value greater than 0 to add developer warnings when a page locks the session for too long. +// The session should rarely be locked for more than 1 second. The input should be in seconds and may be a float. +// +// $CFG->debugsessionlock = 5; +// +// There are times when a session lock is not required during a request. For a page/service to opt-in whether or not a +// session lock is required this setting must first be set to 'true'. +// This is an experimental issue. The session store can not be in the session, please +// see https://docs.moodle.org/en/Session_handling#Read_only_sessions. +// +// $CFG->enable_read_only_sessions = true; +// +// To help expose all the edge cases bugs a debug mode is available which shows the same +// runtime write during readonly errors without actually turning on the readonly sessions: +// +// $CFG->enable_read_only_sessions_debug = true; +// +// Uninstall plugins from CLI only. This stops admins from uninstalling plugins from the graphical admin +// user interface, and forces plugins to be uninstalled from the Command Line tool only, found at +// admin/cli/plugin_uninstall.php. +// +// $CFG->uninstallclionly = true; +// +// +// Customise question bank display +// +// The display of Moodle's question bank is made up of a number of columns. +// You can customise this display by giving a comma-separated list of column class +// names here. Each class must be a subclass of \core_question\bank\column_base. +// For example you might define a class like +// class \local_qbank_extensions\my_column extends \core_question\bank\column_base +// in a local plugin, then add it to the list here. At the time of writing, +// the default question bank display is equivalent to the following, but you might like +// to check the latest default in question/classes/bank/view.php before setting this. +// +// $CFG->questionbankcolumns = 'checkbox_column,question_type_column,' +// . 'question_name_idnumber_tags_column,edit_menu_column,' +// . 'tags_action_column,edit_action_column,copy_action_column,' +// . 'preview_action_column,delete_action_column,export_xml_action_column,' +// . 'creator_name_column,modifier_name_column'; +// +// Forum summary report +// +// In order for the forum summary report to calculate word count and character count data, those details are now stored +// for each post in the database when posts are created or updated. For posts that existed prior to a Moodle 3.8 upgrade, +// these are calculated by the refresh_forum_post_counts ad-hoc task in chunks of 5000 posts per batch by default. +// That default can be overridden by setting an integer value for $CFG->forumpostcountchunksize. +// +// $CFG->forumpostcountchunksize = 5000; +// +// Course and category sorting +// +// If the number of courses in a category exceeds $CFG->maxcoursesincategory (10000 by default), it may lead to duplicate +// sort orders of courses in separated categories. For example: +// - Category A has the sort order of 10000, and has 10000 courses. The last course will have the sort order of 20000. +// - Category B has the sort order of 20000, and has a course with the sort order of 20001. +// - If we add another course in category A, it will have a sort order of 20001, +// which is the same as the course in category B +// The duplicate will cause sorting issue and hence we need to increase $CFG->maxcoursesincategory +// to fix the duplicate sort order +// Please also make sure $CFG->maxcoursesincategory * MAX_COURSE_CATEGORIES less than max integer. +// +// $CFG->maxcoursesincategory = 10000; +// +// Admin setting encryption +// +// $CFG->secretdataroot = '/var/www/my_secret_folder'; +// +// Location to store encryption keys. By default this is $CFG->dataroot/secret; set this if +// you want to use a different location for increased security (e.g. if too many people have access +// to the main dataroot, or if you want to avoid using shared storage). Your web server user needs +// read access to this location, and write access unless you manually create the keys. +// +// $CFG->nokeygeneration = false; +// +// If you change this to true then the server will give an error if keys don't exist, instead of +// automatically generating them. This is only needed if you want to ensure that keys are consistent +// across a cluster when not using shared storage. If you stop the server generating keys, you will +// need to manually generate them by running 'php admin/cli/generate_key.php'. + +//========================================================================= +// 7. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!! +//========================================================================= +// +// Force a debugging mode regardless the settings in the site administration +// @error_reporting(E_ALL | E_STRICT); // NOT FOR PRODUCTION SERVERS! +// @ini_set('display_errors', '1'); // NOT FOR PRODUCTION SERVERS! +// $CFG->debug = (E_ALL | E_STRICT); // === DEBUG_DEVELOPER - NOT FOR PRODUCTION SERVERS! +// $CFG->debugdisplay = 1; // NOT FOR PRODUCTION SERVERS! +// +// You can specify a comma separated list of user ids that that always see +// debug messages, this overrides the debug flag in $CFG->debug and $CFG->debugdisplay +// for these users only. +// $CFG->debugusers = '2'; +// +// Prevent theme caching +// $CFG->themedesignermode = true; // NOT FOR PRODUCTION SERVERS! +// +// Enable verbose debug information during fetching of email messages from IMAP server. +// $CFG->debugimap = true; +// +// Enable verbose debug information during sending of email messages to SMTP server. +// Note: also requires $CFG->debug set to DEBUG_DEVELOPER. +// $CFG->debugsmtp = true; +// +// Prevent JS caching +// $CFG->cachejs = false; // NOT FOR PRODUCTION SERVERS! +// +// Prevent Template caching +// $CFG->cachetemplates = false; // NOT FOR PRODUCTION SERVERS! +// +// Restrict which YUI logging statements are shown in the browser console. +// For details see the upstream documentation: +// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logInclude +// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logExclude +// $CFG->yuiloginclude = array( +// 'moodle-course-categoryexpander' => true, +// ); +// $CFG->yuilogexclude = array( +// 'moodle-core-notification' => true, +// ); +// +// Set the minimum log level for YUI logging statements. +// For details see the upstream documentation: +// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logLevel +// $CFG->yuiloglevel = 'debug'; +// +// Prevent core_string_manager application caching +// $CFG->langstringcache = false; // NOT FOR PRODUCTION SERVERS! +// +// When working with production data on test servers, no emails or other messages +// should ever be send to real users +// $CFG->noemailever = true; // NOT FOR PRODUCTION SERVERS! +// +// Divert all outgoing emails to this address to test and debug emailing features +// $CFG->divertallemailsto = 'root@localhost.local'; // NOT FOR PRODUCTION SERVERS! +// +// Except for certain email addresses you want to let through for testing. Accepts +// a comma separated list of regexes. +// $CFG->divertallemailsexcept = 'tester@dev.com, fred(\+.*)?@example.com'; // NOT FOR PRODUCTION SERVERS! +// +// Uncomment if you want to allow empty comments when modifying install.xml files. +// $CFG->xmldbdisablecommentchecking = true; // NOT FOR PRODUCTION SERVERS! +// +// Since 2.0 sql queries are not shown during upgrade by default. +// Please note that this setting may produce very long upgrade page on large sites. +// $CFG->upgradeshowsql = true; // NOT FOR PRODUCTION SERVERS! +// +// Add SQL queries to the output of cron, just before their execution +// $CFG->showcronsql = true; +// +// Force developer level debug and add debug info to the output of cron +// $CFG->showcrondebugging = true; +// +// Force result of checks used to determine whether a site is considered "public" or not (such as for site registration). +// $CFG->site_is_public = false; +// +//========================================================================= +// 8. FORCED SETTINGS +//========================================================================= +// It is possible to specify normal admin settings here, the point is that +// they can not be changed through the standard admin settings pages any more. +// +// Core settings are specified directly via assignment to $CFG variable. +// Example: +// $CFG->somecoresetting = 'value'; +// +// Plugin settings have to be put into a special array. +// Example: +// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'secondsetting' => 'othervalue'), +// 'otherplugin' => array('mysetting' => 'myvalue', 'thesetting' => 'thevalue')); +// Module default settings with advanced/locked checkboxes can be set too. To do this, add +// an extra config with '_adv' or '_locked' as a suffix and set the value to true or false. +// Example: +// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'settingname_locked' => true, 'settingname_adv' => true)); +// +//========================================================================= +// 9. PHPUNIT SUPPORT +//========================================================================= +// $CFG->phpunit_prefix = 'phpu_'; +// $CFG->phpunit_dataroot = '/home/example/phpu_moodledata'; +// $CFG->phpunit_directorypermissions = 02777; // optional +// $CFG->phpunit_profilingenabled = true; // optional to profile PHPUnit runs. +// +// +//========================================================================= +// 10. SECRET PASSWORD SALT +//========================================================================= +// A site-wide password salt is no longer used in new installations. +// If upgrading from 2.6 or older, keep all existing salts in config.php file. +// +// $CFG->passwordsaltmain = 'a_very_long_random_string_of_characters#@6&*1'; +// +// You may also have some alternative salts to allow migration from previously +// used salts. +// +// $CFG->passwordsaltalt1 = ''; +// $CFG->passwordsaltalt2 = ''; +// $CFG->passwordsaltalt3 = ''; +// .... +// $CFG->passwordsaltalt19 = ''; +// $CFG->passwordsaltalt20 = ''; +// +// +//========================================================================= +// 11. BEHAT SUPPORT +//========================================================================= +// Behat test site needs a unique www root, data directory and database prefix: +// +// $CFG->behat_wwwroot = 'http://127.0.0.1/moodle'; +// $CFG->behat_prefix = 'bht_'; +// $CFG->behat_dataroot = '/home/example/bht_moodledata'; +// +// You can override default Moodle configuration for Behat and add your own +// params; here you can add more profiles, use different Mink drivers than Selenium... +// These params would be merged with the default Moodle behat.yml, giving priority +// to the ones specified here. The array format is YAML, following the Behat +// params hierarchy. More info: http://docs.behat.org/guides/7.config.html +// Example: +// $CFG->behat_config = array( +// 'Mac-Firefox' => array( +// 'suites' => array ( +// 'default' => array( +// 'filters' => array( +// 'tags' => '~@_file_upload' +// ), +// ), +// ), +// 'extensions' => array( +// 'Behat\MinkExtension' => array( +// 'webddriver' => array( +// 'browser' => 'firefox', +// 'capabilities' => array( +// 'platform' => 'OS X 10.6', +// 'version' => 20 +// ) +// ) +// ) +// ) +// ), +// 'Mac-Safari' => array( +// 'extensions' => array( +// 'Behat\MinkExtension' => array( +// 'webddriver' => array( +// 'browser' => 'safari', +// 'capabilities' => array( +// 'platform' => 'OS X 10.8', +// 'version' => 6 +// ) +// ) +// ) +// ) +// ) +// ); +// You can also use the following config to override default Moodle configuration for Behat. +// This config is limited to default suite and will be supported in later versions. +// It will have precedence over $CFG->behat_config. +// $CFG->behat_profiles = array( +// 'phantomjs' => array( +// 'browser' => 'phantomjs', +// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs', +// 'wd_host' => 'http://127.0.0.1:4443/wd/hub', +// 'capabilities' => array( +// 'platform' => 'Linux', +// 'version' => 2.1 +// ) +// ), +// ); +// +// All this page's extra Moodle settings are compared against a white list of allowed settings +// (the basic and behat_* ones) to avoid problems with production environments. This setting can be +// used to expand the default white list with an array of extra settings. +// Example: +// $CFG->behat_extraallowedsettings = array('somecoresetting', ...); +// +// You should explicitly allow the usage of the deprecated behat steps, otherwise an exception will +// be thrown when using them. The setting is disabled by default. +// Example: +// $CFG->behat_usedeprecated = true; +// +// If you are using a slow machine, it may help to increase the timeouts that Behat uses. The +// following example will increase timeouts by a factor of 3 (using 30 seconds instead of 10 +// seconds, for instance). +// Example: +// $CFG->behat_increasetimeout = 3; +// +// Including feature files from directories outside the dirroot is possible if required. The setting +// requires that the running user has executable permissions on all parent directories in the paths. +// Example: +// $CFG->behat_additionalfeatures = array('/home/developer/code/wipfeatures'); +// +// You can make behat save several dumps when a scenario fails. The dumps currently saved are: +// * a dump of the DOM in it's state at the time of failure; and +// * a screenshot (JavaScript is required for the screenshot functionality, so not all browsers support this option) +// Example: +// $CFG->behat_faildump_path = '/my/path/to/save/failure/dumps'; +// +// You can make behat pause upon failure to help you diagnose and debug problems with your tests. +// +// $CFG->behat_pause_on_fail = true; +// +// You can specify db, selenium wd_host etc. for behat parallel run by setting following variable. +// Example: +// $CFG->behat_parallel_run = array ( +// array ( +// 'dbtype' => 'mysqli', +// 'dblibrary' => 'native', +// 'dbhost' => 'localhost', +// 'dbname' => 'moodletest', +// 'dbuser' => 'moodle', +// 'dbpass' => 'moodle', +// 'behat_prefix' => 'mdl_', +// 'wd_host' => 'http://127.0.0.1:4444/wd/hub', +// 'behat_wwwroot' => 'http://127.0.0.1/moodle', +// 'behat_dataroot' => '/home/example/bht_moodledata' +// ), +// ); +// +// To change name of behat parallel run site, define BEHAT_PARALLEL_SITE_NAME and parallel run sites will be suffixed +// with this value +// Example: +// define('BEHAT_PARALLEL_SITE_NAME', 'behatparallelsite'); +// +// Command line output for parallel behat install is limited to 80 chars, if you are installing more then 4 sites and +// want to expand output to more then 80 chars, then define BEHAT_MAX_CMD_LINE_OUTPUT +// Example: +// define('BEHAT_MAX_CMD_LINE_OUTPUT', 120); +// +// Behat feature files will be distributed randomly between the processes by default. If you have timing file or want +// to create timing file then define BEHAT_FEATURE_TIMING_FILE with path to timing file. It will be updated for each +// run with latest time taken to execute feature. +// Example: +// define('BEHAT_FEATURE_TIMING_FILE', '/PATH_TO_TIMING_FILE/timing.json'); +// +// If you don't have timing file and want some stable distribution of features, then you can use step counts to +// distribute the features. You can generate step file by executing php admin/tool/behat/cli/util.php --updatesteps +// this will update step file which is defined by BEHAT_FEATURE_STEP_FILE. +// Example: +// define('BEHAT_FEATURE_STEP_FILE', '/PATH_TO_FEATURE_STEP_COUNT_FILE/stepcount.json'); +// +// Feature distribution for each process is displayed as histogram. you can disable it by setting +// BEHAT_DISABLE_HISTOGRAM +// Example: +// define('BEHAT_DISABLE_HISTOGRAM', true); +// +// Mobile app Behat testing requires this option, pointing to a developer Moodle app directory: +// $CFG->behat_ionic_dirroot = '/where/I/keep/my/git/checkouts/moodleapp'; +// +// The following option can be used to indicate a running Ionic server (otherwise Behat will start +// one automatically for each test run, which is convenient but takes ages): +// $CFG->behat_ionic_wwwroot = 'http://localhost:8100'; +// +//========================================================================= +// 12. DEVELOPER DATA GENERATOR +//========================================================================= +// +// The developer data generator tool is intended to be used only in development or testing sites and +// it's usage in production environments is not recommended; if it is used to create JMeter test plans +// is even less recommended as JMeter needs to log in as site course users. JMeter needs to know the +// users passwords but would be dangerous to have a default password as everybody would know it, which would +// be specially dangerouse if somebody uses this tool in a production site, so in order to prevent unintended +// uses of the tool and undesired accesses as well, is compulsory to set a password for the users +// generated by this tool, but only in case you want to generate a JMeter test. The value should be a string. +// Example: +// $CFG->tool_generator_users_password = 'examplepassword'; +// +//========================================================================= +// 13. SYSTEM PATHS (You need to set following, depending on your system) +//========================================================================= +// Ghostscript path. +// On most Linux installs, this can be left as '/usr/bin/gs'. +// On Windows it will be something like 'c:\gs\bin\gswin32c.exe' (make sure +// there are no spaces in the path - if necessary copy the files 'gswin32c.exe' +// and 'gsdll32.dll' to a new folder without a space in the path) +// $CFG->pathtogs = '/usr/bin/gs'; +// +// Path to PHP CLI. +// Probably something like /usr/bin/php. If you enter this, cron scripts can be +// executed from admin web interface. +// $CFG->pathtophp = ''; +// +// Path to du. +// Probably something like /usr/bin/du. If you enter this, pages that display +// directory contents will run much faster for directories with a lot of files. +// $CFG->pathtodu = ''; +// +// Path to aspell. +// To use spell-checking within the editor, you MUST have aspell 0.50 or later +// installed on your server, and you must specify the correct path to access the +// aspell binary. On Unix/Linux systems, this path is usually /usr/bin/aspell, +// but it might be something else. +// $CFG->aspellpath = ''; +// +// Path to dot. +// Probably something like /usr/bin/dot. To be able to generate graphics from +// DOT files, you must have installed the dot executable and point to it here. +// Note that, for now, this only used by the profiling features +// (Development->Profiling) built into Moodle. +// $CFG->pathtodot = ''; +// +// Path to unoconv. +// Probably something like /usr/bin/unoconv. Used as a fallback to convert between document formats. +// Unoconv is used convert between file formats supported by LibreOffice. +// Use a recent version of unoconv ( >= 0.7 ), older versions have trouble running from a webserver. +// $CFG->pathtounoconv = ''; +// +//========================================================================= +// 14. ALTERNATIVE FILE SYSTEM SETTINGS +//========================================================================= +// +// Alternative file system. +// Since 3.3 it is possible to override file_storage and file_system API and use alternative storage systems (e.g. S3, +// Rackspace Cloud Files, Google Cloud Storage, Azure Storage, etc.). +// To set the alternative file storage system in config.php you can use the following setting, providing the +// alternative system class name that will be auto-loaded by file_storage API. +// +// $CFG->alternative_file_system_class = '\\local_myfilestorage\\file_system'; +// +//========================================================================= +// 15. CAMPAIGN CONTENT +//========================================================================= +// +// We have added a campaign content to the notifications page, in case you want to hide that from your site you just +// need to set showcampaigncontent setting to false. +// +// $CFG->showcampaigncontent = true; +// +//========================================================================= +// 16. ALTERNATIVE CACHE CONFIG SETTINGS +//========================================================================= +// +// Alternative cache config. +// Since 3.10 it is possible to override the cache_factory class with an alternative caching factory. +// This overridden factory can provide alternative classes for caching such as cache_config, +// cache_config_writer and core_cache\local\administration_display_helper. +// The autoloaded factory class name can be specified to use. +// +// $CFG->alternative_cache_factory_class = 'tool_alternativecache_cache_factory'; +// +//========================================================================= +// 17. SCHEDULED TASK OVERRIDES +//========================================================================= +// +// It is now possible to define scheduled tasks directly within config. +// The overridden value will take precedence over the values that have been set VIA the UI from the +// next time the task is run. +// +// Tasks are configured as an array of tasks that can override a task's schedule, as well as setting +// the task as disabled. I.e: +// +// $CFG->scheduled_tasks = [ +// '\local_plugin\task\my_task' => [ +// 'schedule' => '*/15 0 0 0 0', +// 'disabled' => 0, +// ], +// ]; +// +// The format for the schedule definition is: '{minute} {hour} {day} {dayofweek} {month}'. +// +// The classname of the task also supports wildcards: +// +// $CFG->scheduled_tasks = [ +// '\local_plugin\*' => [ +// 'schedule' => '*/15 0 0 0 0', +// 'disabled' => 0, +// ], +// '*' => [ +// 'schedule' => '0 0 0 0 0', +// 'disabled' => 0, +// ], +// ]; +// +// In this example, any task classnames matching '\local_plugin\*' would match the first rule and +// use that schedule the next time the task runs. Note that even though the 'local_plugin' tasks match +// the second rule as well, the highest rule takes precedence. Therefore, the second rule would be +// applied to all tasks, except for tasks within '\local_plugin\'. +// +// When the full classname is used, this rule always takes priority over any wildcard rules. +// +//========================================================================= +// ALL DONE! To continue installation, visit your main page with a browser +//========================================================================= + +require_once(__DIR__ . '/lib/setup.php'); // Do not edit + +// There is no php closing tag in this file, +// it is intentional because it prevents trailing whitespace problems! diff --git a/conf/cron b/conf/cron index 777ceb2..77db592 100644 --- a/conf/cron +++ b/conf/cron @@ -1 +1 @@ -*/15 * * * * __USER__ /usr/bin/php__PHPVERSION__ -f __FINALPATH__/admin/cli/cron.php +*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ -f __FINALPATH__/admin/cli/cron.php diff --git a/manifest.json b/manifest.json index 74ccb14..b293fd2 100644 --- a/manifest.json +++ b/manifest.json @@ -45,11 +45,31 @@ "name": "admin", "type": "user", "example": "johndoe" - }, + }, + { + "name": "site_name", + "type": "string", + "ask": { + "en": "Choose a name for the site you want to create", + "fr": "Choisissez un nom pour le site que vous voulez créer" + }, + "default": "moodle", + "example": "moodle" + }, { "name": "is_public", "type": "boolean", "default": true + }, + { + "name": "language", + "type": "string", + "ask": { + "en": "Choose the application language", + "fr": "Choisissez la langue de l'application" + }, + "choices": ["en", "fr"], + "default": "fr" } ] } diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..c9ced12 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,114 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +language=$(ynh_app_setting_get --app=$app --key=language) + +# Add settings here as needed by your application +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) + +#================================================= +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# ADD A CONFIGURATION +#================================================= +ynh_script_progression --message="Updating a configuration file..." --weight=1 + +domain=$new_domain +path_url=$new_path +ynh_replace_string --match_string="\$CFG->wwwroot = '.*'" --replace_string="\$CFG->wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index 1da150a..d1b12ea 100644 --- a/scripts/install +++ b/scripts/install @@ -24,6 +24,8 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC +language=$YNH_APP_ARG_LANGUAGE +site_name=$YNH_APP_ARG_SITE_NAME email=$(ynh_user_get_info --username=$admin --key=mail) password=$(ynh_string_random --length=30) @@ -48,6 +50,8 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin +ynh_app_setting_set --app=$app --key=language --value=$language +ynh_app_setting_set --app=$app --key=site_name --value=$site_name #================================================= # STANDARD MODIFICATIONS @@ -89,10 +93,6 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # NGINX CONFIGURATION #================================================= @@ -127,9 +127,9 @@ chown -R $app:www-data "$data_path" #================================================= # SETUP APPLICATION #================================================= -ynh_script_progression --message="Setting up the application..." --weight=190 +ynh_script_progression --message="Setting up the application..." --weight=19 -ynh_exec_as $app php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license +php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://${domain}${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --lang="$language" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="$site_name" --shortname="$site_name" --non-interactive --agree-license # Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.php" @@ -152,7 +152,11 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -ynh_exec_as $app php$phpversion "$final_path/admin/cli/purge_caches.php" +php$phpversion "$final_path/admin/cli/purge_caches.php" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # ADD CRON JOB diff --git a/scripts/restore b/scripts/restore index 9d1d15d..8fce4d0 100644 --- a/scripts/restore +++ b/scripts/restore @@ -120,6 +120,8 @@ ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./d ynh_script_progression --message="Restoring the cron file..." --weight=3 ynh_restore_file --origin_path="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 8526cc8..d4b7f81 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,9 @@ admin=$(ynh_app_setting_get --app=$app --key=admin) final_path=$(ynh_app_setting_get --app=$app --key=final_path) data_path=$(ynh_app_setting_get --app=$app --key=data_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +language=$(ynh_app_setting_get --app=$app --key=language) +site_name=$(ynh_app_setting_get --app=$app --key=site_name) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -29,6 +32,20 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up Moodle before upgrading (may take a while)..." --weight=10 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -39,6 +56,18 @@ if [ -z "$admin" ]; then ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall Moodle" fi +# If the language is not defined +if [ -z "$language" ]; then + language="fr" + ynh_app_setting_set --app=$app --key=language --value=$language +fi + +# If the site_name is not defined +if [ -z "$site_name" ]; then + site_name="YunoHost" + ynh_app_setting_set --app=$app --key=site_name --value=$site_name +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all @@ -46,20 +75,6 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up Moodle before upgrading (may take a while)..." --weight=30 - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # CREATE DEDICATED USER #================================================= @@ -74,32 +89,41 @@ ynh_system_user_create --username=$app --home_dir="$final_path" # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +# if [ "$upgrade_type" == "UPGRADE_APP" ] +# then +# ynh_script_progression --message="Upgrading source files..." --weight=6 + +# # Create a temporary directory +# tmpdir="$(mktemp -d)" + +# # Backup the config file in the temp dir +# cp -a "$final_path/config.php" "$tmpdir/config.php" + +# # Remove the app directory securely +# ynh_secure_remove --file="$final_path" + +# # Download, check integrity, uncompress and patch the source from app.src +# ynh_setup_source --dest_dir="$final_path" + +# # Copy the admin saved settings from tmp directory to final path +# cp -a "$tmpdir/config.php" "$final_path/config.php" + +# # Remove the tmp directory securely +# ynh_secure_remove --file="$tmpdir" +# fi + if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=6 -# Create a temporary directory - tmpdir="$(mktemp -d)" - - # Backup the config file in the temp dir - cp -a "$final_path/config.php" "$tmpdir/config.php" - # Remove the app directory securely - ynh_secure_remove --file="$final_path" + #ynh_secure_remove --file="$final_path" # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" - - # Copy the admin saved settings from tmp directory to final path - cp -a "$tmpdir/config.php" "$final_path/config.php" - - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config.php" + php${phpversion} $final_path/admin/cli/upgrade.php fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION @@ -125,18 +149,6 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -#================================================= -# UPGRADING THE APPLICATION -#================================================= -# ynh_script_progression --message="Upgrading the application..." --weight=1 - -# ynh_backup_if_checksum_is_different --file="$final_path/config.php" - -# ynh_exec_as $app php${phpversion} "$final_path/admin/cli/upgrade.php" --non-interactive - -# # Recalculate and store the checksum of the file for the next upgrade. -# ynh_store_file_checksum --file="$final_path/config.php" - #================================================= # ACTIVATE LDAP SUPPORT #================================================= @@ -155,7 +167,11 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p # The admin is an ldap user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" -ynh_exec_as $app php${phpversion} "$final_path/admin/cli/purge_caches.php" +php${phpversion} "$final_path/admin/cli/purge_caches.php" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # ADD CRON JOB @@ -166,8 +182,6 @@ ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" chmod 644 "/etc/cron.d/$app" -chown -R $app:www-data "$final_path" - #================================================= # RELOAD NGINX #================================================= From 760abf8c9ac9fa7d1510380eb0ef783f0b076be9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 17 Aug 2021 15:55:50 +0200 Subject: [PATCH 42/83] Fix --- conf/cron | 2 +- scripts/upgrade | 27 --------------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/conf/cron b/conf/cron index 77db592..f8d4277 100644 --- a/conf/cron +++ b/conf/cron @@ -1 +1 @@ -*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ -f __FINALPATH__/admin/cli/cron.php +*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ -f __FINALPATH__/admin/cli/cron.php >/dev/null diff --git a/scripts/upgrade b/scripts/upgrade index d4b7f81..6fb0ae7 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -89,42 +89,15 @@ ynh_system_user_create --username=$app --home_dir="$final_path" # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -# if [ "$upgrade_type" == "UPGRADE_APP" ] -# then -# ynh_script_progression --message="Upgrading source files..." --weight=6 - -# # Create a temporary directory -# tmpdir="$(mktemp -d)" - -# # Backup the config file in the temp dir -# cp -a "$final_path/config.php" "$tmpdir/config.php" - -# # Remove the app directory securely -# ynh_secure_remove --file="$final_path" - -# # Download, check integrity, uncompress and patch the source from app.src -# ynh_setup_source --dest_dir="$final_path" - -# # Copy the admin saved settings from tmp directory to final path -# cp -a "$tmpdir/config.php" "$final_path/config.php" - -# # Remove the tmp directory securely -# ynh_secure_remove --file="$tmpdir" -# fi - if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=6 - # Remove the app directory securely - #ynh_secure_remove --file="$final_path" - # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config.php" php${phpversion} $final_path/admin/cli/upgrade.php fi - #================================================= # NGINX CONFIGURATION #================================================= From 6e2ed9da1213c2223d5fbf20a6236cb110d6f705 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 17 Aug 2021 16:04:07 +0200 Subject: [PATCH 43/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index c9ced12..2bbcf8d 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -105,7 +105,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=$new_domain path_url=$new_path -ynh_replace_string --match_string="\$CFG->wwwroot = '.*'" --replace_string="\$CFG->wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" +ynh_replace_string --match_string="\$CFG->wwwroot = '.*';" --replace_string="\$CFG->wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" #================================================= # END OF SCRIPT From 718b2d13fa9065bfc13e7d0a959f502787e456b0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 17 Aug 2021 17:19:16 +0200 Subject: [PATCH 44/83] Update nginx.conf --- conf/nginx.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 4a8cbd0..8a64153 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,7 +13,8 @@ location __PATH__/ { client_max_body_size 1G; - try_files $uri $uri/ index.php; + try_files $uri $uri/ __PATH__/__PATH__/index.php?$query_string; + location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; From 5d30585149b382f370537d6f4ac6bb80e2ce3f26 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 17 Aug 2021 18:58:48 +0200 Subject: [PATCH 45/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 2bbcf8d..6d19d3f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -105,7 +105,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=$new_domain path_url=$new_path -ynh_replace_string --match_string="\$CFG->wwwroot = '.*';" --replace_string="\$CFG->wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" +ynh_replace_string --match_string="wwwroot = '.*';" --replace_string="wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" #================================================= # END OF SCRIPT From 55b312fd29579d03239f2c066408c484563ac7bd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 17 Aug 2021 19:25:14 +0200 Subject: [PATCH 46/83] Update change_url --- scripts/change_url | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 6d19d3f..b61cbf3 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -99,7 +99,7 @@ then fi #================================================= -# ADD A CONFIGURATION +# UPGRADE A CONFIGURATION #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 @@ -107,6 +107,13 @@ domain=$new_domain path_url=$new_path ynh_replace_string --match_string="wwwroot = '.*';" --replace_string="wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + #================================================= # END OF SCRIPT #================================================= From ce641c351fd08580eebaa9167b0a5cb1865acdcc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 07:52:31 +0200 Subject: [PATCH 47/83] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 6fb0ae7..06315e6 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -95,7 +95,7 @@ then # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config.php" - php${phpversion} $final_path/admin/cli/upgrade.php + #php${phpversion} $final_path/admin/cli/upgrade.php fi #================================================= From 004326092ac39a015e66c6dac0ffb4f6a76965c1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 11:30:48 +0200 Subject: [PATCH 48/83] Update change_url --- scripts/change_url | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index b61cbf3..01f3863 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,13 +28,6 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) -data_path=$(ynh_app_setting_get --app=$app --key=data_path) -language=$(ynh_app_setting_get --app=$app --key=language) - -# Add settings here as needed by your application -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP @@ -105,7 +98,8 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=$new_domain path_url=$new_path -ynh_replace_string --match_string="wwwroot = '.*';" --replace_string="wwwroot = 'https://${domain}${path_url%/}';" --target_file="$final_path/config.php" +#ynh_replace_string --match_string="wwwroot = \'https://.*\';" --replace_string="wwwroot = \'https://${domain}${path_url%/}\';" --target_file="$final_path/config.php" +sed "s~https\?://\([^/]\+\)\(.*\)\(/.*\)~https://\${domain}\${path_url%\/\2~" $final_path/config.php #================================================= # RELOAD NGINX From 4248da44326a8cdfe90173a6765498541b996c7f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 11:41:03 +0200 Subject: [PATCH 49/83] Update change_url --- scripts/change_url | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 01f3863..7aea598 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -96,10 +96,9 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -domain=$new_domain -path_url=$new_path -#ynh_replace_string --match_string="wwwroot = \'https://.*\';" --replace_string="wwwroot = \'https://${domain}${path_url%/}\';" --target_file="$final_path/config.php" -sed "s~https\?://\([^/]\+\)\(.*\)\(/.*\)~https://\${domain}\${path_url%\/\2~" $final_path/config.php +domain=${new_domain%/} +path_url=${new_path%/} +ynh_replace_string --match_string="wwwroot = \'https://.*\';" --replace_string="wwwroot = \'https://$domain$path_url\';" --target_file="$final_path/config.php" #================================================= # RELOAD NGINX From 74fe3da34e7d557c566715f87399d4298a142c3b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 11:56:21 +0200 Subject: [PATCH 50/83] Update change_url --- scripts/change_url | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 7aea598..b963fb6 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -96,9 +96,9 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -domain=${new_domain%/} -path_url=${new_path%/} -ynh_replace_string --match_string="wwwroot = \'https://.*\';" --replace_string="wwwroot = \'https://$domain$path_url\';" --target_file="$final_path/config.php" +#domain=${new_domain%/} +#path_url=${new_path%/} +ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}' . '/';" --target_file="$final_path/config.php" #================================================= # RELOAD NGINX From 288db6327d1ecdd2449b05f4a5fdb98e83655008 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 11:56:42 +0200 Subject: [PATCH 51/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index b963fb6..c602c6b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -98,7 +98,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 #domain=${new_domain%/} #path_url=${new_path%/} -ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}' . '/';" --target_file="$final_path/config.php" +ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" #================================================= # RELOAD NGINX From 937e66ca2addc97babb10bdc61986d8b16dc8842 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 12:10:46 +0200 Subject: [PATCH 52/83] Update change_url --- scripts/change_url | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index c602c6b..bea3feb 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -96,9 +96,14 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -#domain=${new_domain%/} -#path_url=${new_path%/} -ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" +domain=${new_domain%/} +path_url=${new_path%/} +#ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" +php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://${domain}${path_url%/}" --non-interactive --agree-license + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX From 07ef623719f30e82e3fef41c8f236a2db327b8d2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 12:16:36 +0200 Subject: [PATCH 53/83] Update change_url --- scripts/change_url | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/change_url b/scripts/change_url index bea3feb..594ee7a 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,6 +28,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP From 639cac82f82450935e41eabf53c789796b570495 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 12:39:06 +0200 Subject: [PATCH 54/83] fix --- conf/config-dist.php | 1158 +----------------------------------------- scripts/change_url | 14 +- 2 files changed, 24 insertions(+), 1148 deletions(-) diff --git a/conf/config-dist.php b/conf/config-dist.php index 30df842..1980bf3 100644 --- a/conf/config-dist.php +++ b/conf/config-dist.php @@ -1,1157 +1,29 @@ dbtype = 'pgsql'; // 'pgsql', 'mariadb', 'mysqli', 'auroramysql', 'sqlsrv' or 'oci' -$CFG->dblibrary = 'native'; // 'native' only at the moment -$CFG->dbhost = 'localhost'; // eg 'localhost' or 'db.isp.com' or IP -$CFG->dbname = '__DB_NAME__';// database name, eg moodle -$CFG->dbuser = '__DB_NAME__';// your database username -$CFG->dbpass = '__DB_PWD__'; // your database password -$CFG->prefix = 'mdl_'; // prefix to use for all table names +$CFG->dbtype = 'pgsql'; +$CFG->dblibrary = 'native'; +$CFG->dbhost = 'localhost'; +$CFG->dbname = '__DB_NAME__'; +$CFG->dbuser = '__DB_NAME__'; +$CFG->dbpass = '__DB_PWD__'; +$CFG->prefix = 'mdl_'; $CFG->dboptions = array( - 'dbpersist' => false, // should persistent database connections be - // used? set to 'false' for the most stable - // setting, 'true' can improve performance - // sometimes - 'dbsocket' => false, // should connection via UNIX socket be used? - // if you set it to 'true' or custom path - // here set dbhost to 'localhost', - // (please note mysql is always using socket - // if dbhost is 'localhost' - if you need - // local port connection use '127.0.0.1') - 'dbport' => '', // the TCP port number to use when connecting - // to the server. keep empty string for the - // default port - 'dbhandlesoptions' => false,// On PostgreSQL poolers like pgbouncer don't - // support advanced options on connection. - // If you set those in the database then - // the advanced settings will not be sent. - 'dbcollation' => 'utf8mb4_unicode_ci', // MySQL has partial and full UTF-8 - // support. If you wish to use partial UTF-8 - // (three bytes) then set this option to - // 'utf8_unicode_ci', otherwise this option - // can be removed for MySQL (by default it will - // use 'utf8mb4_unicode_ci'. This option should - // be removed for all other databases. - // 'fetchbuffersize' => 100000, // On PostgreSQL, this option sets a limit - // on the number of rows that are fetched into - // memory when doing a large recordset query - // (e.g. search indexing). Default is 100000. - // Uncomment and set to a value to change it, - // or zero to turn off the limit. You need to - // set to zero if you are using pg_bouncer in - // 'transaction' mode (it is fine in 'session' - // mode). - /* - 'connecttimeout' => null, // Set connect timeout in seconds. Not all drivers support it. - 'readonly' => [ // Set to read-only slave details, to get safe reads - // from there instead of the master node. Optional. - // Currently supported by pgsql and mysqli variety classes. - // If not supported silently ignored. - 'instance' => [ // Readonly slave connection parameters - [ - 'dbhost' => 'slave.dbhost', - 'dbport' => '', // Defaults to master port - 'dbuser' => '', // Defaults to master user - 'dbpass' => '', // Defaults to master password - ], - [...], - ], - - Instance(s) can alternatively be specified as: - - 'instance' => 'slave.dbhost', - 'instance' => ['slave.dbhost1', 'slave.dbhost2'], - 'instance' => ['dbhost' => 'slave.dbhost', 'dbport' => '', 'dbuser' => '', 'dbpass' => ''], - - 'connecttimeout' => 2, // Set read-only slave connect timeout in seconds. See above. - 'latency' => 0.5, // Set read-only slave sync latency in seconds. - // When 'latency' seconds have lapsed after an update to a table - // it is deemed safe to use readonly slave for reading from the table. - // It is optional. If omitted once written to a table it will always - // use master handle for reading. - // Lower values increase the performance, but setting it too low means - // missing the master-slave sync. - 'exclude_tables' => [ // Tables to exclude from read-only slave feature. - 'table1', // Should not be used, unless in rare cases when some area of the system - 'table2', // is malfunctioning and you still want to use readonly feature. - ], // Then one can exclude offending tables while investigating. - - More info available in lib/dml/moodle_read_slave_trait.php where the feature is implemented. - ] - */ -// For all database config settings see https://docs.moodle.org/en/Database_settings + 'dbpersist' => 0, + 'dbsocket' => '', + 'dbport' => '', ); - -//========================================================================= -// 2. WEB SITE LOCATION -//========================================================================= -// Now you need to tell Moodle where it is located. Specify the full -// web address to where moodle has been installed. If your web site -// is accessible via multiple URLs then choose the most natural one -// that your students would use. Do not include a trailing slash -// -// If you need both intranet and Internet access please read -// http://docs.moodle.org/en/masquerading - $CFG->wwwroot = 'https://__DOMAIN____PATH__'; - - -//========================================================================= -// 3. DATA FILES LOCATION -//========================================================================= -// Now you need a place where Moodle can save uploaded files. This -// directory should be readable AND WRITEABLE by the web server user -// (usually 'nobody' or 'apache'), but it should not be accessible -// directly via the web. -// -// - On hosting systems you might need to make sure that your "group" has -// no permissions at all, but that "others" have full permissions. -// -// - On Windows systems you might specify something like 'c:\moodledata' - $CFG->dataroot = '__DATA_PATH__'; - - -//========================================================================= -// 4. DATA FILES PERMISSIONS -//========================================================================= -// The following parameter sets the permissions of new directories -// created by Moodle within the data directory. The format is in -// octal format (as used by the Unix utility chmod, for example). -// The default is usually OK, but you may want to change it to 0750 -// if you are concerned about world-access to the files (you will need -// to make sure the web server process (eg Apache) can access the files. -// NOTE: the prefixed 0 is important, and don't use quotes. - -$CFG->directorypermissions = 02777; - - -//========================================================================= -// 5. DIRECTORY LOCATION (most people can just ignore this setting) -//========================================================================= -// A very few webhosts use /admin as a special URL for you to access a -// control panel or something. Unfortunately this conflicts with the -// standard location for the Moodle admin pages. You can work around this -// by renaming the admin directory in your installation, and putting that -// new name here. eg "moodleadmin". This should fix all admin links in Moodle. -// After any change you need to visit your new admin directory -// and purge all caches. - $CFG->admin = 'admin'; - -//========================================================================= -// 6. OTHER MISCELLANEOUS SETTINGS (ignore these for new installations) -//========================================================================= -// -// These are additional tweaks for which no GUI exists in Moodle yet. -// -// Starting in PHP 5.3 administrators should specify default timezone -// in PHP.ini, you can also specify it here if needed. -// See details at: http://php.net/manual/en/function.date-default-timezone-set.php -// List of time zones at: http://php.net/manual/en/timezones.php -// date_default_timezone_set('Australia/Perth'); -// -// Change the key pair lifetime for Moodle Networking -// The default is 28 days. You would only want to change this if the key -// was not getting regenerated for any reason. You would probably want -// make it much longer. Note that you'll need to delete and manually update -// any existing key. -// $CFG->mnetkeylifetime = 28; -// -// Not recommended: Set the following to true to allow the use -// off non-Moodle standard characters in usernames. -// $CFG->extendedusernamechars = true; -// -// Allow user passwords to be included in backup files. Very dangerous -// setting as far as it publishes password hashes that can be unencrypted -// if the backup file is publicy available. Use it only if you can guarantee -// that all your backup files remain only privacy available and are never -// shared out from your site/institution! -// $CFG->includeuserpasswordsinbackup = true; -// -// Completely disable user creation when restoring a course, bypassing any -// permissions granted via roles and capabilities. Enabling this setting -// results in the restore process stopping when a user attempts to restore a -// course requiring users to be created. -// $CFG->disableusercreationonrestore = true; -// -// Keep the temporary directories used by backup and restore without being -// deleted at the end of the process. Use it if you want to debug / view -// all the information stored there after the process has ended. Note that -// those directories may be deleted (after some ttl) both by cron and / or -// by new backup / restore invocations. -// $CFG->keeptempdirectoriesonbackup = true; -// -// Modify the restore process in order to force the "user checks" to assume -// that the backup originated from a different site, so detection of matching -// users is performed with different (more "relaxed") rules. Note that this is -// only useful if the backup file has been created using Moodle < 1.9.4 and the -// site has been rebuilt from scratch using backup files (not the best way btw). -// If you obtain user conflicts on restore, rather than enabling this setting -// permanently, try restoring the backup on a different site, back it up again -// and then restore on the target server. -// $CFG->forcedifferentsitecheckingusersonrestore = true; -// -// Force the backup system to continue to create backups in the legacy zip -// format instead of the new tgz format. Does not affect restore, which -// auto-detects the underlying file format. -// $CFG->usezipbackups = true; -// -// Prevent stats processing and hide the GUI -// $CFG->disablestatsprocessing = true; -// -// Setting this to true will enable admins to edit any post at any time -// $CFG->admineditalways = true; -// -// These variables define DEFAULT block variables for new courses -// If this one is set it overrides all others and is the only one used. -// $CFG->defaultblocks_override = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// These variables define the specific settings for defined course formats. -// They override any settings defined in the formats own config file. -// $CFG->defaultblocks_site = 'site_main_menu,course_list:course_summary,calendar_month'; -// $CFG->defaultblocks_social = 'search_forums,calendar_month,calendar_upcoming,social_activities,recent_activity,course_list'; -// $CFG->defaultblocks_topics = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// $CFG->defaultblocks_weeks = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// These blocks are used when no other default setting is found. -// $CFG->defaultblocks = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// You can specify a different class to be created for the $PAGE global, and to -// compute which blocks appear on each page. However, I cannot think of any good -// reason why you would need to change that. It just felt wrong to hard-code the -// the class name. You are strongly advised not to use these to settings unless -// you are absolutely sure you know what you are doing. -// $CFG->moodlepageclass = 'moodle_page'; -// $CFG->moodlepageclassfile = "$CFG->dirroot/local/myplugin/mypageclass.php"; -// $CFG->blockmanagerclass = 'block_manager'; -// $CFG->blockmanagerclassfile = "$CFG->dirroot/local/myplugin/myblockamanagerclass.php"; -// -// Seconds for files to remain in caches. Decrease this if you are worried -// about students being served outdated versions of uploaded files. -// $CFG->filelifetime = 60*60*6; -// -// Some web servers can offload the file serving from PHP process, -// comment out one the following options to enable it in Moodle: -// $CFG->xsendfile = 'X-Sendfile'; // Apache {@see https://tn123.org/mod_xsendfile/} -// $CFG->xsendfile = 'X-LIGHTTPD-send-file'; // Lighttpd {@see http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file} -// $CFG->xsendfile = 'X-Accel-Redirect'; // Nginx {@see http://wiki.nginx.org/XSendfile} -// If your X-Sendfile implementation (usually Nginx) uses directory aliases specify them -// in the following array setting: -// $CFG->xsendfilealiases = array( -// '/dataroot/' => $CFG->dataroot, -// '/cachedir/' => '/var/www/moodle/cache', // for custom $CFG->cachedir locations -// '/localcachedir/' => '/var/local/cache', // for custom $CFG->localcachedir locations -// '/tempdir/' => '/var/www/moodle/temp', // for custom $CFG->tempdir locations -// '/filedir' => '/var/www/moodle/filedir', // for custom $CFG->filedir locations -// ); -// -// YUI caching may be sometimes improved by slasharguments: -// $CFG->yuislasharguments = 1; -// Some servers may need a special rewrite rule to work around internal path length limitations: -// RewriteRule (^.*/theme/yui_combo\.php)(/.*) $1?file=$2 -// -// -// Following settings may be used to select session driver, uncomment only one of the handlers. -// Database session handler (not compatible with MyISAM): -// $CFG->session_handler_class = '\core\session\database'; -// $CFG->session_database_acquire_lock_timeout = 120; -// -// File session handler (file system locking required): -// $CFG->session_handler_class = '\core\session\file'; -// $CFG->session_file_save_path = $CFG->dataroot.'/sessions'; -// -// Memcached session handler (requires memcached server and extension): -// $CFG->session_handler_class = '\core\session\memcached'; -// $CFG->session_memcached_save_path = '127.0.0.1:11211'; -// $CFG->session_memcached_prefix = 'memc.sess.key.'; -// $CFG->session_memcached_acquire_lock_timeout = 120; -// $CFG->session_memcached_lock_expire = 7200; // Ignored if PECL memcached is below version 2.2.0 -// $CFG->session_memcached_lock_retry_sleep = 150; // Spin-lock retry sleeptime (msec). Only effective -// // for tuning php-memcached 3.0.x (PHP 7) -// -// Redis session handler (requires redis server and redis extension): -// $CFG->session_handler_class = '\core\session\redis'; -// $CFG->session_redis_host = '127.0.0.1'; -// $CFG->session_redis_port = 6379; // Optional. -// $CFG->session_redis_database = 0; // Optional, default is db 0. -// $CFG->session_redis_auth = ''; // Optional, default is don't set one. -// $CFG->session_redis_prefix = ''; // Optional, default is don't set one. -// $CFG->session_redis_acquire_lock_timeout = 120; -// $CFG->session_redis_lock_expire = 7200; -// $CFG->session_redis_lock_retry = 100; // Optional wait between lock attempts in ms, default is 100. -// // After 5 seconds it will throttle down to once per second. -// Use the igbinary serializer instead of the php default one. Note that phpredis must be compiled with -// igbinary support to make the setting to work. Also, if you change the serializer you have to flush the database! -// $CFG->session_redis_serializer_use_igbinary = false; // Optional, default is PHP builtin serializer. -// $CFG->session_redis_compressor = 'none'; // Optional, possible values are: -// // 'gzip' - PHP GZip compression -// // 'zstd' - PHP Zstandard compression -// -// Please be aware that when selecting Memcached for sessions that it is advised to use a dedicated -// memcache server. The memcached extension does not provide isolated environments for individual uses. -// Using the same server for other purposes (MUC for example) can lead to sessions being prematurely removed should -// the other uses of the server purge the cache. -// -// Following setting allows you to alter how frequently is timemodified updated in sessions table. -// $CFG->session_update_timemodified_frequency = 20; // In seconds. -// -// If this setting is set to true, then Moodle will track the IP of the -// current user to make sure it hasn't changed during a session. This -// will prevent the possibility of sessions being hijacked via XSS, but it -// may break things for users coming using proxies that change all the time, -// like AOL. -// $CFG->tracksessionip = true; -// -// The following lines are for handling email bounces. -// $CFG->handlebounces = true; -// $CFG->minbounces = 10; -// $CFG->bounceratio = .20; -// The next lines are needed both for bounce handling and any other email to module processing. -// mailprefix must be EXACTLY four characters. -// Uncomment and customise this block for Postfix -// $CFG->mailprefix = 'mdl+'; // + is the separator for Exim and Postfix. -// $CFG->mailprefix = 'mdl-'; // - is the separator for qmail -// $CFG->maildomain = 'youremaildomain.com'; -// -// Enable when setting up advanced reverse proxy load balancing configurations, -// it may be also necessary to enable this when using port forwarding. -// $CFG->reverseproxy = true; -// -// Enable when using external SSL appliance for performance reasons. -// Please note that site may be accessible via http: or https:, but not both! -// $CFG->sslproxy = true; -// -// This setting will cause the userdate() function not to fix %d in -// date strings, and just let them show with a zero prefix. -// $CFG->nofixday = true; -// -// This setting will make some graphs (eg user logs) use lines instead of bars -// $CFG->preferlinegraphs = true; -// -// This setting allows you to specify a class to rewrite outgoing urls -// enabling 'clean urls' in conjunction with an apache / nginx handler. -// The handler must implement \core\output\url_rewriter. -// $CFG->urlrewriteclass = '\local_cleanurls\url_rewriter'; -// -// Enabling this will allow custom scripts to replace existing moodle scripts. -// For example: if $CFG->customscripts/course/view.php exists then -// it will be used instead of $CFG->wwwroot/course/view.php -// At present this will only work for files that include config.php and are called -// as part of the url (index.php is implied). -// Some examples are: -// http://my.moodle.site/course/view.php -// http://my.moodle.site/index.php -// http://my.moodle.site/admin (index.php implied) -// Custom scripts should not include config.php -// Warning: Replacing standard moodle scripts may pose security risks and/or may not -// be compatible with upgrades. Use this option only if you are aware of the risks -// involved. -// Specify the full directory path to the custom scripts -// $CFG->customscripts = '/home/example/customscripts'; -// -// Performance profiling -// -// If you set Debug to "Yes" in the Configuration->Variables page some -// performance profiling data will show up on your footer (in default theme). -// With these settings you get more granular control over the capture -// and printout of the data -// -// Capture performance profiling data -// define('MDL_PERF' , true); -// -// Capture additional data from DB -// define('MDL_PERFDB' , true); -// -// Print to log (for passive profiling of production servers) -// define('MDL_PERFTOLOG' , true); -// -// Print to footer (works with the default theme) -// define('MDL_PERFTOFOOT', true); -// -// Enable earlier profiling that causes more code to be covered -// on every request (db connections, config load, other inits...). -// Requires extra configuration to be defined in config.php like: -// profilingincluded, profilingexcluded, profilingautofrec, -// profilingallowme, profilingallowall, profilinglifetime -// $CFG->earlyprofilingenabled = true; -// -// Disable database storage for profile data. -// When using an exernal plugin to store profiling data it is often -// desirable to not store the data in the database. -// -// $CFG->disableprofilingtodatabase = true; -// -// Force displayed usernames -// A little hack to anonymise user names for all students. If you set these -// then all non-teachers will always see these for every person. -// $CFG->forcefirstname = 'Bruce'; -// $CFG->forcelastname = 'Simpson'; -// -// The following setting will turn on username logging into Apache log. For full details regarding setting -// up of this function please refer to the install section of the document. -// $CFG->apacheloguser = 0; // Turn this feature off. Default value. -// $CFG->apacheloguser = 1; // Log user id. -// $CFG->apacheloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. -// $CFG->apacheloguser = 3; // Log username. -// To get the values logged in Apache's log, add to your httpd.conf -// the following statements. In the General part put: -// LogFormat "%h %l %{MOODLEUSER}n %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\"" moodleformat -// And in the part specific to your Moodle install / virtualhost: -// CustomLog "/your/path/to/log" moodleformat -// -// Alternatively for other webservers such as nginx, you can instead have the username sent via a http header -// 'X-MOODLEUSER' which can be saved in the logfile and then stripped out before being sent to the browser: -// $CFG->headerloguser = 0; // Turn this feature off. Default value. -// $CFG->headerloguser = 1; // Log user id. -// $CFG->headerloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. -// $CFG->headerloguser = 3; // Log username. -// -// CAUTION: Use of this option will expose usernames in the Apache / nginx log, -// If you are going to publish your log, or the output of your web stats analyzer -// this will weaken the security of your website. -// -// Email database connection errors to someone. If Moodle cannot connect to the -// database, then email this address with a notice. -// -// $CFG->emailconnectionerrorsto = 'your@emailaddress.com'; -// -// Set the priority of themes from highest to lowest. This is useful (for -// example) in sites where the user theme should override all other theme -// settings for accessibility reasons. You can also disable types of themes -// (other than site) by removing them from the array. The default setting is: -// -// $CFG->themeorder = array('course', 'category', 'session', 'user', 'cohort', 'site'); -// -// NOTE: course, category, session, user, cohort themes still require the -// respective settings to be enabled -// -// It is possible to add extra themes directory stored outside of $CFG->dirroot. -// This local directory does not have to be accessible from internet. -// -// $CFG->themedir = '/location/of/extra/themes'; -// -// It is possible to specify different cache and temp directories, use local fast filesystem -// for normal web servers. Server clusters MUST use shared filesystem for cachedir! -// Localcachedir is intended for server clusters, it does not have to be shared by cluster nodes. -// The directories must not be accessible via web. -// -// $CFG->tempdir = '/var/www/moodle/temp'; // Directory MUST BE SHARED by all cluster nodes. -// $CFG->cachedir = '/var/www/moodle/cache'; // Directory MUST BE SHARED by all cluster nodes, locking required. -// $CFG->localcachedir = '/var/local/cache'; // Intended for local node caching. -// $CFG->localrequestdir = '/tmp'; // Intended for local only temporary files. The defaults uses sys_get_temp_dir(). -// -// It is possible to specify a different backup temp directory, use local fast filesystem -// for normal web servers. Server clusters MUST use shared filesystem for backuptempdir! -// The directory must not be accessible via web. -// -// $CFG->backuptempdir = '/var/www/moodle/backuptemp'; // Directory MUST BE SHARED by all cluster nodes. -// -// Some filesystems such as NFS may not support file locking operations. -// Locking resolves race conditions and is strongly recommended for production servers. -// $CFG->preventfilelocking = false; -// -// Site default language can be set via standard administration interface. If you -// want to have initial error messages for eventual database connection problems -// localized too, you have to set your language code here. -// - $CFG->lang = '__LANGUAGE__'; // for example 'cs' -// -// When Moodle is about to perform an intensive operation it raises PHP's memory -// limit. The following setting should be used on large sites to set the raised -// memory limit to something higher. -// The value for the settings should be a valid PHP memory value. e.g. 512M, 1G -// -// $CFG->extramemorylimit = '1024M'; -// -// Moodle 2.4 introduced a new cache API. -// The cache API stores a configuration file within the Moodle data directory and -// uses that rather than the database in order to function in a stand-alone manner. -// Using altcacheconfigpath you can change the location where this config file is -// looked for. -// It can either be a directory in which to store the file, or the full path to the -// file if you want to take full control. Either way it must be writable by the -// webserver. -// -// $CFG->altcacheconfigpath = '/var/www/shared/moodle.cache.config.php -// -// Use the following flag to completely disable the Available update notifications -// feature and hide it from the server administration UI. -// -// $CFG->disableupdatenotifications = true; -// -// Use the following flag to completely disable the installation of plugins -// (new plugins, available updates and missing dependencies) and related -// features (such as cancelling the plugin installation or upgrade) via the -// server administration web interface. -// -// $CFG->disableupdateautodeploy = true; -// -// Use the following flag to disable the warning on the system notifications page -// about present development libraries. This flag will not disable the warning within -// the security overview report. Use this flag only if you really have prohibited web -// access to the development libraries in your webserver configuration. -// -// $CFG->disabledevlibdirscheck = true; -// -// Use the following flag to disable modifications to scheduled tasks -// whilst still showing the state of tasks. -// -// $CFG->preventscheduledtaskchanges = true; -// -// As of version 2.4 Moodle serves icons as SVG images if the users browser appears -// to support SVG. -// For those wanting to control the serving of SVG images the following setting can -// be defined in your config.php. -// If it is not defined then the default (browser detection) will occur. -// -// To ensure they are always used when available: -// $CFG->svgicons = true; -// -// To ensure they are never used even when available: -// $CFG->svgicons = false; -// -// Some administration options allow setting the path to executable files. This can -// potentially cause a security risk. Set this option to true to disable editing -// those config settings via the web. They will need to be set explicitly in the -// config.php file -// $CFG->preventexecpath = true; -// -// Use the following flag to set userid for noreply user. If not set then moodle will -// create dummy user and use -ve value as user id. -// $CFG->noreplyuserid = -10; -// -// As of version 2.6 Moodle supports admin to set support user. If not set, all mails -// will be sent to supportemail. -// $CFG->supportuserid = -20; -// -// Moodle 2.7 introduces a locking api for critical tasks (e.g. cron). -// The default locking system to use is DB locking for Postgres, MySQL, MariaDB and -// file locking for Oracle and SQLServer. If $CFG->preventfilelocking is set, then the -// default will always be DB locking. It can be manually set to one of the lock -// factory classes listed below, or one of your own custom classes implementing the -// \core\lock\lock_factory interface. -// -// $CFG->lock_factory = "auto"; -// -// The list of available lock factories is: -// -// "\\core\\lock\\file_lock_factory" - File locking -// Uses lock files stored by default in the dataroot. Whether this -// works on clusters depends on the file system used for the dataroot. -// -// "\\core\\lock\\db_record_lock_factory" - DB locking based on table rows. -// -// "\\core\\lock\\mysql_lock_factory" - DB locking based on MySQL / MariaDB locks. -// -// "\\core\\lock\\postgres_lock_factory" - DB locking based on postgres advisory locks. -// -// Settings used by the lock factories -// -// Location for lock files used by the File locking factory. This must exist -// on a shared file system that supports locking. -// $CFG->file_lock_root = $CFG->dataroot . '/lock'; -// -// -// Alternative task logging. -// Since Moodle 3.7 the output of al scheduled and adhoc tasks is stored in the database and it is possible to use an -// alternative task logging mechanism. -// To set the alternative task logging mechanism in config.php you can use the following settings, providing the -// alternative class name that will be auto-loaded. -// -// $CFG->task_log_class = '\\local_mytasklogger\\logger'; -// -// Moodle 2.9 allows administrators to customise the list of supported file types. -// To add a new filetype or override the definition of an existing one, set the -// customfiletypes variable like this: -// -// $CFG->customfiletypes = array( -// (object)array( -// 'extension' => 'frog', -// 'icon' => 'archive', -// 'type' => 'application/frog', -// 'customdescription' => 'Amphibian-related file archive' -// ) -// ); -// -// The extension, icon, and type fields are required. The icon field can refer to -// any icon inside the pix/f folder. You can also set the customdescription field -// (shown above) and (for advanced use) the groups, string, and defaulticon fields. -// -// Upgrade key -// -// If the upgrade key is defined here, then the value must be provided every time -// the site is being upgraded though the web interface, regardless of whether the -// administrator is logged in or not. This prevents anonymous access to the upgrade -// screens where the real authentication and authorization mechanisms can not be -// relied on. -// -// It is strongly recommended to use a value different from your real account -// password. -// -// $CFG->upgradekey = 'put_some_password-like_value_here'; -// -// Document conversion limit -// -// How many times the background task should attempt to convert a given attempt -// before removing it from the queue. Currently this limit is only used by the -// mod_assign conversion task. -// -// $CFG->conversionattemptlimit = 3; -// -// Font used in exported PDF files. When generating a PDF, Moodle embeds a subset of -// the font in the PDF file so it will be readable on the widest range of devices. -// The default font is 'freesans' which is part of the GNU FreeFont collection. -// -// $CFG->pdfexportfont = 'freesans'; -// -// Use the following flag to enable messagingallusers and set the default preference -// value for existing users to allow them to be contacted by other site users. -// -// $CFG->keepmessagingallusersenabled = true; -// -// Disable login token validation for login pages. Login token validation is enabled -// by default unless $CFG->alternateloginurl is set. -// -// $CFG->disablelogintoken = true; -// -// Moodle 3.7+ checks that cron is running frequently. If the time between cron runs -// is greater than this value (in seconds), you get a warning on the admin page. (This -// setting only controls whether or not the warning appears, it has no other effect.) -// -// $CFG->expectedcronfrequency = 200; -// -// Moodle 3.9+ checks how old tasks are in the ad hoc queue and warns at 10 minutes -// and errors at 4 hours. Set these to override these limits: -// -// $CFG->adhoctaskagewarn = 10 * 60; -// $CFG->adhoctaskageerror = 4 * 60 * 60; -// -// Session lock warning threshold. Long running pages should release the session using \core\session\manager::write_close(). -// Set this threshold to any value greater than 0 to add developer warnings when a page locks the session for too long. -// The session should rarely be locked for more than 1 second. The input should be in seconds and may be a float. -// -// $CFG->debugsessionlock = 5; -// -// There are times when a session lock is not required during a request. For a page/service to opt-in whether or not a -// session lock is required this setting must first be set to 'true'. -// This is an experimental issue. The session store can not be in the session, please -// see https://docs.moodle.org/en/Session_handling#Read_only_sessions. -// -// $CFG->enable_read_only_sessions = true; -// -// To help expose all the edge cases bugs a debug mode is available which shows the same -// runtime write during readonly errors without actually turning on the readonly sessions: -// -// $CFG->enable_read_only_sessions_debug = true; -// -// Uninstall plugins from CLI only. This stops admins from uninstalling plugins from the graphical admin -// user interface, and forces plugins to be uninstalled from the Command Line tool only, found at -// admin/cli/plugin_uninstall.php. -// -// $CFG->uninstallclionly = true; -// -// -// Customise question bank display -// -// The display of Moodle's question bank is made up of a number of columns. -// You can customise this display by giving a comma-separated list of column class -// names here. Each class must be a subclass of \core_question\bank\column_base. -// For example you might define a class like -// class \local_qbank_extensions\my_column extends \core_question\bank\column_base -// in a local plugin, then add it to the list here. At the time of writing, -// the default question bank display is equivalent to the following, but you might like -// to check the latest default in question/classes/bank/view.php before setting this. -// -// $CFG->questionbankcolumns = 'checkbox_column,question_type_column,' -// . 'question_name_idnumber_tags_column,edit_menu_column,' -// . 'tags_action_column,edit_action_column,copy_action_column,' -// . 'preview_action_column,delete_action_column,export_xml_action_column,' -// . 'creator_name_column,modifier_name_column'; -// -// Forum summary report -// -// In order for the forum summary report to calculate word count and character count data, those details are now stored -// for each post in the database when posts are created or updated. For posts that existed prior to a Moodle 3.8 upgrade, -// these are calculated by the refresh_forum_post_counts ad-hoc task in chunks of 5000 posts per batch by default. -// That default can be overridden by setting an integer value for $CFG->forumpostcountchunksize. -// -// $CFG->forumpostcountchunksize = 5000; -// -// Course and category sorting -// -// If the number of courses in a category exceeds $CFG->maxcoursesincategory (10000 by default), it may lead to duplicate -// sort orders of courses in separated categories. For example: -// - Category A has the sort order of 10000, and has 10000 courses. The last course will have the sort order of 20000. -// - Category B has the sort order of 20000, and has a course with the sort order of 20001. -// - If we add another course in category A, it will have a sort order of 20001, -// which is the same as the course in category B -// The duplicate will cause sorting issue and hence we need to increase $CFG->maxcoursesincategory -// to fix the duplicate sort order -// Please also make sure $CFG->maxcoursesincategory * MAX_COURSE_CATEGORIES less than max integer. -// -// $CFG->maxcoursesincategory = 10000; -// -// Admin setting encryption -// -// $CFG->secretdataroot = '/var/www/my_secret_folder'; -// -// Location to store encryption keys. By default this is $CFG->dataroot/secret; set this if -// you want to use a different location for increased security (e.g. if too many people have access -// to the main dataroot, or if you want to avoid using shared storage). Your web server user needs -// read access to this location, and write access unless you manually create the keys. -// -// $CFG->nokeygeneration = false; -// -// If you change this to true then the server will give an error if keys don't exist, instead of -// automatically generating them. This is only needed if you want to ensure that keys are consistent -// across a cluster when not using shared storage. If you stop the server generating keys, you will -// need to manually generate them by running 'php admin/cli/generate_key.php'. - -//========================================================================= -// 7. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!! -//========================================================================= -// -// Force a debugging mode regardless the settings in the site administration -// @error_reporting(E_ALL | E_STRICT); // NOT FOR PRODUCTION SERVERS! -// @ini_set('display_errors', '1'); // NOT FOR PRODUCTION SERVERS! -// $CFG->debug = (E_ALL | E_STRICT); // === DEBUG_DEVELOPER - NOT FOR PRODUCTION SERVERS! -// $CFG->debugdisplay = 1; // NOT FOR PRODUCTION SERVERS! -// -// You can specify a comma separated list of user ids that that always see -// debug messages, this overrides the debug flag in $CFG->debug and $CFG->debugdisplay -// for these users only. -// $CFG->debugusers = '2'; -// -// Prevent theme caching -// $CFG->themedesignermode = true; // NOT FOR PRODUCTION SERVERS! -// -// Enable verbose debug information during fetching of email messages from IMAP server. -// $CFG->debugimap = true; -// -// Enable verbose debug information during sending of email messages to SMTP server. -// Note: also requires $CFG->debug set to DEBUG_DEVELOPER. -// $CFG->debugsmtp = true; -// -// Prevent JS caching -// $CFG->cachejs = false; // NOT FOR PRODUCTION SERVERS! -// -// Prevent Template caching -// $CFG->cachetemplates = false; // NOT FOR PRODUCTION SERVERS! -// -// Restrict which YUI logging statements are shown in the browser console. -// For details see the upstream documentation: -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logInclude -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logExclude -// $CFG->yuiloginclude = array( -// 'moodle-course-categoryexpander' => true, -// ); -// $CFG->yuilogexclude = array( -// 'moodle-core-notification' => true, -// ); -// -// Set the minimum log level for YUI logging statements. -// For details see the upstream documentation: -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logLevel -// $CFG->yuiloglevel = 'debug'; -// -// Prevent core_string_manager application caching -// $CFG->langstringcache = false; // NOT FOR PRODUCTION SERVERS! -// -// When working with production data on test servers, no emails or other messages -// should ever be send to real users -// $CFG->noemailever = true; // NOT FOR PRODUCTION SERVERS! -// -// Divert all outgoing emails to this address to test and debug emailing features -// $CFG->divertallemailsto = 'root@localhost.local'; // NOT FOR PRODUCTION SERVERS! -// -// Except for certain email addresses you want to let through for testing. Accepts -// a comma separated list of regexes. -// $CFG->divertallemailsexcept = 'tester@dev.com, fred(\+.*)?@example.com'; // NOT FOR PRODUCTION SERVERS! -// -// Uncomment if you want to allow empty comments when modifying install.xml files. -// $CFG->xmldbdisablecommentchecking = true; // NOT FOR PRODUCTION SERVERS! -// -// Since 2.0 sql queries are not shown during upgrade by default. -// Please note that this setting may produce very long upgrade page on large sites. -// $CFG->upgradeshowsql = true; // NOT FOR PRODUCTION SERVERS! -// -// Add SQL queries to the output of cron, just before their execution -// $CFG->showcronsql = true; -// -// Force developer level debug and add debug info to the output of cron -// $CFG->showcrondebugging = true; -// -// Force result of checks used to determine whether a site is considered "public" or not (such as for site registration). -// $CFG->site_is_public = false; -// -//========================================================================= -// 8. FORCED SETTINGS -//========================================================================= -// It is possible to specify normal admin settings here, the point is that -// they can not be changed through the standard admin settings pages any more. -// -// Core settings are specified directly via assignment to $CFG variable. -// Example: -// $CFG->somecoresetting = 'value'; -// -// Plugin settings have to be put into a special array. -// Example: -// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'secondsetting' => 'othervalue'), -// 'otherplugin' => array('mysetting' => 'myvalue', 'thesetting' => 'thevalue')); -// Module default settings with advanced/locked checkboxes can be set too. To do this, add -// an extra config with '_adv' or '_locked' as a suffix and set the value to true or false. -// Example: -// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'settingname_locked' => true, 'settingname_adv' => true)); -// -//========================================================================= -// 9. PHPUNIT SUPPORT -//========================================================================= -// $CFG->phpunit_prefix = 'phpu_'; -// $CFG->phpunit_dataroot = '/home/example/phpu_moodledata'; -// $CFG->phpunit_directorypermissions = 02777; // optional -// $CFG->phpunit_profilingenabled = true; // optional to profile PHPUnit runs. -// -// -//========================================================================= -// 10. SECRET PASSWORD SALT -//========================================================================= -// A site-wide password salt is no longer used in new installations. -// If upgrading from 2.6 or older, keep all existing salts in config.php file. -// -// $CFG->passwordsaltmain = 'a_very_long_random_string_of_characters#@6&*1'; -// -// You may also have some alternative salts to allow migration from previously -// used salts. -// -// $CFG->passwordsaltalt1 = ''; -// $CFG->passwordsaltalt2 = ''; -// $CFG->passwordsaltalt3 = ''; -// .... -// $CFG->passwordsaltalt19 = ''; -// $CFG->passwordsaltalt20 = ''; -// -// -//========================================================================= -// 11. BEHAT SUPPORT -//========================================================================= -// Behat test site needs a unique www root, data directory and database prefix: -// -// $CFG->behat_wwwroot = 'http://127.0.0.1/moodle'; -// $CFG->behat_prefix = 'bht_'; -// $CFG->behat_dataroot = '/home/example/bht_moodledata'; -// -// You can override default Moodle configuration for Behat and add your own -// params; here you can add more profiles, use different Mink drivers than Selenium... -// These params would be merged with the default Moodle behat.yml, giving priority -// to the ones specified here. The array format is YAML, following the Behat -// params hierarchy. More info: http://docs.behat.org/guides/7.config.html -// Example: -// $CFG->behat_config = array( -// 'Mac-Firefox' => array( -// 'suites' => array ( -// 'default' => array( -// 'filters' => array( -// 'tags' => '~@_file_upload' -// ), -// ), -// ), -// 'extensions' => array( -// 'Behat\MinkExtension' => array( -// 'webddriver' => array( -// 'browser' => 'firefox', -// 'capabilities' => array( -// 'platform' => 'OS X 10.6', -// 'version' => 20 -// ) -// ) -// ) -// ) -// ), -// 'Mac-Safari' => array( -// 'extensions' => array( -// 'Behat\MinkExtension' => array( -// 'webddriver' => array( -// 'browser' => 'safari', -// 'capabilities' => array( -// 'platform' => 'OS X 10.8', -// 'version' => 6 -// ) -// ) -// ) -// ) -// ) -// ); -// You can also use the following config to override default Moodle configuration for Behat. -// This config is limited to default suite and will be supported in later versions. -// It will have precedence over $CFG->behat_config. -// $CFG->behat_profiles = array( -// 'phantomjs' => array( -// 'browser' => 'phantomjs', -// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs', -// 'wd_host' => 'http://127.0.0.1:4443/wd/hub', -// 'capabilities' => array( -// 'platform' => 'Linux', -// 'version' => 2.1 -// ) -// ), -// ); -// -// All this page's extra Moodle settings are compared against a white list of allowed settings -// (the basic and behat_* ones) to avoid problems with production environments. This setting can be -// used to expand the default white list with an array of extra settings. -// Example: -// $CFG->behat_extraallowedsettings = array('somecoresetting', ...); -// -// You should explicitly allow the usage of the deprecated behat steps, otherwise an exception will -// be thrown when using them. The setting is disabled by default. -// Example: -// $CFG->behat_usedeprecated = true; -// -// If you are using a slow machine, it may help to increase the timeouts that Behat uses. The -// following example will increase timeouts by a factor of 3 (using 30 seconds instead of 10 -// seconds, for instance). -// Example: -// $CFG->behat_increasetimeout = 3; -// -// Including feature files from directories outside the dirroot is possible if required. The setting -// requires that the running user has executable permissions on all parent directories in the paths. -// Example: -// $CFG->behat_additionalfeatures = array('/home/developer/code/wipfeatures'); -// -// You can make behat save several dumps when a scenario fails. The dumps currently saved are: -// * a dump of the DOM in it's state at the time of failure; and -// * a screenshot (JavaScript is required for the screenshot functionality, so not all browsers support this option) -// Example: -// $CFG->behat_faildump_path = '/my/path/to/save/failure/dumps'; -// -// You can make behat pause upon failure to help you diagnose and debug problems with your tests. -// -// $CFG->behat_pause_on_fail = true; -// -// You can specify db, selenium wd_host etc. for behat parallel run by setting following variable. -// Example: -// $CFG->behat_parallel_run = array ( -// array ( -// 'dbtype' => 'mysqli', -// 'dblibrary' => 'native', -// 'dbhost' => 'localhost', -// 'dbname' => 'moodletest', -// 'dbuser' => 'moodle', -// 'dbpass' => 'moodle', -// 'behat_prefix' => 'mdl_', -// 'wd_host' => 'http://127.0.0.1:4444/wd/hub', -// 'behat_wwwroot' => 'http://127.0.0.1/moodle', -// 'behat_dataroot' => '/home/example/bht_moodledata' -// ), -// ); -// -// To change name of behat parallel run site, define BEHAT_PARALLEL_SITE_NAME and parallel run sites will be suffixed -// with this value -// Example: -// define('BEHAT_PARALLEL_SITE_NAME', 'behatparallelsite'); -// -// Command line output for parallel behat install is limited to 80 chars, if you are installing more then 4 sites and -// want to expand output to more then 80 chars, then define BEHAT_MAX_CMD_LINE_OUTPUT -// Example: -// define('BEHAT_MAX_CMD_LINE_OUTPUT', 120); -// -// Behat feature files will be distributed randomly between the processes by default. If you have timing file or want -// to create timing file then define BEHAT_FEATURE_TIMING_FILE with path to timing file. It will be updated for each -// run with latest time taken to execute feature. -// Example: -// define('BEHAT_FEATURE_TIMING_FILE', '/PATH_TO_TIMING_FILE/timing.json'); -// -// If you don't have timing file and want some stable distribution of features, then you can use step counts to -// distribute the features. You can generate step file by executing php admin/tool/behat/cli/util.php --updatesteps -// this will update step file which is defined by BEHAT_FEATURE_STEP_FILE. -// Example: -// define('BEHAT_FEATURE_STEP_FILE', '/PATH_TO_FEATURE_STEP_COUNT_FILE/stepcount.json'); -// -// Feature distribution for each process is displayed as histogram. you can disable it by setting -// BEHAT_DISABLE_HISTOGRAM -// Example: -// define('BEHAT_DISABLE_HISTOGRAM', true); -// -// Mobile app Behat testing requires this option, pointing to a developer Moodle app directory: -// $CFG->behat_ionic_dirroot = '/where/I/keep/my/git/checkouts/moodleapp'; -// -// The following option can be used to indicate a running Ionic server (otherwise Behat will start -// one automatically for each test run, which is convenient but takes ages): -// $CFG->behat_ionic_wwwroot = 'http://localhost:8100'; -// -//========================================================================= -// 12. DEVELOPER DATA GENERATOR -//========================================================================= -// -// The developer data generator tool is intended to be used only in development or testing sites and -// it's usage in production environments is not recommended; if it is used to create JMeter test plans -// is even less recommended as JMeter needs to log in as site course users. JMeter needs to know the -// users passwords but would be dangerous to have a default password as everybody would know it, which would -// be specially dangerouse if somebody uses this tool in a production site, so in order to prevent unintended -// uses of the tool and undesired accesses as well, is compulsory to set a password for the users -// generated by this tool, but only in case you want to generate a JMeter test. The value should be a string. -// Example: -// $CFG->tool_generator_users_password = 'examplepassword'; -// -//========================================================================= -// 13. SYSTEM PATHS (You need to set following, depending on your system) -//========================================================================= -// Ghostscript path. -// On most Linux installs, this can be left as '/usr/bin/gs'. -// On Windows it will be something like 'c:\gs\bin\gswin32c.exe' (make sure -// there are no spaces in the path - if necessary copy the files 'gswin32c.exe' -// and 'gsdll32.dll' to a new folder without a space in the path) -// $CFG->pathtogs = '/usr/bin/gs'; -// -// Path to PHP CLI. -// Probably something like /usr/bin/php. If you enter this, cron scripts can be -// executed from admin web interface. -// $CFG->pathtophp = ''; -// -// Path to du. -// Probably something like /usr/bin/du. If you enter this, pages that display -// directory contents will run much faster for directories with a lot of files. -// $CFG->pathtodu = ''; -// -// Path to aspell. -// To use spell-checking within the editor, you MUST have aspell 0.50 or later -// installed on your server, and you must specify the correct path to access the -// aspell binary. On Unix/Linux systems, this path is usually /usr/bin/aspell, -// but it might be something else. -// $CFG->aspellpath = ''; -// -// Path to dot. -// Probably something like /usr/bin/dot. To be able to generate graphics from -// DOT files, you must have installed the dot executable and point to it here. -// Note that, for now, this only used by the profiling features -// (Development->Profiling) built into Moodle. -// $CFG->pathtodot = ''; -// -// Path to unoconv. -// Probably something like /usr/bin/unoconv. Used as a fallback to convert between document formats. -// Unoconv is used convert between file formats supported by LibreOffice. -// Use a recent version of unoconv ( >= 0.7 ), older versions have trouble running from a webserver. -// $CFG->pathtounoconv = ''; -// -//========================================================================= -// 14. ALTERNATIVE FILE SYSTEM SETTINGS -//========================================================================= -// -// Alternative file system. -// Since 3.3 it is possible to override file_storage and file_system API and use alternative storage systems (e.g. S3, -// Rackspace Cloud Files, Google Cloud Storage, Azure Storage, etc.). -// To set the alternative file storage system in config.php you can use the following setting, providing the -// alternative system class name that will be auto-loaded by file_storage API. -// -// $CFG->alternative_file_system_class = '\\local_myfilestorage\\file_system'; -// -//========================================================================= -// 15. CAMPAIGN CONTENT -//========================================================================= -// -// We have added a campaign content to the notifications page, in case you want to hide that from your site you just -// need to set showcampaigncontent setting to false. -// -// $CFG->showcampaigncontent = true; -// -//========================================================================= -// 16. ALTERNATIVE CACHE CONFIG SETTINGS -//========================================================================= -// -// Alternative cache config. -// Since 3.10 it is possible to override the cache_factory class with an alternative caching factory. -// This overridden factory can provide alternative classes for caching such as cache_config, -// cache_config_writer and core_cache\local\administration_display_helper. -// The autoloaded factory class name can be specified to use. -// -// $CFG->alternative_cache_factory_class = 'tool_alternativecache_cache_factory'; -// -//========================================================================= -// 17. SCHEDULED TASK OVERRIDES -//========================================================================= -// -// It is now possible to define scheduled tasks directly within config. -// The overridden value will take precedence over the values that have been set VIA the UI from the -// next time the task is run. -// -// Tasks are configured as an array of tasks that can override a task's schedule, as well as setting -// the task as disabled. I.e: -// -// $CFG->scheduled_tasks = [ -// '\local_plugin\task\my_task' => [ -// 'schedule' => '*/15 0 0 0 0', -// 'disabled' => 0, -// ], -// ]; -// -// The format for the schedule definition is: '{minute} {hour} {day} {dayofweek} {month}'. -// -// The classname of the task also supports wildcards: -// -// $CFG->scheduled_tasks = [ -// '\local_plugin\*' => [ -// 'schedule' => '*/15 0 0 0 0', -// 'disabled' => 0, -// ], -// '*' => [ -// 'schedule' => '0 0 0 0 0', -// 'disabled' => 0, -// ], -// ]; -// -// In this example, any task classnames matching '\local_plugin\*' would match the first rule and -// use that schedule the next time the task runs. Note that even though the 'local_plugin' tasks match -// the second rule as well, the highest rule takes precedence. Therefore, the second rule would be -// applied to all tasks, except for tasks within '\local_plugin\'. -// -// When the full classname is used, this rule always takes priority over any wildcard rules. -// -//========================================================================= -// ALL DONE! To continue installation, visit your main page with a browser -//========================================================================= +$CFG->directorypermissions = 02777; require_once(__DIR__ . '/lib/setup.php'); // Do not edit // There is no php closing tag in this file, -// it is intentional because it prevents trailing whitespace problems! +// it is intentional because it prevents trailing whitespace problems! \ No newline at end of file diff --git a/scripts/change_url b/scripts/change_url index 594ee7a..314c742 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -99,12 +99,16 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} path_url=${new_path%/} -#ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" -php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://${domain}${path_url%/}" --non-interactive --agree-license +# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +# chmod 750 "$final_path" +# chmod -R o-rwx "$final_path" +# chown -R $app:www-data "$final_path" + +ynh_add_config --template="../conf/config-dist.php" --destination="$final_path/config.php" + +chmod 400 "$final_path/config.php" +chown $app:$app "$final_path/config.php" #================================================= # RELOAD NGINX From 38a2b2964fba131a625f2ba526d5fc42e35b51ed Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 12:44:01 +0200 Subject: [PATCH 55/83] fix --- check_process | 1 - manifest.json | 10 ---------- scripts/change_url | 5 ++++- scripts/install | 4 +--- scripts/upgrade | 7 ------- 5 files changed, 5 insertions(+), 22 deletions(-) diff --git a/check_process b/check_process index 9f6d87f..c516ac6 100644 --- a/check_process +++ b/check_process @@ -3,7 +3,6 @@ domain="domain.tld" path="/path" admin="john" - language="fr" site_name="Moodle" is_public=1 ; Checks diff --git a/manifest.json b/manifest.json index b293fd2..d2b03fe 100644 --- a/manifest.json +++ b/manifest.json @@ -60,16 +60,6 @@ "name": "is_public", "type": "boolean", "default": true - }, - { - "name": "language", - "type": "string", - "ask": { - "en": "Choose the application language", - "fr": "Choisissez la langue de l'application" - }, - "choices": ["en", "fr"], - "default": "fr" } ] } diff --git a/scripts/change_url b/scripts/change_url index 314c742..77d09eb 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -26,9 +26,12 @@ app=$YNH_APP_INSTANCE_NAME #================================================= ynh_script_progression --message="Loading installation settings..." --weight=1 -# Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP diff --git a/scripts/install b/scripts/install index d1b12ea..3d71df6 100644 --- a/scripts/install +++ b/scripts/install @@ -24,7 +24,6 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC -language=$YNH_APP_ARG_LANGUAGE site_name=$YNH_APP_ARG_SITE_NAME email=$(ynh_user_get_info --username=$admin --key=mail) password=$(ynh_string_random --length=30) @@ -50,7 +49,6 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin -ynh_app_setting_set --app=$app --key=language --value=$language ynh_app_setting_set --app=$app --key=site_name --value=$site_name #================================================= @@ -129,7 +127,7 @@ chown -R $app:www-data "$data_path" #================================================= ynh_script_progression --message="Setting up the application..." --weight=19 -php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://${domain}${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --lang="$language" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="$site_name" --shortname="$site_name" --non-interactive --agree-license +php${phpversion} "$final_path/admin/cli/install.php" --wwwroot="https://${domain}${path_url%/}" --dataroot="$data_path" --dbtype='pgsql' --dbname="$db_name" --dbuser="$db_name" --dbpass="$db_pwd" --adminuser="$admin" --adminpass="$password" --adminemail="$email" --fullname="$site_name" --shortname="$site_name" --non-interactive --agree-license # Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.php" diff --git a/scripts/upgrade b/scripts/upgrade index 06315e6..f9c30d9 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,7 +22,6 @@ admin=$(ynh_app_setting_get --app=$app --key=admin) final_path=$(ynh_app_setting_get --app=$app --key=final_path) data_path=$(ynh_app_setting_get --app=$app --key=data_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) -language=$(ynh_app_setting_get --app=$app --key=language) site_name=$(ynh_app_setting_get --app=$app --key=site_name) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) @@ -56,12 +55,6 @@ if [ -z "$admin" ]; then ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall Moodle" fi -# If the language is not defined -if [ -z "$language" ]; then - language="fr" - ynh_app_setting_set --app=$app --key=language --value=$language -fi - # If the site_name is not defined if [ -z "$site_name" ]; then site_name="YunoHost" From acffb64ec182240295e3376bd193a6b8f07620cd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 12:54:14 +0200 Subject: [PATCH 56/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 77d09eb..1060093 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -107,7 +107,7 @@ path_url=${new_path%/} # chmod 750 "$final_path" # chmod -R o-rwx "$final_path" # chown -R $app:www-data "$final_path" - +dir='__DIR__' ynh_add_config --template="../conf/config-dist.php" --destination="$final_path/config.php" chmod 400 "$final_path/config.php" From 383a25eb355a4bd6f30539c2c194cac73bc33059 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 13:01:07 +0200 Subject: [PATCH 57/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 1060093..8cc24b6 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -101,7 +101,7 @@ fi ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} -path_url=${new_path%/} +path=${new_path%/} # ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" # chmod 750 "$final_path" From c4c0747c46c7d50148e863f6573639974889c710 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 13:15:09 +0200 Subject: [PATCH 58/83] Update change_url --- scripts/change_url | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 8cc24b6..8fe9a2a 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -100,18 +100,22 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -domain=${new_domain%/} -path=${new_path%/} +#domain=${new_domain%/} +#path=${new_path%/} # ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" +ynh_replace_string --match_string="\$CFG->wwwroot = \'.*\'" --replace_string="\$CFG->wwwroot = \'https://${new_domain%/}${new_path%/}\'" --target_file="$final_path/config.php" + + # chmod 750 "$final_path" # chmod -R o-rwx "$final_path" # chown -R $app:www-data "$final_path" -dir='__DIR__' -ynh_add_config --template="../conf/config-dist.php" --destination="$final_path/config.php" -chmod 400 "$final_path/config.php" -chown $app:$app "$final_path/config.php" +# dir='__DIR__' +# ynh_add_config --template="../conf/config-dist.php" --destination="$final_path/config.php" + +# chmod 400 "$final_path/config.php" +# chown $app:$app "$final_path/config.php" #================================================= # RELOAD NGINX From 14ace9d88acb1aa25897339818a2391f4445c92f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 14:28:04 +0200 Subject: [PATCH 59/83] Update change_url --- scripts/change_url | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 8fe9a2a..03d82ef 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -27,11 +27,6 @@ app=$YNH_APP_INSTANCE_NAME ynh_script_progression --message="Loading installation settings..." --weight=1 final_path=$(ynh_app_setting_get --app=$app --key=final_path) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -data_path=$(ynh_app_setting_get --app=$app --key=data_path) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP @@ -100,22 +95,12 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -#domain=${new_domain%/} -#path=${new_path%/} -# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '$new_domain' . '${new_path%/}';" --target_file="$final_path/config.php" +domain=${new_domain%/} +path="/${new_path%/}" +#sed "s/wwwroot = '.*'/wwwroot = 'https:\/\/new_domain path'/" $final_path/config.php +sed "s/wwwroot = '.*'/wwwroot = 'https:\/\/$domain$path'/" $final_path/config.php -ynh_replace_string --match_string="\$CFG->wwwroot = \'.*\'" --replace_string="\$CFG->wwwroot = \'https://${new_domain%/}${new_path%/}\'" --target_file="$final_path/config.php" - - -# chmod 750 "$final_path" -# chmod -R o-rwx "$final_path" -# chown -R $app:www-data "$final_path" - -# dir='__DIR__' -# ynh_add_config --template="../conf/config-dist.php" --destination="$final_path/config.php" - -# chmod 400 "$final_path/config.php" -# chown $app:$app "$final_path/config.php" +ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '${new_domain%/}' . '${new_path%/}';" --target_file="$final_path/config.php" #================================================= # RELOAD NGINX From ded1f916bdb441bf46f00748fae75a818d854bf5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 14:36:23 +0200 Subject: [PATCH 60/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 03d82ef..edaf47c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -98,7 +98,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} path="/${new_path%/}" #sed "s/wwwroot = '.*'/wwwroot = 'https:\/\/new_domain path'/" $final_path/config.php -sed "s/wwwroot = '.*'/wwwroot = 'https:\/\/$domain$path'/" $final_path/config.php +sed "s/wwwroot = '.*'/wwwroot = \'https:\/\/$domain$path\'/" $final_path/config.php ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '${new_domain%/}' . '${new_path%/}';" --target_file="$final_path/config.php" From ab0b5505eb5f54f2493d7192a1b313272d717328 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 14:43:42 +0200 Subject: [PATCH 61/83] Update change_url --- scripts/change_url | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index edaf47c..f3be979 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -97,10 +97,10 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} path="/${new_path%/}" -#sed "s/wwwroot = '.*'/wwwroot = 'https:\/\/new_domain path'/" $final_path/config.php -sed "s/wwwroot = '.*'/wwwroot = \'https:\/\/$domain$path\'/" $final_path/config.php -ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '${new_domain%/}' . '${new_path%/}';" --target_file="$final_path/config.php" +sed -i "s/wwwroot = '.*'/wwwroot = \'https:\/\/$domain$path\'/" "$final_path/config.php" + +#ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '${new_domain%/}' . '${new_path%/}';" --target_file="$final_path/config.php" #================================================= # RELOAD NGINX From 710e160955159b192a2f082c6c2ee04daf4c8ac0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 14:57:14 +0200 Subject: [PATCH 62/83] Update change_url --- scripts/change_url | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index f3be979..a0db7bd 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -95,12 +95,14 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -domain=${new_domain%/} -path="/${new_path%/}" +#domain=${new_domain%/} +#path="/${new_path%/}" -sed -i "s/wwwroot = '.*'/wwwroot = \'https:\/\/$domain$path\'/" "$final_path/config.php" - -#ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = 'https://' . '${new_domain%/}' . '${new_path%/}';" --target_file="$final_path/config.php" +if [ "$new_path" == "/" ]; then + ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" +else + ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain}${new_path%\/}\';" --target_file="$final_path/config.php" +fi #================================================= # RELOAD NGINX From 605710c787dfbe3879e7c7f2a6d871a090f37aef Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 15:09:32 +0200 Subject: [PATCH 63/83] Fix --- conf/config-domain.php | 29 +++++++++++++++++++++++ conf/{config-dist.php => config-path.php} | 0 scripts/change_url | 17 +++++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 conf/config-domain.php rename conf/{config-dist.php => config-path.php} (100%) diff --git a/conf/config-domain.php b/conf/config-domain.php new file mode 100644 index 0000000..63e132d --- /dev/null +++ b/conf/config-domain.php @@ -0,0 +1,29 @@ +dbtype = 'pgsql'; +$CFG->dblibrary = 'native'; +$CFG->dbhost = 'localhost'; +$CFG->dbname = '__DB_NAME__'; +$CFG->dbuser = '__DB_NAME__'; +$CFG->dbpass = '__DB_PWD__'; +$CFG->prefix = 'mdl_'; +$CFG->dboptions = array( + 'dbpersist' => 0, + 'dbsocket' => '', + 'dbport' => '', +); + +$CFG->wwwroot = 'https://__DOMAIN__'; +$CFG->dataroot = '__DATA_PATH__'; +$CFG->admin = 'admin'; + +$CFG->directorypermissions = 02777; + +require_once(__DIR__ . '/lib/setup.php'); // Do not edit + +// There is no php closing tag in this file, +// it is intentional because it prevents trailing whitespace problems! \ No newline at end of file diff --git a/conf/config-dist.php b/conf/config-path.php similarity index 100% rename from conf/config-dist.php rename to conf/config-path.php diff --git a/scripts/change_url b/scripts/change_url index a0db7bd..28454fe 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -27,6 +27,9 @@ app=$YNH_APP_INSTANCE_NAME ynh_script_progression --message="Loading installation settings..." --weight=1 final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP @@ -95,13 +98,19 @@ fi #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=1 -#domain=${new_domain%/} -#path="/${new_path%/}" +domain=${new_domain%/} +path="/${new_path%/}" + +# if [ "$new_path" == "/" ]; then +# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" +# else +# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain}${new_path%\/}\';" --target_file="$final_path/config.php" +# fi if [ "$new_path" == "/" ]; then - ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" + ynh_add_config --template="../conf/config-domain.php" --destination="$final_path/config.php" else - ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain}${new_path%\/}\';" --target_file="$final_path/config.php" + ynh_add_config --template="../conf/config-path.php" --destination="$final_path/config.php" fi #================================================= From c56cec4005bc334f3281660afeee5563f5187b42 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 15:09:51 +0200 Subject: [PATCH 64/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 28454fe..c8805aa 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -99,7 +99,7 @@ fi ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} -path="/${new_path%/}" +path=${new_path%/} # if [ "$new_path" == "/" ]; then # ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" From b8c0fa43ae0fdd0934a2207d3aa69fab1ff298b6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 15:16:09 +0200 Subject: [PATCH 65/83] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index c8805aa..fd0a7bc 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -100,7 +100,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} path=${new_path%/} - +dir="__DIR__" # if [ "$new_path" == "/" ]; then # ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" # else From ffac0774d737329957f0ee0d32b3d62a526f9227 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 15:16:31 +0200 Subject: [PATCH 66/83] Update change_url --- scripts/change_url | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/change_url b/scripts/change_url index fd0a7bc..8fd855b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -101,6 +101,7 @@ ynh_script_progression --message="Updating a configuration file..." --weight=1 domain=${new_domain%/} path=${new_path%/} dir="__DIR__" + # if [ "$new_path" == "/" ]; then # ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" # else From e7b56e0111eea717e74dd600db9dc86a183e72b6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 16:32:24 +0200 Subject: [PATCH 67/83] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8a64153..03a5f09 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,4 +1,3 @@ -#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { # Path to source From 2c045672e45350cee162b005bf7764dd00f4fa09 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 18 Aug 2021 16:42:46 +0200 Subject: [PATCH 68/83] Update nginx.conf --- conf/nginx.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 03a5f09..0a45cd4 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -8,6 +8,8 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } + #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; + index index.php; client_max_body_size 1G; From f5b36742cd3ff346f6d36e4a9ec63f88e2578fbe Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 22 Aug 2021 15:27:59 +0200 Subject: [PATCH 69/83] Update nginx.conf --- conf/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0a45cd4..e6b0974 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,3 +1,4 @@ +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { # Path to source From 4a8d82780c9a21a57110102800d11e049feeae12 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 22 Aug 2021 15:43:24 +0200 Subject: [PATCH 70/83] Update nginx.conf --- conf/nginx.conf | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index e6b0974..8a64153 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -9,8 +9,6 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; - index index.php; client_max_body_size 1G; From 199e817ff61ae5295ef528d2dae61ca3eac02030 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 29 Aug 2021 18:37:31 +0200 Subject: [PATCH 71/83] Update restore --- scripts/restore | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/restore b/scripts/restore index 8fce4d0..25df19d 100644 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,6 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " From 02ddc36677aedbbda24a60e4f5fb5c080a22018b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 21 Sep 2021 23:54:47 +0200 Subject: [PATCH 72/83] Update manifest.json --- manifest.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index d2b03fe..c6a6dc5 100644 --- a/manifest.json +++ b/manifest.json @@ -32,8 +32,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "example.com" + "type": "domain" }, { "name": "path", @@ -43,8 +42,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "site_name", From f1effea5f3764fe2f8d7edaf22bbf834d3813137 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 11 Dec 2021 23:08:34 +0100 Subject: [PATCH 73/83] 4.3 --- conf/nginx.conf | 5 ----- manifest.json | 2 +- scripts/restore | 3 +-- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8a64153..bce5fb3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -4,11 +4,6 @@ location __PATH__/ { # Path to source alias __FINALPATH__/ ; - # Force usage of https - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } - index index.php; client_max_body_size 1G; diff --git a/manifest.json b/manifest.json index c6a6dc5..f676352 100644 --- a/manifest.json +++ b/manifest.json @@ -21,7 +21,7 @@ "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 4.2.4" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ diff --git a/scripts/restore b/scripts/restore index 25df19d..dca91fd 100644 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,7 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS From 8a1058bbbb1da68f0f08c259f8efb781bf2fba50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 12 Dec 2021 08:32:41 +0100 Subject: [PATCH 74/83] 3.11.4 (#57) * 3.11.4 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 +- config_panel.toml | 25 ++++++++++++ manifest.json | 2 +- scripts/_common.sh | 2 +- scripts/config | 95 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/install | 2 +- scripts/remove | 11 ++++++ scripts/restore | 7 +++- scripts/upgrade | 18 ++++++++- 11 files changed, 159 insertions(+), 11 deletions(-) create mode 100644 config_panel.toml create mode 100644 scripts/config diff --git a/README.md b/README.md index 3d118bc..97b9774 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 3.11.2~ynh1 +**Shipped version:** 3.11.4~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index e4c9a51..9abe1e1 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 3.11.2~ynh1 +**Version incluse :** 3.11.4~ynh1 **Démo :** https://sandbox.moodledemo.net/ diff --git a/conf/app.src b/conf/app.src index 734f5be..406eb53 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.2.zip -SOURCE_SUM=b4ad9b8243ce55fc28d592dd43d734bf7949b6a10e8b936e2a85644c087012f8 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.4.zip +SOURCE_SUM=9893c7095b86de4a68c48b21a22116d09ee5040bc5582265d843119b5c8683c8 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/config_panel.toml b/config_panel.toml new file mode 100644 index 0000000..d6d68fe --- /dev/null +++ b/config_panel.toml @@ -0,0 +1,25 @@ +version = "1.0" + +[main] +name = "Moodle configuration" + + [main.php_fpm_config] + name = "PHP-FPM configuration" + + [main.php_fpm_config.fpm_footprint] + ask = "Memory footprint of the service?" + choices = ["low", "medium", "high", "specific"] + default = "low" + help = "low <= 20Mb per pool. medium between 20Mb and 40Mb per pool. high > 40Mb per pool.
Use specific to set a value with the following option." + + [main.php_fpm_config.free_footprint] + ask = "Memory footprint of the service?" + type = "number" + default = "0" + help = "Free field to specify exactly the footprint in Mb if you don't want to use one of the three previous values." + + [main.php_fpm_config.fpm_usage] + ask = "Expected usage of the service?" + choices = ["low", "medium", "high"] + default = "low" + help = "low: Personal usage, behind the sso. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.
medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.
high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." diff --git a/manifest.json b/manifest.json index f676352..be56902 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.11.2~ynh1", + "version": "3.11.4~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", diff --git a/scripts/_common.sh b/scripts/_common.sh index 3730b16..f158759 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,7 +9,7 @@ pkg_dependencies="postgresql" YNH_PHP_VERSION="7.3" -extra_php_dependencies="php${YNH_PHP_VERSION}-common php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-xmlrpc php${YNH_PHP_VERSION}-soap php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-intl php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-pgsql php${YNH_PHP_VERSION}-ldap" +pkg_dependencies="postgresql php${YNH_PHP_VERSION}-common php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-xmlrpc php${YNH_PHP_VERSION}-soap php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-intl php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-pgsql php${YNH_PHP_VERSION}-ldap" #================================================= # PERSONAL HELPERS diff --git a/scripts/config b/scripts/config new file mode 100644 index 0000000..3440bd2 --- /dev/null +++ b/scripts/config @@ -0,0 +1,95 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +current_fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) + +#================================================= +# SPECIFIC GETTERS FOR TOML SHORT KEY +#================================================= + +get__fpm_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + echo "specific" + else + echo "$current_fpm_footprint" + fi +} + +get__free_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + # If current_fpm_footprint is an integer, that's a numeric value for the footprint + echo "$current_fpm_footprint" + else + echo "0" + fi +} + +#================================================= +# SPECIFIC SETTERS FOR TOML SHORT KEYS +#================================================= + +set__fpm_footprint() { + if [ "$fpm_footprint" != "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_footprint" + fi +} + +set__free_footprint() { + if [ "$fpm_footprint" = "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" + fi +} + +#================================================= +# GENERIC FINALIZATION +#================================================= + +ynh_app_config_validate() { + _ynh_app_config_validate + + if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then + # If fpm_footprint is set to 'specific', use $free_footprint value. + if [ "$fpm_footprint" = "specific" ] + then + fpm_footprint=$free_footprint + fi + + if [ "$fpm_footprint" == "0" ] + then + ynh_print_err --message="When selecting 'specific', you have to set a footprint value into the field below." + + exit 0 + fi + fi +} + +ynh_app_config_apply() { + _ynh_app_config_apply + + ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +} + +ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install index 3d71df6..893f8d4 100644 --- a/scripts/install +++ b/scripts/install @@ -105,7 +105,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring PHP-FPM..." --weight=1 # Create a dedicated php-fpm config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/remove b/scripts/remove index 2c7cc30..502e9a4 100644 --- a/scripts/remove +++ b/scripts/remove @@ -48,6 +48,17 @@ ynh_script_progression --message="Removing Moodle main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" +#================================================= +# REMOVE DATA DIR +#================================================= + +# Remove the data directory if --purge option is used +if [ "${YNH_APP_PURGE:-0}" -eq 1 ] +then + ynh_script_progression --message="Removing app data directory..." --weight=1 + ynh_secure_remove --file="$data_path" +fi + #================================================= # REMOVE NGINX CONFIGURATION #================================================= diff --git a/scripts/restore b/scripts/restore index dca91fd..7e66aaa 100644 --- a/scripts/restore +++ b/scripts/restore @@ -31,6 +31,9 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= @@ -87,8 +90,8 @@ ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=1 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Recreate a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" +# Recreate a dedicated php-fpm config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # SPECIFIC RESTORATION diff --git a/scripts/upgrade b/scripts/upgrade index f9c30d9..c15d324 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -25,6 +25,9 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) site_name=$(ynh_app_setting_get --app=$app --key=site_name) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK VERSION #================================================= @@ -61,6 +64,18 @@ if [ -z "$site_name" ]; then ynh_app_setting_set --app=$app --key=site_name --value=$site_name fi +# If fpm_footprint doesn't exist, create it +if [ -z "$fpm_footprint" ]; then + fpm_footprint=low + ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +fi + +# If fpm_usage doesn't exist, create it +if [ -z "$fpm_usage" ]; then + fpm_usage=low + ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage +fi + # Cleaning legacy permissions if ynh_legacy_permissions_exists; then ynh_legacy_permissions_delete_all @@ -112,8 +127,7 @@ ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint #================================================= # ACTIVATE LDAP SUPPORT From d53513c092ec2d5f77b24252e4e9da90b9e72d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 1 Feb 2022 21:31:44 +0100 Subject: [PATCH 75/83] 3.11.5 (#58) * 3.11.5 * Auto-update README Co-authored-by: Yunohost-Bot <> --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 97b9774..699180a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 3.11.4~ynh1 +**Shipped version:** 3.11.5~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index 9abe1e1..248fdfd 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 3.11.4~ynh1 +**Version incluse :** 3.11.5~ynh1 **Démo :** https://sandbox.moodledemo.net/ diff --git a/conf/app.src b/conf/app.src index 406eb53..c045988 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.4.zip -SOURCE_SUM=9893c7095b86de4a68c48b21a22116d09ee5040bc5582265d843119b5c8683c8 +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.5.zip +SOURCE_SUM=993c6ef90710cbfd60764c4ebdde1547fbdab409dceab79f1aef0aef70812a9e SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index be56902..d827b72 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.11.4~ynh1", + "version": "3.11.5~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", From 8b1da5a6914b67d725174b2e75c5a07968146bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 27 Mar 2022 23:52:12 +0200 Subject: [PATCH 76/83] 3.11.6 (#61) * 3.11.6 --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- conf/config-domain.php | 2 +- conf/config-path.php | 4 +++- conf/nginx.conf | 1 - manifest.json | 2 +- scripts/change_url | 7 +------ scripts/config | 4 ++-- scripts/install | 2 -- 10 files changed, 12 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 699180a..d29da05 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 3.11.5~ynh1 +**Shipped version:** 3.11.6~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index 248fdfd..8b3123f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 3.11.5~ynh1 +**Version incluse :** 3.11.6~ynh1 **Démo :** https://sandbox.moodledemo.net/ diff --git a/conf/app.src b/conf/app.src index c045988..e9a0493 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.5.zip -SOURCE_SUM=993c6ef90710cbfd60764c4ebdde1547fbdab409dceab79f1aef0aef70812a9e +SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.6.zip +SOURCE_SUM=eaade75ef2ddb223abe7ca89c61d2579ef183bdedaee0241307b0a7992bb6b45 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/conf/config-domain.php b/conf/config-domain.php index 63e132d..7ea0f92 100644 --- a/conf/config-domain.php +++ b/conf/config-domain.php @@ -8,7 +8,7 @@ $CFG->dbtype = 'pgsql'; $CFG->dblibrary = 'native'; $CFG->dbhost = 'localhost'; $CFG->dbname = '__DB_NAME__'; -$CFG->dbuser = '__DB_NAME__'; +$CFG->dbuser = '__DB_USER__'; $CFG->dbpass = '__DB_PWD__'; $CFG->prefix = 'mdl_'; $CFG->dboptions = array( diff --git a/conf/config-path.php b/conf/config-path.php index 1980bf3..832f944 100644 --- a/conf/config-path.php +++ b/conf/config-path.php @@ -8,7 +8,7 @@ $CFG->dbtype = 'pgsql'; $CFG->dblibrary = 'native'; $CFG->dbhost = 'localhost'; $CFG->dbname = '__DB_NAME__'; -$CFG->dbuser = '__DB_NAME__'; +$CFG->dbuser = '__DB_USER__'; $CFG->dbpass = '__DB_PWD__'; $CFG->prefix = 'mdl_'; $CFG->dboptions = array( @@ -21,6 +21,8 @@ $CFG->wwwroot = 'https://__DOMAIN____PATH__'; $CFG->dataroot = '__DATA_PATH__'; $CFG->admin = 'admin'; +$CFG->lang = '__LANGUAGE__'; + $CFG->directorypermissions = 02777; require_once(__DIR__ . '/lib/setup.php'); // Do not edit diff --git a/conf/nginx.conf b/conf/nginx.conf index bce5fb3..c27948a 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,7 +13,6 @@ location __PATH__/ { location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; - fastcgi_index index.php; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; diff --git a/manifest.json b/manifest.json index d827b72..886521c 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.11.5~ynh1", + "version": "3.11.6~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", diff --git a/scripts/change_url b/scripts/change_url index 8fd855b..5687b92 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -29,6 +29,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 final_path=$(ynh_app_setting_get --app=$app --key=final_path) data_path=$(ynh_app_setting_get --app=$app --key=data_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) #================================================= @@ -102,12 +103,6 @@ domain=${new_domain%/} path=${new_path%/} dir="__DIR__" -# if [ "$new_path" == "/" ]; then -# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain%\/}\';" --target_file="$final_path/config.php" -# else -# ynh_replace_string --match_string="\$CFG->wwwroot = .*" --replace_string="\$CFG->wwwroot = \'https:\/\/${new_domain}${new_path%\/}\';" --target_file="$final_path/config.php" -# fi - if [ "$new_path" == "/" ]; then ynh_add_config --template="../conf/config-domain.php" --destination="$final_path/config.php" else diff --git a/scripts/config b/scripts/config index 3440bd2..8a9110c 100644 --- a/scripts/config +++ b/scripts/config @@ -57,7 +57,7 @@ set__fpm_footprint() { } set__free_footprint() { - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" fi @@ -72,7 +72,7 @@ ynh_app_config_validate() { if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then # If fpm_footprint is set to 'specific', use $free_footprint value. - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then fpm_footprint=$free_footprint fi diff --git a/scripts/install b/scripts/install index 893f8d4..42587d2 100644 --- a/scripts/install +++ b/scripts/install @@ -72,8 +72,6 @@ db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_psql_setup_db --db_user=$db_user --db_name=$db_name -db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) - #================================================= # CREATE DEDICATED USER #================================================= From 81b704f3558b0ca8ee7017243d9aedc481905323 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Mar 2022 17:43:14 +0200 Subject: [PATCH 77/83] Update config-path.php --- conf/config-path.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/config-path.php b/conf/config-path.php index 832f944..768e7d0 100644 --- a/conf/config-path.php +++ b/conf/config-path.php @@ -21,8 +21,6 @@ $CFG->wwwroot = 'https://__DOMAIN____PATH__'; $CFG->dataroot = '__DATA_PATH__'; $CFG->admin = 'admin'; -$CFG->lang = '__LANGUAGE__'; - $CFG->directorypermissions = 02777; require_once(__DIR__ . '/lib/setup.php'); // Do not edit From f99d929476f632221f9cb886bc5e46e18ffa3b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 May 2022 20:39:13 +0200 Subject: [PATCH 78/83] 4.0.0 (#62) * 3.11.5 * Auto-update README * 3.11.6 * Auto-update README * Fix * Update config-path.php * Update manifest.json * remove language * Revert "remove language" This reverts commit a598ca0465a662bcb652718c5b8656d2ffecb755. * Fix * Update upgrade * Update check_process * Fix * Update install * Fix * Update install * Fix * Update install * Update upgrade * 100M * Fix * fix * Update _common.sh * Fix * remove de * Update fr.src * remove translation * fix * Update upgrade * Update change_url * Update config-path.php * Update _common.sh * 4.0.0 * Auto-update README * 7.4 * Update restore * Update upgrade Co-authored-by: Yunohost-Bot <> Co-authored-by: yunohost-bot --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 4 ++-- scripts/_common.sh | 4 +--- scripts/restore | 20 ++++++++++---------- scripts/upgrade | 4 ++++ 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index d29da05..be139ad 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 3.11.6~ynh1 +**Shipped version:** 4.0.0~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index 8b3123f..e268b26 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 3.11.6~ynh1 +**Version incluse :** 4.0.0~ynh1 **Démo :** https://sandbox.moodledemo.net/ diff --git a/conf/app.src b/conf/app.src index e9a0493..0ec6331 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v3.11.6.zip -SOURCE_SUM=eaade75ef2ddb223abe7ca89c61d2579ef183bdedaee0241307b0a7992bb6b45 +SOURCE_URL=https://github.com/moodle/moodle/archive/v4.0.0.zip +SOURCE_SUM=a8ab07a4b0fb5286b42658381df4db8746b8bb44a96234df1b69d2841ed81a07 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 886521c..1ae438e 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "3.11.6~ynh1", + "version": "4.0.0~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", @@ -26,7 +26,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.3-fpm" + "php7.4-fpm" ], "arguments": { "install" : [ diff --git a/scripts/_common.sh b/scripts/_common.sh index f158759..20fd74b 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,9 +5,7 @@ #================================================= # dependencies used by the app -pkg_dependencies="postgresql" - -YNH_PHP_VERSION="7.3" +YNH_PHP_VERSION="7.4" pkg_dependencies="postgresql php${YNH_PHP_VERSION}-common php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-xmlrpc php${YNH_PHP_VERSION}-soap php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-intl php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-pgsql php${YNH_PHP_VERSION}-ldap" diff --git a/scripts/restore b/scripts/restore index 7e66aaa..c8793f7 100644 --- a/scripts/restore +++ b/scripts/restore @@ -83,16 +83,6 @@ chmod 750 "$data_path" chmod -R o-rwx "$data_path" chown -R $app:www-data "$data_path" -#================================================= -# RESTORE THE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=1 - -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" - -# Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion - #================================================= # SPECIFIC RESTORATION #================================================= @@ -103,6 +93,16 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=3 # Define and install dependencies ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies +#================================================= +# RESTORE THE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring PHP-FPM configuration..." --weight=1 + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +# Recreate a dedicated php-fpm config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion + #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c15d324..266ca11 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -106,6 +106,10 @@ then #php${phpversion} $final_path/admin/cli/upgrade.php fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= From bd2d4121c452e84ff5d8028881ce3bcd70a1ee84 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 12 May 2022 08:35:35 +0200 Subject: [PATCH 79/83] Update check_process --- check_process | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/check_process b/check_process index c516ac6..3396250 100644 --- a/check_process +++ b/check_process @@ -13,8 +13,8 @@ setup_private=1 setup_public=1 upgrade=1 - # 3.11.1~ynh1 - upgrade=1 from_commit=b2abcd9cefa16e5c5e0e6963a92ebc961be12d1a + # 3.11.6~ynh1 + upgrade=1 from_commit=623e7bae2dbae1bc9d7ceaa947ec49f56b57fa05 backup_restore=1 multi_instance=1 change_url=1 @@ -22,6 +22,6 @@ Email= Notification=none ;;; Upgrade options - ; commit=b2abcd9cefa16e5c5e0e6963a92ebc961be12d1a - name=3.11.1~ynh1 + ; commit=623e7bae2dbae1bc9d7ceaa947ec49f56b57fa05 + name=Testing (#63) \ No newline at end of file From 8df25d3363523f86f6f09354bb122fc2ed21e487 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 12 May 2022 08:42:24 +0200 Subject: [PATCH 80/83] Cleaning up --- manifest.json | 2 +- scripts/backup | 4 ++++ scripts/install | 2 +- scripts/remove | 2 +- scripts/upgrade | 4 ++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/manifest.json b/manifest.json index 1ae438e..f61a1c5 100644 --- a/manifest.json +++ b/manifest.json @@ -12,7 +12,7 @@ "license": "GPL-3.0-or-later", "website": "https://moodle.org/", "demo": "https://sandbox.moodledemo.net/", - "admindoc": "https://docs.moodle.org/311/en/Main_page", + "admindoc": "https://docs.moodle.org/400/en/Main_page", "code": "https://github.com/moodle/moodle" }, "license": "GPL-3.0-or-later", diff --git a/scripts/backup b/scripts/backup index 6229a5b..4510d34 100644 --- a/scripts/backup +++ b/scripts/backup @@ -40,6 +40,10 @@ ynh_print_info --message="Declaring files to be backed up..." ynh_backup --src_path="$final_path" +#================================================= +# BACKUP THE DATA DIR +#================================================= + ynh_backup --src_path="$data_path" --is_big #================================================= diff --git a/scripts/install b/scripts/install index 42587d2..e4e7dfd 100644 --- a/scripts/install +++ b/scripts/install @@ -145,7 +145,7 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='onlogin' WHERE plugin='auth_ldap' AND (name='field_updatelocal_firstname' OR name='field_updatelocal_lastname' OR name='field_updatelocal_email');" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='locked' WHERE plugin='auth_ldap' AND (name='field_lock_firstname' OR name='field_lock_lastname' OR name='field_lock_email');" -# The admin is an ldap user +# The admin is an LDAP user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" php$phpversion "$final_path/admin/cli/purge_caches.php" diff --git a/scripts/remove b/scripts/remove index 502e9a4..097e493 100644 --- a/scripts/remove +++ b/scripts/remove @@ -43,7 +43,7 @@ ynh_remove_app_dependencies #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing Moodle main directory..." --weight=2 +ynh_script_progression --message="Removing app main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" diff --git a/scripts/upgrade b/scripts/upgrade index 266ca11..f3cf19c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -37,7 +37,7 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up Moodle before upgrading (may take a while)..." --weight=10 +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=10 # Backup the current version of the app ynh_backup_before_upgrade @@ -148,7 +148,7 @@ ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_p ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='onlogin' WHERE plugin='auth_ldap' AND (name='field_updatelocal_firstname' OR name='field_updatelocal_lastname' OR name='field_updatelocal_email');" ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_config_plugins SET value='locked' WHERE plugin='auth_ldap' AND (name='field_lock_firstname' OR name='field_lock_lastname' OR name='field_lock_email');" -# The admin is an ldap user +# The admin is an LDAP user ynh_psql_execute_as_root --database="$db_name" --sql="UPDATE public.mdl_user SET auth='ldap' WHERE username='$admin';" php${phpversion} "$final_path/admin/cli/purge_caches.php" From 8a10a2cce214a4acfede39e45620bd2de8c63299 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 May 2022 06:42:29 +0000 Subject: [PATCH 81/83] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index be139ad..63a74fa 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ How to configure this app: by an admin panel. ## Documentation and resources * Official app website: https://moodle.org/ -* Official admin documentation: https://docs.moodle.org/311/en/Main_page +* Official admin documentation: https://docs.moodle.org/400/en/Main_page * Upstream app code repository: https://github.com/moodle/moodle * YunoHost documentation for this app: https://yunohost.org/app_moodle * Report a bug: https://github.com/YunoHost-Apps/moodle_ynh/issues diff --git a/README_fr.md b/README_fr.md index e268b26..01ff113 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,7 +28,7 @@ Plateforme d'apprentissage en ligne ## Documentations et ressources * Site officiel de l'app : https://moodle.org/ -* Documentation officielle de l'admin : https://docs.moodle.org/311/en/Main_page +* Documentation officielle de l'admin : https://docs.moodle.org/400/en/Main_page * Dépôt de code officiel de l'app : https://github.com/moodle/moodle * Documentation YunoHost pour cette app : https://yunohost.org/app_moodle * Signaler un bug : https://github.com/YunoHost-Apps/moodle_ynh/issues From 410ef98caef29d9b35307d16b05ff6c46c4515e4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 21 May 2022 12:04:28 +0200 Subject: [PATCH 82/83] 4.0.1 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 0ec6331..3362c09 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/moodle/moodle/archive/v4.0.0.zip -SOURCE_SUM=a8ab07a4b0fb5286b42658381df4db8746b8bb44a96234df1b69d2841ed81a07 +SOURCE_URL=https://github.com/moodle/moodle/archive/v4.0.1.zip +SOURCE_SUM=7e0ea98532226e131726d67a30e3ada77bb8a7c799f0094f75050920c11d3b4f SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index f61a1c5..1966af9 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Online learning platform", "fr": "Plateforme d'apprentissage en ligne" }, - "version": "4.0.0~ynh1", + "version": "4.0.1~ynh1", "url": "https://moodle.org/", "upstream": { "license": "GPL-3.0-or-later", From ba213326a6fb8adf42a8bcd813adb13f48f6a83e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 21 May 2022 10:04:32 +0000 Subject: [PATCH 83/83] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 63a74fa..b61bbb3 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Online learning platform -**Shipped version:** 4.0.0~ynh1 +**Shipped version:** 4.0.1~ynh1 **Demo:** https://sandbox.moodledemo.net/ diff --git a/README_fr.md b/README_fr.md index 01ff113..85f6a59 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Plateforme d'apprentissage en ligne -**Version incluse :** 4.0.0~ynh1 +**Version incluse :** 4.0.1~ynh1 **Démo :** https://sandbox.moodledemo.net/