quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

ech_tests.sh (54674B)


      1 #!/usr/bin/env bash
      2 #***************************************************************************
      3 #                                  _   _ ____  _
      4 #  Project                     ___| | | |  _ \| |
      5 #                             / __| | | | |_) | |
      6 #                            | (__| |_| |  _ <| |___
      7 #                             \___|\___/|_| \_\_____|
      8 #
      9 # Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
     10 #
     11 # This software is licensed as described in the file COPYING, which
     12 # you should have received as part of this distribution. The terms
     13 # are also available at https://curl.se/docs/copyright.html.
     14 #
     15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
     16 # copies of the Software, and permit persons to whom the Software is
     17 # furnished to do so, under the terms of the COPYING file.
     18 #
     19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     20 # KIND, either express or implied.
     21 #
     22 # SPDX-License-Identifier: curl
     23 #
     24 ###########################################################################
     25 #
     26 
     27 # Run some tests against servers we know to support ECH (CF, defo.ie, etc.).
     28 # as well as some we know don't do ECH but have an HTTPS RR, and finally some
     29 # for which neither is the case.
     30 
     31 # TODO: Translate this into something that approximates a valid curl test:-)
     32 # Should be useful though even before such translation and a pile less work
     33 # to do this than that.  The pile of work required would include making an
     34 # ECH-enabled server and a DoH server. For now, this is just run manually.
     35 #
     36 
     37 # set -x
     38 
     39 # Exit with an error if there's an active ech stanza in ~/.curlrc
     40 # as that'd likely skew some results (e.g. turning a fail into a
     41 # success or vice versa)
     42 : "${CURL_CFG_FILE=$HOME/.curlrc}"
     43 active_ech=$(grep ech "$CURL_CFG_FILE" | grep -v "#.*ech")
     44 if [[ "$active_ech" != "" ]]
     45 then
     46     echo "You seem to have an active ECH setting in $CURL_CFG_FILE"
     47     echo "That might affect results so please remove that or comment"
     48     echo "it out - exiting."
     49     exit 1
     50 fi
     51 
     52 
     53 # Targets we expect to be ECH-enabled servers
     54 # for which an HTTPS RR is published.
     55 # structure is host:port mapped to pathname
     56 # TODO: add negative tests for these
     57 declare -A ech_targets=(
     58     [my-own.net]="ech-check.php"
     59     [my-own.net:8443]="ech-check.php"
     60     [defo.ie]="ech-check.php"
     61     [cover.defo.ie]=""
     62     [draft-13.esni.defo.ie:8413]="stats"
     63     [draft-13.esni.defo.ie:8414]="stats"
     64     [draft-13.esni.defo.ie:9413]=""
     65     [draft-13.esni.defo.ie:10413]=""
     66     [draft-13.esni.defo.ie:11413]=""
     67     [draft-13.esni.defo.ie:12413]=""
     68     [draft-13.esni.defo.ie:12414]=""
     69     [cloudflare-ech.com]="cdn-cgi/trace"
     70     [tls-ech.dev]=""
     71     # this one's gone away for now (possibly temporarily)
     72     # [epochbelt.com]=""
     73 )
     74 
     75 # Targets we expect not to be ECH-enabled servers
     76 # but for which an HTTPS RR is published.
     77 declare -A httpsrr_targets=(
     78     [ietf.org]=""
     79     [rte.ie]=""
     80 )
     81 
     82 # Targets we expect not to be ECH-enabled servers
     83 # and for which no HTTPS RR is published.
     84 declare -A neither_targets=(
     85     [www.tcd.ie]=""
     86     [jell.ie]=""
     87 )
     88 
     89 #
     90 # Variables that can be over-ridden from environment
     91 #
     92 
     93 # Top of curl test tree, assume we're there
     94 : "${CTOP:=.}"
     95 
     96 # Place to put test log output
     97 : "${LTOP:=$CTOP/tests/ech-log/}"
     98 
     99 # Place to stash outputs when things go wrong
    100 : "${BTOP:=$LTOP}"
    101 
    102 # Time to wait for a remote access to work, 10 seconds
    103 : "${tout:=10s}"
    104 
    105 # Where we find OpenSSL .so's
    106 : "${OSSL:=$HOME/code/openssl-local-inst}"
    107 
    108 # Where we find wolfSSL .so's
    109 : "${WSSL:=$HOME/code/wolfssl/inst/lib}"
    110 
    111 # Where we find BoringSSL .so's
    112 : "${BSSL:=$HOME/code/boringssl/inst/lib}"
    113 
    114 # Where we send DoH queries when using kdig or curl
    115 : "${DOHSERVER:=one.one.one.one}"
    116 : "${DOHPATH:=dns-query}"
    117 
    118 # Whether to send mail when bad things happen (mostly for cronjob)
    119 : "${DOMAIL:=no}"
    120 
    121 # Misc vars and functions
    122 
    123 DEFPORT=443
    124 
    125 function whenisitagain()
    126 {
    127     /bin/date -u +%Y%m%d-%H%M%S
    128 }
    129 
    130 function fileage()
    131 {
    132     echo $(($(date +%s) - $(date +%s -r "$1")))
    133 }
    134 
    135 function hostport2host()
    136 {
    137     case $1 in
    138       *:*) host=${1%:*} port=${1##*:};;
    139         *) host=$1      port=$DEFPORT;;
    140     esac
    141     echo "$host"
    142 }
    143 
    144 function hostport2port()
    145 {
    146     case $1 in
    147       *:*) host=${1%:*} port=${1##*:};;
    148         *) host=$1      port=$DEFPORT;;
    149     esac
    150     echo "$port"
    151 }
    152 
    153 function cli_test()
    154 {
    155     # 1st param is target URL
    156     turl=$1
    157     # 2nd param is 0 if we expect curl to not work or 1 if we expect it
    158     # to have worked
    159     curl_winorlose=$2
    160     # 3rd param is 0 if we expect ECH to not work or 1 if we expect it
    161     # to have worked
    162     ech_winorlose=$3
    163     # remaining params are passed to command line
    164     # echparms=(${@:4})
    165     IFS=" " read -r -a echparms <<< "${@:4}"
    166 
    167     TMPF=$(mktemp)
    168     cmd="timeout $tout $CURL ${CURL_PARAMS[*]} ${echparms[*]} $turl >$TMPF 2>&1"
    169     echo "cli_test: $cmd " >> "$logfile"
    170     timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" "${echparms[@]}" "$turl" >"$TMPF" 2>&1
    171     eres=$?
    172     if [[ "$eres" == "124" ]]
    173     then
    174         allgood="no"
    175         echo "cli_test: Timeout running $cmd"
    176         cat "$TMPF" >> "$logfile"
    177         echo "cli_test: Timeout running $cmd" >> "$logfile"
    178     fi
    179     if [[ "$eres" != "0" && "$curl_winorlose" == "1" ]]
    180     then
    181         allgood="no"
    182         echo "cli_test: curl failure running $cmd"
    183         cat "$TMPF" >> "$logfile"
    184         echo "cli_test: curl failure running $cmd" >> "$logfile"
    185     fi
    186     ech_success=$(grep -c "ECH: result: status is succeeded" "$TMPF")
    187     if [[ "$ech_success" == "$ech_winorlose" ]]
    188     then
    189         echo "cli_test ok for ${echparms[*]}"
    190     else
    191         allgood="no"
    192         echo "cli_test: ECH failure running $cmd"
    193         cat "$TMPF" >> "$logfile"
    194         echo "cli_test: ECH failure running $cmd" >> "$logfile"
    195     fi
    196     rm -f "$TMPF"
    197 }
    198 
    199 function get_ech_configlist()
    200 {
    201     domain=$1
    202     ecl=$(dig +short https "$domain" | grep "ech=" | sed -e 's/^.*ech=//' | sed -e 's/ .*//')
    203     echo "$ecl"
    204 }
    205 
    206 # start of main script
    207 
    208 # start by assuming we have nothing we need...
    209 have_ossl="no"
    210 have_wolf="no"
    211 have_bssl="no"
    212 using_ossl="no"
    213 using_wolf="no"
    214 using_bssl="no"
    215 have_curl="no"
    216 have_dig="no"
    217 have_kdig="no"
    218 have_presout="no"
    219 have_portsblocked="no"
    220 
    221 # setup logging
    222 NOW=$(whenisitagain)
    223 BINNAME=$(basename "$0" .sh)
    224 if [ ! -d "$LTOP" ]
    225 then
    226     mkdir -p "$LTOP"
    227 fi
    228 if [ ! -d "$LTOP" ]
    229 then
    230     echo "Can't see $LTOP for logs - exiting"
    231     exit 1
    232 fi
    233 logfile=$LTOP/${BINNAME}_$NOW.log
    234 
    235 echo "-----" > "$logfile"
    236 echo "Running $0 at $NOW"  >> "$logfile"
    237 echo "Running $0 at $NOW"
    238 
    239 # check we have the binaries needed and which TLS library we'll be using
    240 if [ -f "$OSSL"/libssl.so ]
    241 then
    242     have_ossl="yes"
    243 fi
    244 if [ -f "$WSSL"/libwolfssl.so ]
    245 then
    246     have_wolf="yes"
    247 fi
    248 if [ -f "$BSSL"/libssl.so ]
    249 then
    250     have_bssl="yes"
    251 fi
    252 CURL="$CTOP/src/curl"
    253 CURL_PARAMS=(-vvv --doh-url https://one.one.one.one/dns-query)
    254 if [ -f "$CTOP"/src/curl ]
    255 then
    256     have_curl="yes"
    257 fi
    258 ossl_cnt=$(LD_LIBRARY_PATH=$OSSL $CURL "${CURL_PARAMS[@]}" -V 2> /dev/null | grep -c OpenSSL)
    259 if ((ossl_cnt == 1))
    260 then
    261     using_ossl="yes"
    262     # setup access to our .so
    263     export LD_LIBRARY_PATH=$OSSL
    264 fi
    265 bssl_cnt=$(LD_LIBRARY_PATH=$BSSL $CURL "${CURL_PARAMS[@]}" -V 2> /dev/null | grep -c BoringSSL)
    266 if ((bssl_cnt == 1))
    267 then
    268     using_bssl="yes"
    269     # setup access to our .so
    270     export LD_LIBRARY_PATH=$BSSL
    271 fi
    272 wolf_cnt=$($CURL "${CURL_PARAMS[@]}" -V 2> /dev/null | grep -c wolfSSL)
    273 if ((wolf_cnt == 1))
    274 then
    275     using_wolf="yes"
    276     # for some reason curl+wolfSSL dislikes certs that are ok
    277     # for browsers, so we'll test using "insecure" mode (-k)
    278     # but that's ok here as we're only interested in ECH testing
    279     CURL_PARAMS+=(-k)
    280 fi
    281 # check if we have dig and it knows https or not
    282 digcmd="dig +short"
    283 wdig=$(type -p dig)
    284 if [[ "$wdig" != "" ]]
    285 then
    286     have_dig="yes"
    287 fi
    288 wkdig=$(type -p kdig)
    289 if [[ "$wkdig" != "" ]]
    290 then
    291     have_kdig="yes"
    292     digcmd="kdig @$DOHSERVER +https +short"
    293 fi
    294 # see if our dig version knows HTTPS
    295 dout=$($digcmd https defo.ie)
    296 if [[ $dout != "1 . "* ]]
    297 then
    298     dout=$($digcmd -t TYPE65 defo.ie)
    299     if [[ $dout == "1 . "* ]]
    300     then
    301         # we're good
    302         have_presout="yes"
    303     fi
    304 else
    305     have_presout="yes"
    306 fi
    307 
    308 # Check if ports other than 443 are blocked from this
    309 # vantage point (I run tests in a n/w where that's
    310 # sadly true sometimes;-)
    311 # echo "Checking if ports other than 443 are maybe blocked"
    312 not443testurl="https://draft-13.esni.defo.ie:9413/"
    313 timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" "$not443testurl" >/dev/null 2>&1
    314 eres=$?
    315 if [[ "$eres" == "124" ]]
    316 then
    317     echo "Timeout running curl for $not443testurl" >> "$logfile"
    318     echo "Timeout running curl for $not443testurl"
    319     have_portsblocked="yes"
    320 fi
    321 
    322 {
    323     echo "have_ossl: $have_ossl"
    324     echo "have_wolf: $have_wolf"
    325     echo "have_bssl: $have_bssl"
    326     echo "using_ossl: $using_ossl"
    327     echo "using_wolf: $using_wolf"
    328     echo "using_bssl: $using_bssl"
    329     echo "have_curl: $have_curl"
    330     echo "have_dig: $have_dig"
    331     echo "have_kdig: $have_kdig"
    332     echo "have_presout: $have_presout"
    333     echo "have_portsblocked: $have_portsblocked"
    334 } >> "$logfile"
    335 
    336 echo "curl: have $have_curl, cURL command: |$CURL ${CURL_PARAMS[*]}|"
    337 echo "ossl: have: $have_ossl, using: $using_ossl"
    338 echo "wolf: have: $have_wolf, using: $using_wolf"
    339 echo "bssl: have: $have_bssl, using: $using_bssl"
    340 echo "dig: $have_dig, kdig: $have_kdig, HTTPS pres format: $have_presout"
    341 echo "dig command: |$digcmd|"
    342 echo "ports != 443 blocked: $have_portsblocked"
    343 
    344 if [[ "$have_curl" == "no" ]]
    345 then
    346     echo "Can't proceed without curl - exiting"
    347     exit 32
    348 fi
    349 
    350 allgood="yes"
    351 
    352 skip="false"
    353 
    354 if [[ "$skip" != "true" ]]
    355 then
    356 
    357 # basic ECH good/bad
    358 for targ in "${!ech_targets[@]}"
    359 do
    360     if [[ "$using_wolf" == "yes" ]]
    361     then
    362         case $targ in
    363             "draft-13.esni.defo.ie:8414" | "tls-ech.dev" | \
    364             "cloudflare-ech.com" | "epochbelt.com")
    365                 echo "Skipping $targ 'cause wolf"; continue;;
    366             *)
    367                 ;;
    368         esac
    369     fi
    370     host=$(hostport2host "$targ")
    371     port=$(hostport2port "$targ")
    372     if [[ "$port" != "443" && "$have_portsblocked" == "yes" ]]
    373     then
    374         echo "Skipping $targ as ports != 443 seem blocked"
    375         continue
    376     fi
    377     path=${ech_targets[$targ]}
    378     turl="https://$host:$port/$path"
    379     echo "ECH check for $turl"
    380     {
    381         echo ""
    382         echo "ECH check for $turl"
    383     } >> "$logfile"
    384     timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" --ech hard "$turl" >> "$logfile" 2>&1
    385     eres=$?
    386     if [[ "$eres" == "124" ]]
    387     then
    388         allgood="no"
    389         {
    390             echo "Timeout for $turl"
    391             echo -e "\tTimeout for $turl"
    392             echo "Timeout running curl for $host:$port/$path"
    393         } >> "$logfile"
    394     fi
    395     if [[ "$eres" != "0" ]]
    396     then
    397         allgood="no"
    398         echo "Error ($eres) for $turl" >> "$logfile"
    399         echo -e "\tError ($eres) for $turl"
    400     fi
    401     echo "" >> "$logfile"
    402 done
    403 
    404 # check if public_name override works (OpenSSL only)
    405 if [[ "$using_ossl" == "yes" ]]
    406 then
    407     for targ in "${!ech_targets[@]}"
    408     do
    409         host=$(hostport2host "$targ")
    410         port=$(hostport2port "$targ")
    411         if [[ "$port" != "443" && "$have_portsblocked" == "yes" ]]
    412         then
    413             echo "Skipping $targ as ports != 443 seem blocked"
    414             continue
    415         fi
    416         if [[ "$host" == "cloudflare-ech.com" ]]
    417         then
    418             echo "Skipping $host as they've blocked PN override"
    419             continue
    420         fi
    421         path=${ech_targets[$targ]}
    422         turl="https://$host:$port/$path"
    423         echo "PN override check for $turl"
    424         {
    425             echo ""
    426             echo "PN override check for $turl"
    427         } >> "$logfile"
    428         timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" --ech pn:override --ech hard "$turl" >> "$logfile" 2>&1
    429         eres=$?
    430         if [[ "$eres" == "124" ]]
    431         then
    432             allgood="no"
    433             {
    434                 echo "Timeout for $turl"
    435                 echo -e "\tTimeout for $turl"
    436                 echo "Timeout running curl for $host:$port/$path"
    437             } >> "$logfile"
    438         fi
    439         if [[ "$eres" != "0" ]]
    440         then
    441             allgood="no"
    442             echo "PN override Error ($eres) for $turl" >> "$logfile"
    443             echo -e "\tPN override Error ($eres) for $turl"
    444         fi
    445         echo "" >> "$logfile"
    446     done
    447 fi
    448 
    449 for targ in "${!httpsrr_targets[@]}"
    450 do
    451     host=$(hostport2host "$targ")
    452     port=$(hostport2port "$targ")
    453     if [[ "$port" != "443" && "$have_portsblocked" == "yes" ]]
    454     then
    455         echo "Skipping $targ as ports != 443 seem blocked"
    456         continue
    457     fi
    458     path=${httpsrr_targets[$targ]}
    459     turl="https://$host:$port/$path"
    460     echo "HTTPS RR but no ECHConfig check for $turl"
    461     {
    462         echo ""
    463         echo "HTTPS RR but no ECHConfig check for $turl"
    464     } >> "$logfile"
    465     timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" --ech true "$turl" >> "$logfile" 2>&1
    466     eres=$?
    467     if [[ "$eres" == "124" ]]
    468     then
    469         allgood="no"
    470         {
    471             echo "Timeout for $turl"
    472             echo -e "\tTimeout for $turl"
    473             echo "Timeout running curl for $host:$port/$path"
    474         } >> "$logfile"
    475     fi
    476     if [[ "$eres" != "0" ]]
    477     then
    478         allgood="no"
    479         echo "Error ($eres) for $turl" >> "$logfile"
    480         echo -e "\tError ($eres) for $turl"
    481     fi
    482     echo "" >> "$logfile"
    483 done
    484 
    485 for targ in "${!neither_targets[@]}"
    486 do
    487     host=$(hostport2host "$targ")
    488     port=$(hostport2port "$targ")
    489     if [[ "$port" != "443" && "$have_portsblocked" == "yes" ]]
    490     then
    491         echo "Skipping $targ as ports != 443 seem blocked"
    492         continue
    493     fi
    494     path=${neither_targets[$targ]}
    495     turl="https://$host:$port/$path"
    496     echo "Neither HTTPS nor ECHConfig check for $turl"
    497     {
    498         echo ""
    499         echo "Neither HTTPS nor ECHConfig check for $turl"
    500     } >> "$logfile"
    501     timeout "$tout" "$CURL" "${CURL_PARAMS[@]}" --ech true "$turl" >> "$logfile" 2>&1
    502     eres=$?
    503     if [[ "$eres" == "124" ]]
    504     then
    505         allgood="no"
    506         {
    507             echo "Timeout for $turl"
    508             echo -e "\tTimeout for $turl"
    509             echo "Timeout running curl for $host:$port/$path"
    510         } >> "$logfile"
    511     fi
    512     if [[ "$eres" != "0" ]]
    513     then
    514         allgood="no"
    515         echo "Error ($eres) for $turl" >> "$logfile"
    516         echo -e "\tError ($eres) for $turl"
    517     fi
    518     echo "" >> "$logfile"
    519 done
    520 
    521 
    522 # Check various command line options, if we're good so far
    523 if [[ "$using_ossl" == "yes" && "$allgood" == "yes" ]]
    524 then
    525     # use this test URL as it'll tell us if things worked
    526     turl="https://defo.ie/ech-check.php"
    527     echo "cli_test with $turl"
    528     echo "cli_test with $turl" >> "$logfile"
    529     cli_test "$turl" 1 1 --ech true
    530     cli_test "$turl" 1 0 --ech false
    531     cli_test "$turl" 1 1 --ech false --ech true
    532     cli_test "$turl" 1 1 --ech false --ech true --ech pn:foobar
    533     cli_test "$turl" 1 1 --ech false --ech pn:foobar --ech true
    534     echconfiglist=$(get_ech_configlist defo.ie)
    535     cli_test "$turl" 1 1 --ech ecl:"$echconfiglist"
    536     cli_test "$turl" 1 0 --ech ecl:
    537 fi
    538 
    539 fi # skip
    540 
    541 # Check combinations of command line options, if we're good so far
    542 # Most of this only works for OpenSSL, which is ok, as we're checking
    543 # the argument handling here, not the ECH protocol
    544 if [[ "$using_ossl" == "yes" && "$allgood" == "yes" ]]
    545 then
    546     # ech can be hard, true, grease or false
    547     # ecl:ecl can be correct, incorrect or missing
    548     # ech:pn can be correct, incorrect or missing
    549     # in all cases the "last" argument provided should "win"
    550     # but only one of hard, true, grease or false will apply
    551     turl="https://defo.ie/ech-check.php"
    552     echconfiglist=$(get_ech_configlist defo.ie)
    553     goodecl=$echconfiglist
    554     echconfiglist=$(get_ech_configlist hidden.hoba.ie)
    555     badecl=$echconfiglist
    556     goodpn="cover.defo.ie"
    557     badpn="hoba.ie"
    558     echo "more cli_test with $turl"
    559     echo "more cli_test with $turl" >> "$logfile"
    560 
    561     # The combinatorics here are handled via the tests/ech_combos.py script
    562     # which produces all the relevant combinations or inputs and orders
    563     # thereof. We have to manually assess whether or not ECH is expected to
    564     # work for each case.
    565     cli_test "$turl" 0 0
    566     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    567     cli_test "$turl" 0 0 --ech ecl:"$badecl"
    568     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    569     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech ecl:"$goodecl"
    570     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    571     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    572     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    573     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard
    574     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    575     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl"
    576     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    577     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    578     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    579     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech pn:"$goodpn"
    580     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    581     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true
    582     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    583     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl"
    584     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    585     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    586     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    587     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true --ech pn:"$goodpn"
    588     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    589     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn"
    590     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    591     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl"
    592     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    593     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    594     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    595     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard
    596     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    597     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    598     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    599     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    600     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    601     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    602     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    603     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true
    604     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    605     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    606     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    607     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    608     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    609     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    610     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    611     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech pn:"$goodpn"
    612     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    613     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true
    614     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    615     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    616     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    617     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    618     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    619     cli_test "$turl" - 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    620     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    621     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$goodpn"
    622     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    623     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true
    624     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    625     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl"
    626     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    627     cli_test "$turl" 1 1 --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    628     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    629     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true --ech pn:"$goodpn"
    630     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    631     cli_test "$turl" 1 1 --ech ecl:"$goodecl"
    632     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    633     cli_test "$turl" 1 1 --ech ecl:"$goodecl" --ech pn:"$goodpn"
    634     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    635     cli_test "$turl" 1 0 --ech false
    636     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    637     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl"
    638     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    639     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech ecl:"$goodecl"
    640     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    641     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    642     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    643     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard
    644     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    645     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl"
    646     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    647     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    648     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    649     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech pn:"$goodpn"
    650     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    651     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true
    652     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    653     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl"
    654     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    655     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    656     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    657     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech pn:"$goodpn"
    658     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    659     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn"
    660     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    661     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl"
    662     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    663     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    664     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    665     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard
    666     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    667     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    668     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    669     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    670     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    671     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    672     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    673     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true
    674     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    675     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    676     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    677     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    678     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    679     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    680     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    681     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech pn:"$goodpn"
    682     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    683     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true
    684     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    685     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    686     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    687     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    688     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    689     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    690     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    691     cli_test "$turl" 1 0 --ech false --ech ecl:"$badecl" --ech pn:"$goodpn"
    692     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    693     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true
    694     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    695     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl"
    696     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    697     cli_test "$turl" 1 1 --ech false --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    698     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    699     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true --ech pn:"$goodpn"
    700     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    701     cli_test "$turl" 1 0 --ech false --ech ecl:"$goodecl"
    702     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    703     cli_test "$turl" 1 0 --ech false --ech ecl:"$goodecl" --ech pn:"$goodpn"
    704     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    705     cli_test "$turl" 1 1 --ech false --ech hard
    706     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    707     cli_test "$turl" 1 1 --ech false --ech hard --ech ecl:"$goodecl"
    708     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    709     cli_test "$turl" 1 1 --ech false --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    710     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    711     cli_test "$turl" 1 1 --ech false --ech hard --ech pn:"$goodpn"
    712     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    713     cli_test "$turl" 1 1 --ech false --ech hard --ech true
    714     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    715     cli_test "$turl" 1 1 --ech false --ech hard --ech true --ech ecl:"$goodecl"
    716     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    717     cli_test "$turl" 1 1 --ech false --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    718     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    719     cli_test "$turl" 1 1 --ech false --ech hard --ech true --ech pn:"$goodpn"
    720     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    721     cli_test "$turl" 1 0 --ech false --ech pn:"$badpn"
    722     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    723     cli_test "$turl" 1 0 --ech false --ech pn:"$badpn" --ech ecl:"$goodecl"
    724     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    725     cli_test "$turl" 1 0 --ech false --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    726     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    727     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard
    728     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    729     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    730     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    731     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    732     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    733     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    734     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    735     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech true
    736     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    737     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    738     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    739     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    740     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    741     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    742     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    743     cli_test "$turl" 1 0 --ech false --ech pn:"$badpn" --ech pn:"$goodpn"
    744     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    745     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech true
    746     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    747     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    748     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    749     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    750     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    751     cli_test "$turl" 1 1 --ech false --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    752     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    753     cli_test "$turl" 1 0 --ech false --ech pn:"$goodpn"
    754     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    755     cli_test "$turl" 1 1 --ech false --ech true
    756     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    757     cli_test "$turl" 1 1 --ech false --ech true --ech ecl:"$goodecl"
    758     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    759     cli_test "$turl" 1 1 --ech false --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    760     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    761     cli_test "$turl" 1 1 --ech false --ech true --ech pn:"$goodpn"
    762     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    763     cli_test "$turl" 1 1 --ech hard
    764     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    765     cli_test "$turl" 1 1 --ech hard --ech ecl:"$goodecl"
    766     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    767     cli_test "$turl" 1 1 --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    768     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    769     cli_test "$turl" 1 1 --ech hard --ech pn:"$goodpn"
    770     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    771     cli_test "$turl" 1 1 --ech hard --ech true
    772     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    773     cli_test "$turl" 1 1 --ech hard --ech true --ech ecl:"$goodecl"
    774     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    775     cli_test "$turl" 1 1 --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    776     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    777     cli_test "$turl" 1 1 --ech hard --ech true --ech pn:"$goodpn"
    778     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    779     cli_test "$turl" 1 0 --ech pn:"$badpn"
    780     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    781     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech ecl:"$goodecl"
    782     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    783     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    784     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    785     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard
    786     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    787     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    788     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    789     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    790     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    791     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    792     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    793     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech true
    794     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    795     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    796     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    797     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    798     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    799     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    800     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    801     cli_test "$turl" 1 0 --ech pn:"$badpn" --ech pn:"$goodpn"
    802     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    803     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech true
    804     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    805     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    806     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    807     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    808     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    809     cli_test "$turl" 1 1 --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    810     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    811     cli_test "$turl" 1 0 --ech pn:"$goodpn"
    812     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    813     cli_test "$turl" 1 1 --ech true
    814     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    815     cli_test "$turl" 1 1 --ech true --ech ecl:"$goodecl"
    816     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    817     cli_test "$turl" 1 1 --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    818     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    819     cli_test "$turl" 1 1 --ech true --ech pn:"$goodpn"
    820     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    821     cli_test "$turl" 1 0
    822     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    823     cli_test "$turl" 1 1 --ech ecl:"$goodecl"
    824     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    825     cli_test "$turl" 1 1 --ech ecl:"$goodecl" --ech pn:"$goodpn"
    826     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    827     cli_test "$turl" 1 0 --ech pn:"$goodpn"
    828     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    829     cli_test "$turl" 1 1 --ech true
    830     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    831     cli_test "$turl" 1 1 --ech true --ech ecl:"$goodecl"
    832     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    833     cli_test "$turl" 1 1 --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    834     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    835     cli_test "$turl" 1 1 --ech true --ech pn:"$goodpn"
    836     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    837 
    838     # a target URL that doesn't support ECH
    839     turl="https://tcd.ie"
    840     echo "cli_test with $turl"
    841     echo "cli_test with $turl" >> "$logfile"
    842     # the params below don't matter much here as we'll fail anyway
    843     echconfiglist=$(get_ech_configlist defo.ie)
    844     goodecl=$echconfiglist
    845     badecl="$goodecl"
    846     goodpn="tcd.ie"
    847     badpn="tcd.ie"
    848     cli_test "$turl" 1 0
    849     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    850     cli_test "$turl" 0 0 --ech ecl:"$badecl"
    851     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    852     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech ecl:"$goodecl"
    853     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    854     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    855     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    856     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard
    857     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    858     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl"
    859     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    860     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    861     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    862     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech pn:"$goodpn"
    863     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    864     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true
    865     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    866     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl"
    867     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    868     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    869     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    870     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech hard --ech true --ech pn:"$goodpn"
    871     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    872     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn"
    873     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    874     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl"
    875     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    876     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    877     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    878     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard
    879     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    880     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    881     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    882     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    883     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    884     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    885     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    886     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true
    887     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    888     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    889     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    890     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    891     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    892     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    893     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    894     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech pn:"$goodpn"
    895     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    896     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true
    897     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    898     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    899     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    900     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    901     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    902     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    903     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    904     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech pn:"$goodpn"
    905     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    906     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true
    907     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    908     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl"
    909     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    910     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    911     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    912     cli_test "$turl" 0 0 --ech ecl:"$badecl" --ech true --ech pn:"$goodpn"
    913     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    914     cli_test "$turl" 0 0 --ech ecl:"$goodecl"
    915     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    916     cli_test "$turl" 0 0 --ech ecl:"$goodecl" --ech pn:"$goodpn"
    917     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    918     cli_test "$turl" 0 0 --ech false
    919     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    920     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl"
    921     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    922     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech ecl:"$goodecl"
    923     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    924     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    925     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    926     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard
    927     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    928     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl"
    929     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    930     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    931     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    932     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech pn:"$goodpn"
    933     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    934     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true
    935     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    936     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl"
    937     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    938     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    939     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    940     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech hard --ech true --ech pn:"$goodpn"
    941     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    942     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn"
    943     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    944     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl"
    945     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    946     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
    947     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    948     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard
    949     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    950     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
    951     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    952     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    953     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    954     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
    955     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    956     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true
    957     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    958     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
    959     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    960     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    961     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    962     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
    963     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    964     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech pn:"$goodpn"
    965     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    966     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true
    967     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    968     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
    969     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    970     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    971     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    972     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
    973     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    974     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech pn:"$goodpn"
    975     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    976     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true
    977     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    978     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl"
    979     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    980     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
    981     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    982     cli_test "$turl" 0 0 --ech false --ech ecl:"$badecl" --ech true --ech pn:"$goodpn"
    983     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    984     cli_test "$turl" 0 0 --ech false --ech ecl:"$goodecl"
    985     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    986     cli_test "$turl" 0 0 --ech false --ech ecl:"$goodecl" --ech pn:"$goodpn"
    987     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    988     cli_test "$turl" 0 0 --ech false --ech hard
    989     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    990     cli_test "$turl" 0 0 --ech false --ech hard --ech ecl:"$goodecl"
    991     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    992     cli_test "$turl" 0 0 --ech false --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
    993     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    994     cli_test "$turl" 0 0 --ech false --ech hard --ech pn:"$goodpn"
    995     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    996     cli_test "$turl" 0 0 --ech false --ech hard --ech true
    997     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
    998     cli_test "$turl" 0 0 --ech false --ech hard --ech true --ech ecl:"$goodecl"
    999     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1000     cli_test "$turl" 0 0 --ech false --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1001     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1002     cli_test "$turl" 0 0 --ech false --ech hard --ech true --ech pn:"$goodpn"
   1003     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1004     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn"
   1005     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1006     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech ecl:"$goodecl"
   1007     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1008     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1009     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1010     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard
   1011     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1012     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
   1013     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1014     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1015     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1016     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
   1017     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1018     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech true
   1019     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1020     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
   1021     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1022     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1023     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1024     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
   1025     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1026     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech pn:"$goodpn"
   1027     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1028     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech true
   1029     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1030     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
   1031     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1032     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1033     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1034     cli_test "$turl" 0 0 --ech false --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
   1035     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1036     cli_test "$turl" 0 0 --ech false --ech pn:"$goodpn"
   1037     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1038     cli_test "$turl" 0 0 --ech false --ech true
   1039     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1040     cli_test "$turl" 0 0 --ech false --ech true --ech ecl:"$goodecl"
   1041     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1042     cli_test "$turl" 0 0 --ech false --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1043     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1044     cli_test "$turl" 0 0 --ech false --ech true --ech pn:"$goodpn"
   1045     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1046     cli_test "$turl" 0 0 --ech hard
   1047     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1048     cli_test "$turl" 0 0 --ech hard --ech ecl:"$goodecl"
   1049     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1050     cli_test "$turl" 0 0 --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1051     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1052     cli_test "$turl" 0 0 --ech hard --ech pn:"$goodpn"
   1053     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1054     cli_test "$turl" 0 0 --ech hard --ech true
   1055     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1056     cli_test "$turl" 0 0 --ech hard --ech true --ech ecl:"$goodecl"
   1057     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1058     cli_test "$turl" 0 0 --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1059     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1060     cli_test "$turl" 0 0 --ech hard --ech true --ech pn:"$goodpn"
   1061     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1062     cli_test "$turl" 0 0 --ech pn:"$badpn"
   1063     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1064     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech ecl:"$goodecl"
   1065     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1066     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1067     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1068     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard
   1069     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1070     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl"
   1071     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1072     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1073     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1074     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech pn:"$goodpn"
   1075     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1076     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech true
   1077     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1078     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl"
   1079     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1080     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1081     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1082     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech hard --ech true --ech pn:"$goodpn"
   1083     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1084     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech pn:"$goodpn"
   1085     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1086     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech true
   1087     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1088     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech true --ech ecl:"$goodecl"
   1089     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1090     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1091     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1092     cli_test "$turl" 0 0 --ech pn:"$badpn" --ech true --ech pn:"$goodpn"
   1093     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1094     cli_test "$turl" 0 0 --ech pn:"$goodpn"
   1095     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1096     cli_test "$turl" 0 0 --ech true
   1097     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1098     cli_test "$turl" 0 0 --ech true --ech ecl:"$goodecl"
   1099     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1100     cli_test "$turl" 0 0 --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1101     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1102     cli_test "$turl" 0 0 --ech true --ech pn:"$goodpn"
   1103     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1104     cli_test "$turl" 0 0
   1105     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1106     cli_test "$turl" 0 0 --ech ecl:"$goodecl"
   1107     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1108     cli_test "$turl" 0 0 --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1109     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1110     cli_test "$turl" 0 0 --ech pn:"$goodpn"
   1111     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1112     cli_test "$turl" 0 0 --ech true
   1113     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1114     cli_test "$turl" 0 0 --ech true --ech ecl:"$goodecl"
   1115     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1116     cli_test "$turl" 0 0 --ech true --ech ecl:"$goodecl" --ech pn:"$goodpn"
   1117     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1118     cli_test "$turl" 0 0 --ech true --ech pn:"$goodpn"
   1119     if [[ "$allgood" != "yes" ]]; then echo "$LINENO"; fi
   1120 fi
   1121 
   1122 
   1123 END=$(whenisitagain)
   1124 echo "Finished $0 at $END"  >> "$logfile"
   1125 echo "-----" >> "$logfile"
   1126 
   1127 if [[ "$allgood" == "yes" ]]
   1128 then
   1129     echo "Finished $0 at $END"
   1130     echo "All good, log in $logfile"
   1131     exit 0
   1132 else
   1133     echo "Finished $0 at $END"
   1134     echo "NOT all good, log in $logfile"
   1135 fi
   1136 
   1137 # send a mail to root (will be fwd'd) but just once every 24 hours
   1138 # 'cause we only really need "new" news
   1139 itsnews="yes"
   1140 age_of_news=0
   1141 if [ -f "$LTOP"/bad_runs ]
   1142 then
   1143     age_of_news=$(fileage "$LTOP"/bad_runs)
   1144     # only consider news "new" if we haven't mailed today
   1145     if ((age_of_news < 24*3600))
   1146     then
   1147         itsnews="no"
   1148     fi
   1149 fi
   1150 if [[ "$DOMAIL" == "yes" && "$itsnews" == "yes" ]]
   1151 then
   1152     echo "ECH badness at $NOW" | mail -s "ECH badness at $NOW" root
   1153 fi
   1154 # add to list of bad runs (updating file age)
   1155 echo "ECH badness at $NOW" >>"$LTOP"/bad_runs
   1156 exit 2