arthur.bebou

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