Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (10542B)
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 Code : http://git.bebou.netlib.re/qcm/files.html 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 plus 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 * optionnelle : gnuplot pour faire des graphiques avec -g 34 35 Testé sous debian 12 et le serveur web nginx packagé pour. Le code 36 parsant les logs convient pour le format par défaut d'nginx. Il se peut 37 qu'il ne fonctionne pas pour d'autres formats. 38 39 ## Les défauts 40 41 url par défaut : http://bebou.netlib.re (modifiable dans le code) 42 log par défaut : `/var/log/nginx/access.log` (modifiable dans le code) 43 nombre de questions par défaut : 4 (ABCD) 44 45 ## Installation 46 47 Télécharger le code : 48 49 git clone git://bebou.netlib.re/qcm 50 51 Compiler et installer 52 53 cd qcm 54 make 55 make install 56 57 Il est possible de modifier le dossier de destination du script exécutable en 58 modifiant la variable `DEST` dans le makefile. 59 60 ## Usages et exemples 61 62 ### Créer des questionnaires 63 64 La syntaxe des questionnaires est [ici](#le-format-du-fichier-de-questionnaire). 65 66 #### Depuis le serveur web ou une machine ayant accès aux logs webs en direct 67 68 Lancer la console de création de questionnaire : 69 70 $ qcm 71 72 Pareil mais afficher une autre url (si jamais l'édition du script n'est pas 73 possible) : 74 75 $ qcm -u http://monsite.com 76 77 Comme le premier exemple mais scanner le fichier de log `/var/log/httpd/logs` 78 plutôt que celui par défaut (attention il faudra sûrement adapter le code) : 79 80 $ qcm -l /var/log/httpd/logs 81 82 Lire un questionnaire déjà fait depuis stdin et afficher les résultats avec 83 gnuplot : 84 85 $ cat questionnaire.qcm | qcm -g 86 87 #### Depuis une machine pouvant SSH sur le serveur web 88 89 Lancer un questionnaire sur un serveur équipé de `qcm` : 90 **Ne fonctionne pas encore** 91 92 $ cat questionnaire.qcm | ssh -t user@server qcm 93 94 Alternatives : uploader le fichier d'abord 95 96 $ cat questionnaire.qcm | ssh user@server 'cat > q' 97 $ ssh -t user@server '< q qcm;rm q' 98 99 ou copier/coller le fichier avec xclip : 100 101 $ < questionnaire.qcm xclip -selection clipboard 102 $ ssh -t user@server qcm 103 Ecrivez le questionnaire puis ctrl+D pour le soumettre 104 syntaxe du questionnaire : 105 http://arthur.bebou.netlib.re/qcm/#le-format-du-fichier-de-questionnaire 106 *ici faire ctrl+v pour coller le questionnaire* 107 108 ### Répondre aux questionnaires 109 110 Il faut se munir de l'url du serveur, de l'identifiant du questionnaire, de 111 l'intitutlé de la question et des choix de réponses. Ces infos sont connues de 112 la personne ayant créé le questionnaire. 113 114 Pour répondre à une question il faut créer et envoyer une requête HTTP GET au 115 serveur à l'url : 116 117 url/identifiant/réponse 118 119 Ainsi si l'url est `http://bebou.netlib.re`, l'identifiant `hjk` et la question 120 : 121 122 om, psg ou les verts ? 123 124 A om 125 B psg 126 C les verts 127 128 On pourra répondre "les verts" en envoyant la réquête à : 129 130 http://bebou.netlib.re/hjk/C 131 132 Quand cela est prévu il est possible de choisir plusieurs réponses. Il faut 133 alors bien les mettre dans l'ordre : 134 135 http://bebou.netlib.re/hjk/AC 136 et non pas 137 http://bebou.netlib.re/hjk/CA 138 139 Pour les questions ouvertes il est possible de répondre n'importe quoi 140 141 http://bebou.netlib.re/hjk/cool cool je peux écrire ce que je veux 142 143 Pour créer et envoyer cette requête le plus courant sera d'utiliser un 144 navigateur web et d'entrer l'url dans la barre d'url/de recherche en haut. Il 145 est également possible d'utiliser un programme comme `curl` ou `wget`. 146 147 Puisque les pages qui correspondent n'existent pas une erreur 404 sera 148 renvoyée. Pas d'inquiétude, la réponse a tout de même bien été prise en compte. 149 150 ## Le format du fichier de questionnaire 151 152 Le fichier de questionnaire est un fichier texte. Chaque question contient des 153 champs pour renseigner ses attributs et *doit* terminer par l'instruction 154 `demander`. Les attributs *doivent* être sous la forme `nom:` sans espace entre 155 le `:` et `nom` mais avec un espace après le `:`. 156 157 La liste des attributs : 158 159 * `question` : L'intitulé de la question. Optionnel. S'il n'existe pas rien 160 ne sera affiché 161 * `type` : le type de question. Optionnel. `qcm`, type par défaut, proposera 162 un choix multiple (A, B, C...), uniquement ces réponses seront valides. Si 163 `options` existe il fera correspondre les options aux différentes lettres. 164 En l'absence d'`options` `qcm` proposera 4 choix par défaut (A, B, C et D). 165 Malgré son nom `qcm` n'admet par défaut qu'une seule réponse possible. Voir 166 `choix`. `ouverte` permettra n'importe quelle réponse et ignore `options`. 167 `regex` permet de restreindre les réponses possibles en écrivant un 168 expression régulière. Dans ce cas-ci `options` renseigne l'expression. 169 * `options` : Si la question est de type `qcm`, `options` est la liste des 170 réponses possibles séparées par des `~`. Il ne doit pas y avoir de `~` à la 171 fin. Si la question est de type `regex`, `options` est l'expression 172 régulière filtrant les réponses. Optionnel. 173 * `unique` : si une seule réponse par IP est autorisée ou pas. Optionnel. "non" 174 enregistrera toutes les réponses, n'importe quoi d'autre (`oui` par exemple) 175 filtrera sur les IP pour ne laisser que la première réponse passer. Par défaut 176 `unique` est à oui. 177 * `choix` : si la question est à choix multiple ou pas. Optionnel. "multiple" 178 permettra de choisir plusieurs options, n'importe quoi d'autre l'empêchera. 179 Par défaut les questions ne sont pas à choix multiple. Si la question est de 180 `type` `ouverte` cet attribut est ignoré puisqu'il n'y a pas d'options 181 parmi lesquelles choisir. 182 * `demander` : n'est pas un attribut mais "enregistre" la question et la lance 183 184 **Attention** : Tout attribut renseigné pour la N^ième question conservera sa 185 valeur pour les questions suivantes s'il n'est pas répété. Si la question ou 186 les réponses contiennent des caractères spéciaux `;/)'` etc il vaut mieux tout 187 "quoter" avec des ". Pour ajouter un `"` vous pouvez l'échapper avec un `\`. 188 189 Ainsi le fichier 190 191 demander 192 193 question: om, psg ou les verts 194 options: om~psg~les verts 195 choix: multiple 196 demander 197 198 question: Donnez un exemple de nombre réel svp 199 type: regex 200 options: [0-9]*[,.][0-9]+ 201 unique: non 202 demander 203 204 question: "Quels sentiments vous évoquent l'anarchie ?" 205 type: ouverte 206 demander 207 208 question: "Sachant que : 209 x=3 210 y=7 211 212 Combien font \"x+y\" ?" 213 type: qcm 214 options: 6~11~10~autre 215 choix: unique 216 unique: oui 217 demander 218 219 question: Et x-y ? 220 demander 221 222 Posera six questions en tout. 223 224 1. celle par défaut, un qcm avec quatre choix, aucun intitulé, aucune réponse 225 possible d'affichée (juste les lettres). Par défaut ne permet de choisir 226 qu'une seule réponse une seule fois. Utile si les questions et les réponses 227 sont gérées par ailleurs, par exemple projetée via des diapos. 228 2. une qcm offrant le choix entre les trois équipes de foot. Il est possible 229 d'en choisir plusieurs à la fois. Est toujours un qcm par défaut et ne permet 230 de répondre qu'une seule fois. 231 3. une question `regex` demandant un nombre réel et filtrant sur une 232 expression régulière ne laissant passer que les nombres réels. Une même IP 233 peut envoyer plusieurs réponses. 234 4. une question ouverte à laquelle on peut répondre plusieurs fois. Notez les 235 `"` pour gérer l'apostrophe dans `l'anarchie`. 236 5. une question de type `qcm` de math dont une seule réponse est correcte et 237 à laquelle on ne peut répondre qu'une seule fois. Il faut ici rappeler que 238 c'est une qcm, que l'on ne peut répondre qu'une seule fois et qu'une seule 239 réponse est la bonne puisque par défaut on hérite des attributs de la 240 question précédente, ouverte et à laquelle on pouvait répondre plusieurs fois 241 ainsi que celle encore d'avant pour laquelle on pouvait choisir plusieurs 242 options. On notera également que si l'on englobe tout dans des `"` on peut 243 sauter des lignes et que l'on peut échapper des `"`. 244 6. identique à la question 5 mais l'intitulé change. 245 246 Étant donné que tous les attributs sont optionnels le fichier suivant : 247 248 demander 249 demander 250 demander 251 252 Est valide. Il posera trois questions sans intitulés avec quatre options de 253 réponses chacune. 254 255 Si l'on veut créer un questionnaire à la volée et que l'on connaît bien la 256 syntaxe ci-dessus on peut simplement lancer `qcm -f -` et écrire les questions. 257 258 Pour l'instant dans les questions de type `qcm` une réponse `CD` est considérée 259 comme différente de `DC`. 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. 288