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)
diff --git a/README.md b/README.md
index bfa371a..4598e6a 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,39 @@
+
+
# Mailman3 for YunoHost
-[![Integration level](https://dash.yunohost.org/integration/mailman3.svg)](https://dash.yunohost.org/appci/app/mailman3)
-[![Install Mailman3 with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=mailman3)
+[![Integration level](https://dash.yunohost.org/integration/mailman3.svg)](https://dash.yunohost.org/appci/app/mailman3) ![](https://ci-apps.yunohost.org/ci/badges/mailman3.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mailman3.maintain.svg)
+[![Install Mailman3 with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mailman3)
*[Lire ce readme en français.](./README_fr.md)*
-> This package allow you to install Mailman3 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.*
-
-## Status
-
-**Experimental.**
-
-Please review the [issues list](https://github.com/YunoHost-Apps/mailman3_ynh/issues) before choosing to install this application.
-
-There is also a [community forum thread](https://forum.yunohost.org/t/community-app-mailman3-free-software-for-managing-electronic-mail-discussion-and-e-newsletter-lists/9077/2) for this application.
+> *This package allows you to install Mailman3 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
-This is GNU Mailman, a mailing list management system distributed under the terms of the GNU General Public License (GPL) version 3 or later. Mailman is written in Python which is available for all platforms that Mailman is supported on, including GNU/Linux and most other Unix-like operating systems (e.g. Solaris, *BSD, MacOSX, etc.).
+Electronic mailing lists manager
-> http://docs.mailman3.org/en/latest/userguide.html
+**Shipped version:** 1.0~ynh1
-**Shipped version:** 3.2.0
+**Demo:** https://lists.mailman3.org/mailman3/lists/
## Screenshots
-![](https://image.slidesharecdn.com/hyperkitty-160201173833/95/hyperkitty-a-web-interface-for-gnu-mailman-3-8-638.jpg?cb=1454349750)
+![](./doc/screenshots/screenshot1.webp)
-## Demo
+## Disclaimers / important information
-* [Official demo](https://lists.mailman3.org/mailman3/lists/)
+* Any known limitations, constrains or stuff not working, such as (but not limited to):
+ * requiring a full dedicated domain
-No user/password is provided, so you must sign up.
+* Other infos that people should be aware of, such as:
+ * No LDAP support yet (apparently under development)
+ * Users can also just sign up themselves to manage details
+ * Users can use mailing lists without signing up?
## Post-installation steps
@@ -108,19 +108,6 @@ It is important to note that this package makes use of the [mailman3-full](http:
Finally, you also configure things through the Django web admin available at `/admin/`.
-## YunoHost specific features
-
-#### Multi-users support
-
-* No LDAP support yet (apparently under development)
-* Users can also just sign up themselves to manage details
-* Users can use mailing lists without signing up
-
-#### Supported architectures
-
-* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mailman3%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mailman3/)
-* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/mailman3%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mailman3/)
-
## Limitations
* Migrating from Mailman 2.X is not officially supported, sorry. However, there is a manual and
@@ -132,35 +119,24 @@ Finally, you also configure things through the Django web admin available at `/a
* There may be only one installation per YunoHost.
-## Mirroring
+## Documentation and resources
-* https://github.com/YunoHost-Apps/mailman3_ynh
-* https://hack.decentral1.se/yunohost-packages/mailman3_ynh
+* Official app website: http://www.list.org/
+* Official user documentation: http://docs.mailman3.org/en/latest/userguide.html
+* Official admin documentation: https://docs.mailman3.org/en/latest/
+* Upstream app code repository: https://gitlab.com/mailman/mailman-suite
+* YunoHost documentation for this app: https://yunohost.org/app_mailman3
+* Report a bug: https://github.com/YunoHost-Apps/mailman3_ynh/issues
-## Links
+## Developer info
- * Report a bug: https://github.com/YunoHost-Apps/mailman3_ynh/issues
- * App website: http://docs.mailman3.org/en/latest/index.html
- * Upstream app repository: https://gitlab.com/mailman/mailman-suite
- * YunoHost website: https://yunohost.org/
-
----
-
-Developers info
-----------------
-
-**Only if you want to use a testing branch for coding, instead of merging directly into master.**
-
-Please make your pull request against the [testing branch](https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing).
-
-To try the testing branch:
+Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing).
+To try the testing branch, please proceed like that.
```
-$ yunohost app install https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
+sudo yunohost app install https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
+or
+sudo yunohost app upgrade mailman3 -u https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
```
-Or to upgrade from the testing branch:
-
-```bash
-$ yunohost app upgrade mailman3 -u https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
-```
+**More info regarding app packaging:** https://yunohost.org/packaging_apps
\ No newline at end of file
diff --git a/README_fr.md b/README_fr.md
index a679816..74b2709 100644
--- a/README_fr.md
+++ b/README_fr.md
@@ -1,5 +1,138 @@
# Mailman3 pour YunoHost
-Please help me maintain this with translations!
+[![Niveau d'intégration](https://dash.yunohost.org/integration/mailman3.svg)](https://dash.yunohost.org/appci/app/mailman3) ![](https://ci-apps.yunohost.org/ci/badges/mailman3.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mailman3.maintain.svg)
+[![Installer Mailman3 avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mailman3)
-Sorry!
+*[Read this readme in english.](./README.md)*
+*[Lire ce readme en français.](./README_fr.md)*
+
+> *Ce package vous permet d'installer Mailman3 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
+
+Un gestionnaire de liste de discussion par email
+
+**Version incluse :** 1.0~ynh1
+
+**Démo :** https://lists.mailman3.org/mailman3/lists/
+
+## Captures d'écran
+
+![](./doc/screenshots/screenshot1.webp)
+
+## Avertissements / informations importantes
+
+* Any known limitations, constrains or stuff not working, such as (but not limited to):
+ * requiring a full dedicated domain
+
+* Other infos that people should be aware of, such as:
+ * No LDAP support yet (apparently under development)
+ * Users can also just sign up themselves to manage details
+ * Users can use mailing lists without signing up?
+
+## Post-installation steps
+
+### Setup Admin User
+
+You must [configure the admin user](http://docs.mailman3.org/en/latest/config-web.html#setting-up-admin-account):
+
+```bash
+$ cd /usr/share/mailman3-web
+$ python3 manage.py createsuperuser
+```
+
+You should then attempt to log in with this user account in the web UI. Once you've logged in, a confirmation mail will be sent to your email address that you specified. Therefore, you should have something like [Rainloop](https://github.com/YunoHost-Apps/rainloop_ynh) installed to view mail on your YunoHost installation.
+
+### Setup your main domain
+
+You'll need to log in as administrator and visit the `/admin/site/site`.
+
+If you're Mailman3 is setup on `https://myyunohost.org` then that would be the following:
+
+> https://myyunohost.org/admin/site/site
+
+### Configure incoming mail
+
+Mailman3 implements an LMTP server for receiving mail from Postfix. This means that Mailman3 doesn't need anything from Dovecot. This is important to understand because Dovecot is the default YunoHost local delivery agent. Therefore, the default YunoHost Postfix configuration uses Dovecot. So, in order to deliver incoming mail, we need to override which delivery agent handles which mails based on the addresses. In other words, if you create a mailing list "mylist@myyunohost.org" you want Mailman3's LMTP server to receive this, *not* Dovecot, becaues Dovecot only delivers to LDAP created user accounts.
+
+You'll need to add this to your Postfix configuration:
+
+```bash
+owner_request_special = no
+
+transport_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+
+local_recipient_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+
+virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf, hash:/var/lib/mailman3/data/postfix_lmtp
+```
+
+And then run:
+
+```bash
+$ sudo -su list mailman aliases
+```
+
+This is unfortunately a manual step at this point because the package remains experimental. Once it matures, this will be integrated into a hook or the default Postfix configuration. For now, remember that when you run `yunohost tools regen-conf postfix` or if any installation invokes `regen-conf`, your Postfix configuration will not be changed because it has diverged from the default configuration. This may cause you problems if YunoHost core expects that there is some new value in your Postfix configuration.
+
+### Configure outgoing mail
+
+Postfix relies on using SMTP which should be configured in your `/etc/postfix/main.cf`.
+
+You should make sure that you have outgoing mail working before getting started with Mailman 3.
+
+## General Configuration
+
+Mailman 3 or "The Mailman Suite" is made up of 5 moving parts. See the following documentation for more:
+
+> http://docs.mailman3.org/en/latest/index.html#the-mailman-suite
+
+On your YunoHost, all the configuration files you need to worry about are in:
+
+* `/etc/mailman3/`
+* `/usr/share/mailman3-web/`
+
+The services you need to manage can be checked with:
+
+* `systemctl status mailman3`
+* `systemctl status mailman3-web`
+
+It is important to note that this package makes use of the [mailman3-full](http://docs.mailman3.org/en/latest/prodsetup.html#distribution-packages) Debian package contained in the Debian Stretch backports repository. The default installation assumes the use of a SQLite3 database but the installation script overrides this and uses a PostgreSQL database instead.
+
+Finally, you also configure things through the Django web admin available at `/admin/`.
+
+## Limitations
+
+* Migrating from Mailman 2.X is not officially supported, sorry. However, there is a manual and
+ which details an experimental process. Please see [the documentation](https://docs.mailman3.org/en/latest/migration.html).
+
+* Mailman3 must be configured to use a root domain (https://myyunohost.org and not https://myyunohost.org/mailman3).
+
+* You must have a HTTPS certificate installed on the root domain.
+
+* There may be only one installation per YunoHost.
+
+## Documentations et ressources
+
+* Site officiel de l'app : http://www.list.org/
+* Documentation officielle utilisateur : http://docs.mailman3.org/en/latest/userguide.html
+* Documentation officielle de l'admin : https://docs.mailman3.org/en/latest/
+* Dépôt de code officiel de l'app : https://gitlab.com/mailman/mailman-suite
+* Documentation YunoHost pour cette app : https://yunohost.org/app_mailman3
+* Signaler un bug : https://github.com/YunoHost-Apps/mailman3_ynh/issues
+
+## Informations pour les développeurs
+
+Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing).
+
+Pour essayer la branche testing, procédez comme suit.
+```
+sudo yunohost app install https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
+ou
+sudo yunohost app upgrade mailman3 -u https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
+```
+
+**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps
\ No newline at end of file
diff --git a/check_process.default b/check_process
similarity index 57%
rename from check_process.default
rename to check_process
index ffaa2b3..9a38718 100644
--- a/check_process.default
+++ b/check_process
@@ -1,8 +1,7 @@
;; Test complet
; Manifest
- domain="domain.tld" (DOMAIN)
- domain_ip="192.168.1.1"
- is_public=1 (PUBLIC|public=1|private=0)
+ domain="domain.tld"
+ is_public=1
; Checks
pkg_linter=1
setup_sub_dir=0
@@ -11,17 +10,13 @@
setup_private=1
setup_public=1
upgrade=1
- upgrade=1 from_commit=CommitHash
backup_restore=1
multi_instance=0
port_already_use=1
- change_url=1
-;;; Levels
- Level 5=auto
+ change_url=0
;;; Options
Email=
Notification=none
;;; Upgrade options
; commit=CommitHash
name=Name and date of the commit.
- manifest_arg=domain=DOMAIN&domain_ip='192.168.1.1'&is_public=1
diff --git a/conf/mailman-hyperkitty.cfg b/conf/mailman-hyperkitty.cfg
index eb7eb7a..aa582ed 100644
--- a/conf/mailman-hyperkitty.cfg
+++ b/conf/mailman-hyperkitty.cfg
@@ -1,3 +1,23 @@
+# mailman-hyperkitty.cfg
+# This is the mailman extension configuration file to enable HyperKitty as an
+# archiver. Remember to add the following lines in the mailman.cfg file:
+#
+# [archiver.hyperkitty]
+# class: mailman_hyperkitty.Archiver
+# enable: yes
+# configuration: /path/to/here/mailman-hyperkitty.cfg
+#
+
[general]
+
+# This is your HyperKitty installation, preferably on the localhost. This
+# address will be used by Mailman to forward incoming emails to HyperKitty
+# for archiving. It does not need to be publicly available, in fact it's
+# better if it is not.
+# However, if your Mailman installation is accessed via HTTPS, the URL needs
+# to match your SSL certificate (e.g. https://lists.example.com/hyperkitty).
base_url: https://__DOMAIN__/hyperkitty
+
+# Shared API key, must be the identical to the value in HyperKitty's
+# settings.
api_key: __ARCHIVER_KEY__
diff --git a/conf/mailman-web.py b/conf/mailman-web.py
index fc189a4..197984c 100644
--- a/conf/mailman-web.py
+++ b/conf/mailman-web.py
@@ -1,16 +1,32 @@
+# This file is imported by the Mailman Suite. It is used to override
+# the default settings from /usr/share/mailman3-web/settings.py.
+
+# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '__SECRET_KEY__'
ADMINS = (
('Mailman Suite Admin', 'root@__DOMAIN__'),
)
-ALLOWED_HOSTS = ['*']
+# Hosts/domain names that are valid for this site; required if DEBUG is False
+# See https://docs.djangoproject.com/en/1.8/ref/settings/#allowed-hosts
+# Set to '*' per default in the Deian package to allow all hostnames. Mailman3
+# is meant to run behind a webserver reverse proxy anyway.
+ALLOWED_HOSTS = [
+ #"localhost", # Archiving API from Mailman, keep it.
+ # "lists.your-domain.org",
+ # Add here all production URLs you may have.
+ '*'
+]
-MAILMAN_REST_API_URL = 'http://localhost:__PORT_WEB__'
+# Mailman API credentials
+MAILMAN_REST_API_URL = 'http://localhost:__PORT__'
MAILMAN_REST_API_USER = '__REST_API_ADMIN_USER__'
MAILMAN_REST_API_PASS = '__REST_API_ADMIN_PWD__'
MAILMAN_ARCHIVER_KEY = '__ARCHIVER_KEY__'
-MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1', '__DOMAIN_IP__')
+MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1')
+
+# Application definition
INSTALLED_APPS = (
'hyperkitty',
@@ -33,27 +49,60 @@ INSTALLED_APPS = (
'allauth',
'allauth.account',
'allauth.socialaccount',
+ 'django_mailman3.lib.auth.fedora',
+ #'allauth.socialaccount.providers.openid',
+ #'allauth.socialaccount.providers.github',
+ #'allauth.socialaccount.providers.gitlab',
+ #'allauth.socialaccount.providers.google',
+ #'allauth.socialaccount.providers.facebook',
+ #'allauth.socialaccount.providers.twitter',
+ #'allauth.socialaccount.providers.stackexchange',
)
+# Database
+# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
+
DATABASES = {
'default': {
+ # Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ #'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
- 'NAME': '__DB_NAME__',
- 'USER': '__DB_USER__',
- 'PASSWORD': '__DB_PWD__',
+ #'ENGINE': 'django.db.backends.mysql',
+ # DB name or path to database file if using sqlite3.
+ 'NAME': '__DB_NAME_WEB__',
+ # The following settings are not used with sqlite3:
+ 'USER': '__DB_USER_WEB__',
+ 'PASSWORD': '__DB_PWD_WEB__',
+ # HOST: empty for localhost through domain sockets or '127.0.0.1' for
+ # localhost through TCP.
'HOST': '',
+ # PORT: set to empty string for default.
'PORT': '',
+ # OPTIONS: Extra parameters to use when connecting to the database.
'OPTIONS': {
+ # Set sql_mode to 'STRICT_TRANS_TABLES' for MySQL. See
+ # https://docs.djangoproject.com/en/1.11/ref/
+ # databases/#setting-sql-mode
+ #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
+# If you're behind a proxy, use the X-Forwarded-Host header
+# See https://docs.djangoproject.com/en/1.8/ref/settings/#use-x-forwarded-host
USE_X_FORWARDED_HOST = True
+
+# And if your proxy does your SSL encoding for you, set SECURE_PROXY_SSL_HEADER
+# https://docs.djangoproject.com/en/1.8/ref/settings/#secure-proxy-ssl-header
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https')
+
+# Other security settings
SECURE_SSL_REDIRECT = True
+# If you set SECURE_SSL_REDIRECT to True, make sure the SECURE_REDIRECT_EXEMPT
+# contains at least this line:
SECURE_REDIRECT_EXEMPT = [
"archives/api/mailman/.*",
]
@@ -64,21 +113,76 @@ CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'DENY'
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.8/topics/i18n/
+
LANGUAGE_CODE = 'en-us'
+
TIME_ZONE = 'UTC'
+
USE_I18N = True
USE_L10N = True
USE_TZ = True
+
+# Set default domain for email addresses.
EMAILNAME = '__DOMAIN__'
-DEFAULT_FROM_EMAIL = 'postorius@{}'.format(EMAILNAME)
+
+# If you enable internal authentication, this is the address that the emails
+# will appear to be coming from. Make sure you set a valid domain name,
+# otherwise the emails may get rejected.
+# https://docs.djangoproject.com/en/1.8/ref/settings/#default-from-email
+# DEFAULT_FROM_EMAIL = "mailing-lists@you-domain.org"
+DEFAULT_FROM_EMAIL = 'root@{}'.format(EMAILNAME)
+
+# If you enable email reporting for error messages, this is where those emails
+# will appear to be coming from. Make sure you set a valid domain name,
+# otherwise the emails may get rejected.
+# https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-SERVER_EMAIL
+# SERVER_EMAIL = 'root@your-domain.org'
SERVER_EMAIL = 'root@{}'.format(EMAILNAME)
+
+# Django Allauth
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
+
+#
+# Social auth
+#
SOCIALACCOUNT_PROVIDERS = {
+ #'openid': {
+ # 'SERVERS': [
+ # dict(id='yahoo',
+ # name='Yahoo',
+ # openid_url='http://me.yahoo.com'),
+ # ],
+ #},
+ #'google': {
+ # 'SCOPE': ['profile', 'email'],
+ # 'AUTH_PARAMS': {'access_type': 'online'},
+ #},
+ #'facebook': {
+ # 'METHOD': 'oauth2',
+ # 'SCOPE': ['email'],
+ # 'FIELDS': [
+ # 'email',
+ # 'name',
+ # 'first_name',
+ # 'last_name',
+ # 'locale',
+ # 'timezone',
+ # ],
+ # 'VERSION': 'v2.4',
+ #},
}
+# On a production setup, setting COMPRESS_OFFLINE to True will bring a
+# significant performance improvement, as CSS files will not need to be
+# recompiled on each requests. It means running an additional "compress"
+# management command after each code upgrade.
+# http://django-compressor.readthedocs.io/en/latest/usage/#offline-compression
COMPRESS_OFFLINE = True
POSTORIUS_TEMPLATE_BASE_URL = 'https://__DOMAIN__'
diff --git a/conf/mailman.cfg b/conf/mailman.cfg
index 477a3f6..4b9c8c7 100644
--- a/conf/mailman.cfg
+++ b/conf/mailman.cfg
@@ -1,47 +1,214 @@
+# Copyright (C) 2008-2017 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see .
+
+# This file contains the Debian configuration for mailman. It uses ini-style
+# formats under the lazr.config regime to define all system configuration
+# options. See for details.
+
+
[mailman]
+# This address is the "site owner" address. Certain messages which must be
+# delivered to a human, but which can't be delivered to a list owner (e.g. a
+# bounce from a list owner), will be sent to this address. It should point to
+# a human.
site_owner: root@__DOMAIN__
+
+# This is the local-part of an email address used in the From field whenever a
+# message comes from some entity to which there is no natural reply recipient.
+# Mailman will append '@' and the host name of the list involved. This
+# address must not bounce and it must not point to a Mailman process.
noreply_address: noreply
+
+# The default language for this server.
default_language: en
+
+# Membership tests for posting purposes are usually performed by looking at a
+# set of headers, passing the test if any of their values match a member of
+# the list. Headers are checked in the order given in this variable. The
+# value From_ means to use the envelope sender. Field names are case
+# insensitive. This is a space separate list of headers.
sender_headers: from from_ reply-to sender
+
+# Mail command processor will ignore mail command lines after designated max.
email_commands_max_lines: 10
+
+# Default length of time a pending request is live before it is evicted from
+# the pending database.
pending_request_life: 3d
+
+# How long should files be saved before they are evicted from the cache?
cache_life: 7d
+
+# A callable to run with no arguments early in the initialization process.
+# This runs before database initialization.
pre_hook:
+
+# A callable to run with no arguments late in the initialization process.
+# This runs after adapters are initialized.
post_hook:
+
+# Which paths.* file system layout to use.
+# You should not change this variable.
layout: debian
+
+# Can MIME filtered messages be preserved by list owners?
filtered_messages_are_preservable: no
+
+# How should text/html parts be converted to text/plain when the mailing list
+# is set to convert HTML to plaintext? This names a command to be called,
+# where the substitution variable $filename is filled in by Mailman, and
+# contains the path to the temporary file that the command should read from.
+# The command should print the converted text to stdout.
html_to_plain_text_command: /usr/bin/lynx -dump $filename
+
+# Specify what characters are allowed in list names. Characters outside of
+# the class [-_.+=!$*{}~0-9a-z] matched case insensitively are never allowed,
+# but this specifies a subset as the only allowable characters. This must be
+# a valid character class regexp or the effect on list creation is
+# unpredictable.
listname_chars: [-_.0-9a-z]
+
[shell]
+# `mailman shell` (also `withlist`) gives you an interactive prompt that you
+# can use to interact with an initialized and configured Mailman system. Use
+# --help for more information. This section allows you to configure certain
+# aspects of this interactive shell.
+
+# Customize the interpreter prompt.
prompt: >>>
+
+# Banner to show on startup.
banner: Welcome to the GNU Mailman shell
+
+# Use IPython as the shell, which must be found on the system. Valid values
+# are `no`, `yes`, and `debug` where the latter is equivalent to `yes` except
+# that any import errors will be displayed to stderr.
use_ipython: no
+
+# Set this to allow for command line history if readline is available. This
+# can be as simple as $var_dir/history.py to put the file in the var directory.
history_file:
+
[paths.debian]
+# Important directories for Mailman operation. These are defined here so that
+# different layouts can be supported. For example, a developer layout would
+# be different from a FHS layout. Most paths are based off the var_dir, and
+# often just setting that will do the right thing for all the other paths.
+# You might also have to set spool_dir though.
+#
+# Substitutions are allowed, but must be of the form $var where 'var' names a
+# configuration variable in the paths.* section. Substitutions are expanded
+# recursively until no more $-variables are present. Beware of infinite
+# expansion loops!
+#
+# This is the root of the directory structure that Mailman will use to store
+# its run-time data.
var_dir: /var/lib/mailman3
+# This is where the Mailman queue files directories will be created.
queue_dir: $var_dir/queue
+# This is the directory containing the Mailman 'runner' and 'master' commands
+# if set to the string '$argv', it will be taken as the directory containing
+# the 'mailman' command.
bin_dir: /usr/lib/mailman3/bin
+# All list-specific data.
list_data_dir: $var_dir/lists
+# Directory where log files go.
log_dir: /var/log/mailman3
+# Directory for system-wide locks.
lock_dir: $var_dir/locks
+# Directory for system-wide data.
data_dir: $var_dir/data
+# Cache files.
cache_dir: $var_dir/cache
+# Directory for configuration files and such.
etc_dir: /etc/mailman3
+# Directory containing Mailman plugins.
ext_dir: $var_dir/ext
+# Directory where the default IMessageStore puts its messages.
messages_dir: $var_dir/messages
+# Directory for archive backends to store their messages in. Archivers should
+# create a subdirectory in here to store their files.
archive_dir: $var_dir/archives
+# Root directory for site-specific template override files.
template_dir: $var_dir/templates
+# There are also a number of paths to specific file locations that can be
+# defined. For these, the directory containing the file must already exist,
+# or be one of the directories created by Mailman as per above.
+#
+# This is where PID file for the master runner is stored.
pid_file: /run/mailman3/master.pid
+# Lock file.
lock_file: $lock_dir/master.lck
+
[database]
+# The class implementing the IDatabase.
+#class: mailman.database.sqlite.SQLiteDatabase
+#class: mailman.database.mysql.MySQLDatabase
class: mailman.database.postgresql.PostgreSQLDatabase
-url: postgres://__DB_USER__:__DB_PWD__@localhost/__DB_NAME__
+
+# Use this to set the Storm database engine URL. You generally have one
+# primary database connection for all of Mailman. List data and most rosters
+# will store their data in this database, although external rosters may access
+# other databases in their own way. This string supports standard
+# 'configuration' substitutions.
+#url: sqlite:///$DATA_DIR/mailman.db
+#url: mysql+pymysql://mailman3:mmpass@localhost/mailman3?charset=utf8&use_unicode=1
+url: postgres://__DB_USER_APP__:__DB_PWD_APP__@localhost/__DB_NAME_APP__
+
debug: no
+
[logging.debian]
+# This defines various log settings. The options available are:
+#
+# - level -- Overrides the default level; this may be any of the
+# standard Python logging levels, case insensitive.
+# - format -- Overrides the default format string
+# - datefmt -- Overrides the default date format string
+# - path -- Overrides the default logger path. This may be a relative
+# path name, in which case it is relative to Mailman's LOG_DIR,
+# or it may be an absolute path name. You cannot change the
+# handler class that will be used.
+# - propagate -- Boolean specifying whether to propagate log message from this
+# logger to the root "mailman" logger. You cannot override
+# settings for the root logger.
+#
+# In this section, you can define defaults for all loggers, which will be
+# prefixed by 'mailman.'. Use subsections to override settings for specific
+# loggers. The names of the available loggers are:
+#
+# - archiver -- All archiver output
+# - bounce -- All bounce processing logs go here
+# - config -- Configuration issues
+# - database -- Database logging (SQLAlchemy and Alembic)
+# - debug -- Only used for development
+# - error -- All exceptions go to this log
+# - fromusenet -- Information related to the Usenet to Mailman gateway
+# - http -- Internal wsgi-based web interface
+# - locks -- Lock state changes
+# - mischief -- Various types of hostile activity
+# - runner -- Runner process start/stops
+# - smtp -- Successful SMTP activity
+# - smtp-failure -- Unsuccessful SMTP activity
+# - subscribe -- Information about leaves/joins
+# - vette -- Message vetting information
format: %(asctime)s (%(process)d) %(message)s
datefmt: %b %d %H:%M:%S %Y
propagate: no
@@ -49,23 +216,58 @@ level: info
path: mailman.log
[webservice]
+# The hostname at which admin web service resources are exposed.
hostname: localhost
-port: __PORT_WEB__
+
+# The port at which the admin web service resources are exposed.
+port: __PORT__
+
+# Whether or not requests to the web service are secured through SSL.
use_https: no
+
+# Whether or not to show tracebacks in an HTTP response for a request that
+# raised an exception.
show_tracebacks: yes
+
+# The API version number for the current (highest) API.
api_version: 3.1
+
+# The administrative username.
admin_user: __REST_API_ADMIN_USER__
+
+# The administrative password.
admin_pass: __REST_API_ADMIN_PWD__
[mta]
+# The class defining the interface to the incoming mail transport agent.
+#incoming: mailman.mta.exim4.LMTP
incoming: mailman.mta.postfix.LMTP
+
+# The callable implementing delivery to the outgoing mail transport agent.
+# This must accept three arguments, the mailing list, the message, and the
+# message metadata dictionary.
outgoing: mailman.mta.deliver.deliver
+
+# How to connect to the outgoing MTA. If smtp_user and smtp_pass is given,
+# then Mailman will attempt to log into the MTA when making a new connection.
smtp_host: localhost
smtp_port: 25
smtp_user:
smtp_pass:
+
+# Where the LMTP server listens for connections. Use 127.0.0.1 instead of
+# localhost for Postfix integration, because Postfix only consults DNS
+# (e.g. not /etc/hosts).
lmtp_host: 127.0.0.1
lmtp_port: 8024
+
+# Where can we find the mail server specific configuration file? The path can
+# be either a file system path or a Python import path. If the value starts
+# with python: then it is a Python import path, otherwise it is a file system
+# path. File system paths must be absolute since no guarantees are made about
+# the current working directory. Python paths should not include the trailing
+# .cfg, which the file must end with.
+#configuration: python:mailman.config.exim4
configuration: python:mailman.config.postfix
[archiver.hyperkitty]
diff --git a/conf/nginx.conf b/conf/nginx.conf
index de08d50..2f11c13 100644
--- a/conf/nginx.conf
+++ b/conf/nginx.conf
@@ -1,11 +1,11 @@
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/run/mailman3-web/uwsgi.sock;
- include conf.d/yunohost_panel.conf.inc;
+ #include conf.d/yunohost_panel.conf.inc;
}
-location /mailman3/static {
- alias /var/lib/mailman3/web/static;
+location /mailman3/static/ {
+ alias /var/lib/mailman3/web/static/;
}
location /mailman3/static/favicon.ico {
diff --git a/doc/.gitkeep b/doc/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md
new file mode 100644
index 0000000..0359a49
--- /dev/null
+++ b/doc/DISCLAIMER.md
@@ -0,0 +1,91 @@
+* Any known limitations, constrains or stuff not working, such as (but not limited to):
+ * requiring a full dedicated domain
+
+* Other infos that people should be aware of, such as:
+ * No LDAP support yet (apparently under development)
+ * Users can also just sign up themselves to manage details
+ * Users can use mailing lists without signing up?
+
+## Post-installation steps
+
+### Setup Admin User
+
+You must [configure the admin user](http://docs.mailman3.org/en/latest/config-web.html#setting-up-admin-account):
+
+```bash
+$ cd /usr/share/mailman3-web
+$ python3 manage.py createsuperuser
+```
+
+You should then attempt to log in with this user account in the web UI. Once you've logged in, a confirmation mail will be sent to your email address that you specified. Therefore, you should have something like [Rainloop](https://github.com/YunoHost-Apps/rainloop_ynh) installed to view mail on your YunoHost installation.
+
+### Setup your main domain
+
+You'll need to log in as administrator and visit the `/admin/site/site`.
+
+If you're Mailman3 is setup on `https://myyunohost.org` then that would be the following:
+
+> https://myyunohost.org/admin/site/site
+
+### Configure incoming mail
+
+Mailman3 implements an LMTP server for receiving mail from Postfix. This means that Mailman3 doesn't need anything from Dovecot. This is important to understand because Dovecot is the default YunoHost local delivery agent. Therefore, the default YunoHost Postfix configuration uses Dovecot. So, in order to deliver incoming mail, we need to override which delivery agent handles which mails based on the addresses. In other words, if you create a mailing list "mylist@myyunohost.org" you want Mailman3's LMTP server to receive this, *not* Dovecot, becaues Dovecot only delivers to LDAP created user accounts.
+
+You'll need to add this to your Postfix configuration:
+
+```bash
+owner_request_special = no
+
+transport_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+
+local_recipient_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+
+virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf, hash:/var/lib/mailman3/data/postfix_lmtp
+```
+
+And then run:
+
+```bash
+$ sudo -su list mailman aliases
+```
+
+This is unfortunately a manual step at this point because the package remains experimental. Once it matures, this will be integrated into a hook or the default Postfix configuration. For now, remember that when you run `yunohost tools regen-conf postfix` or if any installation invokes `regen-conf`, your Postfix configuration will not be changed because it has diverged from the default configuration. This may cause you problems if YunoHost core expects that there is some new value in your Postfix configuration.
+
+### Configure outgoing mail
+
+Postfix relies on using SMTP which should be configured in your `/etc/postfix/main.cf`.
+
+You should make sure that you have outgoing mail working before getting started with Mailman 3.
+
+## General Configuration
+
+Mailman 3 or "The Mailman Suite" is made up of 5 moving parts. See the following documentation for more:
+
+> http://docs.mailman3.org/en/latest/index.html#the-mailman-suite
+
+On your YunoHost, all the configuration files you need to worry about are in:
+
+* `/etc/mailman3/`
+* `/usr/share/mailman3-web/`
+
+The services you need to manage can be checked with:
+
+* `systemctl status mailman3`
+* `systemctl status mailman3-web`
+
+It is important to note that this package makes use of the [mailman3-full](http://docs.mailman3.org/en/latest/prodsetup.html#distribution-packages) Debian package contained in the Debian Stretch backports repository. The default installation assumes the use of a SQLite3 database but the installation script overrides this and uses a PostgreSQL database instead.
+
+Finally, you also configure things through the Django web admin available at `/admin/`.
+
+## Limitations
+
+* Migrating from Mailman 2.X is not officially supported, sorry. However, there is a manual and
+ which details an experimental process. Please see [the documentation](https://docs.mailman3.org/en/latest/migration.html).
+
+* Mailman3 must be configured to use a root domain (https://myyunohost.org and not https://myyunohost.org/mailman3).
+
+* You must have a HTTPS certificate installed on the root domain.
+
+* There may be only one installation per YunoHost.
diff --git a/doc/screenshots/.gitkeep b/doc/screenshots/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/doc/screenshots/screenshot1.webp b/doc/screenshots/screenshot1.webp
new file mode 100644
index 0000000..2dab2f7
Binary files /dev/null and b/doc/screenshots/screenshot1.webp differ
diff --git a/manifest.json b/manifest.json
index 264e500..21e42f4 100644
--- a/manifest.json
+++ b/manifest.json
@@ -7,7 +7,15 @@
"fr": "Un gestionnaire de liste de discussion par email"
},
"version": "1.0~ynh1",
- "url": "http://docs.mailman3.org/",
+ "url": "http://www.list.org/",
+ "upstream": {
+ "license": "AGPL-3.0-or-later",
+ "website": "http://www.list.org/",
+ "demo": "https://lists.mailman3.org/mailman3/lists/",
+ "admindoc": "https://docs.mailman3.org/en/latest/",
+ "userdoc": "http://docs.mailman3.org/en/latest/userguide.html",
+ "code": "https://gitlab.com/mailman/mailman-suite"
+ },
"license": "AGPL-3.0-or-later",
"maintainer": {
"name": "decentral1se",
@@ -15,39 +23,22 @@
"url": "https://decentral1.se/"
},
"requirements": {
- "yunohost": ">= 3.6"
+ "yunohost": ">= 4.1.3"
},
"multi_instance": false,
"services": [
- "nginx",
- "postgresql"
+ "nginx"
],
"arguments": {
"install" : [
{
"name": "domain",
"type": "domain",
- "ask": {
- "en": "Choose a domain name for Mailman3",
- "fr": "Choisissez un nom de domaine pour Mailman3"
- },
- "example": "myyunohost.org"
- },
- {
- "name": "domain_ip",
- "type": "string",
- "ask": {
- "en": "Specify the IP address of your domain"
- },
- "example": "192.168.24.6"
+ "example": "example.com"
},
{
"name": "is_public",
"type": "boolean",
- "ask": {
- "en": "Is it a public application?",
- "fr": "Est-ce une application publique ?"
- },
"default": true
}
]
diff --git a/pull_request_template.md b/pull_request_template.md
deleted file mode 100644
index 9d61f01..0000000
--- a/pull_request_template.md
+++ /dev/null
@@ -1,23 +0,0 @@
-## Problem
-
-- *Description of why you made this PR*
-
-## Solution
-
-- *And how do you fix that problem*
-
-## PR Status
-
-- [ ] Code finished.
-- [ ] Tested with Package_check.
-- [ ] Fix or enhancement tested.
-- [ ] Upgrade from last version tested.
-- [ ] Can be reviewed and tested.
-
-## Package_check results
-
----
-
-*If you have access to [App Continuous Integration for packagers](https://yunohost.org/#/packaging_apps_ci) you can provide a link to the package_check results like below, replacing '-NUM-' in this link by the PR number and USERNAME by your username on the ci-apps-dev. Or you provide a screenshot or a pastebin of the results*
-
-[![Build Status](https://ci-apps-dev.yunohost.org/jenkins/job/APP_ynh%20PR-NUM-%20(USERNAME)/badge/icon)](https://ci-apps-dev.yunohost.org/jenkins/job/APP_ynh%20PR-NUM-%20(USERNAME)/)
diff --git a/scripts/_common.sh b/scripts/_common.sh
index 6ab9422..f8851af 100644
--- a/scripts/_common.sh
+++ b/scripts/_common.sh
@@ -4,9 +4,8 @@
# COMMON VARIABLES
#=================================================
-pkg_dependencies="postgresql lynx"
-
-mailman3_suite_pkg="mailman3-full"
+# dependencies used by the app
+pkg_dependencies="postgresql lynx mailman3-full"
#=================================================
# PERSONAL HELPERS
@@ -15,3 +14,7 @@ mailman3_suite_pkg="mailman3-full"
#=================================================
# EXPERIMENTAL HELPERS
#=================================================
+
+#=================================================
+# FUTURE OFFICIAL HELPERS
+#=================================================
diff --git a/scripts/backup b/scripts/backup
index c3e545c..6034411 100755
--- a/scripts/backup
+++ b/scripts/backup
@@ -1,15 +1,12 @@
#!/bin/bash
-# TODO(decentral1se)
-
#=================================================
# GENERIC START
-#=================================================
-
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
+# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers
@@ -18,98 +15,55 @@ source /usr/share/yunohost/helpers
#=================================================
ynh_clean_setup () {
- ynh_clean_check_starting
+ true
}
-
+# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
# LOAD SETTINGS
#=================================================
-
-ynh_script_progression --message="Loading installation settings..." --weight=2
+ynh_print_info --message="Loading installation settings..."
app=$YNH_APP_INSTANCE_NAME
+
domain=$(ynh_app_setting_get --app=$app --key=domain)
db_name_app=$(ynh_app_setting_get --app=$app --key=db_name_app)
-db_name_app_web=$(ynh_app_setting_get --app=$app --key=db_name_app_web)
+db_name_web=$(ynh_app_setting_get --app=$app --key=db_name_web)
#=================================================
-# STANDARD BACKUP STEPS
+# DECLARE DATA AND CONF FILES TO BACKUP
#=================================================
-
-#=================================================
-# STOP SYSTEMD SERVICE
-#=================================================
-
-ynh_script_progression --message="Stopping systemd services..." --weight=10
-
-ynh_systemd_action --service_name=$app --action=stop
-
-ynh_systemd_action --service_name="${app}-web" --action="stop"
-
-#=================================================
-# BACKUP THE APP MAIN DIR
-#=================================================
-
-ynh_script_progression --message="Backing up the main application directory..." --weight=2
-
-ynh_backup --src_path=/etc/mailman3/
-
-ynh_backup --src_path=/usr/share/mailman3-web
+ynh_print_info --message="Declaring files to be backed up..."
#=================================================
# BACKUP THE NGINX CONFIGURATION
#=================================================
-ynh_script_progression --message="Backing up NGINX web server configuration..." --weight=2
-
ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf"
-#=================================================
-# BACKUP THE POSTGRESQL DATABASE
-#=================================================
-
-ynh_script_progression --message="Backing up the PostgreSQL databases..." --weight=4
-
-ynh_psql_dump_db --database="$db_name_app" > "${app}_db.sql"
-
-ynh_psql_dump_db --database="$db_name_app_web" > "${app}_web_db.sql"
-
#=================================================
# SPECIFIC BACKUP
#=================================================
-
-#=================================================
-# BACKUP SYSTEMD
+# BACKUP VARIOUS FILES
#=================================================
-ynh_script_progression --message="Backing up systemd configurations..." --weight=2
+ynh_backup --src_path="/etc/$app/mailman.cfg"
+ynh_backup --src_path="/etc/$app/mailman-hyperkitty.cfg"
+ynh_backup --src_path="/etc/$app/mailman-web.py"
-ynh_backup --src_path="/etc/systemd/system/multi-user.target.wants/$app.service"
-
-ynh_backup --src_path="/etc/systemd/system/multi-user.target.wants/${app}-web.service"
+ynh_backup --src_path="/usr/share/yunohost/hooks/conf_regen/98-postfix_mailman3"
#=================================================
-# BACKUP A CRON FILE
+# BACKUP THE POSTGRESQL DATABASE
#=================================================
+ynh_print_info --message="Backing up the PostgreSQL database..."
-ynh_script_progression --message="Backing up crontab configuration..." --weight=2
-
-ynh_backup --src_path="/etc/cron.d/$app"
-
-#=================================================
-# START SYSTEMD SERVICE
-#=================================================
-
-ynh_script_progression --message="Starting systemd services..." --weight=1
-
-ynh_systemd_action --action=start --service_name=$app
-
-ynh_systemd_action --action=start --service_name="${app}-web"
+ynh_psql_dump_db --database="$db_name_app" > db_app.sql
+ynh_psql_dump_db --database="$db_name_web" > db_web.sql
#=================================================
# END OF SCRIPT
#=================================================
-ynh_script_progression --message="Backup script completed for $app" --last
+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
deleted file mode 100644
index c7e9ab4..0000000
--- a/scripts/change_url
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-# TODO(decentral1se)
diff --git a/scripts/install b/scripts/install
index e023a0a..8296430 100755
--- a/scripts/install
+++ b/scripts/install
@@ -8,229 +8,193 @@
source _common.sh
source /usr/share/yunohost/helpers
-source ynh_add_extra_apt_repos__3
#=================================================
# MANAGE SCRIPT FAILURE
#=================================================
ynh_clean_setup () {
- ynh_clean_check_starting
+ ynh_clean_check_starting
}
-
+# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
# RETRIEVE ARGUMENTS FROM THE MANIFEST
#=================================================
-app=$YNH_APP_INSTANCE_NAME
-app_web="mailman3_web"
-
domain=$YNH_APP_ARG_DOMAIN
-domain_ip=$YNH_APP_ARG_DOMAIN_IP
+path_url="/"
is_public=$YNH_APP_ARG_IS_PUBLIC
+app=$YNH_APP_INSTANCE_NAME
+
#=================================================
# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS
#=================================================
+ynh_script_progression --message="Validating installation parameters..."
-ynh_script_progression --message="Validating installation parameters..." --weight=2
+test ! -e /usr/share/$app-web || ynh_die --message="Mailman3 is already installed !"
-test ! -e /usr/share/mailman3-web || ynh_die --message="Mailman3 is already installed?"
+test ! -e /etc/$app || ynh_die --message="Mailman3 is already installed !"
-test ! -e /etc/mailman3 || ynh_die --message="Mailman3 is already installed?"
+# Register (book) web path
+ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url
#=================================================
# STORE SETTINGS FROM MANIFEST
#=================================================
-
-ynh_script_progression --message="Storing installation settings..." --weight=1
+ynh_script_progression --message="Storing installation settings..."
ynh_app_setting_set --app=$app --key=domain --value=$domain
-ynh_app_setting_set --app=$app --key=domain_ip --value=$domain_ip
-ynh_app_setting_set --app=$app --key=is_public --value=$is_public
-ynh_app_setting_set --app=$app --key=path --value="/"
+ynh_app_setting_set --app=$app --key=path --value=$path_url
#=================================================
# STANDARD MODIFICATIONS
-#=================================================
-
-#=================================================
-# NGINX CONFIGURATION
-#=================================================
-
-ynh_script_progression --message="Configuring NGINX web server..." --weight=3
-
-ynh_add_nginx_config
-
#=================================================
# FIND AND OPEN A PORT
#=================================================
+ynh_script_progression --message="Finding an available port..."
-ynh_script_progression --message="Configuring firewall..." --weight=1
-
-port_web=$(ynh_find_port --port=3000)
-
-ynh_app_setting_set --app=$app --key=port_web --value=$port_web
-
-#=================================================
-# ENABLE BACKPORTS REPOSITORY
-#=================================================
-
-ynh_script_progression --message="Enabling stretch backports ..." --weight=2
-
-ynh_install_extra_repo \
- --repo="deb http://deb.debian.org/debian stretch-backports main" \
- --name=stretch-backports
+# Find an available port
+port=$(ynh_find_port --port=8095)
+ynh_app_setting_set --app=$app --key=port --value=$port
#=================================================
# INSTALL DEPENDENCIES
#=================================================
+ynh_script_progression --message="Installing dependencies..."
-ynh_script_progression --message="Installing dependencies..." --weight=10
-
-ynh_install_app_dependencies $pkg_dependencies
-
-# Note(decentral1se): enable backports during install
-DEBIAN_FRONTEND=noninteractive apt-get \
- --no-remove \
- --assume-yes \
- -o Dpkg::Options::=--force-confdef \
- -o Dpkg::Options::=--force-confold \
- -t stretch-backports \
- install \
- $mailman3_suite_pkg
-
-# Note(decentral1se): See https://github.com/YunoHost-Apps/mailman3_ynh/issues/2
-apt-mark hold $mailman3_suite_pkg
+ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies
#=================================================
# CREATE A POSTGRESQL DATABASE
#=================================================
-
-ynh_script_progression --message="Creating PostgreSQL databases..." --weight=5
+ynh_script_progression --message="Creating a PostgreSQL database..."
ynh_psql_test_if_first_run
-# mailman3 database
-db_pwd_app=$(ynh_string_random 30)
-ynh_app_setting_set --app=$app --key=db_name_app --value=$app
-ynh_app_setting_set --app=$app --key=db_user_app --value=$app
+# mailman3-app database
+db_name_app=$(ynh_sanitize_dbid --db_name="${app}_app")
+db_user_app=$db_name_app
+db_pwd_app=$(ynh_string_random --length=30)
+ynh_app_setting_set --app=$app --key=db_name_app --value=$db_name_app
ynh_app_setting_set --app=$app --key=db_pwd_app --value=$db_pwd_app
-ynh_psql_create_user "$app" "$db_pwd_app"
-ynh_psql_create_db "$app" "$app"
+ynh_psql_setup_db --db_user=$db_user_app --db_name=$db_name_app --db_pwd=$db_pwd_app
# mailman3-web database
-db_pwd_app_web=$(ynh_string_random 30)
-ynh_app_setting_set --app=$app --key=db_name_app_web --value="$app_web"
-ynh_app_setting_set --app=$app --key=db_user_app_web --value="$app_web"
-ynh_app_setting_set --app=$app --key=db_pwd_app_web --value=$db_pwd_app_web
-ynh_psql_create_user "$app_web" "$db_pwd_app_web"
-ynh_psql_create_db "$app_web" "$app_web"
+db_name_web=$(ynh_sanitize_dbid --db_name="${app}_web")
+db_user_web=$db_name_web
+db_pwd_web=$(ynh_string_random --length=30)
+ynh_app_setting_set --app=$app --key=db_name_web --value=$db_name_web
+ynh_app_setting_set --app=$app --key=db_pwd_web --value=$db_pwd_web
+ynh_psql_setup_db --db_user=$db_user_web --db_name=$db_name_web --db_pwd=$db_pwd_web
#=================================================
-# MODIFY A CONFIG FILE
+# NGINX CONFIGURATION
#=================================================
+ynh_script_progression --message="Configuring NGINX web server..."
-ynh_script_progression --message="Modifying necessary config files..." --weight=2
+# Create a dedicated NGINX config
+ynh_add_nginx_config
+
+#=================================================
+# SPECIFIC SETUP
+#=================================================
+# ADD A CONFIGURATION
+#=================================================
+ynh_script_progression --message="Adding a configuration file..."
# mailman3 core configuration
-rest_api_admin="rest_admin"
+rest_api_admin_user="rest_admin"
rest_api_admin_pwd=$(head -n15 /dev/urandom | tail -n +1 | tr -dc -d 'a-z0-9' | head -c15)
-ynh_app_setting_set --app=$app --key=rest_admin --value="$rest_api_admin"
+ynh_app_setting_set --app=$app --key=rest_admin_user --value="$rest_api_admin_user"
ynh_app_setting_set --app=$app --key=rest_admin_pwd --value="$rest_api_admin_pwd"
-cp -f ../conf/mailman.cfg /etc/mailman3/mailman.cfg
-ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__DB_USER__" --replace_string="$app" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__DB_NAME__" --replace_string="$app" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd_app" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__PORT_WEB__" --replace_string="$port_web" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__REST_API_ADMIN_USER__" --replace_string="$rest_api_admin" --target_file="/etc/mailman3/mailman.cfg"
-ynh_replace_string --match_string="__REST_API_ADMIN_PWD__" --replace_string="$rest_api_admin_pwd" --target_file="/etc/mailman3/mailman.cfg"
+ynh_add_config --template="../conf/mailman.cfg" --destination="/etc/mailman3/mailman.cfg"
+
+chmod 400 "/etc/mailman3/mailman.cfg"
+chown list:list "/etc/mailman3/mailman.cfg"
# hyperkitty configuration
archiver_key=$(head -n32 /dev/urandom | tail -n +1 | tr -dc -d 'a-z0-9' | head -c32)
ynh_app_setting_set --app=$app --key=archiver_key --value="$archiver_key"
-cp -f ../conf/mailman-hyperkitty.cfg /etc/mailman3/mailman-hyperkitty.cfg
-ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/mailman3/mailman-hyperkitty.cfg"
-ynh_replace_string --match_string="__ARCHIVER_KEY__" --replace_string="$archiver_key" --target_file="/etc/mailman3/mailman-hyperkitty.cfg"
+ynh_add_config --template="../conf/mailman-hyperkitty.cfg" --destination="/etc/mailman3/mailman-hyperkitty.cfg"
+
+chmod 400 "/etc/mailman3/mailman-hyperkitty.cfg"
+chown list:list "/etc/mailman3/mailman-hyperkitty.cfg"
# mailman3-web configuration
secret_key=$(head -n64 /dev/urandom | tail -n +1 | tr -dc -d 'a-z0-9' | head -c64)
ynh_app_setting_set --app=$app --key=secret_key --value="$secret_key"
-cp -f ../conf/mailman-web.py /etc/mailman3/mailman-web.py
-ynh_replace_string --match_string="__SECRET_KEY__" --replace_string="$secret_key" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__DOMAIN_IP__" --replace_string="$domain_ip" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__PORT_WEB__" --replace_string="$port_web" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__REST_API_ADMIN_USER__" --replace_string="$rest_api_admin" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__REST_API_ADMIN_PWD__" --replace_string="$rest_api_admin_pwd" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__ARCHIVER_KEY__" --replace_string="$archiver_key" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__DB_NAME__" --replace_string="$app_web" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__DB_USER__" --replace_string="$app_web" --target_file="/etc/mailman3/mailman-web.py"
-ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd_app_web" --target_file="/etc/mailman3/mailman-web.py"
+ynh_add_config --template="../conf/mailman-web.py" --destination="/etc/mailman3/mailman-web.py"
+
+chmod 440 "/etc/mailman3/mailman-web.py"
+chown list:www-data "/etc/mailman3/mailman-web.py"
#=================================================
# RUN DATABASE MIGRATIONS
#=================================================
+ynh_script_progression --message="Running database migrations..."
-ynh_script_progression --message="Running database migrations..." --weight=6
-
-cd /usr/share/mailman3-web && python3 manage.py migrate || ynh_die --message="Mailman3 migrations failed!"
+pushd /usr/share/mailman3-web
+ python3 manage.py migrate || ynh_die --message="Mailman3 migrations failed!"
+popd
#=================================================
-# STORE THE CONFIG FILE CHECKSUM
+# POSTFIX CONFIGURATION
#=================================================
+ynh_script_progression --message="Configuring postfix mail server..."
-ynh_script_progression --message="Storing configuration checksum..." --weight=1
+# Add postfix configuration hook and regen postfix conf
+cp -R ../sources/hooks/conf_regen/98-postfix_mailman3 /usr/share/yunohost/hooks/conf_regen/
+yunohost tools regen-conf postfix
+ynh_systemd_action --service_name=postfix --action="restart"
-ynh_store_file_checksum --file=/etc/mailman3/mailman.cfg
-ynh_store_file_checksum --file=/etc/mailman3/mailman-hyperkitty.cfg
-ynh_store_file_checksum --file=/etc/mailman3/mailman-web.cfg
+#=================================================
+# SETUP SYSTEMD
+#=================================================
+ynh_script_progression --message="Configuring a systemd service..."
+
+# Create a dedicated systemd config
+systemctl enable $app.service --quiet
+systemctl enable "$app-web".service --quiet
#=================================================
# GENERIC FINALIZATION
#=================================================
-
-#=================================================
-# ADVERTISE SERVICE IN ADMIN PANEL
+# INTEGRATE SERVICE IN YUNOHOST
#=================================================
+ynh_script_progression --message="Integrating service in YunoHost..."
-ynh_script_progression --message="Advertising services in admin panel..." --weight=3
-
-yunohost service add "$app"
-
-yunohost service add "$app-web"
+yunohost service add $app --description="Mailman3 daemon" --log="/var/log/$app/mailman.log"
+yunohost service add "$app-web" --description="Mailman3 web daemon" --log="/var/log/$app/web/mailman-web.log"
#=================================================
# START SYSTEMD SERVICE
#=================================================
+ynh_script_progression --message="Starting a systemd service..."
-ynh_script_progression --message="Starting the $app and $app-web services..." --weight=10
-
-ynh_systemd_action --service_name=$app --action=enable
-ynh_systemd_action --service_name="$app-web" --action=enable
-
-ynh_systemd_action --service_name=$app --action=restart
-ynh_systemd_action --service_name="$app-web" --action=restart
+# Start a systemd service
+ynh_systemd_action --service_name=$app --action="restart"
+ynh_systemd_action --service_name="$app-web" --action="restart"
#=================================================
# SETUP SSOWAT
#=================================================
+ynh_script_progression --message="Configuring permissions..."
-ynh_script_progression --message="Configuring SSOwat..." --weight=1
-
+# Make app public if necessary
if [ $is_public -eq 1 ]
then
- ynh_app_setting_set --app=$app --key=unprotected_uris --value="/"
+ # Everyone can access the app.
+ # The "main" permission is automatically created before the install script.
+ ynh_permission_update --permission="main" --add="visitors"
fi
#=================================================
# RELOAD NGINX
#=================================================
-
-ynh_script_progression --message="Reloading NGINX web server..." --weight=2
+ynh_script_progression --message="Reloading NGINX web server..."
ynh_systemd_action --service_name=nginx --action=reload
@@ -238,4 +202,4 @@ ynh_systemd_action --service_name=nginx --action=reload
# END OF SCRIPT
#=================================================
-ynh_script_progression --message="Installation of $app completed" --last
+ynh_script_progression --message="Installation of $app completed"
diff --git a/scripts/remove b/scripts/remove
index 038cf61..50c6050 100755
--- a/scripts/remove
+++ b/scripts/remove
@@ -8,89 +8,98 @@
source _common.sh
source /usr/share/yunohost/helpers
-source ynh_add_extra_apt_repos__3
#=================================================
# LOAD SETTINGS
#=================================================
-
-ynh_script_progression --message="Loading installation settings..." --weight=1
+ynh_script_progression --message="Loading installation settings..."
app=$YNH_APP_INSTANCE_NAME
-app_web="${app}_web"
+
+domain=$(ynh_app_setting_get --app=$app --key=domain)
+port=$(ynh_app_setting_get --app=$app --key=port)
+db_name_app=$(ynh_app_setting_get --app=$app --key=db_name_app)
+db_user_app=$db_name_app
+db_name_web=$(ynh_app_setting_get --app=$app --key=db_name_web)
+db_user_web=$db_name_web
#=================================================
# STANDARD REMOVE
#=================================================
-
-#=================================================
-# REMOVE BACKPORTS REPOSITORY
+# REMOVE SERVICE INTEGRATION IN YUNOHOST
#=================================================
-ynh_script_progression --message="Removing stretch backports ..." --weight=2
+# Remove the service from the list of services known by YunoHost (added from `yunohost service add`)
+if ynh_exec_warn_less yunohost service status $app >/dev/null
+then
+ ynh_script_progression --message="Removing $app service integration..."
+ yunohost service remove $app
+fi
-ynh_remove_extra_repo --name=stretch-backports
+# Remove the service from the list of services known by YunoHost (added from `yunohost service add`)
+if ynh_exec_warn_less yunohost service status $app >/dev/null
+then
+ ynh_script_progression --message="Removing $app-web service integration..."
+ yunohost service remove "$app-web"
+fi
+
+#=================================================
+# STOP AND REMOVE SERVICE
+#=================================================
+ynh_script_progression --message="Stopping and removing the systemd service..."
+
+# Remove the dedicated systemd config
+ynh_systemd_action --service_name=$app --action="stop"
+systemctl disable $app.service --quiet
+ynh_systemd_action --service_name="$app-web" --action="stop"
+systemctl disable "$app-web".service --quiet
#=================================================
# REMOVE THE POSTGRESQL DATABASE
#=================================================
+ynh_script_progression --message="Removing the PostgreSQL database..."
-ynh_script_progression --message="Removing the PostgreSQL databases..." --weight=4
-
-ynh_psql_remove_db --db_user=$app --db_name=$app
-
-ynh_psql_remove_db --db_user="$app_web" --db_name="$app_web"
+# Remove a database if it exists, along with the associated user
+ynh_psql_remove_db --db_user=$db_user_app --db_name=$db_name_app
+ynh_psql_remove_db --db_user=$db_user_web --db_name=$db_name_web
#=================================================
# REMOVE DEPENDENCIES
#=================================================
+ynh_script_progression --message="Removing dependencies..."
-ynh_script_progression --message="Removing dependencies..." --weight=6
-
+# Remove metapackage and its dependencies
ynh_remove_app_dependencies
-ynh_package_autopurge $mailman3_suite_pkg
-
-ynh_secure_remove /usr/share/mailman3-web
-
-ynh_secure_remove /etc/mailman3
-
#=================================================
# REMOVE NGINX CONFIGURATION
#=================================================
+ynh_script_progression --message="Removing NGINX web server configuration..."
-ynh_script_progression --message="Removing NGINX web server configuration..." --weight=2
-
+# Remove the dedicated NGINX config
ynh_remove_nginx_config
-#=================================================
-# REMOVE SERVICE FROM ADMIN PANEL
-#=================================================
-
-ynh_script_progression --message="Removing registered services..." --weight=3
-
-if yunohost service status $app >/dev/null 2>&1
-then
- ynh_script_progression --message="Removing $app service..." --weight=2
- yunohost service remove "$app"
-fi
-
-if yunohost service status "$app-web" >/dev/null 2>&1
-then
- ynh_script_progression --message="Removing $app-web service..." --weight=2
- yunohost service remove "$app-web"
-fi
-
#=================================================
# SPECIFIC REMOVE
#=================================================
+# REMOVE VARIOUS FILES
+#=================================================
+ynh_script_progression --message="Removing various files..."
+
+ynh_secure_remove --file="/usr/share/mailman3-web"
+
+# Remove a directory securely
+ynh_secure_remove --file="/etc/$app"
+
+# Remove hook for postfix conf
+ynh_secure_remove --file="/usr/share/yunohost/hooks/conf_regen/98-postfix_mailman3"
+yunohost tools regen-conf postfix
+ynh_systemd_action --service_name=postfix --action="restart"
#=================================================
# GENERIC FINALIZATION
-#=================================================
-
#=================================================
# END OF SCRIPT
#=================================================
-ynh_script_progression --message="Removal of $app completed" --last
+ynh_script_progression --message="Removal of $app completed"
diff --git a/scripts/restore b/scripts/restore
index 31416cd..8653031 100755
--- a/scripts/restore
+++ b/scripts/restore
@@ -1,130 +1,137 @@
#!/bin/bash
-# TODO(decentral1se)
-
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
+# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers
-source ../settings/scripts/ynh_add_extra_apt_repos__3
#=================================================
# MANAGE SCRIPT FAILURE
#=================================================
ynh_clean_setup () {
- ynh_clean_check_starting
+ ynh_clean_check_starting
}
-
+# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
# LOAD SETTINGS
#=================================================
-
-ynh_script_progression --message="Loading settings..." --weight=2
+ynh_script_progression --message="Loading installation 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)
+db_name_app=$(ynh_app_setting_get --app=$app --key=db_name_app)
+db_user_app=$db_name_app
+db_name_web=$(ynh_app_setting_get --app=$app --key=db_name_web)
+db_user_web=$db_name_web
#=================================================
# CHECK IF THE APP CAN BE RESTORED
#=================================================
+ynh_script_progression --message="Validating restoration parameters..."
-ynh_script_progression --message="Validating restoration parameters..." --weight=2
-
-ynh_webpath_available --domain=$domain \
- || ynh_die --message="Path not available: ${domain}"
-
+ynh_webpath_available --domain=$domain --path_url=$path_url \
+ || ynh_die --message="Path not available: ${domain}${path_url}"
test ! -d /usr/share/mailman3-web \
|| ynh_die --message="There is already an installation present at /usr/share/mailman3-web?"
#=================================================
# STANDARD RESTORATION STEPS
-#=================================================
-
#=================================================
# RESTORE THE NGINX CONFIGURATION
#=================================================
-
-ynh_script_progression --message="Restoring nginx configuration..." --weight=1
+ynh_script_progression --message="Restoring the NGINX web server configuration..."
ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf"
-#=================================================
-# RESTORE THE APP MAIN DIRS
-#=================================================
-
-# TODO(decentral1se)
-# ynh_script_progression --message="Restoring the app main directory..." --weight=30
-
#=================================================
# SPECIFIC RESTORATION
-#=================================================
-
#=================================================
# REINSTALL DEPENDENCIES
#=================================================
+ynh_script_progression --message="Reinstalling dependencies..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Reinstalling dependencies..." --weight=30
+# Define and install dependencies
+ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies
#=================================================
-# RESTORE THE POSTGRESQL DATABASES
+# RESTORE THE POSTGRESQL DATABASE
#=================================================
+ynh_script_progression --message="Restoring the PostgreSQL database..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=14
-# ynh_psql_test_if_first_run
-# ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd
-# ynh_psql_execute_file_as_root --file="./db.sql" --database="$db_name"
+ynh_psql_test_if_first_run
+
+db_pwd_app=$(ynh_app_setting_get --app=$app --key=db_pwd_app)
+ynh_psql_setup_db --db_user=$db_user_app --db_name=$db_name_app --db_pwd=$db_pwd_app
+ynh_psql_execute_file_as_root --file="./db_app.sql" --database=$db_name_app
+
+db_pwd_web=$(ynh_app_setting_get --app=$app --key=db_pwd_web)
+ynh_psql_setup_db --db_user=$db_user_web --db_name=$db_name_web --db_pwd=$db_pwd_web
+ynh_psql_execute_file_as_root --file="./db_web.sql" --database=$db_name_web
#=================================================
-# RESTORE SYSTEMD CONFIGURATION
+# RESTORE VARIOUS FILES
#=================================================
+ynh_script_progression --message="Restoring various files..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Restoring the systemd configuration..." --weight=3
+ynh_restore_file --origin_path="/usr/share/yunohost/hooks/conf_regen/98-postfix_mailman3"
+yunohost tools regen-conf postfix
+ynh_systemd_action --service_name=postfix --action="restart"
+
+ynh_secure_remove --file="/etc/$app/mailman.cfg"
+ynh_restore_file --origin_path="/etc/$app/mailman.cfg"
+
+ynh_secure_remove --file="/etc/$app/mailman-hyperkitty.cfg"
+ynh_restore_file --origin_path="/etc/$app/mailman-hyperkitty.cfg"
+
+ynh_secure_remove --file="/etc/$app/mailman-web.py"
+ynh_restore_file --origin_path="/etc/$app/mailman-web.py"
#=================================================
-# ADVERTISE SERVICE IN ADMIN PANEL
+# RESTORE SYSTEMD
#=================================================
+ynh_script_progression --message="Restoring the systemd configuration..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Advertising service in admin panel..." --weight=3
+systemctl enable $app.service --quiet
+systemctl enable "$app-web".service --quiet
+
+#=================================================
+# INTEGRATE SERVICE IN YUNOHOST
+#=================================================
+ynh_script_progression --message="Integrating service in YunoHost..."
+
+yunohost service add $app --description="Mailman3 daemon" --log="/var/log/$app/mailman.log"
+yunohost service add "$app-web" --description="Mailman3 web daemon" --log="/var/log/$app/web/mailman-web.log"
#=================================================
# START SYSTEMD SERVICE
#=================================================
+ynh_script_progression --message="Starting a systemd service..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Starting a systemd service..." --weight=41
-
-#=================================================
-# RESTORE THE CRON FILE
-#=================================================
-
-# TODO(decentral1se)
-# ynh_script_progression --message="Restoring a cron job for removing cache..." --weight=2
-# ynh_restore_file --origin_path="/etc/cron.d/$app"
+# Start a systemd service
+ynh_systemd_action --service_name=$app --action=restart
+ynh_systemd_action --service_name="$app-web" --action=restart
#=================================================
# GENERIC FINALIZATION
#=================================================
# RELOAD NGINX
#=================================================
+ynh_script_progression --message="Reloading NGINX web server..."
-# TODO(decentral1se)
-# ynh_script_progression --message="Reloading NGINX web server..." --weight=2
-# ynh_systemd_action --service_name=nginx --action=reload
+ynh_systemd_action --service_name=nginx --action=reload
#=================================================
# END OF SCRIPT
#=================================================
-ynh_script_progression --message="Restoration completed for $app" --last
+ynh_script_progression --message="Restoration completed for $app"
diff --git a/scripts/upgrade b/scripts/upgrade
index be7a862..5a40761 100755
--- a/scripts/upgrade
+++ b/scripts/upgrade
@@ -1,4 +1,122 @@
#!/bin/bash
-# TODO(decentral1se)
-# Also, see https://github.com/YunoHost-Apps/mailman3_ynh/issues/2
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# LOAD SETTINGS
+#=================================================
+ynh_script_progression --message="Loading installation 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)
+db_name_app=$(ynh_app_setting_get --app=$app --key=db_name_app)
+db_name_web=$(ynh_app_setting_get --app=$app --key=db_name_web)
+
+#=================================================
+# 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 () {
+ ynh_clean_check_starting
+ # Restore it if the upgrade fails
+ ynh_restore_upgradebackup
+}
+# Exit if an error occurs during the execution of the script
+ynh_abort_if_errors
+
+#=================================================
+# STANDARD UPGRADE STEPS
+#=================================================
+# STOP SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Stopping a systemd service..."
+
+ynh_systemd_action --service_name=$app --action="stop"
+ynh_systemd_action --service_name="$app-web" --action=stop
+
+#=================================================
+# ENSURE DOWNWARD COMPATIBILITY
+#=================================================
+ynh_script_progression --message="Ensuring downward compatibility..."
+
+# Cleaning legacy permissions
+if ynh_legacy_permissions_exists; then
+ ynh_legacy_permissions_delete_all
+
+ ynh_app_setting_delete --app=$app --key=is_public
+fi
+
+#=================================================
+# NGINX CONFIGURATION
+#=================================================
+ynh_script_progression --message="Upgrading NGINX web server configuration..."
+
+# Create a dedicated NGINX config
+ynh_add_nginx_config
+
+#=================================================
+# UPGRADE DEPENDENCIES
+#=================================================
+ynh_script_progression --message="Upgrading dependencies..."
+
+ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies
+
+#=================================================
+# POSTFIX CONFIGURATION
+#=================================================
+ynh_script_progression --message="Configuring postfix mail server..."
+
+# Add postfix configuration hook and regen postfix conf
+cp -R ../sources/hooks/conf_regen/98-postfix_mailman3 /usr/share/yunohost/hooks/conf_regen/
+yunohost tools regen-conf postfix
+ynh_systemd_action --service_name=postfix --action="reload"
+
+#=================================================
+# GENERIC FINALIZATION
+#=================================================
+# INTEGRATE SERVICE IN YUNOHOST
+#=================================================
+ynh_script_progression --message="Integrating service in YunoHost..."
+
+yunohost service add $app --description="Mailman3 daemon" --log="/var/log/$app/mailman.log"
+yunohost service add "$app-web" --description="Mailman3 web daemon" --log="/var/log/$app/web/mailman-web.log"
+
+#=================================================
+# START SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Starting a systemd service..."
+
+ynh_systemd_action --service_name=$app --action=start
+ynh_systemd_action --service_name="$app-web" --action=start
+
+#=================================================
+# 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"
diff --git a/scripts/ynh_add_extra_apt_repos__3 b/scripts/ynh_add_extra_apt_repos__3
deleted file mode 100644
index b784159..0000000
--- a/scripts/ynh_add_extra_apt_repos__3
+++ /dev/null
@@ -1,294 +0,0 @@
-#!/bin/bash
-
-# Pin a repository.
-#
-# usage: ynh_pin_repo --package=packages --pin=pin_filter [--priority=priority_value] [--name=name] [--append]
-# | arg: -p, --package - Packages concerned by the pin. Or all, *.
-# | arg: -i, --pin - Filter for the pin.
-# | arg: -p, --priority - Priority for the pin
-# | arg: -n, --name - Name for the files for this repo, $app as default value.
-# | arg: -a, --append - Do not overwrite existing files.
-#
-# See https://manpages.debian.org/stretch/apt/apt_preferences.5.en.html for information about pinning.
-#
-ynh_pin_repo () {
- # Declare an array to define the options of this helper.
- local legacy_args=pirna
- declare -Ar args_array=( [p]=package= [i]=pin= [r]=priority= [n]=name= [a]=append )
- local package
- local pin
- local priority
- local name
- local append
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- package="${package:-*}"
- priority=${priority:-50}
- name="${name:-$app}"
- append=${append:-0}
-
- if [ $append -eq 1 ]
- then
- append="tee -a"
- else
- append="tee"
- fi
-
- mkdir -p "/etc/apt/preferences.d"
- echo "Package: $package
-Pin: $pin
-Pin-Priority: $priority" \
- | $append "/etc/apt/preferences.d/$name"
-}
-
-# Add a repository.
-#
-# usage: ynh_add_repo --uri=uri --suite=suite --component=component [--name=name] [--append]
-# | arg: -u, --uri - Uri of the repository.
-# | arg: -s, --suite - Suite of the repository.
-# | arg: -c, --component - Component of the repository.
-# | arg: -n, --name - Name for the files for this repo, $app as default value.
-# | arg: -a, --append - Do not overwrite existing files.
-#
-# Example for a repo like deb http://forge.yunohost.org/debian/ stretch stable
-# uri suite component
-# ynh_add_repo --uri=http://forge.yunohost.org/debian/ --suite=stretch --component=stable
-#
-ynh_add_repo () {
- # Declare an array to define the options of this helper.
- local legacy_args=uscna
- declare -Ar args_array=( [u]=uri= [s]=suite= [c]=component= [n]=name= [a]=append )
- local uri
- local suite
- local component
- local name
- local append
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- name="${name:-$app}"
- append=${append:-0}
-
- if [ $append -eq 1 ]
- then
- append="tee -a"
- else
- append="tee"
- fi
-
- mkdir -p "/etc/apt/sources.list.d"
- # Add the new repo in sources.list.d
- echo "deb $uri $suite $component" \
- | $append "/etc/apt/sources.list.d/$name.list"
-}
-
-# Add an extra repository correctly, pin it and get the key.
-#
-# usage: ynh_install_extra_repo --repo="repo" [--key=key_url] [--priority=priority_value] [--name=name] [--append]
-# | arg: -r, --repo - Complete url of the extra repository.
-# | arg: -k, --key - url to get the public key.
-# | arg: -p, --priority - Priority for the pin
-# | arg: -n, --name - Name for the files for this repo, $app as default value.
-# | arg: -a, --append - Do not overwrite existing files.
-ynh_install_extra_repo () {
- # Declare an array to define the options of this helper.
- local legacy_args=rkpna
- declare -Ar args_array=( [r]=repo= [k]=key= [p]=priority= [n]=name= [a]=append )
- local repo
- local key
- local priority
- local name
- local append
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- name="${name:-$app}"
- append=${append:-0}
- key=${key:-0}
- priority=${priority:-}
-
- if [ $append -eq 1 ]
- then
- append="--append"
- wget_append="tee -a"
- else
- append=""
- wget_append="tee"
- fi
-
- # Split the repository into uri, suite and components.
- # Remove "deb " at the beginning of the repo.
- repo="${repo#deb }"
-
- # Get the uri
- local uri="$(echo "$repo" | awk '{ print $1 }')"
-
- # Get the suite
- local suite="$(echo "$repo" | awk '{ print $2 }')"
-
- # Get the components
- local component="${repo##$uri $suite }"
-
- # Add the repository into sources.list.d
- ynh_add_repo --uri="$uri" --suite="$suite" --component="$component" --name="$name" $append
-
- # Pin the new repo with the default priority, so it won't be used for upgrades.
- # Build $pin from the uri without http and any sub path
- local pin="${uri#*://}"
- pin="${pin%%/*}"
- # Set a priority only if asked
- if [ -n "$priority" ]
- then
- priority="--priority=$priority"
- fi
- ynh_pin_repo --package="*" --pin="origin \"$pin\"" $priority --name="$name" $append
-
- # Get the public key for the repo
- if [ -n "$key" ]
- then
- mkdir -p "/etc/apt/trusted.gpg.d"
- wget -q "$key" -O - | gpg --dearmor | $wget_append /etc/apt/trusted.gpg.d/$name.gpg > /dev/null
- fi
-
- # Update the list of package with the new repo
- ynh_package_update
-}
-
-# Remove an extra repository and the assiociated configuration.
-#
-# usage: ynh_remove_extra_repo [--name=name]
-# | arg: -n, --name - Name for the files for this repo, $app as default value.
-ynh_remove_extra_repo () {
- # Declare an array to define the options of this helper.
- local legacy_args=n
- declare -Ar args_array=( [n]=name= )
- local name
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- name="${name:-$app}"
-
- ynh_secure_remove "/etc/apt/sources.list.d/$name.list"
- ynh_secure_remove "/etc/apt/preferences.d/$name"
- ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.gpg"
- ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.asc"
-
- # Update the list of package to exclude the old repo
- ynh_package_update
-}
-
-# Install packages from an extra repository properly.
-#
-# usage: ynh_install_extra_app_dependencies --repo="repo" --package="dep1 dep2" [--key=key_url] [--name=name]
-# | arg: -r, --repo - Complete url of the extra repository.
-# | arg: -p, --package - The packages to install from this extra repository
-# | arg: -k, --key - url to get the public key.
-# | arg: -n, --name - Name for the files for this repo, $app as default value.
-ynh_install_extra_app_dependencies () {
- # Declare an array to define the options of this helper.
- local legacy_args=rpkn
- declare -Ar args_array=( [r]=repo= [p]=package= [k]=key= [n]=name= )
- local repo
- local package
- local key
- local name
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- name="${name:-$app}"
- key=${key:-0}
-
- # Set a key only if asked
- if [ -n "$key" ]
- then
- key="--key=$key"
- fi
- # Add an extra repository for those packages
- ynh_install_extra_repo --repo="$repo" $key --priority=995 --name=$name
-
- # Install requested dependencies from this extra repository.
- ynh_add_app_dependencies --package="$package"
-
- # Remove this extra repository after packages are installed
- ynh_remove_extra_repo --name=$app
-}
-
-#=================================================
-
-# patched version of ynh_install_app_dependencies to be used with ynh_add_app_dependencies
-
-# Define and install dependencies with a equivs control file
-# This helper can/should only be called once per app
-#
-# usage: ynh_install_app_dependencies dep [dep [...]]
-# | arg: dep - the package name to install in dependence
-# You can give a choice between some package with this syntax : "dep1|dep2"
-# Example : ynh_install_app_dependencies dep1 dep2 "dep3|dep4|dep5"
-# This mean in the dependence tree : dep1 & dep2 & (dep3 | dep4 | dep5)
-#
-# Requires YunoHost version 2.6.4 or higher.
-ynh_install_app_dependencies () {
- local dependencies=$@
- dependencies="$(echo "$dependencies" | sed 's/\([^\<=\>]\)\ \([^(]\)/\1, \2/g')"
- dependencies=${dependencies//|/ | }
- local manifest_path="../manifest.json"
- if [ ! -e "$manifest_path" ]; then
- manifest_path="../settings/manifest.json" # Into the restore script, the manifest is not at the same place
- fi
-
- local version=$(grep '\"version\": ' "$manifest_path" | cut -d '"' -f 4) # Retrieve the version number in the manifest file.
- if [ ${#version} -eq 0 ]; then
- version="1.0"
- fi
- local dep_app=${app//_/-} # Replace all '_' by '-'
-
- # Handle specific versions
- if [[ "$dependencies" =~ [\<=\>] ]]
- then
- # Replace version specifications by relationships syntax
- # https://www.debian.org/doc/debian-policy/ch-relationships.html
- # Sed clarification
- # [^(\<=\>] ignore if it begins by ( or < = >. To not apply twice.
- # [\<=\>] matches < = or >
- # \+ matches one or more occurence of the previous characters, for >= or >>.
- # [^,]\+ matches all characters except ','
- # Ex: package>=1.0 will be replaced by package (>= 1.0)
- dependencies="$(echo "$dependencies" | sed 's/\([^(\<=\>]\)\([\<=\>]\+\)\([^,]\+\)/\1 (\2 \3)/g')"
- fi
-
- cat > /tmp/${dep_app}-ynh-deps.control << EOF # Make a control file for equivs-build
-Section: misc
-Priority: optional
-Package: ${dep_app}-ynh-deps
-Version: ${version}
-Depends: ${dependencies}
-Architecture: all
-Description: Fake package for $app (YunoHost app) dependencies
- This meta-package is only responsible of installing its dependencies.
-EOF
- ynh_package_install_from_equivs /tmp/${dep_app}-ynh-deps.control \
- || ynh_die --message="Unable to install dependencies" # Install the fake package and its dependencies
- rm /tmp/${dep_app}-ynh-deps.control
- ynh_app_setting_set --app=$app --key=apt_dependencies --value="$dependencies"
-}
-
-ynh_add_app_dependencies () {
- # Declare an array to define the options of this helper.
- local legacy_args=pr
- declare -Ar args_array=( [p]=package= [r]=replace)
- local package
- local replace
- # Manage arguments with getopts
- ynh_handle_getopts_args "$@"
- replace=${replace:-0}
-
- local current_dependencies=""
- if [ $replace -eq 0 ]
- then
- local dep_app=${app//_/-} # Replace all '_' by '-'
- if ynh_package_is_installed --package="${dep_app}-ynh-deps"
- then
- current_dependencies="$(dpkg-query --show --showformat='${Depends}' ${dep_app}-ynh-deps) "
- fi
-
- current_dependencies=${current_dependencies// | /|}
- fi
-
- ynh_install_app_dependencies "${current_dependencies}${package}"
-}
diff --git a/sources/hooks/conf_regen/98-postfix_mailman3 b/sources/hooks/conf_regen/98-postfix_mailman3
new file mode 100644
index 0000000..5eff47d
--- /dev/null
+++ b/sources/hooks/conf_regen/98-postfix_mailman3
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+set -e
+
+do_pre_regen() {
+ pending_dir=$1
+
+ # Patch postfix conf
+ postfix_main_cf="${pending_dir}/../postfix/etc/postfix/main.cf"
+
+ # FIXME : check this file actually exists to not crash when only running this
+ # hook alone
+
+ cat << EOT >> $postfix_main_cf
+unknown_local_recipient_reject_code = 550
+owner_request_special = no
+
+transport_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+local_recipient_maps =
+ hash:/var/lib/mailman3/data/postfix_lmtp
+relay_domains =
+ hash:/var/lib/mailman3/data/postfix_domains
+EOT
+}
+
+do_post_regen() {
+
+ regen_conf_files=$1
+
+}
+
+FORCE=${2:-0}
+DRY_RUN=${3:-0}
+
+case "$1" in
+ pre)
+ do_pre_regen $4
+ ;;
+ post)
+ do_post_regen $4
+ ;;
+ *)
+ echo "hook called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+
+
+