qcm

Retour accueil


Code : http://git.bebou.netlib.re/qcm/files.html

Faire des sondages simples en parsant les logs d’un serveur web

Sur un vieux concept déjà décrit ici. L’idée est d’en faire une sorte de kahoot ! ou wooclap like entièrement descriptible par un fichier texte, ne nécessitant qu’un serveur accessible sur le web.

qcm est installé sur bebou mais uniquement les personnes ayant un compte dessus peuvent l’utiliser pour créer des questionnaires. Il est cependant très simple d’installer qcm sur votre serveur linux, et j’espère pas beaucoup plus sur une autre variante Unix-like.

Dépendances

Testé sous debian 12 et le serveur web nginx packagé pour. Le code parsant les logs convient pour le format par défaut d’nginx. Il se peut qu’il ne fonctionne pas pour d’autres formats.

Les défauts

url par défaut : http://bebou.netlib.re (modifiable dans le code)
log par défaut : /var/log/nginx/access.log (modifiable dans le code)
nombre de questions par défaut : 4 (ABCD)

Installation

Télécharger le code :

git clone git://bebou.netlib.re/qcm

Compiler et installer

cd qcm
make
make install

Il est possible de modifier le dossier de destination du script exécutable en modifiant la variable DEST dans le makefile.

Usages et exemples

Créer des questionnaires

La syntaxe des questionnaires est ici.

Depuis le serveur web ou une machine ayant accès aux logs webs en direct

Lancer la console de création de questionnaire :

$ qcm

Pareil mais afficher une autre url (si jamais l’édition du script n’est pas possible) :

$ qcm -u http://monsite.com

Comme le premier exemple mais scanner le fichier de log /var/log/httpd/logs plutôt que celui par défaut (attention il faudra sûrement adapter le code) :

$ qcm -l /var/log/httpd/logs

Lire un questionnaire déjà fait depuis stdin et afficher les résultats avec gnuplot :

$ cat questionnaire.qcm | qcm -g

Depuis une machine pouvant SSH sur le serveur web

Lancer un questionnaire sur un serveur équipé de qcm : Ne fonctionne pas encore

$ cat questionnaire.qcm | ssh -t user@server qcm

Alternatives : uploader le fichier d’abord

$ cat questionnaire.qcm | ssh user@server 'cat > q'
$ ssh -t user@server '< q qcm;rm q'

ou copier/coller le fichier avec xclip :

$ < questionnaire.qcm xclip -selection clipboard
$ ssh -t user@server qcm
Ecrivez le questionnaire puis ctrl+D pour le soumettre
syntaxe du questionnaire :
http://arthur.bebou.netlib.re/qcm/#le-format-du-fichier-de-questionnaire
*ici faire ctrl+v pour coller le questionnaire*

Répondre aux questionnaires

Il faut se munir de l’url du serveur, de l’identifiant du questionnaire, de l’intitutlé de la question et des choix de réponses. Ces infos sont connues de la personne ayant créé le questionnaire.

Pour répondre à une question il faut créer et envoyer une requête HTTP GET au serveur à l’url :

url/identifiant/réponse

Ainsi si l’url est http://bebou.netlib.re, l’identifiant hjk et la question :

om, psg ou les verts ?

A om
B psg
C les verts

On pourra répondre “les verts” en envoyant la réquête à :

http://bebou.netlib.re/hjk/C

Quand cela est prévu il est possible de choisir plusieurs réponses. Il faut alors bien les mettre dans l’ordre :

http://bebou.netlib.re/hjk/AC
et non pas
http://bebou.netlib.re/hjk/CA

Pour les questions ouvertes il est possible de répondre n’importe quoi

http://bebou.netlib.re/hjk/cool cool je peux écrire ce que je veux

Pour créer et envoyer cette requête le plus courant sera d’utiliser un navigateur web et d’entrer l’url dans la barre d’url/de recherche en haut. Il est également possible d’utiliser un programme comme curl ou wget.

Puisque les pages qui correspondent n’existent pas une erreur 404 sera renvoyée. Pas d’inquiétude, la réponse a tout de même bien été prise en compte.

Le format du fichier de questionnaire

