qcm

Faire des qcm simplement - retour accueil

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

commit ffb6d25409c83d4055d0990a93c36d77361687f1
parent bba193fd91dce9b1cc7b727063608f00952b26c3
Auteurice: Arthur Pons <arthur.pons@unistra.fr>
Date:   Fri,  8 Nov 2024 22:44:25 +0100

Affichage de l'UI uniquement lorqu'il faut

On peut effectivement avoir le meilleur des deux mondes.

On ouvre un fifo sur lequel on lit.
Quand une nouvelle ligne apparaît on teste si c'est une réponse d'une
nouvelle ip, ou pas si la question le permet. On retrace l'UI en
fonction.

Seul problème, si l'on écrit trop vite dans le fifo je crois que le read
n'arrive pas à suivre et on a un "broken pipe". Pourraît être un souci
en condition réel avec beaucoup de personnes utilisatrices. Est-ce qu'il
y a une solution ?

Diffstat:
Mqcm.sh | 88++++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 44 insertions(+), 44 deletions(-)

diff --git a/qcm.sh b/qcm.sh @@ -30,12 +30,40 @@ playout() { $context - $groupedres + $groupedanswers total : $tot . } +calcandshow() { + if [ -z "$uniqueanswers" ];then tot=0 + else + groupedanswers=$(echo "$uniqueanswers" | + grep -Eo "/$id/[^ ]+ " | cut -d'/' -f3- | # PARSAGE DE LOG + sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | xargs printf "%b\n" | + grep -v "^$" | + sort | uniq -c | sort -rn) + tot=$(echo "$uniqueanswers" | wc -l) + fi + + context=$(case "$type" in + ( "ouverte" ) continue ;; + ( "regex" ) printf "format autorisé : %s" "$options" ;; + ( * ) + [ "$choix" = "+" ] \ + && printf "%s\n" "une ou plusieurs options vraies" \ + || printf "%s\n" "une seule option vraie" + [ -n "$options" ] \ + && printf "%s" "$(echo "$options" | tr '~' '\n' | paste $tmpd/o -)" \ + || printf "options : %s" "$(< $tmpd/o paste -d '\0' -s -)" + ;; + esac) + + clear + playout +} + demander() { case "$type" in ( "ouverte" ) pattern=;; @@ -47,51 +75,24 @@ demander() { answers=$(cat $tmpd/o | tr -d '\n') pattern="[$answers]$choix ";; esac - - tail -fn0 "$logs" | stdbuf -oL grep -E "GET /$id/$pattern" >> $tmpd/in & # PARSAGE DE LOG - tailpid=$! - - nbold=0 - while :;do - nbl=$(< $tmpd/in wc -l) - - if [ "$nbl" -gt "$nbold" -o -z "$passedonce" ] ;then - res=$(< $tmpd/in sort $uopt -k1,1 | - grep -Eo "/$id/[^ ]+ " | cut -d'/' -f3- | # PARSAGE DE LOG - sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | - xargs printf "%b\n" | grep -v "^$") - - if [ -z "$res" ];then tot=0 - else - groupedres=$(echo "$res" | sort | uniq -c | sort -rn) - tot=$(echo "$res" | wc -l) - fi - - context=$(case "$type" in - ( "ouverte" ) continue ;; - ( "regex" ) printf "format autorisé : %s" "$options" ;; - ( * ) - [ "$choix" = "+" ] \ - && printf "%s\n" "une ou plusieurs options vraies" \ - || printf "%s\n" "une seule option vraie" - [ -n "$options" ] \ - && printf "%s" "$(echo "$options" | tr '~' '\n' | paste $tmpd/o -)" \ - || printf "options : %s" "$(< $tmpd/o paste -d '\0' -s -)" - ;; - esac) - - passedonce=1 - clear - playout - fi - - nbold="$nbl" - sleep $refresh + pattern="GET /$id/$pattern" + + [ -p $tmpd/notif ] || mkfifo $tmpd/notif + tail -fn0 "$logs" | stdbuf -oL grep -E "$pattern" >> $tmpd/in & # PARSAGE DE LOG + tail1pid=$! + tail -fn0 "$logs" | stdbuf -oL grep -E "$pattern" > $tmpd/notif & # PARSAGE DE LOG + tail2pid=$! + + calcandshow + while read newline < $tmpd/notif ;do + uniqueanswers=$(< $tmpd/in sort $uopt -k1,1) + [ "$olduniqueanswers" != "$uniqueanswers" ] && calcandshow + olduniqueanswers="$uniqueanswers" done & disppid=$! read _ < /dev/tty - kill $disppid $tailpid;rm $tmpd/in + kill $disppid $tail1pid $tail2pid; rm $tmpd/in } while getopts "hl:u:n:r:f:" opt; do @@ -104,13 +105,12 @@ done url="${u:-http://bebou.netlib.re}" refresh="${r:-0.5}" logs="${l:-/var/log/nginx/access.log}" -file="$f" nbq=4 uopt="-u" choix= -tmpd=$(mktemp -d XXX) +tmpd=$(mktemp -d /tmp/XXX) id=$(basename "$tmpd") alias question:=question; question() question="$*"