Met à jour la liste des adresses email inscrites à la liste *ag@* par rapport
aux membres à jour de cotisation. À exécuter à travers un *cron*. A besoin de
-pouvoir lancer les commandes `list_members`, `add_members` et `remove_members`
-via `sudo` sur le compte `list`.
+pouvoir se connecter à l’API REST de Mailman 3.
+
+La variable d’environnement suivante doit être
+définie `NOS_OIGNONS_MAILMAN_REST_API_URL` avec par exemple :
+`https://user:password@mailman.example.org`
+
+À défaut, cette dernière sera lue depuis le fichier `mailman-rest-url`
+dans le dossier indiqué par la variable d’environnemnet `CREDENTIALS_DIRECTORY`
+(voir [System and Service Credentials](https://systemd.io/CREDENTIALS/) et
+la procédure de déploiement indiqué plus bas).
`send-membership-reminders`
---------------------------
L'essentiel du code est en Ruby. Les dépendances sont gérées avec Bundler. Les
tests d'intégrations sont faits avec Cucumber.
-Installer les paquets Debian qui vont bien (sur Wheezy) :
+Installer les paquets Debian qui vont bien (sur Jessie) :
- apt-get install ruby1.9.1 bundler
+ apt-get install bundler
Pour récupérer les dépendances :
- ruby1.9.1 /usr/bin/bundle install --path=vendor/bundle
+ bundle install --path=vendor/bundle
Déploiement
===========
Installer les paquets Debian qui vont bien (sur Wheezy) :
- apt-get install ruby1.9.1 bundler
+ apt-get install bundler
Installer les dépendances :
- ruby1.9.1 /usr/bin/bundle install --deployment \
- --without=development \
- --path=vendor/bundle
+ bundle install --deployment --without=development --path=vendor/bundle
chmod -R o+rX vendor/bundle
Il faut donner les droits d'écriture à `wiki-ca` sur le répertoire `var`.
Ne pas oublier de le rendre exécutable.
-Pour permettre au script `update-ag-subscribers` de fonctionner, il est
-nécessaire de l'autoriser à exécuter certaines commandes de Mailman.
-Pour cela, on va créer un fichier dans `/etc/sudoers.d` :
+On va utiliser des
+[services](https://www.freedesktop.org/software/systemd/man/systemd.service.html)
+et des [timers](https://www.freedesktop.org/software/systemd/man/systemd.timer.html)
+systemd pour les scripts à utiliser régulièrement.
+
+Dans `/etc/systemd/system/gestion-adh-update-ag-subscribers.service` :
+
+ [Unit]
+ Description=Update subscribers of the `ag` mailing list according to memberships
+
+ [Service]
+ Type=oneshot
+ WorkingDirectory=/srv/ikiwiki/wiki-ca/gestion-adh
+ User=wiki-ca
+ ExecStart=/srv/ikiwiki/wiki-ca/gestion-adh/bin/update-ag-subscribers
+ Environment=BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src
+ SyslogIdentifier=update-ag-subscribers
+ ProtectSystem=strict
+ ProtectHome=true
+ PrivateTmp=yes
+ PrivateDevices=yes
+
+Dans `/etc/systemd/system/gestion-adh-update-ag-subscribers.timer` :
+
+ [Unit]
+ Description=Run update-ag-subscribers every hour
+
+ [Timer]
+ RandomizedDelaySec=30min
+ OnCalendar=hourly
+
+ [Install]
+ WantedBy=timers.target
+
+Il est également nécessaire de configurer le *credential* avec les informations
+de connexion à Mailman :
+
+ echo -n 'https://USER:SECRET_PASSWORD@localhost:8001' | sudo systemd-creds encrypt --name=mailman-rest-url -p - - | sudo tee -a /etc/systemd/system/gestion-adh-update-subscribers.service.d/overrides.conf
+
+Dans `/etc/systemd/system/gestion-adh-send-membership-reminders.service` :
+
+ [Unit]
+ Description=Send reminders to renew membership
+
+ [Service]
+ Type=oneshot
+ WorkingDirectory=/srv/ikiwiki/wiki-ca/gestion-adh
+ User=wiki-ca
+ ExecStart=/srv/ikiwiki/wiki-ca/gestion-adh/bin/send-membership-reminders
+ Environment=BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src
+ SyslogIdentifier=send-membership-reminders
+ ProtectSystem=strict
+ ProtectHome=true
+ PrivateTmp=yes
+ PrivateDevices=yes
+ ReadWritePaths=/srv/ikiwiki/wiki-ca/gestion-adh/var
+
+Dans `/etc/systemd/system/gestion-adh-send-membership-reminders.timer` :
+
+ [Unit]
+ Description=Run send-membership-reminders every day
+
+ [Timer]
+ OnCalendar=06:42
+
+ [Install]
+ WantedBy=timers.target
+
+Dans `/etc/systemd/system/gestion-adh-send-member-emails-to-advisors.service` :
+
+ [Unit]
+ Description=Send member emails to the advisory board
- Defaults:wiki-ca !requiretty
+ [Service]
+ Type=oneshot
+ WorkingDirectory=/srv/ikiwiki/wiki-ca/gestion-adh
+ User=wiki-ca
+ ExecStart=/srv/ikiwiki/wiki-ca/gestion-adh/bin/send-member-emails-to-advisors
+ Environment=BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src
+ SyslogIdentifier=send-member-emails-to-advisors
+ ProtectSystem=strict
+ ProtectHome=true
+ PrivateTmp=yes
+ PrivateDevices=yes
- Cmnd_Alias AG_MANAGEMENT = /usr/sbin/list_members ag,\
- /usr/sbin/add_members -r - ag,\
- /usr/sbin/remove_members -f - ag
+Dans `/etc/systemd/system/gestion-adh-send-member-emails-to-advisors.timer` :
- wiki-ca ALL = (list) NOPASSWD: AG_MANAGEMENT
+ [Unit]
+ Description=Run send-member-emails-to-advisors monthly
-Ensuite, pour exécuter régulièrement les scripts via le *crontab* du compte
-`wiki-ca`, il faut y ajouter :
+ [Timer]
+ OnCalendar=monthly
- 42 * * * * BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src ruby1.9.1 /srv/ikiwiki/wiki-ca/gestion-adh/bin/update-ag-subscribers
- 42 6 * * * BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src ruby1.9.1 /srv/ikiwiki/wiki-ca/gestion-adh/bin/send-membership-reminders
- 21 0 1 * * BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile NOS_OIGNONS_BOARD_WIKI_PATH=/srv/ikiwiki/wiki-ca/src ruby1.9.1 /srv/ikiwiki/wiki-ca/gestion-adh/bin/send-member-emails-to-advisors
+ [Install]
+ WantedBy=timers.target
Pour installer le `pre-commit` *hook* sur le dépôt utilisé par
Ikiwiki, on met dans `/srv/ikiwiki/wiki-ca/src/.git/hooks/pre-commit` :
- if ! BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile ruby1.9.1 /srv/ikiwiki/wiki-ca/gestion-adh/bin/pre-commit-hook; then
+ if ! BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile /srv/ikiwiki/wiki-ca/gestion-adh/bin/pre-commit-hook; then
# Reset changes that do not pass the pre-commit hook to prevent
# wrong changes to lay in the Ikiwiki source directory.
git reset --hard
`/srv/git/.gitolite/hooks/wiki-ca/hooks/pre-receive` :
#!/bin/sh
- BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile ruby1.9.1 /srv/ikiwiki/wiki-ca/gestion-adh/bin/pre-receive-hook
+ BUNDLE_GEMFILE=/srv/ikiwiki/wiki-ca/gestion-adh/Gemfile /srv/ikiwiki/wiki-ca/gestion-adh/bin/pre-receive-hook
Ne pas oublier de le rendre exécutable. Il faut ensuite faire un lien symbolique :