Le fichier de questionnaire est un fichier texte. Chaque question contient des champs pour renseigner ses attributs et doit terminer par l’instruction demander. Les attributs doivent être sous la forme nom: sans espace entre le : et nom mais avec un espace après le :.

La liste des attributs :

Attention : Tout attribut renseigné pour la Nième question conservera sa valeur pour les questions suivantes s’il n’est pas répété. Si la question ou les réponses contiennent des caractères spéciaux ;/)' etc il vaut mieux tout “quoter” avec des “. Pour ajouter un " vous pouvez l’échapper avec un \.

Ainsi le fichier

demander

question: om, psg ou les verts
options: om~psg~les verts
choix: multiple
demander

question: Donnez un exemple de nombre réel svp
type: regex
options: [0-9]*[,.][0-9]+
unique: non
demander

question: "Quels sentiments vous évoquent l'anarchie ?"
type: ouverte
demander

question: "Sachant que :
x=3
y=7

Combien font \"x+y\" ?"
type: qcm
options: 6~11~10~autre
choix: unique
unique: oui
demander

question: Et x-y ?
demander

Posera six questions en tout.

  1. celle par défaut, un qcm avec quatre choix, aucun intitulé, aucune réponse possible d’affichée (juste les lettres). Par défaut ne permet de choisir qu’une seule réponse une seule fois. Utile si les questions et les réponses sont gérées par ailleurs, par exemple projetée via des diapos.
  2. une qcm offrant le choix entre les trois équipes de foot. Il est possible d’en choisir plusieurs à la fois. Est toujours un qcm par défaut et ne permet de répondre qu’une seule fois.
  3. une question regex demandant un nombre réel et filtrant sur une expression régulière ne laissant passer que les nombres réels. Une même IP peut envoyer plusieurs réponses.
  4. une question ouverte à laquelle on peut répondre plusieurs fois. Notez les " pour gérer l’apostrophe dans l'anarchie.
  5. une question de type qcm de math dont une seule réponse est correcte et à laquelle on ne peut répondre qu’une seule fois. Il faut ici rappeler que c’est une qcm, que l’on ne peut répondre qu’une seule fois et qu’une seule réponse est la bonne puisque par défaut on hérite des attributs de la question précédente, ouverte et à laquelle on pouvait répondre plusieurs fois ainsi que celle encore d’avant pour laquelle on pouvait choisir plusieurs options. On notera également que si l’on englobe tout dans des " on peut sauter des lignes et que l’on peut échapper des ".
  6. identique à la question 5 mais l’intitulé change.

Étant donné que tous les attributs sont optionnels le fichier suivant :

demander
demander
demander

Est valide. Il posera trois questions sans intitulés avec quatre options de réponses chacune.

Si l’on veut créer un questionnaire à la volée et que l’on connaît bien la syntaxe ci-dessus on peut simplement lancer qcm -f - et écrire les questions.

Pour l’instant dans les questions de type qcm une réponse CD est considérée comme différente de DC.

Sécurité

Attention !

Les fichiers de questionnaire tel qu’ils fonctionnent aujourd’hui sont en réalité des scripts (catium n’est jamais bien loin). Si entre deux attributs on écrit ls la commande sera exécutée ! Cela peut être super pratique si l’on fait confiance au script (automatiser des choses entre les questions ou écrire du shell qui génèrera automatiquement les questions) mais cela est aussi un immense risque d’un point de vue sécurité.

Il est donc fortement recommandé de limiter l’usage de cette fonctionnalité à des sources réputées sûres. Par exemple, sur bebou, seules les personnes détenant un compte peuvent utiliser qcm.

Il est possible de régler cette faille en réécrivant qcm pour qu’il parse le fichier plutôt que l’exécuter mais c’est plus compliqué. Deux solutions possibles :

  1. lire ligne par ligne et exécuter le code mais uniquement si c’est une fonction shell (vérifier si le script n’a pas accès à des fonctions autres que celles déclarées dans le script lui même).
  2. parser les lignes de façon à instancier les variables et faire les appels “à la main”.

Dans les deux cas il sera de toute façon délicat de garantir la sécurité et on perd la possibilité de faire de la méta création de questionnaires.