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.