diff --git a/bin/envs.net/envs_user_info.sh b/bin/envs.net/envs_user_info.sh index e2ffced..fd80188 100755 --- a/bin/envs.net/envs_user_info.sh +++ b/bin/envs.net/envs_user_info.sh @@ -19,6 +19,47 @@ TMP_JSON='/tmp/users_info.json_tmp' clear_lastline() { sed -i '$ s/,$//' "$TMP_JSON" ; } + +progress_userarray() { + for field in "${!line_to_set[@]}"; do + field_name="${field//,*/}" + field_count="${field//*,/}" + + if [[ ":${field_is_array[*]}:" =~ $field_name ]] && ! [[ ":${field_finished[*]}:" =~ $field_name ]]; then + # begin of user def. array + if [ -z "$field_in_progress" ] && [ "$field_count" -eq 0 ]; then + fin_count='0' + field_in_progress="$field_name" + cat << EOM >> "$TMP_JSON" + "$field_name": [ + "${line_to_set[$field]}", +EOM + elif [ "$field_in_progress" = "$field_name" ] && [ "$field_count" = "$(( $fin_count + 1 ))" ]; then + # continue user def. array + fin_count="$(( $fin_count + 1 ))" + cat << EOM >> "$TMP_JSON" + "${line_to_set[$field]}", +EOM + if [ "$field_count" = "${hc_field_entry[$field_name]}" ]; then + # end of user def. array + # remove trailing ',' on last user entry + clear_lastline + cat << EOM >> "$TMP_JSON" + ], +EOM + unset field_in_progress + field_finished+=( "$field_name" ) + else + progress_userarray + fi + elif ! [ "$field_in_progress" = "$field_name" ] && ! [[ ":${field_queue[*]}:" =~ $field_name ]]; then + field_queue+=( "$field_name" ) + fi + fi + done +} + + cat << EOM > "$TMP_JSON" { "timestamp": "$(date +'%s')", @@ -116,35 +157,39 @@ EOM fi # user custom infos from .envs file (max. 10 entrys) if [ -f "$INFO_FILE" ]; then - count_entry='0' # use to limit entrys - count_field_entry='0' # use to separat array line by line + count_entry='0' - unset field_exists; declare -a field_exists=() # contains field names to limit entrys - unset field_is_array; declare -a field_is_array=() # contains array fields to printf correct json entrys - unset line_to_set; declare -A line_to_set # contains user info lines + unset field_exists ; declare -a field_exists=() # contains field names to limit entrys + unset field_is_array ; declare -a field_is_array=() # contains array fields to printf correct json entrys + unset line_to_set ; declare -A line_to_set # contains user info lines + unset hc_field_entry ; declare -A hc_field_entry # contains highest_count_field_entry # check 'INFO_FILE' and add entrys to 'line_to_set' array while read -r LINE ; do - if [[ -n "$LINE" ]] && ! [[ "$LINE" = '#'* ]] \ + if [ -n "$LINE" ] && ! [[ "$LINE" = '#'* ]] \ && ! [[ "$LINE" = 'desc='* ]] && ! [[ "$LINE" = 'ssh_pubkey='* ]]; then user_field="${LINE//=*/}" user_value="${LINE//*=/}" if ! [[ ":${field_exists[*]}:" =~ $user_field ]]; then # entry will be a single line - count_entry="$(( "$count_entry" + 1 ))"; [ "$count_entry" -le '10' ] || continue + count_field_entry='0' + count_entry="$(( "$count_entry" + 1 ))" ; [ "$count_entry" -lt '10' ] || continue + field_exists+=( "$user_field" ) line_to_set["$user_field","$count_field_entry"]+="$user_value" else - # entry will be a array + # entry will be a array (max. 32 entrys) if ! [[ ":${field_is_array[*]}:" =~ $user_field ]]; then field_is_array+=( "$user_field" ) fi - count_field_entry="$(( "$count_field_entry" +1 ))" + count_field_entry="$(( "$count_field_entry" +1 ))" ; [ "$count_field_entry" -lt '32' ] || continue + + hc_field_entry[$user_field]="$count_field_entry" line_to_set["$user_field","$count_field_entry"]+="$user_value" fi fi - done <<< "$(tac "$INFO_FILE")" # read file from buttom + done < "$INFO_FILE" # add users custom entrys from line_to_set (single lines before arrays) # @@ -158,40 +203,21 @@ EOM EOM fi done + # # array line entrys field_in_progress='' + unset field_queue ; declare -a field_queue=() + unset field_finished ; declare -a field_finished=() - for field in "${!line_to_set[@]}"; do - field_name="${field//,*/}" - field_count="${field//*,/}" + progress_userarray - if [[ ":${field_is_array[*]}:" =~ $field_name ]]; then - # begin of user def. array - if ! [ "$field_in_progress" = "$field_name" ]; then - field_in_progress="$field_name" - - cat << EOM >> "$TMP_JSON" - "$field_name": [ - "${line_to_set[$field]}", -EOM - else - # continue user def. array - cat << EOM >> "$TMP_JSON" - "${line_to_set[$field]}", -EOM - if [ "$field_count" -eq '0' ]; then - # end of user def. array - # remove trailing ',' on last user entry - unset field_in_progress - clear_lastline - cat << EOM >> "$TMP_JSON" - ], -EOM - fi - fi - fi - done + if [ -n "${line_to_set[*]}" ]; then + # shellcheck disable=SC2034 + for x in "${!field_queue[@]}"; do + progress_userarray + done + fi # ssh # only print ssh-pubkey if user has enabled @@ -213,7 +239,6 @@ EOM # remove trailing ',' (no ssh-pubkey print out) clear_lastline fi -## if line 118 else # no "$INFO_FILE" file # remove trailing ',' for the last user entry