arthur.bebou

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