From f3b5f1c8da0d617922715d471bfa07ef4e477cf5 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Mon, 25 Mar 2024 20:11:16 +0100 Subject: [PATCH] ramdisk: rewrite Signed-off-by: AuxXxilium --- files/initrd/opt/arc/ramdisk-patch.sh | 130 ++++++++++++++++---------- 1 file changed, 83 insertions(+), 47 deletions(-) diff --git a/files/initrd/opt/arc/ramdisk-patch.sh b/files/initrd/opt/arc/ramdisk-patch.sh index aea3a941..2d14f257 100755 --- a/files/initrd/opt/arc/ramdisk-patch.sh +++ b/files/initrd/opt/arc/ramdisk-patch.sh @@ -9,7 +9,10 @@ set -o pipefail # Get exit code from process piped # Sanity check -[ -f "${ORI_RDGZ_FILE}" ] || (die "${ORI_RDGZ_FILE} not found!" | tee -a "${LOG_FILE}") +if [ ! -f "${ORI_RDGZ_FILE}" ]; then + echo "ERROR: ${ORI_RDGZ_FILE} not found!" >"${LOG_FILE}" + exit 1 +fi echo -e "Patching Ramdisk" @@ -35,6 +38,7 @@ HDDSORT="$(readConfigKey "arc.hddsort" "${USER_CONFIG_FILE}")" USBMOUNT="$(readConfigKey "arc.usbmount" "${USER_CONFIG_FILE}")" KVMSUPPORT="$(readConfigKey "arc.kvm" "${USER_CONFIG_FILE}")" MODULESCOPY="$(readConfigKey "arc.modulescopy" "${USER_CONFIG_FILE}")" +KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" # Check if DSM Version changed . "${RAMDISK_PATH}/etc/VERSION" @@ -48,6 +52,9 @@ RD_COMPRESSED="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].rd-compres PAT_URL="$(readConfigKey "arc.paturl" "${USER_CONFIG_FILE}")" PAT_HASH="$(readConfigKey "arc.pathash" "${USER_CONFIG_FILE}")" +[ "${PAT_URL:0:1}" = "#" ] && PAT_URL="" +[ "${PAT_HASH:0:1}" = "#" ] && PAT_URL="" + if [ "${PRODUCTVERDSM}" != "${PRODUCTVER}" ]; then # Update new buildnumber echo -e "Ramdisk Version ${PRODUCTVER} does not match DSM Version ${PRODUCTVERDSM}!" @@ -55,12 +62,15 @@ if [ "${PRODUCTVERDSM}" != "${PRODUCTVER}" ]; then writeConfigKey "productver" "${USER_CONFIG_FILE}" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" KVER="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")" - PATURL="" - PATSUM="" + PAT_URL="" + PAT_HASH="" fi # Sanity check -[[ -z "${PLATFORM}" || -z "${KVER}" ]] && (die "ERROR: Configuration for Model ${MODEL} and Version ${PRODUCTVER} not found." | tee -a "${LOG_FILE}") +if [[ -z "${PLATFORM}" || -z "${KVER}" ]]; then + echo "ERROR: Configuration for model ${MODEL} and productversion ${PRODUCTVER} not found." >"${LOG_FILE}" + exit 1 +fi # Modify KVER for Epyc7002 if [ "${PLATFORM}" = "epyc7002" ]; then @@ -74,38 +84,40 @@ declare -A MODULES # Read synoinfo from config while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && SYNOINFO["${KEY}"]="${VALUE}" -done < <(readConfigMap "synoinfo" "${USER_CONFIG_FILE}") +done <<<$(readConfigMap "synoinfo" "${USER_CONFIG_FILE}") # Read synoinfo from config while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && ADDONS["${KEY}"]="${VALUE}" -done < <(readConfigMap "addons" "${USER_CONFIG_FILE}") +done <<<$(readConfigMap "addons" "${USER_CONFIG_FILE}") # Read modules from config while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && MODULES["${KEY}"]="${VALUE}" -done < <(readConfigMap "modules" "${USER_CONFIG_FILE}") +done <<<$(readConfigMap "modules" "${USER_CONFIG_FILE}") # Patches (diff -Naru OLDFILE NEWFILE > xxx.patch) while read -r PE; do RET=1 - echo "Patching with ${PE}" >"${LOG_FILE}" 2>&1 + echo "Patching with ${PE}" >"${LOG_FILE}" for PF in $(ls ${PATCH_PATH}/${PE} 2>/dev/null); do - echo "Patching with ${PF}" >>"${LOG_FILE}" 2>&1 + echo "Patching with ${PF}" >>"${LOG_FILE}" ( cd "${RAMDISK_PATH}" - patch -p1 -i "${PF}" >>"${LOG_FILE}" 2>&1 + busybox patch -p1 -i "${PF}" >>"${LOG_FILE}" 2>&1 # busybox patch and gun patch have different processing methods and parameters. ) RET=$? [ ${RET} -eq 0 ] && break done - [ ${RET} -ne 0 ] && dieLog -done < <(readModelArray "${MODEL}" "productvers.[${PRODUCTVER}].patch") + [ ${RET} -ne 0 ] && exit 1 +done <<<$(readModelArray "${MODEL}" "productvers.[${PRODUCTVER}].patch") # Patch /etc/synoinfo.conf -for KEY in ${!SYNOINFO[@]}; do - _set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc/synoinfo.conf" >"${LOG_FILE}" 2>&1 || dieLog -done # Add serial number to synoinfo.conf, to help to recovery a installed DSM -_set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >"${LOG_FILE}" 2>&1 || dieLog +echo "Set synoinfo SN" >"${LOG_FILE}" +_set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 +for KEY in ${!SYNOINFO[@]}; do + echo "Set synoinfo ${KEY}" >>"${LOG_FILE}" + _set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 +done # Patch /sbin/init.post grep -v -e '^[\t ]*#' -e '^$' "${PATCH_PATH}/config-manipulators.sh" >"${TMP_PATH}/rp.txt" @@ -122,14 +134,15 @@ sed -e "/@@@CONFIG-GENERATED@@@/ {" -e "r ${TMP_PATH}/rp.txt" -e 'd' -e '}' -i " rm -f "${TMP_PATH}/rp.txt" # Extract Modules to Ramdisk -installModules "${PLATFORM}" "${KVER}" "${!MODULES[@]}" +installModules "${PLATFORM}" "${KVER}" "${!MODULES[@]}" || exit 1 # Copying fake modprobe cp -f "${PATCH_PATH}/iosched-trampoline.sh" "${RAMDISK_PATH}/usr/sbin/modprobe" # Copying LKM to /usr/lib/modules -gzip -dc "${LKM_PATH}/rp-${PLATFORM}-${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko" +gzip -dc "${LKM_PATH}/rp-${PLATFORM}-${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko" 2>"${LOG_FILE}" || exit 1 # Addons +echo "Create addons.sh" >"${LOG_FILE}" mkdir -p "${RAMDISK_PATH}/addons" echo "#!/bin/sh" >"${RAMDISK_PATH}/addons/addons.sh" echo 'echo "addons.sh called with params ${@}"' >>"${RAMDISK_PATH}/addons/addons.sh" @@ -143,40 +156,37 @@ echo "export LAYOUT=${LAYOUT}" >>"${RAMDISK_PATH}/addons/addons.sh" echo "export KEYMAP=${KEYMAP}" >>"${RAMDISK_PATH}/addons/addons.sh" chmod +x "${RAMDISK_PATH}/addons/addons.sh" -# Required Addons: revert -installAddon "revert" "${PLATFORM}" "${KVER}" -echo "/addons/revert.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog +# Required addons: "revert" "misc" "eudev" "disks" "localrss" "wol" +# This order cannot be changed. +for ADDON in "revert" "misc" "eudev" "disks" "localrss" "wol"; do + PARAMS="" + if [ "${ADDON}" = "disks" ]; then + PARAMS="${HDDSORT} ${USBMOUNT}" + fi + if [ "${ADDON}" = "eudev" ]; then + PARAMS="${MODULESCOPY} ${KVMSUPPORT}" + fi + installAddon "${ADDON}" "${PLATFORM}" "${KVER}" || exit 1 + echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1 +done -# Install System Addons -installAddon "eudev" "${PLATFORM}" "${KVER}" -echo "/addons/eudev.sh \${1} ${MODULESCOPY} ${KVMSUPPORT} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog -installAddon "disks" "${PLATFORM}" "${KVER}" -echo "/addons/disks.sh \${1} ${HDDSORT} ${USBMOUNT} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog -installAddon "misc" "${PLATFORM}" "${KVER}" -echo "/addons/misc.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog -installAddon "localrss" "${PLATFORM}" "${KVER}" -echo "/addons/localrss.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog -installAddon "wol" "${PLATFORM}" "${KVER}" -echo "/addons/wol.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog - -# User Addons check +# User Addons for ADDON in ${!ADDONS[@]}; do PARAMS=${ADDONS[${ADDON}]} - if ! installAddon "${ADDON}" "${PLATFORM}" "${KVER}"; then - echo -n "${ADDON} is not available for this Platform!" | tee -a "${LOG_FILE}" - echo - exit 1 - fi - echo "/addons/${ADDON}.sh \${1} ${PARAMS} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog + installAddon "${ADDON}" "${PLATFORM}" "${KVER}" || exit 1 + echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1 done # Enable Telnet -echo "inetd" >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog +echo "inetd" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "Modify files" >"${LOG_FILE}" +# Remove function from scripts [ "2" = "${BUILDNUM:0:1}" ] && sed -i 's/function //g' $(find "${RAMDISK_PATH}/addons/" -type f -name "*.sh") # Build modules dependencies -${ARC_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null +# ${ARC_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null + # Copying modulelist if [ -f "${USER_UP_PATH}/modulelist" ]; then cp -f "${USER_UP_PATH}/modulelist" "${RAMDISK_PATH}/addons/modulelist" @@ -184,6 +194,26 @@ else cp -f "${ARC_PATH}/include/modulelist" "${RAMDISK_PATH}/addons/modulelist" fi +# backup current loader configs +BACKUP_PATH="${RAMDISK_PATH}/usr/arc/backup" +rm -rf "${BACKUP_PATH}" +for F in "${USER_GRUB_CONFIG}" "${USER_CONFIG_FILE}"; do + if [ -f "${F}" ]; then + FD="$(dirname "${F}")" + mkdir -p "${FD/\/mnt/${BACKUP_PATH}}" + cp -f "${F}" "${FD/\/mnt/${BACKUP_PATH}}" + elif [ -d "${F}" ]; then + SIZE="$(du -sm "${F}" 2>/dev/null | awk '{print $1}')" + if [ ${SIZE:-0} -gt 4 ]; then + echo "Backup of ${F} skipped, size is ${SIZE}MB" >>"${LOG_FILE}" + continue + fi + FD="$(dirname "${F}")" + mkdir -p "${FD/\/mnt/${BACKUP_PATH}}" + cp -rf "${F}" "${FD/\/mnt/${BACKUP_PATH}}" + fi +done + # Network card configuration file IPV6="$(readConfigKey "arc.ipv6" "${USER_CONFIG_FILE}")" ETHX=$(ls /sys/class/net/ | grep -v lo) || true @@ -208,18 +238,24 @@ if [ "${PLATFORM}" = "broadwellntbap" ]; then sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' ${RAMDISK_PATH}/usr/syno/share/environments.sh fi +#if [ "${PLATFORM}" = "kvmx64" ]; then +# sed -i 's/kvmx64/RRING/g' ${RAMDISK_PATH}/etc/synoinfo.conf ${RAMDISK_PATH}/etc/VERSION +#fi + # Call user patch scripts for F in $(ls -1 ${SCRIPTS_PATH}/*.sh 2>/dev/null); do - echo "Calling ${F}" >>"${LOG_FILE}" 2>&1 - . "${F}" >>"${LOG_FILE}" 2>&1 || dieLog + echo "Calling ${F}" >"${LOG_FILE}" + . "${F}" >>"${LOG_FILE}" 2>&1 || exit 1 done # Reassembly ramdisk if [ "${RD_COMPRESSED}" == "true" ]; then - (cd "${RAMDISK_PATH}" && find . | cpio -o -H newc -R root:root | xz -9 --format=lzma >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || dieLog + (cd "${RAMDISK_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 --format=lzma >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || exit 1 else - (cd "${RAMDISK_PATH}" && find . | cpio -o -H newc -R root:root >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || dieLog + (cd "${RAMDISK_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || exit 1 fi +sync + # Clean -rm -rf "${RAMDISK_PATH}" +rm -rf "${RAMDISK_PATH}" \ No newline at end of file