From d0cf3bd7069a940cbb11244a7a6a17756078b856 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs@hunt.opencfd.co.uk> Date: Fri, 25 Apr 2008 11:23:36 +0100 Subject: [PATCH] Added colouring of output --- wmake/wmakeScheduler | 190 +++++++++++++++++++++++++++---------------- 1 file changed, 122 insertions(+), 68 deletions(-) diff --git a/wmake/wmakeScheduler b/wmake/wmakeScheduler index 3351c4067c2..3cfe4c37ea9 100755 --- a/wmake/wmakeScheduler +++ b/wmake/wmakeScheduler @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox @@ -31,6 +31,8 @@ # - WM_HOSTS contains a list of hosts and number of concurrent processes # eg, # export WM_HOSTS="hostA:1 hostB:2 hostC:1" +# - WM_COLOURS contains a list of colours to cycle through +# export WM_COLOURS="black blue green cyan red magenta yellow" # # Sources the relevant cshrc/bashrc if not set. # @@ -54,14 +56,14 @@ lockDir=$HOME/.wmakeScheduler # count the total number of slots available and exit if [ "$1" = "-count" ] then - expr $( - for slotGroup in $WM_HOSTS - do - n=${slotGroup##*:} - if [ "$n" = "${slotGroup%%:*}" ]; then n=1; fi # missing ':' - echo "+ ${n:-1}" - done) - exit 0 + expr $( + for slotGroup in $WM_HOSTS + do + n=${slotGroup##*:} + if [ "$n" = "${slotGroup%%:*}" ]; then n=1; fi # missing ':' + echo "+ ${n:-1}" + done) + exit 0 fi # where to source WM_PROJECT settings in a remote shell @@ -72,38 +74,42 @@ fi sourceFoam=false # fallback command case $SHELL in */csh | */tcsh ) # [t]csh vs bash|ksh|sh - shellRc=cshrc - ;; + shellRc=cshrc + ;; *) - shellRc=bashrc - ;; + shellRc=bashrc + ;; esac -# check ~/.$WM_PROJECT-$WM_PROJECT_VERSION -# check <site>/etc -# check <site>/.$WM_PROJECT-$WM_PROJECT_VERSION +# check ~/.$WM_PROJECT-$WM_PROJECT_VERSION/ +# check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/ +# check ~/.$WM_PROJECT/ +# check <installedProject>/etc/ +# check <installedProject/.$WM_PROJECT-$WM_PROJECT_VERSION/ if [ "$WM_PROJECT" ]; then - : ${FOAM_DOT_DIR:=.$WM_PROJECT-$WM_PROJECT_VERSION} - - for i in \ - $HOME/$FOAM_DOT_DIR \ - $WM_PROJECT_DIR/etc \ - $WM_PROJECT_DIR/$FOAM_DOT_DIR \ - ; - do - if [ -f "$i/$shellRc" ]; then - sourceFoam="$i/$shellRc" - break - fi - done + : ${FOAM_DOT_DIR:=.$WM_PROJECT-$WM_PROJECT_VERSION} + + for i in \ + $HOME/$FOAM_DOT_DIR \ + $HOME/.$WM_PROJECT/$WM_PROJECT_VERSION \ + $HOME/.$WM_PROJECT \ + $WM_PROJECT_DIR/etc \ + $WM_PROJECT_DIR/$FOAM_DOT_DIR \ + ; + do + if [ -f "$i/$shellRc" ]; then + sourceFoam="$i/$shellRc" + break + fi + done fi # Construct test string for remote execution. # Source WM_PROJECT settings if WM_PROJECT environment not set. case $sourceFoam in - */cshrc) sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam";; - */bashrc) sourceFoam='[ "$WM_PROJECT" ] || . '"$sourceFoam";; + */cshrc) sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam";; + */bashrc) sourceFoam='[ "$WM_PROJECT" ] || . '"$sourceFoam";; esac # quote double-quotes for remote command line @@ -111,47 +117,95 @@ rcmd=$(echo $* | sed -e s/\"/\'\"\'/g) ## the same, without forking (not ksh, maybe not /bin/sh either) # rcmd=$(while [ "$#" -gt 0 ]; do echo "${1//\"/'\"'}"; shift; done) + +# Convert WM_COLOURS into an array +declare colours +nColours=0 +for col in $WM_COLOURS +do + colours[$nColours]=$col + ((nColours = $nColours + 1)) +done + +# Bashism: make pipe fail early. This make sure return value of compilation +# is returned and not of colouring pipe. +set -o pipefail + +# Define function to colour output by argument 1 +colourPipe(){ + if [ "$1" ]; then + (while read line; do setterm -foreground $1; echo "$line" ; done) + else + cat + fi +} + + +colourIndex=0 + while : do - # 0.5 sec - usleep 500000 - - for slotGroup in $WM_HOSTS - do - # split 'host:N', but catch 'host:' and 'host' too - host=${slotGroup%%:*} - n=${slotGroup##*:} - if [ "$n" = "$host" ]; then n=1; fi # missing ':' - : ${n:=1} - - ## echo "** slot=$slot host=$host n=$n" - - i=0 - while [ "$i" -lt "$n" ] - do - lock="$host:$i" - if [ ! -f "$lockDir/$lock" ] - then - touch "$lockDir/$lock" - #echo "ssh $host cd $PWD && $*" - if [ "$host" = "$HOST" ] - then - eval $* - elif [ -n "$JOB_ID" ] - then - qrsh -inherit -v PWD $host "$rcmd" - else - ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" + # 0.5 sec + usleep 500000 + + for slotGroup in $WM_HOSTS + do + # split 'host:N', but catch 'host:' and 'host' too + host=${slotGroup%%:*} + n=${slotGroup##*:} + if [ "$n" = "$host" ]; then n=1; fi # missing ':' + : ${n:=1} + + i=0 + while [ "$i" -lt "$n" ] + do + lock="$host:$i" + if [ ! -f "$lockDir/$lock" ]; then + # Set lock + touch "$lockDir/$lock" + + # Set colour + colour=${colours[$colourIndex]} + #echo "** host=$host colourIndex=$colourIndex colour=$colour" + + if [ "$host" = "$HOST" ]; then + if [ "$colour" ]; then + eval $* 2>&1 | colourPipe $colour + else + eval $* + fi + elif [ -n "$JOB_ID" ]; then + if [ "$colour" ]; then + qrsh -inherit -v PWD $host "$rcmd" 2>&1 | colourPipe $colour + else + qrsh -inherit -v PWD $host "$rcmd" + fi + else + if [ "$colour" ]; then + ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" 2>&1 | colourPipe $colour + else + ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" + fi + fi + retval=$? + + # Release lock + rm -f "$lockDir/$lock" 2>/dev/null + exit $retval + fi + i=$(expr $i + 1) + + # Cycle through colours + colourIndex=$(expr $colourIndex + 1) + if (( $colourIndex >= $nColours )); then + colourIndex=0 fi - retval=$? - ## echo "** Releasing $lock" - rm -f "$lockDir/$lock" 2>/dev/null - exit $retval - fi - i=$(expr $i + 1) - done - done + done + done done +if [ "$WM_COLOURS" ]; then + setterm -foreground default +fi #------------------------------------------------------------------------------ -- GitLab