- Dépendances
- Les défauts
- Installation
- Usages et exemples
- Le format du fichier de questionnaire
- Sécurité
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
- un shell posix + local (testé avec dash)
- un
mktemp
avec-d
stdbuf
- un
sed
posix - un
xargs
posix - optionnelle : gnuplot pour faire des graphiques avec -g
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 :
question
: L’intitulé de la question. Optionnel. S’il n’existe pas rien ne sera affichétype
: le type de question. Optionnel.qcm
, type par défaut, proposera un choix multiple (A, B, C…), uniquement ces réponses seront valides. Sioptions
existe il fera correspondre les options aux différentes lettres. En l’absence d’options
qcm
proposera 4 choix par défaut (A, B, C et D). Malgré son nomqcm
n’admet par défaut qu’une seule réponse possible. Voirchoix
.ouverte
permettra n’importe quelle réponse et ignoreoptions
.regex
permet de restreindre les réponses possibles en écrivant un expression régulière. Dans ce cas-cioptions
renseigne l’expression.options
: Si la question est de typeqcm
,options
est la liste des réponses possibles séparées par des~
. Il ne doit pas y avoir de~
à la fin. Si la question est de typeregex
,options
est l’expression régulière filtrant les réponses. Optionnel.unique
: si une seule réponse par IP est autorisée ou pas. Optionnel. “non” enregistrera toutes les réponses, n’importe quoi d’autre (oui
par exemple) filtrera sur les IP pour ne laisser que la première réponse passer. Par défautunique
est à oui.choix
: si la question est à choix multiple ou pas. Optionnel. “multiple” permettra de choisir plusieurs options, n’importe quoi d’autre l’empêchera. Par défaut les questions ne sont pas à choix multiple. Si la question est detype
ouverte
cet attribut est ignoré puisqu’il n’y a pas d’options parmi lesquelles choisir.demander
: n’est pas un attribut mais “enregistre” la question et la lance
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.
- 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.
- 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.
- 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. - une question ouverte à laquelle on peut répondre plusieurs fois. Notez les
"
pour gérer l’apostrophe dansl'anarchie
. - 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"
. - 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 :
- 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).
- 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.