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:
M | qcm.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="$*"