qcm

Faire des qcm simplement - retour accueil

git clone git://bebou.netlib.re/qcm
Log | Files | Refs | README |

README (10602B)


      1 # qcm
      2 
      3 Faire des sondages simples en parsant les logs d'un serveur web
      4 
      5 Sur un vieux concept déjà décrit
      6 [ici](/sondages/#par-greppage-de-logs-de-serveurs-web). L'idée est d'en faire
      7 une sorte de [kahoot !](https://kahoot.it/) ou
      8 [wooclap](https://www.wooclap.com/fr/) like entièrement descriptible par un
      9 fichier texte, ne nécessitant qu'un serveur accessible sur le web.
     10 
     11 `qcm` est installé sur bebou mais uniquement les personnes ayant un compte
     12 dessus peuvent l'utiliser pour créer des questionnaires. Il est cependant très
     13 simple d'installer `qcm` sur votre serveur linux, et j'espère pas beaucoup plus
     14 sur une autre variante Unix-like.
     15 
     16 ## Dépendances
     17 
     18   * un shell posix + local (testé avec dash)
     19   * un `mktemp` avec `-d`
     20   * `stdbuf`
     21   * un `sed` posix
     22   * un `xargs` posix
     23   * un `ps` posix
     24   * optionnelle : gnuplot pour faire des graphiques avec -g
     25 
     26 Testé sous debian 12 et le serveur web nginx packagé pour. Le code
     27 parsant les logs convient pour le format par défaut d'nginx. Il se peut
     28 qu'il ne fonctionne pas pour d'autres formats.
     29 
     30 ## Les défauts
     31 
     32 url par défaut : http://bebou.netlib.re (modifiable dans le code)  
     33 log par défaut : `/var/log/nginx/access.log` (modifiable dans le code)  
     34 nombre de questions par défaut : 4 (ABCD)
     35 
     36 ## Installation
     37 
     38 Télécharger le code :
     39 
     40 	git clone git://bebou.netlib.re/qcm
     41 
     42 Compiler et installer
     43 
     44 	cd qcm
     45 	make
     46 	make install
     47 
     48 Il est possible de modifier le dossier de destination du script exécutable en
     49 modifiant la variable `DEST` dans le makefile.
     50 
     51 ## Usages et exemples
     52 
     53 ### Créer des questionnaires
     54 
     55 La syntaxe des questionnaires est [ici](#le-format-du-fichier-de-questionnaire).
     56 
     57 #### Depuis le serveur web ou une machine ayant accès aux logs webs en direct
     58 
     59 Lancer la console de création de questionnaire :
     60 
     61 	$ qcm
     62 
     63 Pareil mais afficher une autre url (si jamais l'édition du script n'est pas
     64 possible) :
     65 
     66 	$ qcm -u http://monsite.com
     67 
     68 Comme le premier exemple mais scanner le fichier de log `/var/log/httpd/logs`
     69 plutôt que celui par défaut (attention il faudra sûrement adapter le code) :
     70 
     71 	$ qcm -l /var/log/httpd/logs
     72 
     73 Choisir l'identifiant du questionnaire pour qu'il soit "fraise". N'est pas
     74 garanti de se lancer, il peut exister un questionnaire avec le même identifiant
     75 :
     76 
     77 	$ qcm -i fraise
     78 
     79 Lire un questionnaire déjà fait depuis stdin et afficher les résultats avec
     80 gnuplot :
     81 
     82 	$ cat questionnaire.qcm | qcm -g
     83 
     84 Lire un questionnaire et masquer les réponses tant que l'on a pas appuyé une
     85 fois sur la touche entrée. Conviendrait pour un mode "examen" entre gros
     86 guillemets :
     87 
     88 	$ cat questionnaire.qcm | qcm -e
     89 
     90 #### Depuis une machine pouvant SSH sur le serveur web
     91 
     92 Lancer un questionnaire sur un serveur équipé de `qcm` :
     93 **Ne fonctionne pas encore**
     94 
     95 	$ cat questionnaire.qcm | ssh -t user@server qcm
     96 
     97 Alternatives : uploader le fichier d'abord
     98 
     99 	$ cat questionnaire.qcm | ssh user@server 'cat > q'
    100 	$ ssh -t user@server '< q qcm;rm q'
    101 
    102 ou copier/coller le fichier avec xclip :
    103 
    104 	$ < questionnaire.qcm xclip -selection clipboard
    105 	$ ssh -t user@server qcm
    106 	Ecrivez le questionnaire puis ctrl+D pour le soumettre
    107 	syntaxe du questionnaire :
    108 	http://arthur.bebou.netlib.re/qcm/#le-format-du-fichier-de-questionnaire
    109 	*ici faire ctrl+v pour coller le questionnaire*
    110 
    111 ### Répondre aux questionnaires
    112 
    113 Il faut se munir de l'url du serveur, de l'identifiant du questionnaire, de
    114 l'intitutlé de la question et des choix de réponses. Ces infos sont connues de
    115 la personne ayant créé le questionnaire.
    116 
    117 Pour répondre à une question il faut créer et envoyer une requête HTTP GET au
    118 serveur à l'url :
    119 
    120 	url/identifiant/réponse
    121 
    122 Ainsi si l'url est `http://bebou.netlib.re`, l'identifiant `hjk` et la question
    123 :
    124 
    125 	om, psg ou les verts ?
    126 
    127 	A om
    128 	B psg
    129 	C les verts
    130 
    131 On pourra répondre "les verts" en envoyant la réquête à :
    132 
    133 	http://bebou.netlib.re/hjk/C
    134 
    135 Quand cela est prévu il est possible de choisir plusieurs réponses. Il faut
    136 alors bien les mettre dans l'ordre :
    137 
    138 	http://bebou.netlib.re/hjk/AC
    139 	et non pas
    140 	http://bebou.netlib.re/hjk/CA
    141 
    142 Pour les questions ouvertes il est possible de répondre n'importe quoi
    143 
    144 	http://bebou.netlib.re/hjk/cool cool je peux écrire ce que je veux
    145 
    146 Pour créer et envoyer cette requête le plus courant sera d'utiliser un
    147 navigateur web et d'entrer l'url dans la barre d'url/de recherche en haut. Il
    148 est également possible d'utiliser un programme comme `curl` ou `wget`.
    149 
    150 Puisque les pages qui correspondent n'existent pas une erreur 404 sera
    151 renvoyée. Pas d'inquiétude, la réponse a tout de même bien été prise en compte.
    152 
    153 ## Le format du fichier de questionnaire
    154 
    155 Le fichier de questionnaire est un fichier texte. Chaque question contient des
    156 champs pour renseigner ses attributs et *doit* terminer par l'instruction
    157 `demander`. Les attributs *doivent* être sous la forme `nom:` sans espace entre
    158 le `:` et `nom` mais avec un espace après le `:`.
    159 
    160 La liste des attributs :
    161 
    162   * `question` : L'intitulé de la question. Optionnel. S'il n'existe pas rien
    163 	ne sera affiché
    164   * `type` : le type de question. Optionnel. `qcm`, type par défaut, proposera
    165 	un choix multiple (A, B, C...), uniquement ces réponses seront valides. Si
    166 	`options` existe il fera correspondre les options aux différentes lettres.
    167 	En l'absence d'`options` `qcm` proposera 4 choix par défaut (A, B, C et D).
    168 	Malgré son nom `qcm` n'admet par défaut qu'une seule réponse possible. Voir
    169 	`choix`. `ouverte` permettra n'importe quelle réponse et ignore `options`.
    170 	`regex` permet de restreindre les réponses possibles en écrivant un
    171 	expression régulière. Dans ce cas-ci `options` renseigne l'expression.
    172   * `options` : Si la question est de type `qcm`, `options` est la liste des
    173 	réponses possibles séparées par des `~`. Il ne doit pas y avoir de `~` à la
    174 	fin. Si la question est de type `regex`, `options` est l'expression
    175 	régulière filtrant les réponses. Optionnel.
    176   * `unique` : si une seule réponse par IP est autorisée ou pas. Optionnel. "non"
    177 	enregistrera toutes les réponses, n'importe quoi d'autre (`oui` par exemple)
    178 	filtrera sur les IP pour ne laisser que la première réponse passer. Par défaut
    179 	`unique` est à oui.
    180   * `choix` : si la question est à choix multiple ou pas. Optionnel. "multiple"
    181 	permettra de choisir plusieurs options, n'importe quoi d'autre l'empêchera.
    182 	Par défaut les questions ne sont pas à choix multiple. Si la question est de
    183 	`type` `ouverte` cet attribut est ignoré puisqu'il n'y a pas d'options
    184 	parmi lesquelles choisir.
    185   * `demander` : n'est pas un attribut mais "enregistre" la question et la lance
    186 
    187 **Attention** : Tout attribut renseigné pour la N^ième question conservera sa
    188 valeur pour les questions suivantes s'il n'est pas répété. Si la question ou
    189 les réponses contiennent des caractères spéciaux `;/)'` etc il vaut mieux tout
    190 "quoter" avec des ". Pour ajouter un `"` vous pouvez l'échapper avec un `\`.
    191 
    192 Ainsi le fichier
    193 
    194 	demander
    195 
    196 	question: om, psg ou les verts
    197 	options: om~psg~les verts
    198 	choix: multiple
    199 	demander
    200 
    201 	question: Donnez un exemple de nombre réel svp
    202 	type: regex
    203 	options: [0-9]*[,.][0-9]+
    204 	unique: non
    205 	demander
    206 
    207 	question: "Quels sentiments vous évoquent l'anarchie ?"
    208 	type: ouverte
    209 	demander
    210 
    211 	question: "Sachant que :
    212 	x=3
    213 	y=7
    214 
    215 	Combien font \"x+y\" ?"
    216 	type: qcm
    217 	options: 6~11~10~autre
    218 	choix: unique
    219 	unique: oui
    220 	demander
    221 
    222 	question: Et x-y ?
    223 	demander
    224 
    225 Posera six questions en tout.
    226 
    227   1. celle par défaut, un qcm avec quatre choix, aucun intitulé, aucune réponse
    228   possible d'affichée (juste les lettres). Par défaut ne permet de choisir
    229   qu'une seule réponse une seule fois.  Utile si les questions et les réponses
    230   sont gérées par ailleurs, par exemple projetée via des diapos.
    231   2. une qcm offrant le choix entre les trois équipes de foot. Il est possible
    232   d'en choisir plusieurs à la fois. Est toujours un qcm par défaut et ne permet
    233   de répondre qu'une seule fois.
    234   3. une question `regex` demandant un nombre réel et filtrant sur une
    235   expression régulière ne laissant passer que les nombres réels. Une même IP
    236   peut envoyer plusieurs réponses.
    237   4. une question ouverte à laquelle on peut répondre plusieurs fois. Notez les
    238   `"` pour gérer l'apostrophe dans `l'anarchie`.
    239   5. une question de type `qcm` de math dont une seule réponse est correcte et
    240   à laquelle on ne peut répondre qu'une seule fois. Il faut ici rappeler que
    241   c'est une qcm, que l'on ne peut répondre qu'une seule fois et qu'une seule
    242   réponse est la bonne puisque par défaut on hérite des attributs de la
    243   question précédente, ouverte et à laquelle on pouvait répondre plusieurs fois
    244   ainsi que celle encore d'avant pour laquelle on pouvait choisir plusieurs
    245   options. On notera également que si l'on englobe tout dans des `"` on peut
    246   sauter des lignes et que l'on peut échapper des `"`.
    247   6. identique à la question 5 mais l'intitulé change.
    248 
    249 Étant donné que tous les attributs sont optionnels le fichier suivant :
    250 
    251 	demander
    252 	demander
    253 	demander
    254 
    255 Est valide. Il posera trois questions sans intitulés avec quatre options de
    256 réponses chacune.
    257 
    258 Si l'on veut créer un questionnaire à la volée et que l'on connaît bien la
    259 syntaxe ci-dessus on peut simplement lancer `qcm -f -` et écrire les questions.
    260 
    261 ## Sécurité
    262 
    263 **Attention !**
    264 
    265 Les fichiers de questionnaire tel qu'ils fonctionnent aujourd'hui sont en
    266 réalité des scripts (catium n'est jamais bien loin). Si entre deux attributs on
    267 écrit `ls` la commande sera exécutée ! Cela peut être super pratique si l'on
    268 fait confiance au script (automatiser des choses entre les questions ou écrire
    269 du shell qui génèrera automatiquement les questions) mais cela est aussi un
    270 immense risque d'un point de vue sécurité.
    271 
    272 Il est donc fortement recommandé de limiter l'usage de cette fonctionnalité
    273 à des sources réputées sûres. Par exemple, sur bebou, seules les personnes
    274 détenant un compte peuvent utiliser `qcm`.
    275 
    276 Il est possible de régler cette faille en réécrivant `qcm` pour qu'il parse le
    277 fichier plutôt que l'exécuter mais c'est plus compliqué. Deux solutions
    278 possibles :
    279 
    280   1. lire ligne par ligne et exécuter le code mais uniquement si c'est une
    281   fonction shell (vérifier si le script n'a pas accès à des fonctions autres
    282   que celles déclarées dans le script lui même).
    283   2. parser les lignes de façon à instancier les variables et faire les appels
    284   "à la main".
    285 
    286 Dans les deux cas il sera de toute façon délicat de garantir la sécurité et on
    287 perd la possibilité de faire de la méta création de questionnaires.