qcm

Faire des qcm simplement - retour accueil

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

README (12248B)


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