diff --git a/scripts/makeChanges.sh b/scripts/makeChanges.sh index 86d61f916..7502ecb99 100755 --- a/scripts/makeChanges.sh +++ b/scripts/makeChanges.sh @@ -14,14 +14,12 @@ source "${ALLSKY_SCRIPTS}/installUpgradeFunctions.sh" || exit "${EXIT_ERROR_STOP function usage_and_exit() { - { - echo -en "${wERROR}" - echo "Usage: ${ME} [--debug] [--optionsOnly] [--cameraTypeOnly] [--fromInstall] [--addNewSettings]" - echo -en "\tkey label old_value new_value [...]" - echo -e "${wNC}" - echo "There must be a multiple of 4 key/label/old_value/new_value arguments" - echo "unless the --optionsOnly argument is given." - } >&2 + exec >&2 + echo -en "${wERROR}" + echo "Usage: ${ME} [--debug] [--optionsOnly] [--cameraTypeOnly] [--fromInstall] [--addNewSettings]" + echo -en "\tkey label old_value new_value [...]" + echo -e "${wNC}" + echo "There must be a multiple of 4 key/label/old_value/new_value arguments." exit "${1}" } @@ -177,37 +175,62 @@ CAMERA_MODEL_ARG="" NUM_CHANGED=0 +# Read all the arguments into array. +# Some settings, like imageresizewidth and imageresizeheight are usually +# updated at the same time. +# Having an array of all changes allows us to check that a second value +# is being updated while we're looking at the first one. +# For example, if we are working on "imageresizewidth" we can check if "imageresizeheight" +# is also updated, and work on both at the same time. + +declare -A KEYS=() +declare -A LABELS=() +declare -A OLD_VALUES=() +declare -A NEW_VALUES=() + while [[ $# -gt 0 ]] do - KEY="${1}" + KEY="${1,,}" ; KEY="${KEY/#_/}" # convert to lowercase and remove any leading "_" LABEL="${2}" OLD_VALUE="${3}" NEW_VALUE="${4}" - if [[ ${DEBUG} == "true" ]]; then - MSG="${KEY}: Old=[${OLD_VALUE}], New=[${NEW_VALUE}]" - echo -e "${wDEBUG}${ME}: ${MSG}${wNC}" - if [[ ${ON_TTY} == "false" ]]; then # called from WebUI. - echo -e "" - fi - fi - - KEY="${KEY,,}" # convert to lowercase - KEY="${KEY/#_/}" # Remove any leading "_" + shift 4 # Don't skip if it's cameratype since that indicates we need to refresh. if [[ ${KEY} != "cameratype" && ${OLD_VALUE} == "${NEW_VALUE}" ]]; then if [[ ${DEBUG} == "true" ]]; then - echo -e " ${wDEBUG}Skipping - old and new are equal${wNC}" + echo -e " ${wDEBUG}Skipping - old and new are equal${wNC}" fi - shift 4 continue fi + (( NUM_CHANGED++ )) + KEYS[${KEY}]="${KEY}" + LABELS[${KEY}]="${LABEL}" + OLD_VALUES[${KEY}]="${OLD_VALUE}" + NEW_VALUES[${KEY}]="${NEW_VALUE}" +done + +for KEY in ${KEYS[@]} +do + [[ -z ${KEYS[${KEY}]} ]] && continue # setting already processed + + LABEL="${LABELS[${KEY}]}" + OLD_VALUE="${OLD_VALUES[${KEY}]}" + NEW_VALUE="${NEW_VALUES[${KEY}]}" + + if [[ ${DEBUG} == "true" ]]; then + MSG="${KEY}: Old=[${OLD_VALUE}], New=[${NEW_VALUE}]" + echo -e "${wDEBUG}${ME}: ${MSG}${wNC}" + if [[ ${ON_TTY} == "false" ]]; then # called from WebUI. + echo -e "" + fi + fi + # The Allsky configuration file was already updated. - # If we find a bad entry, e.g., a file doesn't exist, all we can do is warn the user. + # If we find a bad entry, e.g., a file doesn't exist, warn the user and reset the value. - ((NUM_CHANGED++)) case "${KEY}" in # When called from the installer we get cameranumber, cameramodel, and cameratype. @@ -225,9 +248,9 @@ do CAMERA_MODEL="${NEW_VALUE}" if [[ ${FROM_INSTALL} == "true" ]]; then +# TODO: Use the KEYS[] array so the settings can be passed in either order. # When called during installation the camera model is # passed in, then the camera type. - shift 4 continue fi @@ -237,7 +260,7 @@ do else CAMERA_TYPE="${NEW_VALUE}" if [[ ! -e "${ALLSKY_BIN}/capture_${CAMERA_TYPE}" ]]; then - MSG="Unknown Camera Type: '${CAMERA_TYPE}'." + MSG="Unknown '${LABEL}': '${CAMERA_TYPE}'." echo -e "${wERROR}${ERROR_PREFIX}ERROR: ${MSG}${wNC}" exit "${EXIT_NO_CAMERA}" fi @@ -337,6 +360,7 @@ do fi echo -e "${wNC}" fi +# TODO: rest settings to prior values? exit "${RET}" # the actual exit code is important fi [[ -n ${R} ]] && echo -e "${R}" @@ -349,6 +373,7 @@ do if [[ -z ${CAMERA_MODEL} ]]; then echo -e "${wERROR}ERROR: '${SETTING_NAME}' not found in ${CC_FILE}.${wNC}" [[ -f ${CC_FILE_OLD} ]] && mv "${CC_FILE_OLD}" "${CC_FILE}" +# TODO: rest settings to prior values? exit 1 fi fi @@ -419,6 +444,7 @@ do echo -n " and '${SETTINGS_FILE}' files" fi echo -e "${wNC}, RET=${RET}: ${R}" +# TODO: rest settings to prior values? exit 1 fi [[ ${DEBUG} == "true" && -n ${R} ]] && echo -e "${wDEBUG}${R}${wNC}" @@ -432,6 +458,7 @@ do fi if [[ -n ${ERR} ]]; then echo -e "${wERROR}${ERROR_PREFIX}${ERR}${wNC}" +# TODO: rest settings to prior values? exit 2 fi @@ -453,13 +480,15 @@ do S_NAME="${NAME%.*}" S_EXT="${NAME##*.}" OLD_SETTINGS_FILE="${ALLSKY_CONFIG}/${S_NAME}_${OLD_TYPE}_${OLD_MODEL// /_}.${S_EXT}" - "${ALLSKY_SCRIPTS}/convertJSON.php" --carryforward | - while read -r SETTING TYPE + "${ALLSKY_SCRIPTS}/convertJSON.php" \ + --carryforward \ + --null \ + --settings-file "${OLD_SETTINGS_FILE}" | + while read -r SETTING TYPE VALUE do # Some carried-forward settings may not be in the old settings file, # so check for "null". - X="$( settings --null ".${SETTING}" "${OLD_SETTINGS_FILE}" )" - [[ ${X} == "null" ]] && continue + [[ ${VALUE} == "null" ]] && continue update_json_file ".${SETTING}" "${X}" "${SETTINGS_FILE}" "${TYPE}" || echo "WARNING: Unable to update ${SETTING} of type ${TYPE}" >&2 @@ -721,6 +750,20 @@ do "${S_minitimelapsewidth}" "${S_minitimelapseheight}" \ "${C_sensorWidth}" "${C_sensorHeight}" 2>&1 )" ; then +# On display the "both must be 0 or not 0" msg once + echo -e "ERROR: ${ERR}" + # Restore to old value + update_json_file ".${KEY}" "${OLD_VALUE}" "${SETTINGS_FILE}" "number" + fi + ;; + + "imageresizeuploadwidth" | "imageresizeuploadheight") + if ! ERR="$( checkWidthHeight "Image RESIZE" \ + "${S_imageresizewidth}" "${S_imageresizeheight}" \ + "${C_sensorWidth}" "${C_sensorHeight}" 2>&1 )" ; then + +# On display the "both must be 0 or not 0" msg once + echo -e "ERROR: ${ERR}" # Restore to old value update_json_file ".${KEY}" "${OLD_VALUE}" "${SETTINGS_FILE}" "number" fi @@ -731,6 +774,8 @@ do "${S_imageresizewidth}" "${S_imageresizeheight}" \ "${C_sensorWidth}" "${C_sensorHeight}" 2>&1 )" ; then +# Only display the "both must be 0 or not 0" msg once + echo -e "ERROR: ${ERR}" # Restore to old value update_json_file ".${KEY}" "${OLD_VALUE}" "${SETTINGS_FILE}" "number" fi @@ -810,11 +855,10 @@ do MSG+="Unknown key '${KEY}'; ignoring. Old=${OLD_VALUE}, New=${NEW_VALUE}" MSG+="${wNC}" echo -e "${MSG}" - ((NUM_CHANGED--)) + (( NUM_CHANGED-- )) ;; esac - shift 4 done [[ ${OK} == "false" ]] && exit 1 @@ -860,19 +904,19 @@ if [[ ${#WEBSITE_CONFIG[@]} -gt 0 ]]; then # Update the local and/or Website remote config file if [[ ${WEBSITES} == "local" || ${WEBSITES} == "both" ]]; then if [[ ${DEBUG} == "true" ]]; then - echo -e "${wDEBUG}Executing updateWebsiteConfig.sh local${wNC}" + echo -e "${wDEBUG}Executing updateJsonFile.sh --local${wNC}" fi # shellcheck disable=SC2086 - "${ALLSKY_SCRIPTS}/updateWebsiteConfig.sh" ${DEBUG_ARG} --local "${WEBSITE_CONFIG[@]}" + "${ALLSKY_SCRIPTS}/updateJsonFile.sh" ${DEBUG_ARG} --local "${WEBSITE_CONFIG[@]}" CHANGED_LOCAL_WEBSITE="true" fi if [[ ${WEBSITES} == "remote" || ${WEBSITES} == "both" ]]; then if [[ ${DEBUG} == "true" ]]; then - echo -e "${wDEBUG}Executing updateWebsiteConfig.sh remote${wNC}" + echo -e "${wDEBUG}Executing updateJsonFile.sh --remote${wNC}" fi # shellcheck disable=SC2086 - "${ALLSKY_SCRIPTS}/updateWebsiteConfig.sh" ${DEBUG_ARG} --remote "${WEBSITE_CONFIG[@]}" + "${ALLSKY_SCRIPTS}/updateJsonFile.sh" ${DEBUG_ARG} --remote "${WEBSITE_CONFIG[@]}" CHANGED_REMOTE_WEBSITE="true" FILE_TO_UPLOAD="${ALLSKY_REMOTE_WEBSITE_CONFIGURATION_FILE}"