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