From d6402bc17e2b04deec503cac3409549fe28b6894 Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Mon, 3 Jan 2022 16:01:21 +1100 Subject: [PATCH] Tidied up colour code. --- gnscli.sh | 112 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 34 deletions(-) diff --git a/gnscli.sh b/gnscli.sh index 247a1a4..9006fa6 100755 --- a/gnscli.sh +++ b/gnscli.sh @@ -1,14 +1,14 @@ #!/bin/bash +# start/stop/del with multiple args broken + # rename node issue when matching multiple # rename project # node stop givesjq error # connect xxx & [opens iterm (or whatever)] - - -VER=0.1 +VER=1.0 # helper function to turn a directory of scripts into inline ## defaults at the end of this script @@ -87,7 +87,7 @@ function initauth() { if [[ $doscripts -eq 1 ]]; then mkscripts "$SCRIPTDIR" fi - echo -e "$BOLD${CYAN}Initialisation of $BOLD$CONFDIR$PLAIN complete.$PLAIN" + cecho -s "$CYAN" "Initialisation of ^b$CONFDIR^p complete." return 0 } @@ -217,7 +217,7 @@ function getstr() { # getstr last_prompt_char default_answer "prompt string" shift prompt="$*" retstr="" - echo -n -e "${PURPLE}$prompt [$BOLD$def$PLAIN$PURPLE]${lastchar}${PLAIN} " + echo -n -e "${NOTIFYNDCOL}$prompt [${NOTIFYNDCOLB}$def$NOTIFYNDCOL]${lastchar}${PLAIN} " read retstr echo -e "$PLAIN" [[ -z $retstr ]] && retstr="$def" @@ -276,6 +276,7 @@ function getcmd() { pstr="gnscli> " [[ ! -z $CACHING ]] && info "$CACHING" + set -f builtin read -p "$(echo -en $BOLD)[$(echo -en $PLAIN$pcol)${prefix}$(echo -e "$PLAIN$BOLD")] $pstr$(echo -e "${PLAIN}")" -e -r input set +f @@ -306,7 +307,7 @@ function profile() { local fname fname=${FUNCNAME[2]} [[ -z $fname ]] && fname=${FUNCNAME[1]} - [[ $PROFILING -eq 1 ]] && echo -e "${YELLOW}${BOLD}${FUNCNAME[1]}(): ${PLAIN}${YELLOW}$*${PLAIN}" 1>&2 + [[ $PROFILING -eq 1 ]] && cecho -s "$YELLOW" "^b${FUNCNAME[1]}(): ^p$*" 1>&2 } function harddebug() { @@ -321,29 +322,64 @@ function debug() { fi if [[ $VERBOSE -eq 1 ]]; then if [[ $force -eq 1 ]]; then - echo -e "${PURPLE}${BOLD}${FUNCNAME[1]}(): ${PLAIN}${PURPLE}$*${PLAIN}" >/dev/stderr + echo -e "${NOTIFYCOLB}${FUNCNAME[1]}(): ${NOTIFYCOL}$*${PLAIN}" >/dev/stderr else - echo -e "${PURPLE}${BOLD}${FUNCNAME[1]}(): ${PLAIN}${PURPLE}$*${PLAIN}" 1>&2 + echo -e "${NOTIFYCOLB}${FUNCNAME[1]}(): ${NOTIFYCOL}$*${PLAIN}" 1>&2 fi fi } +# 'str' can contain: +# ^b bold +# ^i italic +# ^p plain +# +function cecho() { # [-n] [-s] col boldcol "str" + local col bcol str minusn="" autobold=0 + + while [[ ${1:0:1} == "-" ]]; do + if [[ $1 == "-n" ]]; then + minusn="-n" + fi + if [[ $1 == "-s" ]]; then + autobold=1 + fi + shift + done + col="$1" + shift + if [[ $autobold -eq 1 ]]; then + bcol="$col$BOLD" + else + bcol="$1" + shift + fi + str="$*" + str=${str//\^b/${bcol}} + str=${str//\^p/${PLAIN}${col}} + str=${str//\^i/${col}${ITALIC}} + + echo $minusn -e "${col}${str}${PLAIN}" 1>&2 +} + function info() { - echo -e "${CYAN}${BOLD}${ITALIC}[$*]${PLAIN}" 1>&2 + cecho -s "$CYAN" "^i[$*]" 1>&2 } function error() { [[ $innotify -eq 1 ]] && fail - echo -e "${RED}${BOLD}ERROR: ${PLAIN}${RED}$*${PLAIN}" 1>&2 + cecho -s "$RED" "^bERROR: ^p$*" 1>&2 } function notify() { - echo -en "${PURPLE}${BOLD}* ${PLAIN}${PURPLE}$*...${PLAIN} " 1>&2 + #echo -en "${NOTIFYCOLB}* ${NOTIFYCOL}$*...${PLAIN} " 1>&2 + cecho -n "$NOTIFYCOL" "$NOTIFYCOLB" "^b* ^p$*... " 1>&2 innotify=1 } function notify_nodots() { - echo -e "${PURPLE}${BOLD}* ${PLAIN}${PURPLE}$*${PLAIN} " 1>&2 + #echo -e "${NOTIFYNDCOLB}* ${NOTIFYNDCOL}$*${PLAIN} " 1>&2 + cecho "$NOTIFYNDCOL" "$NOTIFYNDCOLB" "^b* ^p$* " 1>&2 } function ok() { @@ -361,7 +397,7 @@ function fail() { } function warn() { - echo -e "${YELLOW}${BOLD}Warning: ${PLAIN}${YELLOW}$*${PLAIN}" 1>&2 + cecho -s "$YELLOW" "^bWarning: ^p$*" 1>&2 } function usage() { @@ -1516,8 +1552,8 @@ function runaction() { # runaction targetlist optio local actionname line all local force=0 foreground=0 f rv files n thisfile jqres goterror local good allgoodresults errs allbadresults -# oooo change this local jqf +# oooo change this local jqf_bad='[ "_DC_", "_OB_", .fault.detail, .fault.reason, .status ] | @csv' local objecttype extrainfo @@ -1596,7 +1632,6 @@ debug -f "--> extrainfo = $extrainfo" objecttype=$(echo ${what:0:1} | tr '[a-z]' '[A-Z]')${what:1} [[ $objecttype == "Model" ]] && objecttype="Node" -# oooo # figure out jq based on action if [[ $actionname == "add" && $endpoint == "model" ]]; then allgoodresults="Server,${objecttype},Ports" @@ -1663,7 +1698,7 @@ debug -f "--> extrainfo = $extrainfo" echo if [[ $errs -gt 0 ]]; then local fullres_bad - echo -e "${RED}$errs x '${BOLD}$actionname${PLAIN}${RED}' actions failed:${PLAIN}" + cecho -s "${RED}" "$errs x '^b$actionname^p' actions failed:" echo -e "${RED}" echo "$allbadresults" | sed -e 's/^/ /' echo -e "${PLAIN}" @@ -1672,7 +1707,7 @@ debug -f "--> extrainfo = $extrainfo" if [[ $good -ge 1 ]]; then local fullres - echo -e "${GREEN}$good x '${BOLD}$actionname${PLAIN}${GREEN}' actions submitted successfully.${PLAIN}" + cecho -s "${GREEN}" "$good x '^b$actionname^p' actions submitted successfully." # More than just a heading? if [[ $(echo -e "$allgoodresults" | wc -l | bc) -gt 1 ]]; then @@ -1875,7 +1910,7 @@ debug all pids finished rescount=$(printf %d $(echo -n "$all" | wc -c)) if [[ $rescount -eq 0 ]]; then - echo -e " ${BOLD}${YELLOW}(no results)${PLAIN}" + cecho -s "$YELLOW" " ^b(no results)" echo rm -f $TMPDIR/get.* rm -f $TMPDIR/err.* @@ -1958,7 +1993,7 @@ debug "dotscript:\n${dotscript}" greenwords="true up enabled" redwords="false down paused uninitialized disabled" yellowwords="migrating" - uuidcol="$PURPLE" + uuidcol="$NOTIFYCOL" while read -r line ; do key=${line%%:*} @@ -2193,7 +2228,7 @@ debug "alluuids is $alluuids" if [[ $nobs -gt 1 && $multiallowed -eq 0 ]]; then debug "actionfilter=$actionfilter" - notify_nodots "'${BOLD}${actionfilter}${PLAIN}${PURPLE}' matched multiple ${whattolist}s" + notify_nodots "'${NOTIFYNDCOLB}${actionfilter}${NOTIFYNDCOL}' matched multiple ${whattolist}s" narrowdown "$whattolist" "$allobs" "$alluuids" selobname selobuuid || rv=1 else selobname="$allobs" @@ -2502,11 +2537,11 @@ debug "post replacedargs is [$replacedargs]" echo -e "$PLAIN" res=$(uuid_to_name ${arg}) if [[ $? -eq 0 ]]; then - echo -e "${CYAN} UUID ${BOLD}${arg}${PLAIN}${CYAN} -> ${res}" + cecho -s "${CYAN}" " UUID ^b${arg}^p -> ${res}" else res=$(name_to_uuid ${arg}) if [[ $? -eq 0 ]]; then - echo -e "${CYAN} UUID ${res} -> ${BOLD}${arg}${PLAIN}" + cecho -s "${CYAN}" " UUID ${res} -> ^b${arg}^p" else error "No cache results found for ${arg}" fi @@ -2578,7 +2613,7 @@ debug "post replacedargs is [$replacedargs]" else debug "newnodetype is $newnodetype" debug "newnodeuuid is $newnodetype_uuid" - notify_nodots "Adding a new ${BOLD}$newnodetype${PLAIN}${PURPLE} named $BOLD$newname${PLAIN}" + notify_nodots "Adding a new ${NOTIFYNDCOLB}$newnodetype${NOTIFYNDCOL} named ${NOTIFYNDCOLB}$newname${PLAIN}" confirm=1 fi elif [[ $endpoint == "link" ]]; then @@ -2619,7 +2654,7 @@ debug "adapnumlist is $adapnumlist" debug "${letter}-node ${dev[$x]} port ${port[$x]} is OK (${dev[$x]})" fi done - notify_nodots "Adding a link from ${BOLD}${dev[0]} ${port[0]}${PLAIN}${PURPLE} to ${BOLD}${dev[1]} ${port[1]}${PLAIN}" + notify_nodots "Adding a link from ${NOTIFYNDCOLB}${dev[0]} ${port[0]}${NOTIFYNDCOL} to ${NOTIFYNDCOLB}${dev[1]} ${port[1]}${PLAIN}" confirm=1 fi else # action is not add/connect @@ -2644,7 +2679,7 @@ debug "adapnumlist is $adapnumlist" else textdata="$data" fi - echo -e "${PURPLE}About to run '${BOLD}$actionname${PLAIN}${PURPLE}' on ${BOLD}${nobs}${PLAIN}${PURPLE} ${whattolist}${ob_ess} on ${BOLD}${ndcs}${PLAIN}${PURPLE} server${dc_ess}:${PLAIN}" + cecho "$NOTIFYNDCOL" "$NOTIFYNDCOLB" "About to run '^b$actionname^p' on ^b${nobs}^p ${whattolist}${ob_ess} on ^b${ndcs}^p server${dc_ess}:" echo -e "$textdata" | awk -F, "BEGIN {lastdc=\"\"} { if (\$1 != lastdc) { print \" ${YELLOW}- ${BOLD}\" \$1 \" -> project=${curproj}${PLAIN}\"; lastdc=\$1; } print \" ${YELLOW}- \" \$2 \"${PLAIN}\"}" echo @@ -2654,7 +2689,7 @@ debug "adapnumlist is $adapnumlist" else local confirmcode entered_string confirmcode=$(generate_random_string) - notify_nodots "Confirmation code is: ${BOLD}${confirmcode}${PLAIN}" + notify_nodots "Confirmation code is: ${NOTIFYDCOLBOLD}${confirmcode}${NOTIFYDCOL}" getstr ":" "n" "Enter the above code to proceed, anything else will abort" entered_string="$retstr" [[ $entered_string == $confirmcode ]] && confirm=1 || confirm=0 @@ -2991,9 +3026,18 @@ GREEN="\033[32m" BLUE="\033[34m" MAGENTA="\033[35m" CYAN="\033[36m" -ORANGE="\033[38;2;255;165;0m" -PURPLE="\033[38;2;200;0;200m" -#PURPLE="\033[35m" +ORANGE="${PLAIN}\033[38;2;255;165;0m" +ORANGEBOLD="${BOLD}\033[38;2;255;220;0m" + +MAGENTARGB="${PLAIN}\033[38;2;208;65;126m" +MAGENTARGBBOLD="${BOLD}\033[38;2;255;135;196m" + + +NOTIFYNDCOL="$ORANGE" +NOTIFYNDCOLB="$ORANGEBOLD" +NOTIFYCOL="$MAGENTARGB" +NOTIFYCOLB="$MAGENTARGBBOLD" + GREY="\033[38;2;110;110;110m" LINK="$BLUE$UNDERLINE" @@ -3013,7 +3057,7 @@ CURLERRORSTRINGS="(^40.:|error|status.*40.)" UUIDCHAR="[0-9a-f]" UUID_REGEXP=${UUIDCHAR}\{8\}-${UUIDCHAR}\{4\}-${UUIDCHAR}\{4\}-${UUIDCHAR}\{4\}-${UUIDCHAR}\{12\} WORDCOLOURS=( "${GREEN}" "${RED}" "${YELLOW}" ) -UUIDCOL="$PURPLE" +UUIDCOL="$NOTIFYCOL" COLOURED_WORDS=( "true\|up\|enabled\|complete\|finished\|started\|opened" "false\|down\|paused\|uninitialized\|disabled\|failed\|stopped\|closed" "migrating\|powering_up\|project_closed\|unknown" ) ADD_COLOURS="" for colidx in ${!WORDCOLOURS[@]}; do @@ -3210,7 +3254,7 @@ cat "$errfile" rv=$? if [[ $rv -ne 0 || -z $jqoutput ]]; then error "$rv Got bad data from initial project list query to API" - echo -e "${RED}${BOLD}Errors:${PLAIN}" + cecho -s "${RED}" "^bErrors:^p" echo -en "${RED}" cat "${errfile}" | sed -e 's/^/ /' echo -en "${PLAIN}" @@ -3227,11 +3271,11 @@ cat "$errfile" else fail error "Could not obtain initial project list from API" - echo -e "${RED}${BOLD}Output:${PLAIN}" + cecho -s "${RED}" "^bOutput:^p" echo -en "${RED}" echo "${output}" | sed -e 's/^/ /' echo -en "${PLAIN}" - echo -e "${RED}${BOLD}Errors:${PLAIN}" + cecho -s "${RED}" "^bErrors:^p" echo -en "${RED}" cat "${errfile}" | sed -e 's/^/ /' echo -en "${PLAIN}" @@ -3253,7 +3297,7 @@ dumpmsgq trap cleanup EXIT echo -e "${UNDERLINE}Unofficial GNS3 cli v${VER}${PLAIN}" -echo -e "${ITALIC}${YELLOW}Note: this script is still in development and may have bugs!${PLAIN}" +#echo -e "${ITALIC}${YELLOW}Note: this script is still in development and may have bugs!${PLAIN}" if [[ $# -gt 0 ]]; then processcmd $*