Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
commit 295c423fa7618ce011442286180b167ade7640e1 parent 319418ab3c7afc19c042b0b80063b561fa1a5171 Auteurice: Arthur Pons <arthur.pons@unistra.fr> Date: Thu, 7 Nov 2024 21:26:00 +0100 Ajout de l'article qcm Diffstat:
A | contents/qcm/index.sh | | | 264 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 264 insertions(+), 0 deletions(-)
diff --git a/contents/qcm/index.sh b/contents/qcm/index.sh @@ -0,0 +1,264 @@ +#! page +title: qcm +author: Arthur Pons +description: Faire des sondages simples en parsant les logs d\'un serveur web +publication: 2024-11-07 + +sectionmd: main + +Sur un vieux concept déjà décrit +[ici](/sondages/#par-greppage-de-logs-de-serveurs-web). L'idée est d'en faire +une sorte de [kahoot !](https://kahoot.it/) ou +[wooclap](https://www.wooclap.com/fr/) 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 (testé avec dash) + * un `mktemp` avec `-d` + * `stdbuf` + * un `sed` posix + * un `xargs` posix + +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 + + 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 + +Scanner le fichier de log `/var/log/nginx/access.log`, proposer quatre réponses +`ABCD` et afficher l'url http://bebou.netlib.re/$id + + 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 avec six choix (ABCDEF) + + qcm -n 6 + +Comme le premier exemple mais scanner le fichier de log `/var/log/httpd/logs` +plutôt que celui par défaut + + qcm -l /var/log/httpd/logs + +Modifier le fichier de log *et* le nombre de questions par défaut + + qcm -n 3 -l /var/log/httpd/logs + +Rafraîchir l'affichage plus vite (attention ça peut être un peu lourd en +calcul) + + qcm -r 0.1 + +Lancer un questionnaire pré-rempli se trouvant dans le fichier +`questionnaire.qcm` avec un taux de rafraichissement plus lent : + + qcm -r 2 -f ./questionnaire.qcm + +Pareil mais en lisant depuis stdin + + cat questionnaire.qcm | qcm -r 2 -f - + +Ecrire les questions à la volée sans les enregistrer au préalable dans +un fichier (nécessite de bien connaître la syntaxe auparavant : + + qcm -f - + +Lancer un questionnaire en local sur un serveur équipé de `qcm` : + + cat questionnaire.qcm | ssh -t user@server qcm -f - + +### 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. Si + `options` 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 nom `qcm` n'admet par défaut qu'une seule réponse possible. Voir + `choix`. `ouverte` permettra n'importe quelle réponse et ignore `options`. + * `options` : la liste des réponses possibles séparées par des `~`. Il ne + doit pas y avoir de `~` à la fin. Optionnel, s'il n'existe pas c'est `-n` + qui décidera du nombre de réponses possibles qui sera le même pour toutes + les questions. + * `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éfaut + `unique` 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 de + `type` `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 N^iè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: "Quels sentiments vous évoquent l'anarchie ?" + type: ouverte + unique: non + 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 cinq 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 ouverte à laquelle on peut répondre plusieurs fois. Notez les + `"` pour gérer l'apostrophe dans `l'anarchie`. + 4. 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 `"`. + 5. identique à la quatrième mais l'intitulé change. + +Étant donné que tous les attributs sont optionnels le fichier suivant : + + demander + demander + demander + +Est valide. S'il est lancé avec la commande `qcm -f ./questionnaire.qcm -n 3` +il posera trois questions sans intitulé avec trois 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.