Skip to content
Snippets Groups Projects
Verified Commit e45e777c authored by Quentin Duchemin's avatar Quentin Duchemin
Browse files

[Wekan] Fix path for hook filtering

parent 861009a9
No related branches found
No related tags found
1 merge request!52Bump wekan and add a tool to filter hooks by activity type
......@@ -19,22 +19,8 @@ Il suffit de mettre à jour les tags des images dans le [docker-compose.yml](./d
On pourra aussi consulter le Compose du dépôt officiel pour effectuer les nouvelles configurations.
### Configurer des hooks
### Hooks
Wekan a une fonctionnalité pour [déclencher un *hook*](https://github.com/wekan/wekan/pull/1119) lors de l'activité sur un board.
Grâce aux hooks, on peut configurer Mattermost pour recevoir un message sur un canal donné dès qu'une activité est détectée.
Pour configurer des hooks, on pourra consulter la [documentation utilisateur](https://wiki.picasoft.net/doku.php?id=technique:adminsys:wekan:hooks).
Le souci est que Wekan [déclenche les hooks sortants pour chaque activité](https://github.com/wekan/wekan/wiki/Webhook-data), même les plus insignifiantes, ce qui spamme le canal.
L'idée est donc de passer par un intermédiaire pour filter les hooks selon le type d'activité, et ne transmettre que les activités intéressantes. C'est ce que fait le petit outil [filter-hooks](./filter-hooks).
Lorsque l'on configure un hook entrant dans Mattermost, on obtient un lien de la forme `https://team.picasoft.net/hooks/XXX`, qui permet de poster le message du hook sur un canal donné. Plutôt que d'entrer directement cette URL dans Wekan, on utilisera une URL de la forme :
```
https://kanban.picasoft.net/forward_hooks?url=https://team.picasoft.net/hooks/XXX
```
`filter-hooks` répond lorsqu'une requête arrive sur `/foward_hooks`, et transmet le hook à `url` s'il est pertinent.
Les hooks "pertinents" sont définis directement [dans le code](./filter-hooks/main.py).
Le code est très basique voire bancal et pourra être amélioré.
Voir aussi [le README de filter-hooks](./filter-hooks) pour le code permettant de filter les hooks par activité.
......@@ -52,7 +52,7 @@ services:
build: ./filter-hooks
container_name: wekan-filter-hooks
environment:
- WEKAN_URL=https://kanban.picasoft.net
- KANBAN_URL=https://kanban.picasoft.net
networks:
- docker_default
labels:
......
## Filter et faire suivre les hooks Wekan
Wekan a une fonctionnalité pour [déclencher un *hook*](https://github.com/wekan/wekan/pull/1119) lors de l'activité sur un board.
Grâce aux hooks, on peut configurer Mattermost pour recevoir un message sur un canal donné dès qu'une activité est détectée.
Le souci est que Wekan [déclenche les hooks sortants pour chaque activité](https://github.com/wekan/wekan/wiki/Webhook-data), même les plus insignifiantes, ce qui spamme le canal.
L'idée est donc de passer par un intermédiaire pour filter les hooks selon le type d'activité, et ne transmettre que les activités intéressantes. C'est ce que fait ce petit outil. Le code est très basique voire bancal et pourra être amélioré.
### Lancement
Il suffit de construire l'image et de lancer l'outil.
On peut aussi le faire à la main :
```
gunicorn --bind 0.0.0.0:5000 --reload main:app
```
### Utilisation
Supposons que dans une application type Mattermost, on configure un hook **entrant** qui peut recevoir des requêtes `POST` de Wekan. Cette URL est désignée par `URL_HOOK`.
Supposons que cet outil soit déployé à l'adresse `https://URL_FILTER`.
Dans Wekan, l'URL du hook sortant sera alors (à la place de `URL_HOOK`) :
```
https://URL_FILTER/forward_hooks?url=URL_HOOK
```
Quand il reçoit une requête, l'outil examine le hook et voit si le type d'activité correspond à une liste pré-définie.
Si oui, il construit un objet JSON avec une description en français de la forme :
```json
{
"text": "Machin a créé la carte truc dans TODO"
}
```
Puis l'envoye à `URL_HOOK`. La plupart des outils type Mattermost sont compatibles avec ce format (c'est celui utilisé par Wekan, d'ailleurs). Sur Mattermost, un message sera posté avec `text` pour contenu.
### Type d'activité pris en compte
Les hooks "pertinents" sont définis directement [dans le code](./main.py).
......@@ -29,7 +29,7 @@ allowed_hooks = {
'act-addComment': 'commenté'
}
@app.route('/', methods=['POST'])
@app.route('/forward_hooks', methods=['POST'])
def filter_hook():
hook_data = json.loads(request.data)
event = hook_data['description']
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment