add "Parse pat"

This commit is contained in:
Ing 2024-01-03 21:53:35 +08:00
parent 9dcdc30000
commit c85f1b1896
5 changed files with 3464 additions and 3147 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -213,8 +213,8 @@ function modelMenu() {
writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
# Remove old files
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/"*
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" >/dev/null 2>&1
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/"* >/dev/null 2>&1
touch ${PART1_PATH}/.build
fi
}
@ -321,11 +321,150 @@ function productversMenu() {
writeConfigKey "modules.\"${ID}\"" "" "${USER_CONFIG_FILE}"
done < <(getAllModules "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")
# Remove old files
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/"*
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" >/dev/null 2>&1
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/"* >/dev/null 2>&1
touch ${PART1_PATH}/.build
}
###############################################################################
# Parse Pat
function ParsePat() {
MKERR_FILE="${TMP_PATH}/makeerror.log"
rm -f "${MKERR_FILE}"
if [ -n "${MODEL}" -a -n "${PRODUCTVER}" ]; then
MSG="$(printf "$(TEXT "You have selected the %s and %s.\n'Parse Pat' will overwrite the previous selection.\nDo you want to continue?")" "${MODEL}" "${PRODUCTVER}")"
DIALOG --title "$(TEXT "Parse Pat")" \
--yesno "${MSG}" 0 0
[ $? -ne 0 ] && return
fi
PAT_PATH=""
ITEMS="$(ls ${USER_UP_PATH}/*.pat 2>/dev/null)"
if [ -z "${ITEMS}" ]; then
MSG=""
MSG+="$(TEXT "No pat file found in users folder!\n")"
MSG+="$(TEXT "Please upload the pat file to /mnt/p3/users/ folder via DUFS and re-enter this option.\n")"
DIALOG --title "$(TEXT "Update")" \
--msgbox "${MSG}" 0 0
return
fi
DIALOG --title "$(TEXT "Product Version")" \
--no-items --menu "$(TEXT "Choose a pat file")" 0 0 0 ${ITEMS} \
2>${TMP_PATH}/resp
[ $? -ne 0 ] && return
PAT_PATH=$(<${TMP_PATH}/resp)
if [ ! -f "${PAT_PATH}" ]; then
DIALOG --title "$(TEXT "Update")" \
--msgbox "$(TEXT "pat Invalid, try again!")" 0 0
return
fi
while true; do
echo "$(printf "$(TEXT "Parse %s ...")" "$(basename "${PAT_PATH}")")"
extractPatFiles "${PAT_PATH}" "${UNTAR_PAT_PATH}"
if [ $? -ne 0 ]; then
rm -rf "${UNTAR_PAT_PATH}"
return 1
fi
if [ ! -f "${UNTAR_PAT_PATH}/GRUB_VER" -o ! -f "${UNTAR_PAT_PATH}/VERSION" ]; then
echo -e "$(TEXT "pat Invalid, try again!")" >"${MKERR_FILE}"
break
fi
. ${UNTAR_PAT_PATH}/GRUB_VER
. ${UNTAR_PAT_PATH}/VERSION
if [ -n "${MODEL}" ]; then
if [ -f "${WORK_PATH}/model-configs/${MODEL}.yml" ]; then
MODEL=${MODEL}
else
echo "$(printf "$(TEXT "Currently, %s is not supported.")" "${MODEL}")" >"${MKERR_FILE}"
break
fi
fi
if [ -n "${majorversion}" -a -n "${minorversion}" -a -n "$(readModelKey "${MODEL}" "productvers.[${majorversion}.${minorversion}]")" ]; then
PRODUCTVER=${majorversion}.${minorversion}
BUILDNUM=${buildnumber}
SMALLNUM=${smallfixnumber}
else
echo "$(printf "$(TEXT "Currently, %s of %s is not supported.")" "${majorversion}.${minorversion}" "${MODEL}")" >"${MKERR_FILE}"
break
fi
echo "$(TEXT "Reconfiguring Synoinfo, Addons and Modules")"
writeConfigKey "model" "${MODEL}" "${USER_CONFIG_FILE}"
SN=$(generateSerial "${MODEL}")
writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
NETIF_NUM=2
MACS=($(generateMacAddress "${MODEL}" ${NETIF_NUM}))
for I in $(seq 1 ${NETIF_NUM}); do
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}"
done
writeConfigKey "productver" "${PRODUCTVER}" "${USER_CONFIG_FILE}"
writeConfigKey "buildnum" "${BUILDNUM}" "${USER_CONFIG_FILE}"
writeConfigKey "smallnum" "${SMALLNUM}" "${USER_CONFIG_FILE}"
mkdir -p "${PART3_PATH}/dl"
# Check disk space left
SPACELEFT=$(df --block-size=1 | grep ${LOADER_DISK_PART3} | awk '{print $4}')
# Discover remote file size
FILESIZE=$(du -sb "${PAT_PATH}" | awk '{print$1}')
if [ 0${FILESIZE} -ge 0${SPACELEFT} ]; then
# No disk space to copy, mv it to dl
mv -f "${PAT_PATH}" "${PART3_PATH}/dl/${MODEL}-${PRODUCTVER}.pat"
else
cp -f "${PAT_PATH}" "${PART3_PATH}/dl/${MODEL}-${PRODUCTVER}.pat"
fi
MD5SUM="$(md5sum "${PART3_PATH}/dl/${MODEL}-${PRODUCTVER}.pat" | awk '{print $1}')"
writeConfigKey "paturl" "" "${USER_CONFIG_FILE}"
writeConfigKey "patsum" "${MD5SUM}" "${USER_CONFIG_FILE}"
# Delete synoinfo and reload model/build synoinfo
writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
while IFS=': ' read KEY VALUE; do
writeConfigKey "synoinfo.\"${KEY}\"" "${VALUE}" "${USER_CONFIG_FILE}"
done < <(readModelMap "${MODEL}" "productvers.[${PRODUCTVER}].synoinfo")
# Check addons
PLATFORM="$(readModelKey "${MODEL}" "platform")"
KVER="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")"
KPRE="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kpre")"
while IFS=': ' read ADDON PARAM; do
[ -z "${ADDON}" ] && continue
if ! checkAddonExist "${ADDON}" "${PLATFORM}" "${KVER}"; then
deleteConfigKey "addons.\"${ADDON}\"" "${USER_CONFIG_FILE}"
fi
done < <(readConfigMap "addons" "${USER_CONFIG_FILE}")
# Rebuild modules
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
while read ID DESC; do
writeConfigKey "modules.\"${ID}\"" "" "${USER_CONFIG_FILE}"
done < <(getAllModules "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")
# Remove old files
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" >/dev/null 2>&1
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/"* >/dev/null 2>&1
touch ${PART1_PATH}/.build
break
done 2>&1 | DIALOG --title "$(TEXT "Main menu")" --cr-wrap --no-collapse \
--progressbox "$(TEXT "Making ...")" 20 100
if [ -f "${MKERR_FILE}" ]; then
DIALOG --title "$(TEXT "Error")" \
--msgbox "$(cat ${MKERR_FILE})" 0 0
return 1
else
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")"
SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")"
SN="$(readConfigKey "sn" "${USER_CONFIG_FILE}")"
MAC1="$(readConfigKey "mac1" "${USER_CONFIG_FILE}")"
MAC2="$(readConfigKey "mac2" "${USER_CONFIG_FILE}")"
return 0
fi
}
###############################################################################
# Manage addons
function addonMenu() {
@ -814,10 +953,123 @@ function synoinfoMenu() {
done
}
###############################################################################
# Extract linux and ramdisk files from the DSM .pat
function getSynoExtractor() {
MKERR_FILE="${TMP_PATH}/makeerror.log"
mirrors=("global.synologydownload.com" "global.download.synology.com" "cndl.synology.cn")
fastest=$(_get_fastest ${mirrors[@]})
OLDPAT_URL="https://${fastest}/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat"
OLDPAT_PATH="${TMP_PATH}/DS3622xs+-42218.pat"
EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch"
# Extractor not exists, get it.
mkdir -p "${EXTRACTOR_PATH}"
echo "$(TEXT "Downloading old pat to extract synology .pat extractor...")"
STATUS=$(curl -k -w "%{http_code}" -L "${OLDPAT_URL}" -o "${OLDPAT_PATH}")
RET=$?
if [ ${RET} -ne 0 -o ${STATUS} -ne 200 ]; then
rm -f "${OLDPAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d:%d")" "${RET}" "${STATUS}")"
echo -e "${MSG}" >"${MKERR_FILE}"
return 1
fi
# Extract DSM ramdisk file from PAT
rm -rf "${RAMDISK_PATH}"
mkdir -p "${RAMDISK_PATH}"
tar -xf "${OLDPAT_PATH}" -C "${RAMDISK_PATH}" rd.gz >"${MKERR_FILE}" 2>&1
if [ $? -ne 0 ]; then
rm -f "${OLDPAT_PATH}"
rm -rf "${RAMDISK_PATH}"
return 1
fi
rm -f "${OLDPAT_PATH}"
# Extract all files from rd.gz
(
cd "${RAMDISK_PATH}"
xz -dc <rd.gz | cpio -idm
) >/dev/null 2>&1 || true
# Copy only necessary files
for f in libcurl.so.4 libmbedcrypto.so.5 libmbedtls.so.13 libmbedx509.so.1 libmsgpackc.so.2 libsodium.so libsynocodesign-ng-virtual-junior-wins.so.7; do
cp -f "${RAMDISK_PATH}/usr/lib/${f}" "${EXTRACTOR_PATH}"
done
cp -f "${RAMDISK_PATH}/usr/syno/bin/scemd" "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}"
rm -rf "${RAMDISK_PATH}"
return 0
}
###############################################################################
# Extract linux and ramdisk files from the DSM .pat
function extractPatFiles() {
MKERR_FILE="${TMP_PATH}/makeerror.log"
PAT_PATH="${1}"
EXT_PATH="${2}"
header="$(od -bcN2 "${PAT_PATH}" | head -1 | awk '{print $3}')"
case ${header} in
105)
echo "$(TEXT "Uncompressed tar")"
isencrypted="no"
;;
213)
echo "$(TEXT "Compressed tar")"
isencrypted="no"
;;
255)
echo "$(TEXT "Encrypted")"
isencrypted="yes"
;;
*)
echo -e "$(TEXT "Could not determine if pat file is encrypted or not, maybe corrupted, try again!")" >"${MKERR_FILE}"
return 1
;;
esac
rm -rf "${EXT_PATH}"
mkdir -p "${EXT_PATH}"
echo -n "$(printf "$(TEXT "Disassembling %s: ")" "$(basename "${PAT_PATH}")")"
if [ "${isencrypted}" = "yes" ]; then
EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch"
# Check existance of extractor
if [ -f "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}" ]; then
echo "$(TEXT "Extractor cached.")"
else
getSynoExtractor
[ $? -ne 0 ] && return 1
fi
# Uses the extractor to untar pat file
echo "$(TEXT "Extracting ...")"
LD_LIBRARY_PATH=${EXTRACTOR_PATH} "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}" "${PAT_PATH}" "${EXT_PATH}" || true
else
echo "$(TEXT "Extracting ...")"
tar -xf "${PAT_PATH}" -C "${EXT_PATH}" >"${LOG_FILE}" 2>&1
if [ $? -ne 0 ]; then
cat "${LOG_FILE}" >"${MKERR_FILE}"
return 1
fi
fi
if [ ! -f ${EXT_PATH}/grub_cksum.syno ] ||
[ ! -f ${EXT_PATH}/GRUB_VER ] ||
[ ! -f ${EXT_PATH}/zImage ] ||
[ ! -f ${EXT_PATH}/rd.gz ]; then
echo -e "$(TEXT "pat Invalid, try again!")" >"${MKERR_FILE}"
return 1
fi
}
###############################################################################
# Extract linux and ramdisk files from the DSM .pat
function extractDsmFiles() {
MKERR_FILE="${1:-"${TMP_PATH}/makeerror.log"}"
MKERR_FILE="${TMP_PATH}/makeerror.log"
EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch"
PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
@ -826,9 +1078,6 @@ function extractDsmFiles() {
PAT_FILE="${MODEL}-${PRODUCTVER}.pat"
PAT_PATH="${PART3_PATH}/dl/${PAT_FILE}"
EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch"
OLDPATURL="https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat"
if [ -f "${PAT_PATH}" ]; then
echo "$(printf "$(TEXT "%s cached.")" "${PAT_FILE}")"
@ -846,7 +1095,6 @@ function extractDsmFiles() {
if echo "${mirrors[@]}" | grep -wq "${mirror}" && [ "${mirror}" != "${fastest}" ]; then
echo "$(printf "$(TEXT "Based on the current network situation, switch to %s mirror to downloading.")" "${fastest}")"
PATURL="$(echo ${PATURL} | sed "s/${mirror}/${fastest}/")"
OLDPATURL="https://${fastest}/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat"
fi
echo "$(printf "$(TEXT "Downloading %s ...")" "${PAT_FILE}")"
# Discover remote file size
@ -874,96 +1122,12 @@ function extractDsmFiles() {
echo "$(TEXT "OK")"
rm -rf "${UNTAR_PAT_PATH}"
mkdir "${UNTAR_PAT_PATH}"
mkdir -p "${UNTAR_PAT_PATH}"
echo -n "$(printf "$(TEXT "Disassembling %s: ")" "${PAT_FILE}")"
header="$(od -bcN2 ${PAT_PATH} | head -1 | awk '{print $3}')"
case ${header} in
105)
echo "$(TEXT "Uncompressed tar")"
isencrypted="no"
;;
213)
echo "$(TEXT "Compressed tar")"
isencrypted="no"
;;
255)
echo "$(TEXT "Encrypted")"
isencrypted="yes"
;;
*)
echo -e "$(TEXT "Could not determine if pat file is encrypted or not, maybe corrupted, try again!")" >"${MKERR_FILE}"
return 1
;;
esac
SPACELEFT=$(df --block-size=1 | grep ${LOADER_DISK_PART3} | awk '{print $4}') # Check disk space left
if [ "${isencrypted}" = "yes" ]; then
# Check existance of extractor
if [ -f "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}" ]; then
echo "$(TEXT "Extractor cached.")"
else
# Extractor not exists, get it.
mkdir -p "${EXTRACTOR_PATH}"
# Check if old pat already downloaded
OLDPAT_PATH="${PART3_PATH}/dl/DS3622xs+-42218.pat"
if [ ! -f "${OLDPAT_PATH}" ]; then
echo "$(TEXT "Downloading old pat to extract synology .pat extractor...")"
# Discover remote file size
FILESIZE=$(curl -k -sLI "${OLDPATURL}" | grep -i Content-Length | awk '{print$2}')
if [ 0${FILESIZE} -ge 0${SPACELEFT} ]; then
# No disk space to download, change it to RAMDISK
OLDPAT_PATH="${TMP_PATH}/DS3622xs+-42218.pat"
fi
STATUS=$(curl -k -w "%{http_code}" -L "${OLDPATURL}" -o "${OLDPAT_PATH}")
RET=$?
if [ ${RET} -ne 0 -o ${STATUS} -ne 200 ]; then
rm -f "${OLDPAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d:%d")" "${RET}" "${STATUS}")"
echo -e "${MSG}" >"${MKERR_FILE}"
return 1
fi
fi
# Extract DSM ramdisk file from PAT
rm -rf "${RAMDISK_PATH}"
mkdir -p "${RAMDISK_PATH}"
tar -xf "${OLDPAT_PATH}" -C "${RAMDISK_PATH}" rd.gz >"${LOG_FILE}" 2>&1
if [ $? -ne 0 ]; then
rm -f "${OLDPAT_PATH}"
rm -rf "${RAMDISK_PATH}"
cat "${LOG_FILE}" >"${MKERR_FILE}"
return 1
fi
[ ${CLEARCACHE} -eq 1 ] && rm -f "${OLDPAT_PATH}"
# Extract all files from rd.gz
(
cd "${RAMDISK_PATH}"
xz -dc <rd.gz | cpio -idm
) >/dev/null 2>&1 || true
# Copy only necessary files
for f in libcurl.so.4 libmbedcrypto.so.5 libmbedtls.so.13 libmbedx509.so.1 libmsgpackc.so.2 libsodium.so libsynocodesign-ng-virtual-junior-wins.so.7; do
cp -f "${RAMDISK_PATH}/usr/lib/${f}" "${EXTRACTOR_PATH}"
done
cp -f "${RAMDISK_PATH}/usr/syno/bin/scemd" "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}"
rm -rf "${RAMDISK_PATH}"
fi
# Uses the extractor to untar pat file
echo "$(TEXT "Extracting ...")"
LD_LIBRARY_PATH=${EXTRACTOR_PATH} "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}" "${PAT_PATH}" "${UNTAR_PAT_PATH}" || true
else
echo "$(TEXT "Extracting ...")"
tar -xf "${PAT_PATH}" -C "${UNTAR_PAT_PATH}" >"${LOG_FILE}" 2>&1
if [ $? -ne 0 ]; then
cat "${LOG_FILE}" >"${MKERR_FILE}"
return 1
fi
fi
if [ ! -f ${UNTAR_PAT_PATH}/grub_cksum.syno ] ||
[ ! -f ${UNTAR_PAT_PATH}/GRUB_VER ] ||
[ ! -f ${UNTAR_PAT_PATH}/zImage ] ||
[ ! -f ${UNTAR_PAT_PATH}/rd.gz ]; then
echo -e "$(TEXT "pat Invalid, try again!")" >"${MKERR_FILE}"
extractPatFiles "${PAT_PATH}" "${UNTAR_PAT_PATH}"
if [ $? -ne 0 ]; then
rm -rf "${UNTAR_PAT_PATH}"
return 1
fi
echo -n "$(TEXT "Setting hash: ")"
@ -1003,7 +1167,7 @@ function make() {
done < <(readConfigMap "addons" "${USER_CONFIG_FILE}")
if [ ! -f "${ORI_ZIMAGE_FILE}" -o ! -f "${ORI_RDGZ_FILE}" ]; then
extractDsmFiles "${MKERR_FILE}"
extractDsmFiles
[ $? -ne 0 ] && break
fi
@ -2228,17 +2392,22 @@ if [ "x$1" = "xb" -a -n "${MODEL}" -a -n "${PRODUCTVER}" -a loaderIsConfigured ]
boot && exit 0 || sleep 5
fi
# Main loop
[ -n "${MODEL}" ] && NEXT="v" || NEXT="m"
NEXT="m"
[ -n "$(ls ${USER_UP_PATH}/*.pat 2>/dev/null)" ] && NEXT="u"
[ -f "${PART1_PATH}/.build" ] && NEXT="d"
[ -n "${MODEL}" ] && NEXT="v"
while true; do
echo "m \"$(TEXT "Choose a model")\"" >"${TMP_PATH}/menu"
echo -n "" >"${TMP_PATH}/menu"
echo "m \"$(TEXT "Choose a model")\"" >>"${TMP_PATH}/menu"
if [ -n "${MODEL}" ]; then
echo "n \"$(TEXT "Choose a version")\"" >>"${TMP_PATH}/menu"
if [ -n "${PRODUCTVER}" ]; then
echo "a \"$(TEXT "Addons menu")\"" >>"${TMP_PATH}/menu"
echo "o \"$(TEXT "Modules menu")\"" >>"${TMP_PATH}/menu"
echo "x \"$(TEXT "Cmdline menu")\"" >>"${TMP_PATH}/menu"
echo "i \"$(TEXT "Synoinfo menu")\"" >>"${TMP_PATH}/menu"
fi
fi
echo "u \"$(TEXT "Parse pat")\"" >>"${TMP_PATH}/menu"
if [ -n "${PRODUCTVER}" ]; then
echo "a \"$(TEXT "Addons menu")\"" >>"${TMP_PATH}/menu"
echo "o \"$(TEXT "Modules menu")\"" >>"${TMP_PATH}/menu"
echo "x \"$(TEXT "Cmdline menu")\"" >>"${TMP_PATH}/menu"
echo "i \"$(TEXT "Synoinfo menu")\"" >>"${TMP_PATH}/menu"
fi
echo "v \"$(TEXT "Advanced menu")\"" >>"${TMP_PATH}/menu"
if [ -n "${MODEL}" ]; then
@ -2271,6 +2440,10 @@ while true; do
productversMenu
NEXT="d"
;;
u)
ParsePat
NEXT="d"
;;
a)
addonMenu
NEXT="d"