Contexte : RPC, le protocole des vieux cons [1]
Parfois, on dispose d’un wiki sur son réseau local et l’on souhaiterait pouvoir publier publiquement certains articles plutôt que d’autres. On aimerait éviter également installer un autre gestionnaire de contenu pour animer le site public.
Les avantages sont de pouvoir publier aléatoirement certains articles sans s’occuper d’une gestion des droits et de la sécurité du wiki s’il avait été exposé publiquement à internet.
Je vous propose donc, à travers cet article, d’utiliser les fonctions XML-RPC disponibles avec le wiki Dokuwiki. Ces fonctions d’appels de procédures distantes (http://fr.wikipedia.org/wiki/Remote_procedure_call) sont disponibles sur la plupart des wikis, blogs et CMS les plus répandus.
Pour l’application frontale publique, nous utiliserons l’excellent micro framework Bottle Python, qui dispose d’une bonne documentation. Il permettra de comprendre rapidement le code sans s’encombrer de concepts inutiles et/ou trop abstraits inhérents à certains frameworks plus complets.
Modules utilisés
Nous utiliserons 4 modules pour réaliser cette tâche :
- dokuwikixmlrpc est le module qui implémente l’interface XML-RPC de Dokuwiki,
- bottle comme module enveloppant pour notre application orientée web,
- import subprocess pour lancer les commandes,
- import shlex comme analyseur syntaxique.
Architecture physique proposée [2]
Captures
La version publique
La version locale
Code de l’exemple
Listing:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'julien@hautefeuille.eu' __version__ = '0.1' __license__ = 'BSD' import bottle import subprocess import shlex TITLE_SITE = "Le Jardinet" COPYRIGHT = TITLE_SITE + """ - Site à vocation informatique en perpétuelle reconstruction""" def get_audit(): cmdl = "python dokuwikixmlrpc.py -u bottle -w" cmdl = cmdl + "https://192.168.0.3/wiki/ -p lemotdepasse --html" cmdl = cmdl + " attaque_de_reseaux_wifi_wep" cmdl.encode('ascii') args = shlex.split(cmdl) process = subprocess.Popen(args, shell=False,stdout=subprocess.PIPE, stderr=subprocess.PIPE) com = process.communicate() return com[0] def get_python(): cmdl = "python dokuwikixmlrpc.py -u bottle -w" cmdl = cmdl + "https://192.168.0.3/wiki/ -p lemotdepasse --html" cmdl = cmdl + " python" cmdl.encode('ascii') args = shlex.split(cmdl) process = subprocess.Popen(args, shell=False,stdout=subprocess.PIPE, stderr=subprocess.PIPE) com = process.communicate() return com[0] def get_diy(): cmdl = "python dokuwikixmlrpc.py -u bottle -w" cmdl = cmdl + "https://192.168.0.3/wiki/ -p lemotdepasse --html" cmdl = cmdl + " electronique_bricolage_diy" cmdl.encode('ascii') args = shlex.split(cmdl) process = subprocess.Popen(args, shell=False,stdout=subprocess.PIPE, stderr=subprocess.PIPE) com = process.communicate() return com[0] @bottle.route('/') @bottle.view('mainview') def index(): return dict(title=TITLE_SITE, copyright=COPYRIGHT,audit=get_audit(), python=get_python(), diy=get_diy()) if "__main__" == __name__: bottle.run(host='localhost', port=8080, server='cherrypy')
[1] | Vieux cons dont je fais partie ;) |
[2] | Comme toute architecture, elle est soumise aux compromis. |