redpill-tool-chain/docker/helper.sh
2022-04-12 12:20:16 +08:00

138 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -u
if [ ${TARGET_REVISION} -lt 42661 ];then
exit 0
fi
cat ./redpill-load/build-loader.sh | head -n `expr -1 + $(sed -n '/Printing config variables/=' ./redpill-load/build-loader.sh)` > ./redpill-load/_helper.sh
. ./redpill-load/_helper.sh "${TARGET_NAME}" "${TARGET_VERSION}-${TARGET_REVISION}"
rm ./_helper.sh
# Repacks tar-like file
#
# Args: $1 directory to unpack (must exist) | $2 file path | $3 should hard fail on error? [default=1]
brp_repack_tar()
{
pr_process "Repacking %s file form %s" "${2}" "${1}"
local output;
output=$("${TAR_PATH}" -czf "${2}" -C "${1}" . 2>&1)
if [ $? -ne 0 ]; then
pr_process_err
if [[ "${3:-1}" -ne 1 ]]; then
pr_err "Failed to unpack tar\n\n%s" "${output}"
return 1
else
pr_crit "Failed to unpack tar\n\n%s" "${output}"
fi
fi
pr_process_ok
}
readonly extract_bin='/usr/local/bin/syno_extract_system_patch'
make_extract(){
archive="$1"
if [ ! -f "${extract_bin}" ]; then
pr_dbg "%s not found - preparing" "${extract_bin}"
if [ ! -f "${EXTRACT_PAT_FILE}" ]; then
rpt_download_remote "${EXTRACT_PAT_URL}" "${EXTRACT_PAT_FILE}"
else
pr_dbg "Found existing PAT at %s - skipping download" "${EXTRACT_PAT_FILE}"
fi
pr_dbg "Found syno_extract_system_patch File not found - preparing" "${extract_bin}"
brp_mkdir /tmp/synoesp && brp_unpack_tar "${EXTRACT_PAT_FILE}" "/tmp/synoesp"
brp_mkdir /tmp/extract && brp_unpack_zrd "/tmp/synoesp/rd.gz" "/tmp/extract"
cp /tmp/extract/usr/lib/{libcurl.so.4,libmbedcrypto.so.5,libmbedtls.so.13,libmbedx509.so.1,libmsgpackc.so.2,libsodium.so,libsynocodesign-ng-virtual-junior-wins.so.7} /usr/local/lib
cp /tmp/extract/usr/syno/bin/scemd ${extract_bin}
rm -rf /tmp/synoesp /tmp/extract
else
pr_dbg "Found syno_extract_system_patch File at %s - skipping nake" "${extract_bin}"
fi
pr_process "Use syno_extract_system_patch extract PAT"
LD_LIBRARY_PATH=/usr/local/lib ${extract_bin} "${BRP_PAT_FILE}" /tmp/pat && pr_process_ok || pr_process_err
brp_repack_tar "/tmp/pat/" /tmp/repack.tar.gz
pr_process "New checksum of PAT %s - Patch the PAT checksum" ${BRP_PAT_FILE}
mv ${BRP_PAT_FILE} ${BRP_PAT_FILE}.org && mv /tmp/repack.tar.gz ${BRP_PAT_FILE} && rm -rf "/tmp/pat"
sum=`sha256sum ${BRP_PAT_FILE} | awk '{print $1}'`
old_sum="$(brp_json_get_field "${BRP_REL_CONFIG_JSON}" "os.sha256")"
sed -i "s/${old_sum}/${sum}/" "${BRP_REL_CONFIG_JSON}"
rm -rf /tmp/pat
pr_process_ok
}
check_pat() {
archive="$1"
archiveheader="$(od -bc ${archive} | head -1 | awk '{print $3}')"
return_value=0
case ${archiveheader} in
105)
pr_dbg "${archive}, is a Tar file"
;;
255)
pr_info "File ${archive}, Decryption required"
return_value=1
;;
213)
pr_dbg "File ${archive}, is a compressed tar"
;;
*)
pr_process_err
pr_err "Could not determine if file ${archive} is encrypted or not, maybe corrupted"
ls -ltr ${archive}
pr_crit "${archiveheader}"
return_value=99
;;
esac
return $return_value
}
##########################################################
# fix redo
readonly BRP_PAT_FILE="${BRP_CACHE_DIR}/${BRP_REL_OS_ID}.pat"
readonly EXTRACT_PAT_FILE="${BRP_CACHE_DIR}/extract.tar.gz"
readonly EXTRACT_PAT_URL='https://global.download.synology.com/download/DSM/release/7.0.1/42218/DSM_DS3615xs_42218.pat'
if [ -f "${BRP_PAT_FILE}.org" ] && [ -f "${BRP_PAT_FILE}" ]; then
pr_info "Found patched PAT file - Patch the PAT checksum"
file_sum="$(brp_json_get_field "${BRP_REL_CONFIG_JSON}" "os.sha256")"
new_sum=`sha256sum "${BRP_PAT_FILE}" | awk '{print $1}'`
org_sum=`sha256sum "${BRP_PAT_FILE}.org" | awk '{print $1}'`
if [ "$new_sum" != "$file_sum" ] && [ "$org_sum" == "$file_sum" ]; then
sed -i "s/${org_sum}/${new_sum}/" "${BRP_REL_CONFIG_JSON}"
fi
fi
if [ ! -d "${BRP_UPAT_DIR}" ]; then
pr_dbg "Unpacked PAT %s not found - preparing" "${BRP_UPAT_DIR}"
brp_mkdir "${BRP_UPAT_DIR}"
if [ ! -f "${BRP_PAT_FILE}" ]; then
rpt_download_remote "$(brp_json_get_field "${BRP_REL_CONFIG_JSON}" "os.pat_url")" "${BRP_PAT_FILE}"
else
pr_dbg "Found existing PAT at %s - skipping download" "${BRP_PAT_FILE}"
fi
brp_verify_file_sha256 "${BRP_PAT_FILE}" "$(brp_json_get_field "${BRP_REL_CONFIG_JSON}" "os.sha256")"
check_pat "${BRP_PAT_FILE}"
exec_status=$?
pr_info "Test encryption pat results %s" "${exec_status}"
if [ "$exec_status" -eq 1 ]; then
pr_empty_nl
make_extract "${BRP_PAT_FILE}"
fi
else
pr_info "Found unpacked PAT at \"%s\" - skipping unpacking" "${BRP_UPAT_DIR}"
fi