Make colo.sh support Bash 5 (#9112)
This commit is contained in:
		| @@ -48,7 +48,7 @@ __cloud_FindInstances() { | |||||||
|   fi |   fi | ||||||
|   INSTANCES_TEXT="$( |   INSTANCES_TEXT="$( | ||||||
|     for AVAIL in "${COLO_RES_AVAILABILITY[@]}"; do |     for AVAIL in "${COLO_RES_AVAILABILITY[@]}"; do | ||||||
|       IFS=$'\v' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME PREEMPTIBLE <<<"${AVAIL}" |       IFS=$'\x1f' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME PREEMPTIBLE <<<"${AVAIL}" | ||||||
|       if [[ ${INSTNAME} =~ ${filter} ]]; then |       if [[ ${INSTNAME} =~ ${filter} ]]; then | ||||||
|         if [[ -n $onlyPreemptible && $PREEMPTIBLE == "false" ]]; then |         if [[ -n $onlyPreemptible && $PREEMPTIBLE == "false" ]]; then | ||||||
|           continue |           continue | ||||||
| @@ -57,7 +57,7 @@ __cloud_FindInstances() { | |||||||
|           echo -e "${INSTNAME}:${IP}:${PRIV_IP}:${ZONE}" |           echo -e "${INSTNAME}:${IP}:${PRIV_IP}:${ZONE}" | ||||||
|         fi |         fi | ||||||
|       fi |       fi | ||||||
|     done | sort -t $'\v' -k1 |     done | sort -t $'\x1f' -k1 | ||||||
|   )" |   )" | ||||||
|   if [[ -n "${INSTANCES_TEXT}" ]]; then |   if [[ -n "${INSTANCES_TEXT}" ]]; then | ||||||
|     while read -r LINE; do |     while read -r LINE; do | ||||||
| @@ -180,17 +180,17 @@ cloud_CreateInstances() { | |||||||
|     declare AVAILABLE_TEXT |     declare AVAILABLE_TEXT | ||||||
|     AVAILABLE_TEXT="$( |     AVAILABLE_TEXT="$( | ||||||
|       for RES in "${COLO_RES_AVAILABILITY[@]}"; do |       for RES in "${COLO_RES_AVAILABILITY[@]}"; do | ||||||
|         IFS=$'\v' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME <<<"${RES}" |         IFS=$'\x1f' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME <<<"${RES}" | ||||||
|         if [[ "FREE" = "${STATUS}" ]]; then |         if [[ "FREE" = "${STATUS}" ]]; then | ||||||
|           INDEX=$(colo_res_index_from_ip "${IP}") |           INDEX=$(colo_res_index_from_ip "${IP}") | ||||||
|           RES_MACH="${COLO_RES_MACHINE[${INDEX}]}" |           RES_MACH="${COLO_RES_MACHINE[${INDEX}]}" | ||||||
|           if colo_machine_types_compatible "${RES_MACH}" "${machineType}"; then |           if colo_machine_types_compatible "${RES_MACH}" "${machineType}"; then | ||||||
|             if ! colo_node_is_requisitioned "${INDEX}" "${COLO_RES_REQUISITIONED[*]}"; then |             if ! colo_node_is_requisitioned "${INDEX}" "${COLO_RES_REQUISITIONED[*]}"; then | ||||||
|               echo -e "${RES_MACH}\v${IP}" |               echo -e "${RES_MACH}\x1f${IP}" | ||||||
|             fi |             fi | ||||||
|           fi |           fi | ||||||
|         fi |         fi | ||||||
|       done | sort -nt $'\v' -k1,1 |       done | sort -nt $'\x1f' -k1,1 | ||||||
|     )" |     )" | ||||||
|  |  | ||||||
|     if [[ -n "${AVAILABLE_TEXT}" ]]; then |     if [[ -n "${AVAILABLE_TEXT}" ]]; then | ||||||
| @@ -207,7 +207,7 @@ cloud_CreateInstances() { | |||||||
|     declare node |     declare node | ||||||
|     declare AI=0 |     declare AI=0 | ||||||
|     for node in "${nodes[@]}"; do |     for node in "${nodes[@]}"; do | ||||||
|       IFS=$'\v' read -r _ IP <<<"${AVAILABLE[${AI}]}" |       IFS=$'\x1f' read -r _ IP <<<"${AVAILABLE[${AI}]}" | ||||||
|       colo_node_requisition "${IP}" "${node}" >/dev/null |       colo_node_requisition "${IP}" "${node}" >/dev/null | ||||||
|       AI=$((AI+1)) |       AI=$((AI+1)) | ||||||
|     done |     done | ||||||
| @@ -284,7 +284,7 @@ cloud_StatusAll() { | |||||||
|     colo_load_availability false |     colo_load_availability false | ||||||
|   fi |   fi | ||||||
|   for AVAIL in "${COLO_RES_AVAILABILITY[@]}"; do |   for AVAIL in "${COLO_RES_AVAILABILITY[@]}"; do | ||||||
|     IFS=$'\v' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME PREEMPTIBLE <<<"${AVAIL}" |     IFS=$'\x1f' read -r HOST_NAME IP PRIV_IP STATUS ZONE LOCK_USER INSTNAME PREEMPTIBLE <<<"${AVAIL}" | ||||||
|     printf "%-30s | publicIp=%-16s privateIp=%s status=%s who=%s zone=%s inst=%s preemptible=%s\n" "${HOST_NAME}" "${IP}" "${PRIV_IP}" "${STATUS}" "${LOCK_USER}" "${ZONE}" "${INSTNAME}" "${PREEMPTIBLE}" |     printf "%-30s | publicIp=%-16s privateIp=%s status=%s who=%s zone=%s inst=%s preemptible=%s\n" "${HOST_NAME}" "${IP}" "${PRIV_IP}" "${STATUS}" "${LOCK_USER}" "${ZONE}" "${INSTNAME}" "${PREEMPTIBLE}" | ||||||
|   done |   done | ||||||
| } | } | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ colo_load_resources() { | |||||||
|       COLO_RES_RAM_GB+=( "${M}" ) |       COLO_RES_RAM_GB+=( "${M}" ) | ||||||
|       COLO_RES_STORAGE_TYPE+=( "${ST}" ) |       COLO_RES_STORAGE_TYPE+=( "${ST}" ) | ||||||
|       COLO_RES_STORAGE_CAP_GB+=( "${SC}" ) |       COLO_RES_STORAGE_CAP_GB+=( "${SC}" ) | ||||||
|       COLO_RES_ADD_STORAGE_TYPE+=( "$(tr ',' $'\v' <<<"${AST}")" ) |       COLO_RES_ADD_STORAGE_TYPE+=( "$(tr ',' $'\x1f' <<<"${AST}")" ) | ||||||
|       COLO_RES_ADD_STORAGE_CAP_GB+=( "$(tr ',' $'\v' <<<"${ASC}")" ) |       COLO_RES_ADD_STORAGE_CAP_GB+=( "$(tr ',' $'\x1f' <<<"${ASC}")" ) | ||||||
|       COLO_RES_MACHINE+=( "${G}" ) |       COLO_RES_MACHINE+=( "${G}" ) | ||||||
|       COLO_RES_ZONE+=( "${Z}" ) |       COLO_RES_ZONE+=( "${Z}" ) | ||||||
|       COLO_RES_N=$((COLO_RES_N+1)) |       COLO_RES_N=$((COLO_RES_N+1)) | ||||||
| @@ -51,13 +51,13 @@ colo_load_availability() { | |||||||
|     COLO_RES_AVAILABILITY=() |     COLO_RES_AVAILABILITY=() | ||||||
|     COLO_RES_REQUISITIONED=() |     COLO_RES_REQUISITIONED=() | ||||||
|     while read -r LINE; do |     while read -r LINE; do | ||||||
|       IFS=$'\v' read -r IP STATUS LOCK_USER INSTNAME PREEMPTIBLE <<< "${LINE}" |       IFS=$'\x1f' read -r IP STATUS LOCK_USER INSTNAME PREEMPTIBLE <<< "${LINE}" | ||||||
|       I=$(colo_res_index_from_ip "${IP}") |       I=$(colo_res_index_from_ip "${IP}") | ||||||
|       PRIV_IP="${COLO_RES_IP_PRIV[${I}]}" |       PRIV_IP="${COLO_RES_IP_PRIV[${I}]}" | ||||||
|       HOST_NAME="${COLO_RES_HOSTNAME[${I}]}" |       HOST_NAME="${COLO_RES_HOSTNAME[${I}]}" | ||||||
|       ZONE="${COLO_RES_ZONE[${I}]}" |       ZONE="${COLO_RES_ZONE[${I}]}" | ||||||
|       COLO_RES_AVAILABILITY+=( "$(echo -e "${HOST_NAME}\v${IP}\v${PRIV_IP}\v${STATUS}\v${ZONE}\v${LOCK_USER}\v${INSTNAME}\v${PREEMPTIBLE}")" ) |       COLO_RES_AVAILABILITY+=( "$(echo -e "${HOST_NAME}\x1f${IP}\x1f${PRIV_IP}\x1f${STATUS}\x1f${ZONE}\x1f${LOCK_USER}\x1f${INSTNAME}\x1f${PREEMPTIBLE}")" ) | ||||||
|     done < <(colo_node_status_all | sort -t $'\v' -k1) |     done < <(colo_node_status_all | sort -t $'\x1f' -k1) | ||||||
|     COLO_RES_AVAILABILITY_CACHED=true |     COLO_RES_AVAILABILITY_CACHED=true | ||||||
|   fi |   fi | ||||||
| } | } | ||||||
| @@ -82,7 +82,7 @@ colo_instance_run() { | |||||||
|   declare RC=$? |   declare RC=$? | ||||||
|   set -e |   set -e | ||||||
|   while read -r LINE; do |   while read -r LINE; do | ||||||
|     echo -e "${IP}\v${RC}\v${LINE}" |     echo -e "${IP}\x1f${RC}\x1f${LINE}" | ||||||
|     if [[ "${RC}" -ne 0 ]]; then |     if [[ "${RC}" -ne 0 ]]; then | ||||||
|       echo "IP(${IP}) Err(${RC}) LINE(${LINE})" 1>&2 |       echo "IP(${IP}) Err(${RC}) LINE(${LINE})" 1>&2 | ||||||
|     fi |     fi | ||||||
| @@ -114,7 +114,7 @@ colo_whoami() { | |||||||
|   declare ME LINE SOL_USER EOL |   declare ME LINE SOL_USER EOL | ||||||
|   while read -r LINE; do |   while read -r LINE; do | ||||||
|     declare IP RC |     declare IP RC | ||||||
|     IFS=$'\v' read -r IP RC SOL_USER EOL <<< "${LINE}" |     IFS=$'\x1f' read -r IP RC SOL_USER EOL <<< "${LINE}" | ||||||
|     if [ "${RC}" -eq 0 ]; then |     if [ "${RC}" -eq 0 ]; then | ||||||
|       [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${LINE}\"" 1>&2 |       [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${LINE}\"" 1>&2 | ||||||
|       if [ -z "${ME}" ] || [ "${ME}" = "${SOL_USER}" ]; then |       if [ -z "${ME}" ] || [ "${ME}" = "${SOL_USER}" ]; then | ||||||
| @@ -123,7 +123,7 @@ colo_whoami() { | |||||||
|         echo "Found conflicting username \"${SOL_USER}\" on ${IP}, expected \"${ME}\"" 1>&2 |         echo "Found conflicting username \"${SOL_USER}\" on ${IP}, expected \"${ME}\"" 1>&2 | ||||||
|       fi |       fi | ||||||
|     fi |     fi | ||||||
|   done < <(colo_instance_run_foreach "[ -n \"\${SOLANA_USER}\" ] && echo -e \"\${SOLANA_USER}\\vEOL\"") |   done < <(colo_instance_run_foreach "[ -n \"\${SOLANA_USER}\" ] && echo -e \"\${SOLANA_USER}\\x1fEOL\"") | ||||||
|   echo "${ME}" |   echo "${ME}" | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -142,7 +142,7 @@ __colo_node_status_script() { | |||||||
|                     # the time due to ${SOLANA_LOCK_FILE} not existing and is running from a |                     # the time due to ${SOLANA_LOCK_FILE} not existing and is running from a | ||||||
|                     # subshell where normal redirection doesn't work |                     # subshell where normal redirection doesn't work | ||||||
|   exec 9<"${SOLANA_LOCK_FILE}" && flock -s 9 && . "${SOLANA_LOCK_FILE}" && exec 9>&- |   exec 9<"${SOLANA_LOCK_FILE}" && flock -s 9 && . "${SOLANA_LOCK_FILE}" && exec 9>&- | ||||||
|   echo -e "\${SOLANA_LOCK_USER}\\v\${SOLANA_LOCK_INSTANCENAME}\\v\${PREEMPTIBLE}\\vEOL" |   echo -e "\${SOLANA_LOCK_USER}\\x1f\${SOLANA_LOCK_INSTANCENAME}\\x1f\${PREEMPTIBLE}\\x1fEOL" | ||||||
|   exec 2>&3 # Restore stderr |   exec 2>&3 # Restore stderr | ||||||
| EOF | EOF | ||||||
| } | } | ||||||
| @@ -150,7 +150,7 @@ EOF | |||||||
| __colo_node_status_result_normalize() { | __colo_node_status_result_normalize() { | ||||||
|   declare IP RC US BY INSTNAME PREEMPTIBLE EOL |   declare IP RC US BY INSTNAME PREEMPTIBLE EOL | ||||||
|   declare ST="DOWN" |   declare ST="DOWN" | ||||||
|   IFS=$'\v' read -r IP RC US INSTNAME PREEMPTIBLE EOL <<< "${1}" |   IFS=$'\x1f' read -r IP RC US INSTNAME PREEMPTIBLE EOL <<< "${1}" | ||||||
|   if [ "${RC}" -eq 0 ]; then |   if [ "${RC}" -eq 0 ]; then | ||||||
|     [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${1}\"" 1>&2 |     [[ "${EOL}" = "EOL" ]] || echo "${FUNCNAME[0]}: Unexpected input \"${1}\"" 1>&2 | ||||||
|     if [ -n "${US}" ]; then |     if [ -n "${US}" ]; then | ||||||
| @@ -163,7 +163,7 @@ __colo_node_status_result_normalize() { | |||||||
|       ST="FREE" |       ST="FREE" | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
|   echo -e $"${IP}\v${ST}\v${BY}\v${INSTNAME}\v${PREEMPTIBLE}" |   echo -e $"${IP}\x1f${ST}\x1f${BY}\x1f${INSTNAME}\x1f${PREEMPTIBLE}" | ||||||
| } | } | ||||||
|  |  | ||||||
| colo_node_status() { | colo_node_status() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user