1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/mailman3_ynh.git synced 2024-09-03 19:36:17 +02:00

Merge pull request #17 from YunoHost-Apps/upgrade

Full Upgrade
This commit is contained in:
yalh76 2021-08-25 19:09:10 +02:00 committed by GitHub
commit 759c46469b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 1084 additions and 713 deletions

55
.github/ISSUE_TEMPLATE.md vendored Normal file
View file

@ -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.*

16
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View file

@ -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)

View file

@ -1,39 +1,39 @@
<!--
N.B.: This README was automatically generated by https://github.com/YunoHost/apps/tree/master/tools/README-generator
It shall NOT be edited by hand.
-->
# Mailman3 for YunoHost # Mailman3 for YunoHost
[![Integration level](https://dash.yunohost.org/integration/mailman3.svg)](https://dash.yunohost.org/appci/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.png)](https://install-app.yunohost.org/?app=mailman3) [![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)* *[Lire ce readme en français.](./README_fr.md)*
> This package allow you to install Mailman3 quickly and simply on a YunoHost server. > *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.*
*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.
## Overview ## 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 ## 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 ## 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/`. 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 ## Limitations
* Migrating from Mailman 2.X is not officially supported, sorry. However, there is a manual and * 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. * There may be only one installation per YunoHost.
## Mirroring ## Documentation and resources
* https://github.com/YunoHost-Apps/mailman3_ynh * Official app website: http://www.list.org/
* https://hack.decentral1.se/yunohost-packages/mailman3_ynh * 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 Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing).
* 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:
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: **More info regarding app packaging:** https://yunohost.org/packaging_apps
```bash
$ yunohost app upgrade mailman3 -u https://github.com/YunoHost-Apps/mailman3_ynh/tree/testing --debug
```

View file

@ -1,5 +1,138 @@
# Mailman3 pour YunoHost # 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

View file

@ -1,8 +1,7 @@
;; Test complet ;; Test complet
; Manifest ; Manifest
domain="domain.tld" (DOMAIN) domain="domain.tld"
domain_ip="192.168.1.1" is_public=1
is_public=1 (PUBLIC|public=1|private=0)
; Checks ; Checks
pkg_linter=1 pkg_linter=1
setup_sub_dir=0 setup_sub_dir=0
@ -11,17 +10,13 @@
setup_private=1 setup_private=1
setup_public=1 setup_public=1
upgrade=1 upgrade=1
upgrade=1 from_commit=CommitHash
backup_restore=1 backup_restore=1
multi_instance=0 multi_instance=0
port_already_use=1 port_already_use=1
change_url=1 change_url=0
;;; Levels
Level 5=auto
;;; Options ;;; Options
Email= Email=
Notification=none Notification=none
;;; Upgrade options ;;; Upgrade options
; commit=CommitHash ; commit=CommitHash
name=Name and date of the commit. name=Name and date of the commit.
manifest_arg=domain=DOMAIN&domain_ip='192.168.1.1'&is_public=1

View file

@ -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] [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 base_url: https://__DOMAIN__/hyperkitty
# Shared API key, must be the identical to the value in HyperKitty's
# settings.
api_key: __ARCHIVER_KEY__ api_key: __ARCHIVER_KEY__

View file

@ -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__' SECRET_KEY = '__SECRET_KEY__'
ADMINS = ( ADMINS = (
('Mailman Suite Admin', 'root@__DOMAIN__'), ('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_USER = '__REST_API_ADMIN_USER__'
MAILMAN_REST_API_PASS = '__REST_API_ADMIN_PWD__' MAILMAN_REST_API_PASS = '__REST_API_ADMIN_PWD__'
MAILMAN_ARCHIVER_KEY = '__ARCHIVER_KEY__' 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 = ( INSTALLED_APPS = (
'hyperkitty', 'hyperkitty',
@ -33,27 +49,60 @@ INSTALLED_APPS = (
'allauth', 'allauth',
'allauth.account', 'allauth.account',
'allauth.socialaccount', '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 = { DATABASES = {
'default': { 'default': {
# Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
#'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '__DB_NAME__', #'ENGINE': 'django.db.backends.mysql',
'USER': '__DB_USER__', # DB name or path to database file if using sqlite3.
'PASSWORD': '__DB_PWD__', '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': '', 'HOST': '',
# PORT: set to empty string for default.
'PORT': '', 'PORT': '',
# OPTIONS: Extra parameters to use when connecting to the database.
'OPTIONS': { '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 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_PROTO', 'https')
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https') SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https')
# Other security settings
SECURE_SSL_REDIRECT = True 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 = [ SECURE_REDIRECT_EXEMPT = [
"archives/api/mailman/.*", "archives/api/mailman/.*",
] ]
@ -64,21 +113,76 @@ CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'DENY' X_FRAME_OPTIONS = 'DENY'
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC' TIME_ZONE = 'UTC'
USE_I18N = True USE_I18N = True
USE_L10N = True USE_L10N = True
USE_TZ = True USE_TZ = True
# Set default domain for email addresses.
EMAILNAME = '__DOMAIN__' 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) SERVER_EMAIL = 'root@{}'.format(EMAILNAME)
# Django Allauth
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https" ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
#
# Social auth
#
SOCIALACCOUNT_PROVIDERS = { 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 COMPRESS_OFFLINE = True
POSTORIUS_TEMPLATE_BASE_URL = 'https://__DOMAIN__' POSTORIUS_TEMPLATE_BASE_URL = 'https://__DOMAIN__'

View file

@ -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 <http://www.gnu.org/licenses/>.
# 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 <https://launchpad.net/lazr.config> for details.
[mailman] [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__ 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 noreply_address: noreply
# The default language for this server.
default_language: en 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 sender_headers: from from_ reply-to sender
# Mail command processor will ignore mail command lines after designated max.
email_commands_max_lines: 10 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 pending_request_life: 3d
# How long should files be saved before they are evicted from the cache?
cache_life: 7d cache_life: 7d
# A callable to run with no arguments early in the initialization process.
# This runs before database initialization.
pre_hook: pre_hook:
# A callable to run with no arguments late in the initialization process.
# This runs after adapters are initialized.
post_hook: post_hook:
# Which paths.* file system layout to use.
# You should not change this variable.
layout: debian layout: debian
# Can MIME filtered messages be preserved by list owners?
filtered_messages_are_preservable: no 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 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] listname_chars: [-_.0-9a-z]
[shell] [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: >>> prompt: >>>
# Banner to show on startup.
banner: Welcome to the GNU Mailman shell 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 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: history_file:
[paths.debian] [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 var_dir: /var/lib/mailman3
# This is where the Mailman queue files directories will be created.
queue_dir: $var_dir/queue 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 bin_dir: /usr/lib/mailman3/bin
# All list-specific data.
list_data_dir: $var_dir/lists list_data_dir: $var_dir/lists
# Directory where log files go.
log_dir: /var/log/mailman3 log_dir: /var/log/mailman3
# Directory for system-wide locks.
lock_dir: $var_dir/locks lock_dir: $var_dir/locks
# Directory for system-wide data.
data_dir: $var_dir/data data_dir: $var_dir/data
# Cache files.
cache_dir: $var_dir/cache cache_dir: $var_dir/cache
# Directory for configuration files and such.
etc_dir: /etc/mailman3 etc_dir: /etc/mailman3
# Directory containing Mailman plugins.
ext_dir: $var_dir/ext ext_dir: $var_dir/ext
# Directory where the default IMessageStore puts its messages.
messages_dir: $var_dir/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 archive_dir: $var_dir/archives
# Root directory for site-specific template override files.
template_dir: $var_dir/templates 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 pid_file: /run/mailman3/master.pid
# Lock file.
lock_file: $lock_dir/master.lck lock_file: $lock_dir/master.lck
[database] [database]
# The class implementing the IDatabase.
#class: mailman.database.sqlite.SQLiteDatabase
#class: mailman.database.mysql.MySQLDatabase
class: mailman.database.postgresql.PostgreSQLDatabase 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 debug: no
[logging.debian] [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 format: %(asctime)s (%(process)d) %(message)s
datefmt: %b %d %H:%M:%S %Y datefmt: %b %d %H:%M:%S %Y
propagate: no propagate: no
@ -49,23 +216,58 @@ level: info
path: mailman.log path: mailman.log
[webservice] [webservice]
# The hostname at which admin web service resources are exposed.
hostname: localhost 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 use_https: no
# Whether or not to show tracebacks in an HTTP response for a request that
# raised an exception.
show_tracebacks: yes show_tracebacks: yes
# The API version number for the current (highest) API.
api_version: 3.1 api_version: 3.1
# The administrative username.
admin_user: __REST_API_ADMIN_USER__ admin_user: __REST_API_ADMIN_USER__
# The administrative password.
admin_pass: __REST_API_ADMIN_PWD__ admin_pass: __REST_API_ADMIN_PWD__
[mta] [mta]
# The class defining the interface to the incoming mail transport agent.
#incoming: mailman.mta.exim4.LMTP
incoming: mailman.mta.postfix.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 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_host: localhost
smtp_port: 25 smtp_port: 25
smtp_user: smtp_user:
smtp_pass: 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_host: 127.0.0.1
lmtp_port: 8024 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 configuration: python:mailman.config.postfix
[archiver.hyperkitty] [archiver.hyperkitty]

View file

@ -1,11 +1,11 @@
location / { location / {
include /etc/nginx/uwsgi_params; include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/run/mailman3-web/uwsgi.sock; 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 { location /mailman3/static/ {
alias /var/lib/mailman3/web/static; alias /var/lib/mailman3/web/static/;
} }
location /mailman3/static/favicon.ico { location /mailman3/static/favicon.ico {

0
doc/.gitkeep Normal file
View file

91
doc/DISCLAIMER.md Normal file
View file

@ -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.

0
doc/screenshots/.gitkeep Normal file
View file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -7,7 +7,15 @@
"fr": "Un gestionnaire de liste de discussion par email" "fr": "Un gestionnaire de liste de discussion par email"
}, },
"version": "1.0~ynh1", "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", "license": "AGPL-3.0-or-later",
"maintainer": { "maintainer": {
"name": "decentral1se", "name": "decentral1se",
@ -15,39 +23,22 @@
"url": "https://decentral1.se/" "url": "https://decentral1.se/"
}, },
"requirements": { "requirements": {
"yunohost": ">= 3.6" "yunohost": ">= 4.1.3"
}, },
"multi_instance": false, "multi_instance": false,
"services": [ "services": [
"nginx", "nginx"
"postgresql"
], ],
"arguments": { "arguments": {
"install" : [ "install" : [
{ {
"name": "domain", "name": "domain",
"type": "domain", "type": "domain",
"ask": { "example": "example.com"
"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"
}, },
{ {
"name": "is_public", "name": "is_public",
"type": "boolean", "type": "boolean",
"ask": {
"en": "Is it a public application?",
"fr": "Est-ce une application publique ?"
},
"default": true "default": true
} }
] ]

View file

@ -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)/)

View file

@ -4,9 +4,8 @@
# COMMON VARIABLES # COMMON VARIABLES
#================================================= #=================================================
pkg_dependencies="postgresql lynx" # dependencies used by the app
pkg_dependencies="postgresql lynx mailman3-full"
mailman3_suite_pkg="mailman3-full"
#================================================= #=================================================
# PERSONAL HELPERS # PERSONAL HELPERS
@ -15,3 +14,7 @@ mailman3_suite_pkg="mailman3-full"
#================================================= #=================================================
# EXPERIMENTAL HELPERS # EXPERIMENTAL HELPERS
#================================================= #=================================================
#=================================================
# FUTURE OFFICIAL HELPERS
#=================================================

View file

@ -1,15 +1,12 @@
#!/bin/bash #!/bin/bash
# TODO(decentral1se)
#================================================= #=================================================
# GENERIC START # GENERIC START
#=================================================
#================================================= #=================================================
# IMPORT GENERIC HELPERS # 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 ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
@ -18,98 +15,55 @@ source /usr/share/yunohost/helpers
#================================================= #=================================================
ynh_clean_setup () { ynh_clean_setup () {
ynh_clean_check_starting true
} }
# Exit if an error occurs during the execution of the script
ynh_abort_if_errors ynh_abort_if_errors
#================================================= #=================================================
# LOAD SETTINGS # LOAD SETTINGS
#================================================= #=================================================
ynh_print_info --message="Loading installation settings..."
ynh_script_progression --message="Loading installation settings..." --weight=2
app=$YNH_APP_INSTANCE_NAME app=$YNH_APP_INSTANCE_NAME
domain=$(ynh_app_setting_get --app=$app --key=domain) 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=$(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
#================================================= #=================================================
ynh_print_info --message="Declaring files to be backed up..."
#=================================================
# 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
#================================================= #=================================================
# BACKUP THE NGINX CONFIGURATION # 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" 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 # SPECIFIC BACKUP
#================================================= #=================================================
# BACKUP VARIOUS FILES
#=================================================
# BACKUP SYSTEMD
#================================================= #=================================================
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="/usr/share/yunohost/hooks/conf_regen/98-postfix_mailman3"
ynh_backup --src_path="/etc/systemd/system/multi-user.target.wants/${app}-web.service"
#================================================= #=================================================
# 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_psql_dump_db --database="$db_name_app" > db_app.sql
ynh_psql_dump_db --database="$db_name_web" > db_web.sql
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"
#================================================= #=================================================
# END OF SCRIPT # 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)."

View file

@ -1,3 +0,0 @@
#!/bin/bash
# TODO(decentral1se)

View file

@ -8,7 +8,6 @@
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
source ynh_add_extra_apt_repos__3
#================================================= #=================================================
# MANAGE SCRIPT FAILURE # MANAGE SCRIPT FAILURE
@ -17,220 +16,185 @@ source ynh_add_extra_apt_repos__3
ynh_clean_setup () { 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 ynh_abort_if_errors
#================================================= #=================================================
# RETRIEVE ARGUMENTS FROM THE MANIFEST # RETRIEVE ARGUMENTS FROM THE MANIFEST
#================================================= #=================================================
app=$YNH_APP_INSTANCE_NAME
app_web="mailman3_web"
domain=$YNH_APP_ARG_DOMAIN domain=$YNH_APP_ARG_DOMAIN
domain_ip=$YNH_APP_ARG_DOMAIN_IP path_url="/"
is_public=$YNH_APP_ARG_IS_PUBLIC is_public=$YNH_APP_ARG_IS_PUBLIC
app=$YNH_APP_INSTANCE_NAME
#================================================= #=================================================
# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS # 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 # STORE SETTINGS FROM MANIFEST
#================================================= #=================================================
ynh_script_progression --message="Storing installation settings..."
ynh_script_progression --message="Storing installation settings..." --weight=1
ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=domain --value=$domain
ynh_app_setting_set --app=$app --key=domain_ip --value=$domain_ip ynh_app_setting_set --app=$app --key=path --value=$path_url
ynh_app_setting_set --app=$app --key=is_public --value=$is_public
ynh_app_setting_set --app=$app --key=path --value="/"
#================================================= #=================================================
# STANDARD MODIFICATIONS # STANDARD MODIFICATIONS
#=================================================
#=================================================
# NGINX CONFIGURATION
#=================================================
ynh_script_progression --message="Configuring NGINX web server..." --weight=3
ynh_add_nginx_config
#================================================= #=================================================
# FIND AND OPEN A PORT # FIND AND OPEN A PORT
#================================================= #=================================================
ynh_script_progression --message="Finding an available port..."
ynh_script_progression --message="Configuring firewall..." --weight=1 # Find an available port
port=$(ynh_find_port --port=8095)
port_web=$(ynh_find_port --port=3000) ynh_app_setting_set --app=$app --key=port --value=$port
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
#================================================= #=================================================
# INSTALL DEPENDENCIES # INSTALL DEPENDENCIES
#================================================= #=================================================
ynh_script_progression --message="Installing dependencies..."
ynh_script_progression --message="Installing dependencies..." --weight=10 ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies
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
#================================================= #=================================================
# CREATE A POSTGRESQL DATABASE # CREATE A POSTGRESQL DATABASE
#================================================= #=================================================
ynh_script_progression --message="Creating a PostgreSQL database..."
ynh_script_progression --message="Creating PostgreSQL databases..." --weight=5
ynh_psql_test_if_first_run ynh_psql_test_if_first_run
# mailman3 database # mailman3-app database
db_pwd_app=$(ynh_string_random 30) db_name_app=$(ynh_sanitize_dbid --db_name="${app}_app")
ynh_app_setting_set --app=$app --key=db_name_app --value=$app db_user_app=$db_name_app
ynh_app_setting_set --app=$app --key=db_user_app --value=$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_app_setting_set --app=$app --key=db_pwd_app --value=$db_pwd_app
ynh_psql_create_user "$app" "$db_pwd_app" ynh_psql_setup_db --db_user=$db_user_app --db_name=$db_name_app --db_pwd=$db_pwd_app
ynh_psql_create_db "$app" "$app"
# mailman3-web database # mailman3-web database
db_pwd_app_web=$(ynh_string_random 30) db_name_web=$(ynh_sanitize_dbid --db_name="${app}_web")
ynh_app_setting_set --app=$app --key=db_name_app_web --value="$app_web" db_user_web=$db_name_web
ynh_app_setting_set --app=$app --key=db_user_app_web --value="$app_web" db_pwd_web=$(ynh_string_random --length=30)
ynh_app_setting_set --app=$app --key=db_pwd_app_web --value=$db_pwd_app_web ynh_app_setting_set --app=$app --key=db_name_web --value=$db_name_web
ynh_psql_create_user "$app_web" "$db_pwd_app_web" ynh_app_setting_set --app=$app --key=db_pwd_web --value=$db_pwd_web
ynh_psql_create_db "$app_web" "$app_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 # 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) 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" 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_add_config --template="../conf/mailman.cfg" --destination="/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" chmod 400 "/etc/mailman3/mailman.cfg"
ynh_replace_string --match_string="__DB_NAME__" --replace_string="$app" --target_file="/etc/mailman3/mailman.cfg" chown list:list "/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"
# hyperkitty configuration # hyperkitty configuration
archiver_key=$(head -n32 /dev/urandom | tail -n +1 | tr -dc -d 'a-z0-9' | head -c32) 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" ynh_app_setting_set --app=$app --key=archiver_key --value="$archiver_key"
cp -f ../conf/mailman-hyperkitty.cfg /etc/mailman3/mailman-hyperkitty.cfg ynh_add_config --template="../conf/mailman-hyperkitty.cfg" --destination="/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" chmod 400 "/etc/mailman3/mailman-hyperkitty.cfg"
chown list:list "/etc/mailman3/mailman-hyperkitty.cfg"
# mailman3-web configuration # mailman3-web configuration
secret_key=$(head -n64 /dev/urandom | tail -n +1 | tr -dc -d 'a-z0-9' | head -c64) 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" ynh_app_setting_set --app=$app --key=secret_key --value="$secret_key"
cp -f ../conf/mailman-web.py /etc/mailman3/mailman-web.py ynh_add_config --template="../conf/mailman-web.py" --destination="/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" chmod 440 "/etc/mailman3/mailman-web.py"
ynh_replace_string --match_string="__DOMAIN_IP__" --replace_string="$domain_ip" --target_file="/etc/mailman3/mailman-web.py" chown list:www-data "/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"
#================================================= #=================================================
# RUN DATABASE MIGRATIONS # RUN DATABASE MIGRATIONS
#================================================= #=================================================
ynh_script_progression --message="Running database migrations..."
ynh_script_progression --message="Running database migrations..." --weight=6 pushd /usr/share/mailman3-web
python3 manage.py migrate || ynh_die --message="Mailman3 migrations failed!"
cd /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 # SETUP SYSTEMD
ynh_store_file_checksum --file=/etc/mailman3/mailman-web.cfg #=================================================
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 # GENERIC FINALIZATION
#================================================= #=================================================
# INTEGRATE SERVICE IN YUNOHOST
#=================================================
# ADVERTISE SERVICE IN ADMIN PANEL
#================================================= #=================================================
ynh_script_progression --message="Integrating service in YunoHost..."
ynh_script_progression --message="Advertising services in admin panel..." --weight=3 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"
yunohost service add "$app"
yunohost service add "$app-web"
#================================================= #=================================================
# START SYSTEMD SERVICE # START SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Starting a systemd service..."
ynh_script_progression --message="Starting the $app and $app-web services..." --weight=10 # Start a systemd service
ynh_systemd_action --service_name=$app --action="restart"
ynh_systemd_action --service_name=$app --action=enable ynh_systemd_action --service_name="$app-web" --action="restart"
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
#================================================= #=================================================
# SETUP SSOWAT # 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 ] if [ $is_public -eq 1 ]
then 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 fi
#================================================= #=================================================
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
ynh_script_progression --message="Reloading NGINX web server..."
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
@ -238,4 +202,4 @@ ynh_systemd_action --service_name=nginx --action=reload
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Installation of $app completed" --last ynh_script_progression --message="Installation of $app completed"

View file

@ -8,89 +8,98 @@
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
source ynh_add_extra_apt_repos__3
#================================================= #=================================================
# LOAD SETTINGS # LOAD SETTINGS
#================================================= #=================================================
ynh_script_progression --message="Loading installation settings..."
ynh_script_progression --message="Loading installation settings..." --weight=1
app=$YNH_APP_INSTANCE_NAME 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 # STANDARD REMOVE
#================================================= #=================================================
# REMOVE SERVICE INTEGRATION IN YUNOHOST
#=================================================
# REMOVE BACKPORTS REPOSITORY
#================================================= #=================================================
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
ynh_remove_extra_repo --name=stretch-backports
#=================================================
# REMOVE 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 DEPENDENCIES
#=================================================
ynh_script_progression --message="Removing dependencies..." --weight=6
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..." --weight=2
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 then
ynh_script_progression --message="Removing $app service..." --weight=2 ynh_script_progression --message="Removing $app service integration..."
yunohost service remove "$app" yunohost service remove $app
fi fi
if yunohost service status "$app-web" >/dev/null 2>&1 # 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 then
ynh_script_progression --message="Removing $app-web service..." --weight=2 ynh_script_progression --message="Removing $app-web service integration..."
yunohost service remove "$app-web" yunohost service remove "$app-web"
fi 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..."
# 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..."
# Remove metapackage and its dependencies
ynh_remove_app_dependencies
#=================================================
# REMOVE NGINX CONFIGURATION
#=================================================
ynh_script_progression --message="Removing NGINX web server configuration..."
# Remove the dedicated NGINX config
ynh_remove_nginx_config
#================================================= #=================================================
# SPECIFIC REMOVE # 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 # GENERIC FINALIZATION
#=================================================
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Removal of $app completed" --last ynh_script_progression --message="Removal of $app completed"

View file

@ -1,16 +1,14 @@
#!/bin/bash #!/bin/bash
# TODO(decentral1se)
#================================================= #=================================================
# GENERIC START # GENERIC START
#================================================= #=================================================
# IMPORT GENERIC HELPERS # 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 ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
source ../settings/scripts/ynh_add_extra_apt_repos__3
#================================================= #=================================================
# MANAGE SCRIPT FAILURE # MANAGE SCRIPT FAILURE
@ -19,112 +17,121 @@ source ../settings/scripts/ynh_add_extra_apt_repos__3
ynh_clean_setup () { 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 ynh_abort_if_errors
#================================================= #=================================================
# LOAD SETTINGS # LOAD SETTINGS
#================================================= #=================================================
ynh_script_progression --message="Loading installation settings..."
ynh_script_progression --message="Loading settings..." --weight=2
app=$YNH_APP_INSTANCE_NAME app=$YNH_APP_INSTANCE_NAME
domain=$(ynh_app_setting_get --app=$app --key=domain) 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 # 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 --path_url=$path_url \
|| ynh_die --message="Path not available: ${domain}${path_url}"
ynh_webpath_available --domain=$domain \
|| ynh_die --message="Path not available: ${domain}"
test ! -d /usr/share/mailman3-web \ test ! -d /usr/share/mailman3-web \
|| ynh_die --message="There is already an installation present at /usr/share/mailman3-web?" || ynh_die --message="There is already an installation present at /usr/share/mailman3-web?"
#================================================= #=================================================
# STANDARD RESTORATION STEPS # STANDARD RESTORATION STEPS
#=================================================
#================================================= #=================================================
# RESTORE THE NGINX CONFIGURATION # RESTORE THE NGINX CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Restoring the NGINX web server configuration..."
ynh_script_progression --message="Restoring nginx configuration..." --weight=1
ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" 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 # SPECIFIC RESTORATION
#=================================================
#================================================= #=================================================
# REINSTALL DEPENDENCIES # REINSTALL DEPENDENCIES
#================================================= #=================================================
ynh_script_progression --message="Reinstalling dependencies..."
# TODO(decentral1se) # Define and install dependencies
# ynh_script_progression --message="Reinstalling dependencies..." --weight=30 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_psql_test_if_first_run
# ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=14
# 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 --db_name=$db_name --db_pwd=$db_pwd 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.sql" --database="$db_name" 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_restore_file --origin_path="/usr/share/yunohost/hooks/conf_regen/98-postfix_mailman3"
# ynh_script_progression --message="Restoring the systemd configuration..." --weight=3 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) systemctl enable $app.service --quiet
# ynh_script_progression --message="Advertising service in admin panel..." --weight=3 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 # START SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Starting a systemd service..."
# TODO(decentral1se) # Start a systemd service
# ynh_script_progression --message="Starting a systemd service..." --weight=41 ynh_systemd_action --service_name=$app --action=restart
ynh_systemd_action --service_name="$app-web" --action=restart
#=================================================
# 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"
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION
#================================================= #=================================================
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
ynh_script_progression --message="Reloading NGINX web server..."
# TODO(decentral1se) ynh_systemd_action --service_name=nginx --action=reload
# ynh_script_progression --message="Reloading NGINX web server..." --weight=2
# ynh_systemd_action --service_name=nginx --action=reload
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Restoration completed for $app" --last ynh_script_progression --message="Restoration completed for $app"

View file

@ -1,4 +1,122 @@
#!/bin/bash #!/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"

View file

@ -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}"
}

View file

@ -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