chore: secure ticketing configuration
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
# comi-odoo-ticketing
|
||||
|
||||
Script WAPT de surveillance des tickets Odoo Helpdesk Comitari.
|
||||
|
||||
Le projet interroge Odoo via JSON-RPC, compare la date de modification des tickets avec un etat local JSON, puis envoie un message Rocket.Chat via webhook quand des tickets ont change depuis la derniere verification.
|
||||
|
||||
## Contenu du depot
|
||||
|
||||
| Fichier | Role |
|
||||
| --- | --- |
|
||||
| `setup.py` | Script WAPT principal. Contient les fonctions `install()`, `audit()` et `send_to_rocket()`. |
|
||||
| `WAPT/control` | Metadata minimale du paquet WAPT. |
|
||||
| `ticketing.ini.example` | Modele de configuration avec placeholders, copie dans le repertoire prive WAPT sous le nom `ticketing.ini`. |
|
||||
| `tests/test_ticketing.py` | Tests unitaires de la logique de comparaison et de persistance d'etat. |
|
||||
| `.env` | Variables d'environnement locales pour pointer vers l'installation Python/WAPT Windows. |
|
||||
| `TRAVAIL.md` | Journal de travail maintenu par Codex. |
|
||||
|
||||
## Fonctionnement
|
||||
|
||||
1. `install()` copie `ticketing.ini.example` vers `WAPT.private_dir/ticketing.ini` si le fichier cible n'existe pas encore.
|
||||
2. Le fichier copie doit etre renseigne sur la machine cible avec l'URL Odoo, la cle API et le webhook Rocket.Chat.
|
||||
3. `audit()` appelle l'endpoint JSON-RPC Odoo configure dans `ticketing.ini`.
|
||||
4. La methode Odoo appelee est `helpdesk.ticket.search_read`, avec les champs `id` et `write_date`.
|
||||
5. Le script charge l'ancien etat depuis `tickets_state.json`.
|
||||
6. Chaque ticket nouveau ou dont `write_date` a change est ajoute a la liste des tickets mis a jour.
|
||||
7. Un message est envoye dans Rocket.Chat via le webhook configure dans le fichier INI prive.
|
||||
8. Le nouvel etat est sauvegarde dans `WAPT.private_dir/tickets_state.json`.
|
||||
|
||||
## Prerequis
|
||||
|
||||
- Environnement WAPT avec `setuphelpers`.
|
||||
- Python compatible avec l'environnement WAPT cible.
|
||||
- Acces reseau vers Odoo Comitari.
|
||||
- Acces reseau vers Rocket.Chat Comitari.
|
||||
- Dependances Python :
|
||||
- `requests`
|
||||
- modules standard : `json`, `os`, `shutil`, `configparser`
|
||||
|
||||
## Configuration
|
||||
|
||||
La configuration sensible est centralisee dans la copie privee `WAPT.private_dir/ticketing.ini`. Le depot ne versionne que `ticketing.ini.example`, avec des placeholders :
|
||||
|
||||
```ini
|
||||
[rocket]
|
||||
webhook_url = CHANGE_ME_ROCKET_CHAT_WEBHOOK_URL
|
||||
|
||||
[odoo]
|
||||
url = https://CHANGE_ME_ODOO_HOST
|
||||
api_key = CHANGE_ME_ODOO_API_KEY
|
||||
model = helpdesk.ticket
|
||||
|
||||
[http]
|
||||
timeout = 30
|
||||
```
|
||||
|
||||
Au deploiement, `install()` copie ce modele vers `WAPT.private_dir/ticketing.ini` uniquement si le fichier n'existe pas deja. Il faut ensuite renseigner le fichier prive sur la machine cible. Les mises a jour du paquet n'ecrasent donc pas une configuration deja remplie.
|
||||
|
||||
Si une valeur obligatoire est absente ou conserve un placeholder `CHANGE_ME...`, l'audit echoue explicitement avec un message indiquant la cle a renseigner.
|
||||
|
||||
Important : ne pas renseigner de vrais secrets dans `ticketing.ini.example`. Le fichier local `ticketing.ini` est ignore par Git.
|
||||
|
||||
## Execution
|
||||
|
||||
Dans un paquet WAPT, l'execution attendue passe par les hooks WAPT :
|
||||
|
||||
```python
|
||||
install()
|
||||
audit()
|
||||
```
|
||||
|
||||
Hors WAPT, le script ne peut pas etre lance tel quel sans fournir les objets et chemins attendus par `setuphelpers`, notamment `WAPT.private_dir`.
|
||||
|
||||
## Etat local
|
||||
|
||||
`tickets_state.json` est stocke dans `WAPT.private_dir` et contient un dictionnaire JSON au format :
|
||||
|
||||
```json
|
||||
{
|
||||
"ticket_id": "write_date"
|
||||
}
|
||||
```
|
||||
|
||||
Le runtime lit et ecrit ce fichier dans `WAPT.private_dir`. Il n'est pas versionne dans le depot.
|
||||
|
||||
## Protocole Odoo
|
||||
|
||||
Le script utilise l'endpoint configure sous la forme `<odoo.url>/jsonrpc` avec un payload JSON-RPC direct :
|
||||
|
||||
```json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "call",
|
||||
"params": {
|
||||
"model": "helpdesk.ticket",
|
||||
"method": "search_read",
|
||||
"args": [[], ["id", "write_date"]]
|
||||
},
|
||||
"id": 1
|
||||
}
|
||||
```
|
||||
|
||||
Il faut donc que l'instance Odoo expose bien un endpoint compatible avec ce format. Si l'instance attend le protocole externe Odoo standard `execute_kw`, il faudra adapter `fetch_odoo_tickets()`.
|
||||
|
||||
## Tests
|
||||
|
||||
Les tests unitaires peuvent etre executes hors WAPT :
|
||||
|
||||
```bash
|
||||
python3 -m unittest discover -s tests
|
||||
```
|
||||
|
||||
## Points d'attention connus
|
||||
|
||||
- Les secrets doivent etre renseignes uniquement dans la copie privee `WAPT.private_dir/ticketing.ini`.
|
||||
- Les secrets deja presents dans l'historique Git doivent etre regeneres cote Odoo et Rocket.Chat.
|
||||
|
||||
## Prochaines ameliorations recommandees
|
||||
|
||||
1. Confirmer en environnement cible que l'endpoint Odoo accepte bien le payload JSON-RPC direct documente ci-dessus.
|
||||
2. Completer les metadonnees `WAPT/control` selon les conventions internes Comitari.
|
||||
3. Ajouter un test d'integration manuel ou automatise sur une instance Odoo de recette.
|
||||
Reference in New Issue
Block a user