From 77c587f4d7081ae38f193881983db206e6b866b5 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot Date: Thu, 13 May 2021 17:47:50 +0200 Subject: [PATCH 1/7] [autopatch] Update issue and PR 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 e81e13519f0904d86ffb1e6577a9b23593866be0 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 9 Mar 2022 00:27:32 +0100 Subject: [PATCH 2/7] 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" From 61dc182a21a06f7cdb70e20e1a40b2ef3c2814fc Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 8 Mar 2022 23:27:37 +0000 Subject: [PATCH 3/7] Auto-update README --- README.md | 103 ++++++++++++++------------------------------------- README_fr.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 76 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index 34a10c9..1bb7002 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,32 @@ -Horde for yunohost -================== + -[![Integration level](https://dash.yunohost.org/integration/horde.svg)](https://ci-apps.yunohost.org/ci/apps/horde%20%28Community%29/lastBuild/consoleFull) -[![Install horde with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=horde) +# Horde for YunoHost -> *This package allow you to install horde quickly and simply on a YunoHost server. -If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* +[![Integration level](https://dash.yunohost.org/integration/horde.svg)](https://dash.yunohost.org/appci/app/horde) ![](https://ci-apps.yunohost.org/ci/badges/horde.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/horde.maintain.svg) +[![Install Horde with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=horde) -Overview --------- +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install Horde 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 A groupware (webmail, adressbook, calendar) witch use PHP -**Shipped version:** 5.2.22 -Screenshots ------------ +**Shipped version:** 5.2.22~ynh4 -![](https://www.horde.org/images/slides/h5slider.png) +**Demo:** http://demo.horde.org -Demo ----- +## Screenshots -* [Official demo](http://demo.horde.org/) +![](./doc/screenshots/screenshot01.png) -Documentation -------------- - - * Official documentation: https://wiki.horde.org/ - * YunoHost documentation: There no other documentations, feel free to contribute. - -YunoHost specific features --------------------------- - -### Multi-users support - -This app support the SSO and LDAP. - -### Supported architectures - -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/horde%20(Community).svg)](https://ci-apps.yunohost.org/ci/apps/horde/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/horde%20(Community).svg)](https://ci-apps-arm.yunohost.org/ci/apps/horde/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/jenkins/job/horde%20(Community).svg)](https://ci-stretch.nohost.me/jenkins/job/horde/) - - - - -Additional informations ------------------------ +## Disclaimers / important information ### Customisation @@ -103,31 +79,17 @@ For calendar, task and addressbook activeSync has been configured but not yet te - Complete the form and save it. - You might be able to sed an email now. -Links ------ +## Documentation and resources - * Report a bug: https://github.com/YunoHost-Apps/horde_ynh/issues - * App website: https://www.horde.org/ - * YunoHost website: https://yunohost.org/ +* Official app website: https://www.horde.org +* Official admin documentation: https://wiki.horde.org +* Upstream app code repository: https://github.com/horde +* YunoHost documentation for this app: https://yunohost.org/app_horde +* Report a bug: https://github.com/YunoHost-Apps/horde_ynh/issues ---- +## Developer info -Install -------- - -From command line: - -`sudo yunohost app install -l horde https://github.com/YunoHost-Apps/horde_ynh` - -Upgrade -------- - -From command line: - -`sudo yunohost app upgrade horde -u https://github.com/YunoHost-Apps/horde_ynh` - -Developers infos ----------------- +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/horde_ynh/tree/testing). To try the testing branch, please proceed like that. ``` @@ -136,15 +98,4 @@ or sudo yunohost app upgrade horde -u https://github.com/YunoHost-Apps/horde_ynh/tree/testing --debug ``` -License -------- - -Horde is published under the GPL-2.0, LGPL-2.1, BSD-2-Clause, ASL, OSI certified -All information about the licence for each part is available here : http://pear.horde.org/ - -TODO ----- - -- [ ] Service auto-discovery test -- [ ] Improve doc -- [ ] Improve https://vm-yh-2.lan/horde/test.php to have all optional dependence installed +**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 new file mode 100644 index 0000000..b509c30 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,97 @@ +# Horde pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/horde.svg)](https://dash.yunohost.org/appci/app/horde) ![](https://ci-apps.yunohost.org/ci/badges/horde.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/horde.maintain.svg) +[![Installer Horde avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=horde) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer Horde 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 + +A groupware (webmail, adressbook, calendar) witch use PHP + + +**Version incluse :** 5.2.22~ynh4 + +**Démo :** http://demo.horde.org + +## Captures d'écran + +![](./doc/screenshots/screenshot01.png) + +## Avertissements / informations importantes + +### 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. + +## Documentations et ressources + +* Site officiel de l'app : https://www.horde.org +* Documentation officielle de l'admin : https://wiki.horde.org +* Dépôt de code officiel de l'app : https://github.com/horde +* Documentation YunoHost pour cette app : https://yunohost.org/app_horde +* Signaler un bug : https://github.com/YunoHost-Apps/horde_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/horde_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/horde_ynh/tree/testing --debug +ou +sudo yunohost app upgrade horde -u https://github.com/YunoHost-Apps/horde_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 6aedbebafce3635f735518f12a41bab3b8bd39c6 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 9 Mar 2022 20:12:38 +0100 Subject: [PATCH 4/7] Fix missing datadir --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 1d88bf7..19bdbdd 100755 --- a/scripts/restore +++ b/scripts/restore @@ -74,7 +74,7 @@ ynh_script_progression --message="Restoring the data directory..." ynh_restore_file --origin_path="$gollem_data_dir" -mkdir -p $datadir +mkdir -p $gollem_data_dir #================================================= # RESTORE THE PHP-FPM CONFIGURATION From ccedd72be8feecda9bd2df6c3874b6d82a6f853f Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 9 Mar 2022 20:17:10 +0100 Subject: [PATCH 5/7] Fix change url --- scripts/change_url | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 215d4d7..3b0fbb9 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -14,8 +14,11 @@ source /usr/share/yunohost/helpers #================================================= old_domain=$YNH_APP_OLD_DOMAIN -domain=$YNH_APP_NEW_DOMAIN -path_url=$(ynh_normalize_url_path --path_url ${YNH_APP_NEW_PATH:-'/'}) +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$(ynh_normalize_url_path --path_url ${YNH_APP_NEW_PATH:-'/'}) + app=$YNH_APP_INSTANCE_NAME #================================================= @@ -25,6 +28,8 @@ 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) + +# Add settings here as needed by your application 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) @@ -32,6 +37,7 @@ service_autodiscovery=$(ynh_app_setting_get --app=$app --key=service_autodiscove 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) +gollem_data_dir=$(ynh_app_setting_get --app=$app --key=gollem_data_dir) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP @@ -77,13 +83,13 @@ 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 -if [ "$old_domain" != "$domain" ] +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/$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" + # 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 #================================================= @@ -92,6 +98,8 @@ fi # ... #================================================= +domain=$new_domain +path_url=$new_path config_nginx # Update horde config From 5cb81a5ccd6a2b3d28b88dda6a843ef0918780c6 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 9 Mar 2022 20:17:17 +0100 Subject: [PATCH 6/7] fix upgrade --- scripts/upgrade | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/upgrade b/scripts/upgrade index 467c060..3111fb3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,6 +26,7 @@ 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) +gollem_data_dir=$(ynh_app_setting_get --app=$app --key=gollem_data_dir) #================================================= # CHECK VERSION From 89d396f77c516cab3fc2a48f1a4635388633907c Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 10 Mar 2022 21:04:07 +0100 Subject: [PATCH 7/7] Fix missing gollem_data_dir --- scripts/upgrade | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 3111fb3..6ee3b41 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -64,6 +64,11 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi +# If final_path doesn't exist, create it +if [ -z "$gollem_data_dir" ]; then + gollem_data_dir=/home/yunohost.app/$app + ynh_app_setting_set --app=$app --key=gollem_data_dir --value=$gollem_data_dir +fi #================================================= # CREATE DEDICATED USER #=================================================