From e81e13519f0904d86ffb1e6577a9b23593866be0 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 9 Mar 2022 00:27:32 +0100 Subject: [PATCH] Apply last example_ynh --- check_process | 28 +-- conf/app.src | 6 - conf/nginx.conf | 10 +- conf/php-fpm.conf | 66 ++++-- .../experimental_helper.sh => doc/.gitkeep | 0 doc/DESCRIPTION.md | 1 + doc/DISCLAIMER.md | 50 +++++ doc/screenshots/.gitkeep | 0 doc/screenshots/screenshot01.png | Bin 0 -> 94978 bytes manifest.json | 65 +++--- scripts/_common.sh | 4 +- scripts/backup | 72 +++++-- scripts/change_url | 106 +++++++--- scripts/install | 198 ++++++++++++------ scripts/remove | 118 +++++++---- scripts/restore | 133 +++++++++--- scripts/upgrade | 126 ++++++++--- 17 files changed, 680 insertions(+), 303 deletions(-) delete mode 100644 conf/app.src rename scripts/experimental_helper.sh => doc/.gitkeep (100%) create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/.gitkeep create mode 100644 doc/screenshots/screenshot01.png diff --git a/check_process b/check_process index f08806c..abac979 100644 --- a/check_process +++ b/check_process @@ -1,15 +1,10 @@ -# See here for more informations -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) + domain="domain.tld" + path="/path" + is_public=1 language="fr" - is_public=1 (PUBLIC|public=1|private=0) + admin="john" service_autodiscovery=1 whups_install=1 sesha_install=1 @@ -23,23 +18,12 @@ setup_private=1 setup_public=1 upgrade=1 + # 5.2.22~ynh4 + upgrade=1 from_commit=88e078661c230a9fe694624367b4b152950ae894 backup_restore=1 multi_instance=1 - incorrect_path=1 port_already_use=0 change_url=1 -;;; Levels - Level 1=auto - Level 2=auto - Level 3=auto - # https://github.com/YunoHost-Apps/horde_ynh/blob/master/sources/sso_auth.patch - Level 4=1 - Level 5=auto - Level 6=auto - Level 7=auto - Level 8=0 - Level 9=0 - Level 10=0 ;;; Options Email= Notification=none diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index e4dd89f..0000000 --- a/conf/app.src +++ /dev/null @@ -1,6 +0,0 @@ -SOURCE_URL=url of app's source -SOURCE_SUM=sha256 checksum -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index dc1c65d..36efec1 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -4,10 +4,6 @@ location __PATH__/ { # Path to source alias __FINALPATH__/horde/ ; - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } - index index.php; # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file @@ -20,18 +16,16 @@ location __PATH__/ { try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php5-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + fastcgi_index index.php; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $request_filename; } - # PHP configuration end # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; more_clear_input_headers 'Accept-Encoding'; } - - diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 936327a..2ca53b8 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -1,10 +1,11 @@ ; Start a new pool named 'www'. -; the variable $pool can we used in any directive and will be replaced by the +; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [__NAMETOCHANGE__] ; Per pool prefix ; It only applies on the following directives: +; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' @@ -24,17 +25,19 @@ group = __USER__ ; The address on which to accept FastCGI requests. ; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; -; 'port' - to listen on a TCP socket to all addresses on a -; specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php5-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock -; Set listen(2) backlog. A value of '-1' means unlimited. -; Default Value: 128 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 128 +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many @@ -44,8 +47,13 @@ listen = /var/run/php5-fpm-__NAMETOCHANGE__.sock listen.owner = www-data listen.group = www-data ;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = -; List of ipv4 addresses of FastCGI clients which are allowed to connect. +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address ; must be separated by a comma. If this value is left blank, connections will be @@ -59,7 +67,13 @@ listen.group = www-data ; - The pool processes will inherit the master process priority ; unless it specified otherwise ; Default Value: no set -; priority = -19 +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes ; Choose how the process manager will control the number of child processes. ; Possible Values: @@ -215,7 +229,7 @@ pm.max_requests = 500 ; last request memory: 0 ; ; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: ${prefix}/share/fpm/status.html +; It's available in: /usr/share/php/7.0/fpm/status.html ; ; Note: The value must start with a leading slash (/). The value can be ; anything, but it may not be a good idea to use the .php extension or it @@ -275,7 +289,7 @@ pm.max_requests = 500 ; - %{megabytes}M ; - %{mega}M ; %n: pool name -; %o: ouput header +; %o: output header ; it must be associated with embraces to specify the name of the header: ; - %{Content-Type}o ; - %{X-Powered-By}o @@ -291,9 +305,13 @@ pm.max_requests = 500 ; %t: server time the request was received ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %T: time the log has been written (the request has finished) ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %u: remote user ; ; Default: "%R - %u %t \"%m %r\" %s" @@ -349,13 +367,22 @@ chdir = __FINALPATH__ ; Default Value: no catch_workers_output = yes +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + ; Limits the extensions of the main script FPM will allow to parse. This can ; prevent configuration mistakes on the web server side. You should only limit ; FPM to .php extensions to prevent malicious users to use other extensions to -; exectute php code. +; execute php code. ; Note: set an empty value to allow all extensions. ; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 +;security.limit_extensions = .php .php3 .php4 .php5 .php7 ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. @@ -391,6 +418,17 @@ catch_workers_output = yes ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; 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 + ; Special settings for Horde php_value[include_path] = "__FINALPATH__/pear/php:.:__FINALPATH__/horde/lib" env[PHP_PEAR_SYSCONF_DIR] = __FINALPATH__ diff --git a/scripts/experimental_helper.sh b/doc/.gitkeep similarity index 100% rename from scripts/experimental_helper.sh rename to doc/.gitkeep diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..e91a70d --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +A groupware (webmail, adressbook, calendar) witch use PHP diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..aeec11a --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,50 @@ +### Customisation + +#### Install others app. + +The package provide some apps, but it's could be possible to install some others apps. The list of all availabe apps are listed here : https://www.horde.org/apps + +Before any change it's recommended to make a backup : +```bash +# In case of multiple instance adapt "horde" by the horde instance +sudo yunohost backup create --verbose --ignore-system --apps horde +``` + +Install horde apps with pear : + +```bash +# Get the horde final_path +# In case of multiple instance adapt "horde" by the horde instance +final_path=$(yunohost app setting horde final_path) + +# Set the pear command to call to stay in the horde environnement (not in the global system environnement) +pear_cmd="$final_path/pear/pear -c $final_path/pear.conf" + +# Update the pear channel +$pear_cmd channel-update pear.horde.org + +# Install the app that you want +$pear_cmd install -a -B horde/APP_TO_INSTALL + +# Set the final permission +# In case of multiple instance adapt "horde" by the horde instance +chown -R www-data:horde $final_path + +``` + +After you need to update the horde database schema and the horde config. So go on the horde config pannel (in the settings wheel > Preferences > Administration > Configuration). Click on "Update all DB schemas" and then on "Update all configurations". + +Now you should be able to use the new apps. + +### ActiveSync + +For calendar, task and addressbook activeSync has been configured but not yet tested. + +### Troubleshotting + +**Get Address is missing domain while to try to send an email.** + +- You need to create an identity before send an email. +- To create this go in the settings wheel > Preferences > Global Preferences > Personal Information. +- Complete the form and save it. +- You might be able to sed an email now. diff --git a/doc/screenshots/.gitkeep b/doc/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot01.png b/doc/screenshots/screenshot01.png new file mode 100644 index 0000000000000000000000000000000000000000..068c2d779e2de391b096d12df1dce936097689d1 GIT binary patch literal 94978 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 3.5.2.2" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ "nginx", - "php5-fpm", + "php7.3-fpm", "mysql" ], "arguments": { "install" : [ { "name": "domain", - "type": "domain", - "ask": { - "en": "Choose a domain name for Horde", - "fr": "Choisissez un nom de domaine pour Horde" - }, - "example": "example.com" + "type": "domain" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Horde", - "fr": "Choisissez un chemin pour Horde" - }, "example": "/horde", "default": "/horde" }, + { + "name": "is_public", + "type": "boolean", + "default": false + }, + { + "name": "language", + "type": "string", + "ask": { + "en": "Choose the application language", + "fr": "Choisissez la langue de l'application" + }, + "choices": [ + "bg", "de", "en", "es", "fi", "fo", "fr", "hr", "hu", + "id", "is", "it", "lt", "lv", "mg", "mk", "mt", "nl", + "pl", "pt", "ro", "ru", "sk", "so", "th", "tr", "uz" + ], + "default": "en" + }, { "name": "admin", "type": "user", @@ -52,36 +69,14 @@ }, "example": "johndoe" }, - { - "name": "is_public", - "type": "boolean", - "ask": { - "en": "Is it a public server?", - "fr": "Est-ce un serveur publique?" - }, - "default": false - }, { "name": "service_autodiscovery", "type": "boolean", "ask": { "en": "Would you like to enable the caldDav/cardDAV service autodiscovery?", "fr": "Voulez-vous activer l'autodécouverte des services calDAV/cardDAV?" - }, - "default": false - }, - { - "name": "language", - "ask": { - "en": "Choose the application language", - "fr": "Choisissez la langue de l'application" }, - "choices": [ - "bg", "de", "en", "es", "fi", "fo", "fr", "hr", "hu", - "id", "is", "it", "lt", "lv", "mg", "mk", "mt", "nl", - "pl", "pt", "ro", "ru", "sk", "so", "th", "tr", "uz" - ], - "default": "en" + "default": false }, { "name": "whups_install", diff --git a/scripts/_common.sh b/scripts/_common.sh index 6218b4f..15f2ff5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,9 +4,7 @@ # SET ALL CONSTANTS #================================================= -app=$YNH_APP_INSTANCE_NAME -final_path="/var/www/$app" -gollem_data_dir="/home/yunohost.app/$app" + #================================================= # DEFINE ALL COMMON FONCTIONS diff --git a/scripts/backup b/scripts/backup index 1a75e19..25968d8 100755 --- a/scripts/backup +++ b/scripts/backup @@ -3,44 +3,74 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Source YunoHost 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 -# Stop script if errors +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + true +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Import common cmd -source ../settings/scripts/experimental_helper.sh -source ../settings/scripts/_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." -ynh_script_progression --message="Loading installation settings..." +app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get --app $app --key final_path) -domain=$(ynh_app_setting_get --app $app --key domain) -db_name=$(ynh_app_setting_get --app $app --key db_name) +final_path=$(ynh_app_setting_get --app=$app --key=final_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) +gollem_data_dir=$(ynh_app_setting_get --app=$app --key=gollem_data_dir) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP #================================================= +ynh_print_info --message="Declaring files to be backed up..." +#================================================= # BACKUP THE APP MAIN DIR -ynh_script_progression --message="Backing up code..." --weight=3 -ynh_backup --src_path "$final_path" +#================================================= -# Backup user data -ynh_script_progression --message="Backing up user data..." --weight=10 -ynh_backup --src_path "$gollem_data_dir" +ynh_backup --src_path="$final_path" +#================================================= +# BACKUP THE DATA DIR +#================================================= + +ynh_backup --src_path="$gollem_data_dir" + +#================================================= # BACKUP THE NGINX CONFIGURATION -ynh_script_progression --message="Backing up configuration..." -ynh_backup --src_path "/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= # BACKUP THE PHP-FPM CONFIGURATION -ynh_backup --src_path "/etc/php5/fpm/pool.d/$app.conf" +#================================================= +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +#================================================= # BACKUP THE MYSQL DATABASE -ynh_script_progression --message="Backing up database" -ynh_mysql_dump_db "$db_name" > db.sql +#================================================= +ynh_print_info --message="Backing up the MySQL database..." -ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last +ynh_mysql_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)." diff --git a/scripts/change_url b/scripts/change_url index ceff022..215d4d7 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,62 +1,114 @@ #!/bin/bash #================================================= -# GENERIC START +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS #================================================= -# IMPORT GENERIC HELPERS +source _common.sh source /usr/share/yunohost/helpers -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -ynh_script_progression --message="Loading installation settings..." - +#================================================= # RETRIEVE ARGUMENTS +#================================================= + old_domain=$YNH_APP_OLD_DOMAIN domain=$YNH_APP_NEW_DOMAIN path_url=$(ynh_normalize_url_path --path_url ${YNH_APP_NEW_PATH:-'/'}) app=$YNH_APP_INSTANCE_NAME -admin=$(ynh_app_setting_get --app $app --key admin) -final_path=$(ynh_app_setting_get --app $app --key final_path) -port=$(ynh_app_setting_get --app $app --key port) -secret_key=$(ynh_app_setting_get --app $app --key secret_key) -service_autodiscovery=$(ynh_app_setting_get --app $app --key service_autodiscovery) -db_name=$(ynh_app_setting_get --app $app --key db_name) -db_user=$(ynh_app_setting_get --app $app --key db_user) -db_pwd=$(ynh_app_setting_get --app $app --key mysqlpwd) +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +admin=$(ynh_app_setting_get --app=$app --key=admin) +port=$(ynh_app_setting_get --app=$app --key=port) +secret_key=$(ynh_app_setting_get --app=$app --key=secret_key) +service_autodiscovery=$(ynh_app_setting_get --app=$app --key=service_autodiscovery) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$(ynh_app_setting_get --app=$app --key=db_user) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) + +#================================================= +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + ynh_clean_check_starting + # 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 #================================================= # STANDARD MODIFICATIONS #================================================= - -ynh_script_progression --message="Updating nginx configuration..." - # MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." + nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the domain for nginx +# Change the domain for NGINX if [ "$old_domain" != "$domain" ] then # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file "$nginx_conf_path" + ynh_delete_file_checksum --file="$nginx_conf_path" mv $nginx_conf_path /etc/nginx/conf.d/$domain.d/$app.conf # Store file checksum for the new config file location - ynh_store_file_checksum --file "/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.d/$app.conf" fi +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +# ... +#================================================= + config_nginx # Update horde config ynh_script_progression --message="Configuring application..." --weight=3 config_horde +#================================================= +# GENERIC FINALISATION +#================================================= # RELOAD NGINX -systemctl reload nginx +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." -ynh_script_progression --message="Change of URL completed for $app" --last +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" diff --git a/scripts/install b/scripts/install index 4568211..140ed0b 100755 --- a/scripts/install +++ b/scripts/install @@ -3,51 +3,64 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source _common.sh source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + ynh_clean_check_starting +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -ynh_script_progression --message="Validating installation parameters..." - +#================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= + domain=$YNH_APP_ARG_DOMAIN path_url=$(ynh_normalize_url_path --path_url $YNH_APP_ARG_PATH) -admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC -service_autodiscovery=$YNH_APP_ARG_SERVICE_AUTODISCOVERY language=$YNH_APP_ARG_LANGUAGE +admin=$YNH_APP_ARG_ADMIN +service_autodiscovery=$YNH_APP_ARG_SERVICE_AUTODISCOVERY whups_install=$YNH_APP_ARG_WHUPS_INSTALL sesha_install=$YNH_APP_ARG_SESHA_INSTALL ansel_install=$YNH_APP_ARG_ANSEL_INSTALL wicked_install=$YNH_APP_ARG_WICKED_INSTALL -# Set variable -final_path="/var/www/$app" +app=$YNH_APP_INSTANCE_NAME -# STORE SETTINGS FROM MANIFEST -ynh_script_progression --message="Storing installation settings..." -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 final_path --value $final_path -ynh_app_setting_set --app $app --key is_public --value $is_public -ynh_app_setting_set --app $app --key service_autodiscovery --value $service_autodiscovery -ynh_app_setting_set --app $app --key whups_install --value $whups_install -ynh_app_setting_set --app $app --key sesha_install --value $sesha_install -ynh_app_setting_set --app $app --key ansel_install --value $ansel_install -ynh_app_setting_set --app $app --key wicked_install --value $wicked_install +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." + +final_path=/var/www/$app +test ! -e "$final_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 -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -test ! -e "$final_path" || ynh_die --message "This path already contains a folder" +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." + +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=language --value=$language +ynh_app_setting_set --app=$app --key=admin --value=$admin +ynh_app_setting_set --app=$app --key=service_autodiscovery --value=$service_autodiscovery +ynh_app_setting_set --app=$app --key=whups_install --value=$whups_install +ynh_app_setting_set --app=$app --key=sesha_install --value=$sesha_install +ynh_app_setting_set --app=$app --key=ansel_install --value=$ansel_install +ynh_app_setting_set --app=$app --key=wicked_install --value=$wicked_install # Set list of optionnal app to install optionnal_apps_list="" @@ -85,32 +98,85 @@ then locale-gen fi +#================================================= # INSTALL DEPENDENCIES +#================================================= ynh_script_progression --message="Installing dependencies..." --weight=7 + install_dependance -# CREATE A MYSQL DATABASE -ynh_script_progression --message="Configuring MySQL database..." -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_app_setting_set --app $app --key db_user --value $db_user -ynh_mysql_setup_db --db_name $db_name --db_user $db_user +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." # Create a system user -ynh_script_progression --message="Configuring system user..." -ynh_system_user_create --username $app +ynh_system_user_create --username=$app --home_dir="$final_path" +#================================================= +# CREATE A MYSQL DATABASE +#================================================= +ynh_script_progression --message="Creating a MySQL database..." + +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_app_setting_set --app=$app --key=db_user --value=$db_user +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." + +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +mkdir $final_path +mkdir $final_path/data + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." + +# Create a dedicated NGINX config +config_nginx + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring PHP-FPM..." + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config + +#================================================= +# SPECIFIC SETUP +#================================================= +# CREATE DATA DIRECTORY +#================================================= +ynh_script_progression --message="Creating a data directory..." + +gollem_data_dir=/home/yunohost.app/$app +ynh_app_setting_set --app=$app --key=gollem_data_dir --value=$gollem_data_dir + +mkdir -p $gollem_data_dir + +chmod 750 "$gollem_data_dir" +chmod -R o-rwx "$gollem_data_dir" +chown -R $app:www-data "$gollem_data_dir" + +#================================================= +# ... +#================================================= # Set execution for expect scripts chmod +x ../conf/init_horde_install.exp chmod +x ../conf/config_horde.exp -# Install horde by pear -ynh_script_progression --message="Creating base directory..." -mkdir $final_path -mkdir $final_path/data -mkdir -p $gollem_data_dir - ynh_script_progression --message="Installing sources files..." --weight=7 pear config-create "$final_path" "$final_path/pear.conf" @@ -131,7 +197,7 @@ $pear_cmd install -a -B horde/webmail $optionnal_apps_list PHP_PEAR_SYSCONF_DIR=$final_path ../conf/config_horde.exp "$final_path" "$db_name" "$db_user" "$db_pwd" "$admin" secret_key=$(grep 'secret_key' "$final_path/horde/config/conf.php" | cut -d"'" -f4) -ynh_app_setting_set --app $app --key secret_key --value "$secret_key" +ynh_app_setting_set --app=$app --key=secret_key --value="$secret_key" # Patch the app ynh_script_progression --message="Patching application..." --weight=7 @@ -141,34 +207,42 @@ patch_app ynh_script_progression --message="Configuring application..." --weight=3 config_horde -# Create a dedicated nginx config -ynh_script_progression --message="Configuring nginx..." --weight=1 -config_nginx - -# Create a dedicated php-fpm config -ynh_add_fpm_config - -#================================================= -# GENERIC FINALIZATION -#================================================= - # SECURE FILES AND DIRECTORIES ynh_script_progression --message="Protecting directory..." set_permission -# configure the sso -ynh_script_progression --message="Configuring permissions..." -if [ "$is_public" = "0" ]; -then # Retire l'accès public - ynh_app_setting_delete --app $app --key skipped_uris -else - ynh_app_setting_set --app $app --key unprotected_uris --value "/" -fi - +#================================================= +# GENERIC FINALIZATION +#================================================= # SETUP LOGROTATE +#================================================= ynh_script_progression --message="Configuring log rotation..." + ynh_use_logrotate $final_path/horde --nonappend --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services --append --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services/portal --append --specific_user www-data/horde -ynh_script_progression --message="Installation of $app completed" --last +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." + +if [ "$is_public" = "0" ]; +then # Retire l'accès public + ynh_app_setting_delete --app=$app --key=skipped_uris +else + ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" +fi + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Installation of $app completed" diff --git a/scripts/remove b/scripts/remove index 6d8bebb..842a6aa 100755 --- a/scripts/remove +++ b/scripts/remove @@ -3,56 +3,96 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Source YunoHost helpers +source _common.sh source /usr/share/yunohost/helpers -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - +#================================================= +# LOAD SETTINGS +#================================================= ynh_script_progression --message="Loading installation settings..." -# Retrieve app settings app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get --app $app --key domain) -port=$(ynh_app_setting_get --app $app --key port) -db_name=$(ynh_app_setting_get --app $app --key db_name) -db_user=$(ynh_app_setting_get --app $app --key db_user) -final_path=$(ynh_app_setting_get --app $app --key final_path) + +domain=$(ynh_app_setting_get --app=$app --key=domain) +port=$(ynh_app_setting_get --app=$app --key=port) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$(ynh_app_setting_get --app=$app --key=db_user) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # STANDARD REMOVE #================================================= - -# Remove metapackage and its dependencies -ynh_script_progression --message="Removing dependencies" --weight=10 -ynh_remove_app_dependencies - -# Remove a database if it exists, along with the associated user -ynh_script_progression --message="Removing databases..." -ynh_mysql_remove_db --db_user $db_user --db_name $db_name - -# Remove the app directory securely -ynh_script_progression --message="Removing code..." -ynh_secure_remove --file="$final_path" - -# Remove user data -ynh_script_progression --message="Removing user data..." -ynh_secure_remove --file="$gollem_data_dir" - -# Remove the dedicated nginx config -ynh_script_progression --message="Removing nginx configuration..." -ynh_remove_nginx_config - -# Remove the dedicated php-fpm config -ynh_remove_fpm_config - -# Delete a system user -ynh_script_progression --message="Removing the dedicated system user..." -ynh_system_user_delete --username $app +# REMOVE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Removing logrotate configuration..." # Remove the app-specific logrotate config ynh_remove_logrotate -ynh_script_progression --message="Removal of $app completed" --last +#================================================= +# REMOVE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Removing the MySQL database..." + +# Remove a database if it exists, along with the associated user +ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." + +# Remove the dedicated NGINX config +ynh_remove_nginx_config + +#================================================= +# REMOVE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Removing PHP-FPM configuration..." + +# Remove the dedicated PHP-FPM config +ynh_remove_fpm_config + +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + +#================================================= +# SPECIFIC REMOVE +#================================================= +# REMOVE VARIOUS FILES +#================================================= +ynh_script_progression --message="Removing various files..." + +ynh_secure_remove --file="$gollem_data_dir" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." + +# Delete a system user +ynh_system_user_delete --username=$app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" diff --git a/scripts/restore b/scripts/restore index 4a3fda3..1d88bf7 100755 --- a/scripts/restore +++ b/scripts/restore @@ -3,67 +3,134 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Source YunoHost 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 -# Stop script if errors +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + ynh_clean_check_starting +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Import common cmd -source ../settings/scripts/experimental_helper.sh -source ../settings/scripts/_common.sh +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." -ynh_script_progression --message="Loading settings..." +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) -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) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$(ynh_app_setting_get --app=$app --key=db_user) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +gollem_data_dir=$(ynh_app_setting_get --app=$app --key=gollem_data_dir) +#================================================= # CHECK IF THE APP CAN BE RESTORED -ynh_webpath_available --domain $domain --path_url $path_url \ - || ynh_die --message "Path not available: ${domain}${path_url}" +#================================================= +ynh_script_progression --message="Validating restoration parameters..." + test ! -d $final_path \ - || ynh_die --message "There is already a directory: $final_path " + || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS #================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX web server configuration..." -# Define and install dependencies -ynh_script_progression --message="Reinstalling dependencies..." --weight=5 -install_dependance +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..." # Create the dedicated user (if not existing) -ynh_system_user_create --username $app +ynh_system_user_create --username=$app --home_dir="$final_path" -# Restore all config and data -ynh_script_progression --message="Restoring files..." --weight=10 -ynh_restore +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring the app main directory..." +ynh_restore_file --origin_path="$final_path" + +#================================================= +# RESTORE THE DATA DIRECTORY +#================================================= +ynh_script_progression --message="Restoring the data directory..." + +ynh_restore_file --origin_path="$gollem_data_dir" + +mkdir -p $datadir + +#================================================= +# RESTORE THE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the PHP-FPM configuration..." + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + + +#================================================= +# SPECIFIC RESTORATION +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=5 + +install_dependance + + +#================================================= # RESTORE THE MYSQL DATABASE -ynh_script_progression --message="Restoring database..." --weight=3 -db_pwd=$(ynh_app_setting_get --app $app --key mysqlpwd) -ynh_mysql_setup_db --db_user $db_name --db_name $db_name --db_pwd $db_pwd -ynh_mysql_connect_as --user $db_name --password $db_pwd --database $db_name < ./db.sql +#================================================= +ynh_script_progression --message="Restoring the MySQL database..." + +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql #================================================= -# GENERIC FINALIZATION +# RESTORE VARIOUS FILES #================================================= +ynh_script_progression --message="Restoring various files..." -# SECURE FILES AND DIRECTORIES -ynh_script_progression --message="Protecting directory..." set_permission -# SETUP LOGROTATE -ynh_script_progression --message="Configuring log rotation..." +#================================================= +# RESTORE THE LOGROTATE CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the logrotate configuration..." + ynh_use_logrotate $final_path/horde --nonappend --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services --append --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services/portal --append --specific_user www-data/horde -# Reload services -systemctl reload php5-fpm -systemctl reload nginx +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." -ynh_script_progression --message="Restoration completed for $app" --last +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" diff --git a/scripts/upgrade b/scripts/upgrade index dee9cef..467c060 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,36 +3,47 @@ #================================================= # GENERIC START #================================================= - # IMPORT GENERIC HELPERS +#================================================= + +source _common.sh source /usr/share/yunohost/helpers -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - +#================================================= +# LOAD SETTINGS +#================================================= ynh_script_progression --message="Loading installation settings..." -# LOAD SETTINGS -domain=$(ynh_app_setting_get --app $app --key domain) -path_url=$(ynh_normalize_url_path --path_url $(ynh_app_setting_get --app $app --key path)) -admin=$(ynh_app_setting_get --app $app --key admin) -service_autodiscovery=$(ynh_app_setting_get --app $app --key service_autodiscovery) -final_path=$(ynh_app_setting_get --app $app --key final_path) -port=$(ynh_app_setting_get --app $app --key port) -secret_key=$(ynh_app_setting_get --app $app --key secret_key) -db_name=$(ynh_app_setting_get --app $app --key db_name) -db_user=$(ynh_app_setting_get --app $app --key db_user) -db_pwd=$(ynh_app_setting_get --app $app --key mysqlpwd) +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) +service_autodiscovery=$(ynh_app_setting_get --app=$app --key=service_autodiscovery) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +port=$(ynh_app_setting_get --app=$app --key=port) +secret_key=$(ynh_app_setting_get --app=$app --key=secret_key) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$(ynh_app_setting_get --app=$app --key=db_user) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) + +#================================================= +# CHECK VERSION +#================================================= +ynh_script_progression --message="Checking version..." + +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." # Backup the current version of the app ynh_backup_before_upgrade - ynh_clean_setup () { - # restore it if the upgrade fails + ynh_clean_check_starting + # Restore it if the upgrade fails ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script @@ -41,11 +52,53 @@ ynh_abort_if_errors #================================================= # STANDARD UPGRADE STEPS #================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." -# INSTALL DEPENDENCIES +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." + +# Create a dedicated NGINX config +config_nginx + +#================================================= +# UPGRADE DEPENDENCIES +#================================================= ynh_script_progression --message="Upgrading dependencies..." + install_dependance +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading PHP-FPM configuration..." + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config + +#================================================= +# SPECIFIC UPGRADE +#================================================= +# ... +#================================================= # Upgrade Horde by PEAR ynh_script_progression --message="Upgrading source files..." --weight=6 pear_cmd="$final_path/pear/pear -c $final_path/pear.conf" @@ -60,23 +113,30 @@ patch_app ynh_script_progression --message="Configuring application..." --weight=3 config_horde -# NGINX CONFIGURATION -# Create a dedicated nginx config -ynh_script_progression --message="Configuring nginx..." --weight=1 -config_nginx - -#================================================= -# GENERIC FINALIZATION -#================================================= - # SECURE FILES AND DIRECTORIES ynh_script_progression --message="Protecting directory..." set_permission +#================================================= +# GENERIC FINALIZATION +#================================================= # SETUP LOGROTATE -ynh_script_progression --message="Configuring log rotation..." +#================================================= +ynh_script_progression --message="Upgrading logrotate configuration..." + ynh_use_logrotate $final_path/horde --nonappend --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services --append --specific_user www-data/horde ynh_use_logrotate $final_path/horde/services/portal --append --specific_user www-data/horde -ynh_script_progression --message="Upgrade of $app completed" --last +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed"