394 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# if [ ${git_helpers_sourced:-1} = "1" ]; then
 | 
						|
#    readonly git_helpers_sourced=${BASH_SOURCE[0]}
 | 
						|
#else
 | 
						|
#    return 0
 | 
						|
#fi
 | 
						|
 | 
						|
source ./general_utils
 | 
						|
 | 
						|
exec_opkg_command () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    log_debug "$func:${LINENO} exec-ing [$*]"
 | 
						|
 | 
						|
    local __result=$(exec_process_substitution $*)
 | 
						|
    local __result_code=$?
 | 
						|
 | 
						|
    log_debug "$func:${LINENO} result=$__result"
 | 
						|
 | 
						|
    printf '%s' "$__result"
 | 
						|
    return $__result_code
 | 
						|
}
 | 
						|
 | 
						|
# Fetch/merge updates from predefined repository using git.
 | 
						|
# 
 | 
						|
fetch_customer_updates() {
 | 
						|
    if ! pull_customer_repository $1; then
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
copy () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    local copy_necessary=0
 | 
						|
 | 
						|
    readarray -td' ' files <<< "$1"
 | 
						|
    for f in ${files[@]}; do
 | 
						|
        log_debug "$func:${LINENO}: $f"
 | 
						|
        # $f is determined by git
 | 
						|
        if [[ "$f" =~ .*update[.]conf.* ]]; then
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
    
 | 
						|
        copy_necessary=1
 | 
						|
 | 
						|
        PERCENT=$((PERCENT+1))
 | 
						|
        test $PERCENT -gt 100 && PERCENT=100
 | 
						|
 | 
						|
        local __f=${f##*/}
 | 
						|
        local __m=""
 | 
						|
        local __copy_error=0
 | 
						|
 | 
						|
        if grep -qE "^.*$DC\s*$" <<< ${f}; then
 | 
						|
            __m="cp ${CUSTOMER_ID_BASE_DIR}/${f} to ${DC_SYS_DIR}/${__f}"
 | 
						|
            cp "${CUSTOMER_ID_BASE_DIR}/${f}" "${DC_SYS_DIR}/${__f}"
 | 
						|
            __copy_error=$?
 | 
						|
        elif grep -qE "^.*[.]json\s*$" <<< ${f}; then
 | 
						|
            __m="cp ${CUSTOMER_ID_BASE_DIR}/${f} to ${CONF_SYS_DIR}/${__f}"
 | 
						|
            cp "${CUSTOMER_ID_BASE_DIR}/${f}" "${CONF_SYS_DIR}/${__f}"
 | 
						|
            __copy_error=$?
 | 
						|
        elif grep -qE "^.*[.]ini\s*$" <<< ${f}; then
 | 
						|
            if [ "$__f" = "$ATBQT_INI" ]; then
 | 
						|
                __m="cp ${CUSTOMER_ID_BASE_DIR}/${f} $ATBAPP_SYS_DIR/${__f}"
 | 
						|
                cp "${CUSTOMER_ID_BASE_DIR}/${f}" $ATBAPP_SYS_DIR/${__f}
 | 
						|
                __copy_error=$?
 | 
						|
            elif [ "$__f" = "$SYSTEM_CONTROL_INI" ]; then
 | 
						|
                __m="cp ${CUSTOMER_ID_BASE_DIR}/${f} $SYSCONFIG_SYS_DIR/${__f}"
 | 
						|
                cp "${CUSTOMER_ID_BASE_DIR}/${f}" $SYSCONFIG_SYS_DIR/${__f}
 | 
						|
                __copy_error=$?
 | 
						|
            elif [ "$__f" = "$SYS_CONFIG_INI" ]; then
 | 
						|
                __m="cp ${CUSTOMER_ID_BASE_DIR}/${f} $SYSCONFIG_SYS_DIR/${__f}"
 | 
						|
                cp "${CUSTOMER_ID_BASE_DIR}/${f}" $SYSCONFIG_SYS_DIR/${__f}
 | 
						|
                __copy_error=$?
 | 
						|
            elif [ "$__f" = "$ISMASMGR_INI" ]; then
 | 
						|
                if grep -qE "$ISMASMGR_SYS_DIR" <<< "${f%/*}"; then
 | 
						|
                    __m="cp ${CUSTOMER_ID_BASE_DIR}/${f}"
 | 
						|
                    __m="$__m $ISMASMGR_SYS_DIR/${__f}"
 | 
						|
                    cp "${CUSTOMER_ID_BASE_DIR}/${f}" $ISMASMGR_SYS_DIR/${__f}
 | 
						|
                    __copy_error=$?
 | 
						|
                else
 | 
						|
                    __m="cp ${CUSTOMER_ID_BASE_DIR}/${f}"
 | 
						|
                    __m="$__m $SYSCONFIG_SYS_DIR/${__f}"
 | 
						|
                    cp "${CUSTOMER_ID_BASE_DIR}/${f}" $SYSCONFIG_SYS_DIR/${__f}
 | 
						|
                    __copy_error=$?
 | 
						|
                fi
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
 | 
						|
        if [ $__copy_error -ne 0 ]; then
 | 
						|
            log_error "$func:${LINENO}: $__m failed"
 | 
						|
            update_psa_copy_conf_and_ini_files \
 | 
						|
                $UPDATE_ISMAS_ERROR $RC_COPY_ERROR "$__m failed"
 | 
						|
            return $?
 | 
						|
        else
 | 
						|
            log_info "$func:${LINENO}: $__m ok"
 | 
						|
            update_psa_copy_conf_and_ini_files $UPDATE_ISMAS_PROGRESS \
 | 
						|
                $RC_SUCCESS "$__m ok"
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    
 | 
						|
    if [ $copy_necessary -eq 0 ]; then
 | 
						|
        update_psa_copy_conf_and_ini_files $UPDATE_ISMAS_PROGRESS $RC_SUCCESS \
 | 
						|
            "no copy of json/ini-files necessary"
 | 
						|
        log_debug "$func:${LINENO}: no copy of conf/ini-files necessary"
 | 
						|
    else
 | 
						|
        log_debug "$func:${LINENO}: copied *conf/*ini-files to system-dirs"
 | 
						|
    fi
 | 
						|
    return 0
 | 
						|
}
 | 
						|
    
 | 
						|
filter_changed_files () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    log_debug "$func:${LINENO} $1"
 | 
						|
    readarray -td' ' files <<< "$1"
 | 
						|
    local __system_files=""
 | 
						|
    for f in ${files[@]}; do
 | 
						|
        log_debug "$func:${LINENO} $f"
 | 
						|
        if grep -qE "^.*[.]($2)\s*$" <<< $f; then
 | 
						|
            if [ -z $__system_files ]; then
 | 
						|
                __system_files="${f}"
 | 
						|
            else
 | 
						|
                __system_files="$__system_files ${f}"
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
    done
 | 
						|
 | 
						|
    log_debug "$func:${LINENO} system-files=$__system_files"
 | 
						|
    printf '%s' "$__system_files"
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
md5_of () {
 | 
						|
    printf '%s' "$(md5sum "$1" | cut -d' ' -f1)"
 | 
						|
}
 | 
						|
 | 
						|
# Check if the fetched/merged files have the correct md5 and are
 | 
						|
# valid for the PSA.
 | 
						|
#
 | 
						|
check_md5_for_changed_json_and_ini_files () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    local js_key="" # used by json-parser 'jq'
 | 
						|
    local md5sum_update_conf=""
 | 
						|
    local md5sum_repository=""
 | 
						|
    local readonly cut_md5="cut -d' ' -f1"
 | 
						|
    log_debug "$func:${LINENO} files=$1"
 | 
						|
    if ! [ -z $1 ]; then
 | 
						|
        readarray -td' ' files <<< "$1"
 | 
						|
        local readonly __cl=$CUSTOMER_LOCATION
 | 
						|
        for file in ${files[@]}; do
 | 
						|
            log_debug "$func:${LINENO} checking file=${file}..."
 | 
						|
            local __fsuffix=${file##*.}
 | 
						|
            local __bn=$(basename $file .$__fsuffix)
 | 
						|
            if [[ "$file" =~ .*dc2c.hex.* ]]; then
 | 
						|
                js_key=".dc.dc2c.$__bn"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $CUSTOMER_ID_BASE_DIR/$file)"
 | 
						|
            elif [[ "$file" =~ .*cash[.]json.* ]]; then
 | 
						|
                js_key=".conf.$__cl.zg[1].z[1].etc.psa_config.$__bn"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $CUSTOMER_ID_BASE_DIR/$file)"
 | 
						|
            elif [[ "$file" =~ .*print[0-9][0-9][.]json.* ]]; then
 | 
						|
                js_key=".conf.$__cl.zg[1].z[1].etc.psa_config.$__bn"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $CUSTOMER_ID_BASE_DIR/$file)"
 | 
						|
            elif [[ "$file" =~ .*conf[.]json.* ]]; then
 | 
						|
                js_key=".conf.$__cl.zg[1].z[1].etc.psa_config.DC2C_conf"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $CUSTOMER_ID_BASE_DIR/$file)"
 | 
						|
            elif [[ "$file" =~ .*serial[.]json.* ]]; then
 | 
						|
                js_key=".conf.$__cl.zg[1].z[1].etc.psa_config.DC2C_serial"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $CUSTOMER_ID_BASE_DIR/$file)"
 | 
						|
            elif [[ "$file" =~ .*ATBQT[.]ini.* ]]; then
 | 
						|
                js_key=".ini.$__cl.zg[1].z[1].opt.app.ATBAPP.ATBQT"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository="$(md5_of $ATBQT_INI_FULL)"
 | 
						|
            elif [[ "$file" =~ .*sysconfig[.]ini.* ]]; then
 | 
						|
                js_key=".ini.$__cl.zg[1].z[1].opt.app.sysconfig.sysconfig"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository=$(md5_of $SYSCONFIG_SYSCONFIG_INI_FULL)
 | 
						|
            elif [[ "$file" =~ .*SystemControl[.]ini.* ]]; then
 | 
						|
                js_key=".ini.$__cl.zg[1].z[1].opt.app.sysconfig.SystemControl"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository=$(md5_of $SYSCONFIG_SYSCTRL_INI_FULL)
 | 
						|
            elif [[ "$file" =~ .*ISMASMgr/ISMASMgr[.]ini.* ]]; then
 | 
						|
                js_key=".ini.$__cl.zg[1].z[1].opt.app.ISMASMgr.ISMASMgr"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository=$(md5_of $ISMASMGR_ISMASMGR_INI_FULL)
 | 
						|
            elif [[ "$file" =~ .*sysconfig/ISMASMgr[.]ini.* ]]; then
 | 
						|
                js_key=".ini.$__cl.zg[1].z[1].opt.app.sysconfig.ISMASMgr"
 | 
						|
                md5sum_update_conf=$(cat $UPDATE_CONF | jq -r $js_key)
 | 
						|
                md5sum_repository=$(md5_of $SYSCONFIG_ISMASMGR_INI_FULL)
 | 
						|
            else
 | 
						|
                continue
 | 
						|
            fi
 | 
						|
                
 | 
						|
            PERCENT=$((PERCENT+1))
 | 
						|
            test $PERCENT -gt 100 && PERCENT=100
 | 
						|
 | 
						|
            if [ "$md5sum_repository" = "$md5sum_update_conf" ]; then
 | 
						|
                log_info "$func:${LINENO}: md5sum for $file ok"
 | 
						|
                update_psa_check_hash $UPDATE_ISMAS_PROGRESS $RC_SUCCESS \
 | 
						|
                    "md5sum -|$md5sum_repository|- for $file ok"
 | 
						|
            else
 | 
						|
                local __r="repository: $md5sum_repository"
 | 
						|
                local __u="update.conf=$md5sum_update_conf"
 | 
						|
                local __m="$__r != $__u"
 | 
						|
                log_error "$func:${LINENO}: md5sum for $file wrong: $__m"
 | 
						|
                update_psa_check_hash $UPDATE_ISMAS_ERROR $RC_HASH_VALUE_ERROR \
 | 
						|
                    "md5sum -|$md5sum_repository|- for $file wrong"
 | 
						|
                return $?
 | 
						|
            fi
 | 
						|
        done
 | 
						|
    else
 | 
						|
        log_debug "$func:${LINENO} no changed conf-/ini-files"
 | 
						|
    fi
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
check_hardware_compatibility () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    # RC_HW_COMPATIBILITY_ERROR=6
 | 
						|
    update_psa_check_hardware_compatibility $UPDATE_ISMAS_PROGRESS \
 | 
						|
        $RC_SUCCESS "TODO: hardware compatibility"
 | 
						|
    return $?
 | 
						|
}
 | 
						|
 | 
						|
