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