check_md5_for_opkg_packages () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    local -n opkg_output_ref=$1
 | 
						|
    local package=""
 | 
						|
    local md5sum_opkg_info=""
 | 
						|
    local filename=""
 | 
						|
    for line in ${opkg_output_ref[@]}; do
 | 
						|
        log_info "$func:${LINENO}: line=$line"
 | 
						|
        if grep -qE "^\s*Package\s*:.*?$" <<< "$line"; then
 | 
						|
            package=${line#*:* }
 | 
						|
        elif grep -qE "^\s*MD5Sum\s*:.*?$" <<< "$line"; then
 | 
						|
            md5sum_opkg_info=${line#*:* }
 | 
						|
        elif grep -qE "^\s*Filename\s*:.*?$" <<< "$line"; then
 | 
						|
            filename=${line#*:* }
 | 
						|
        fi
 | 
						|
    done
 | 
						|
 | 
						|
    local __update_conf="${CUSTOMER_LOCATION_DIR}/update.conf"
 | 
						|
    md5sum_repo=$(cat $__update_conf | jq -r .opkg.${package}.MD5Sum)
 | 
						|
    if ! [ -z $md5sum_repo ]; then
 | 
						|
        if [ "$md5sum_opkg_info" = "$md5sum_repo" ]; then
 | 
						|
            log_info "$func:${LINENO}: md5 $md5sum_repo OK for $package"
 | 
						|
            return 0
 | 
						|
        else
 | 
						|
            log_error "$func:${LINENO}: md5sum_repo [$md5sum_repo] "\
 | 
						|
                "!= md5sum_opkg_info [$md5sum_opkg_info] for $package"
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        log_error "$func:${LINENO}: md5sum_repo empty"
 | 
						|
    fi
 | 
						|
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
# In case the new checked-out files are not correct, revert the git
 | 
						|
# repository to its previous state.
 | 
						|
#
 | 
						|
revert_customer_repository () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    # TODO
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
# Backup before the update-process. 
 | 
						|
#
 | 
						|
backup_previous_version () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    # TODO
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
exec_opkg_info () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    log_info "$func:${LINENO}: executing info $1"
 | 
						|
    
 | 
						|
    opkg_result=$(exec_opkg_command "opkg info $1")
 | 
						|
    if [ $? -eq 0 ]; then
 | 
						|
        # make sure the keywords start with '\n'
 | 
						|
        opkg_result=$(sed -E -e "s/(^.*)(Package)(.*$)/\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Version)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Depends)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Status)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Architecture)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Maintainer)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(MD5Sum)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Filename)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Source)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Description)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Installed-Size)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Section)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*[^-])(Size)(.*$)/\1\n\2\3/g"\
 | 
						|
                -e "s/(^.*)(Installed-Time)(.*$)/\1\n\2\3/g"
 | 
						|
                    <<< "$opkg_result")
 | 
						|
 | 
						|
        local -n output_ref=$2
 | 
						|
 | 
						|
        readarray -d $'\n' output_ref < <(printf '%s' "$opkg_result")
 | 
						|
        if [ $? -ne 0 ]; then
 | 
						|
            log_error "$func:${LINENO}: readarray finished with error"
 | 
						|
            return 1
 | 
						|
        fi
 | 
						|
    
 | 
						|
        log_info "$func:${LINENO}: ... done"
 | 
						|
        # log_info "$func:${LINENO}: opkg_result=${output_ref[@]}"
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
 | 
						|
    log_error "$func:${LINENO}: executing info $1"
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
# Try to install new opkg-packages (in case the are some
 | 
						|
# in the new git-checkout).
 | 
						|
#
 | 
						|
exec_opkg_noaction() {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    local opkg_command_no_action="opkg --noaction $1"
 | 
						|
    log_debug "$func:${LINENO}: executing $opkg_command_no_action"
 | 
						|
    
 | 
						|
    local __opkg_result=$(exec_opkg_command "opkg --noaction $1")
 | 
						|
    if [ $? -eq 0 ]; then
 | 
						|
        log_info "$func:${LINENO}: opkg_result=$__opkg_result"
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
 | 
						|
    log_error "$func:${LINENO}: error executing opkg --noaction $1"
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
# Install the new packages using opkg. 
 | 
						|
#
 | 
						|
exec_opkg () {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    log_debug "$func:${LINENO}: executing $1"
 | 
						|
    
 | 
						|
    local __opkg_result=$(exec_opkg_command "opkg $1")
 | 
						|
    if [ $? -eq 0 ]; then
 | 
						|
        log_info "$func:${LINENO}: opkg_result=$__opkg_result"
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
 | 
						|
    log_error "$func:${LINENO}: error executing $1"
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
# In case there was some error, re-install the previous package(s)
 | 
						|
# and use the backup to restore any conf/ini-files.
 | 
						|
#
 | 
						|
fallback_to_previous_version() {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    # TODO
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
# If all went well, then execute all necessary cleanup steps.
 | 
						|
#
 | 
						|
cleanup_previous_version() {
 | 
						|
    local func="${FUNCNAME[0]}"
 | 
						|
    # TODO
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
check_for_apism () {
 | 
						|
    nc localhost 7778
 | 
						|
}
 | 
						|
 | 
						|
get_plugins () {
 | 
						|
    local __plugins=""
 | 
						|
    for __f in /opt/app/ATBAPP/plugins/*; do
 | 
						|
        local plugin=$__f
 | 
						|
        plugins+="
 | 
						|
            \"${plugin##*/}\": {
 | 
						|
        "
 | 
						|
        plugins+=$(strings $__f             |
 | 
						|
                   grep -A4 \"Interface\":  |
 | 
						|
                   grep \"Version\"         |
 | 
						|
                   sed -E -e 's/^\s*/\n/g')
 | 
						|
        # remove trailing ',' which is already contained in returned value
 | 
						|
        plugins=${plugins/%,}
 | 
						|
        plugins+="
 | 
						|
        },"
 | 
						|
    done
 | 
						|
    printf '%s' ${plugins/%,}
 | 
						|
}
 | 
						|
# get_plugins
 |