From 8cb6619ae8e0b71b70752ae523705eae8a431862 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 01:29:20 +0100 Subject: [PATCH 1/7] tree: rework Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc-functions.sh | 257 +++++++++++++-------- files/initrd/opt/arc/arc.sh | 64 ++--- files/initrd/opt/arc/boot.sh | 56 ++--- files/initrd/opt/arc/bzImage-to-vmlinux.sh | 14 +- files/initrd/opt/arc/calc_run_size.sh | 22 +- files/initrd/opt/arc/extract-vmlinux | 44 ++-- files/initrd/opt/arc/include/addons.sh | 19 +- files/initrd/opt/arc/include/configFile.sh | 27 ++- files/initrd/opt/arc/include/functions.sh | 176 +++++++------- files/initrd/opt/arc/include/modules.sh | 137 ++++++----- files/initrd/opt/arc/include/network.sh | 6 +- files/initrd/opt/arc/include/storage.sh | 6 +- files/initrd/opt/arc/include/update.sh | 2 +- files/initrd/opt/arc/init.sh | 80 +++---- files/initrd/opt/arc/ramdisk-patch.sh | 82 ++++--- files/initrd/opt/arc/vmlinux-to-bzImage.sh | 72 +++--- files/initrd/opt/arc/zimage-patch.sh | 8 +- files/p1/boot/grub/grub.cfg | 4 +- 18 files changed, 565 insertions(+), 511 deletions(-) diff --git a/files/initrd/opt/arc/arc-functions.sh b/files/initrd/opt/arc/arc-functions.sh index 3649faad..5dc83e4f 100755 --- a/files/initrd/opt/arc/arc-functions.sh +++ b/files/initrd/opt/arc/arc-functions.sh @@ -275,7 +275,7 @@ function modulesMenu() { 2>${TMP_PATH}/resp [ $? -ne 0 ] && break VALUE="$(cat "${TMP_PATH}/resp")" - if [[ ${VALUE} = *" "* ]]; then + if echo "${VALUE}" | grep -q " "; then dialog --backtitle "$(backtitle)" --title "Blacklist Module" \ --yesno "Invalid list, No spaces should appear, retry?" 0 0 [ $? -eq 0 ] && continue || break @@ -334,10 +334,10 @@ function cmdlineMenu() { RET=$? case ${RET} in 0) # ok-button - NAME="$(cat "${TMP_PATH}/resp" | sed -n '1p')" - VALUE="$(cat "${TMP_PATH}/resp" | sed -n '2p')" - [[ "${NAME}" = *= ]] && NAME="${NAME%?}" - [[ "${VALUE}" = =* ]] && VALUE="${VALUE#*=}" + NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" + VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" + [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}" + [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}" if [ -z "${NAME//\"/}" ]; then dialog --clear --backtitle "$(backtitle)" --title "User Cmdline" \ --yesno "Invalid Parameter Name, retry?" 0 0 @@ -539,10 +539,10 @@ function synoinfoMenu() { RET=$? case ${RET} in 0) # ok-button - NAME="$(cat "${TMP_PATH}/resp" | sed -n '1p')" - VALUE="$(cat "${TMP_PATH}/resp" | sed -n '2p')" - [[ "${NAME}" = *= ]] && NAME="${NAME%?}" - [[ "${VALUE}" = =* ]] && VALUE="${VALUE#*=}" + NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" + VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" + [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}" + [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}" if [ -z "${NAME//\"/}" ]; then dialog --clear --backtitle "$(backtitle)" --title "User Cmdline" \ --yesno "Invalid Parameter Name, retry?" 0 0 @@ -971,8 +971,8 @@ function sysinfo() { CPU="$(cat /proc/cpuinfo 2>/dev/null | grep 'model name' | uniq | awk -F':' '{print $2}')" SECURE=$(dmesg 2>/dev/null | grep -i "Secure Boot" | awk -F'] ' '{print $2}') VENDOR=$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i') - ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) - ETHN=$(echo ${ETHX} | wc -w) + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true + ETHN=$(echo "${ETHX}" | wc -w) ARC_BRANCH="$(readConfigKey "arc.branch" "${USER_CONFIG_FILE}")" CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1140,6 +1140,7 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l) + [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1148,6 +1149,7 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l) + [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1181,6 +1183,7 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/nvme 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[N:${PORT}:" | wc -l) + [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1188,6 +1191,7 @@ function sysinfo() { TEXT+="\n VMBUS Controller:\n" NAME="vmbus:acpi" PORTNUM=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep 'vmbus:acpi' | wc -l) + [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) fi @@ -1267,7 +1271,7 @@ function uploadDiag () { # Shows Networkdiag to user function networkdiag() { ( - ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true for N in ${ETHX}; do echo DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') @@ -1371,7 +1375,7 @@ function credits() { ############################################################################### # Setting Static IP for Loader function staticIPMenu() { - ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep -v lo) + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true IPCON="" for N in ${ETHX}; do MACR="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g')" @@ -1386,10 +1390,10 @@ function staticIPMenu() { RET=$? case ${RET} in 0) # ok-button - address="$(cat "${TMP_PATH}/resp" | sed -n '1p')" - netmask="$(cat "${TMP_PATH}/resp" | sed -n '2p')" - gateway="$(cat "${TMP_PATH}/resp" | sed -n '3p')" - dnsname="$(cat "${TMP_PATH}/resp" | sed -n '4p')" + address="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" + netmask="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" + gateway="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null)" + dnsname="$(sed -n '4p' "${TMP_PATH}/resp" 2>/dev/null)" ( if [ -z "${address}" ]; then if [ -n "$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" ]; then @@ -1553,8 +1557,8 @@ function addNewDSMUser() { --form "${MSG}" 8 60 3 "username:" 1 1 "user" 1 10 50 0 "password:" 2 1 "passwd" 2 10 50 0 \ 2>"${TMP_PATH}/resp" [ $? -ne 0 ] && return - username="$(cat "${TMP_PATH}/resp" | sed -n '1p')" - password="$(cat "${TMP_PATH}/resp" | sed -n '2p')" + username="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" + password="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" ( ONBOOTUP="" ONBOOTUP="${ONBOOTUP}if synouser --enum local | grep -q ^${username}\$; then synouser --setpw ${username} ${password}; else synouser --add ${username} ${password} arc 0 user@arc.arc 1; fi\n" @@ -1591,12 +1595,12 @@ function loaderPassword() { dialog --backtitle "$(backtitle)" --title "Loader Password" \ --inputbox "New password: (Empty value 'arc')" 0 70 \ 2>${TMP_PATH}/resp - [ $? -ne 0 ] && continue - STRPASSWD="$(cat "${TMP_PATH}/resp")" - NEWPASSWD="$(openssl passwd -6 -salt $(openssl rand -hex 8) "${STRPASSWD:-arc}")" + [ $? -ne 0 ] && return + local STRPASSWD="$(cat "${TMP_PATH}/resp")" + local NEWPASSWD="$(openssl passwd -6 -salt $(openssl rand -hex 8) "${STRPASSWD:-arc}")" cp -p /etc/shadow /etc/shadow- sed -i "s|^root:[^:]*|root:${NEWPASSWD}|" /etc/shadow - RDXZ_PATH="${TMP_PATH}/rdxz_tmp" + local RDXZ_PATH="${TMP_PATH}/rdxz_tmp" rm -rf "${RDXZ_PATH}" mkdir -p "${RDXZ_PATH}" [ -f "${ARC_RAMDISK_USER_FILE}" ] && ( @@ -1612,7 +1616,7 @@ function loaderPassword() { if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then ( cd "${RDXZ_PATH}" - RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') + local RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') find . 2>/dev/null | cpio -o -H newc -R root:root | pv -n -s ${RDSIZE:-1} | xz -9 --check=crc32 >"${ARC_RAMDISK_USER_FILE}" ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Loader Password" \ --progressbox "Changing Loader password..." 30 100 @@ -1629,10 +1633,10 @@ function loaderPassword() { ############################################################################### # Change Arc Loader Password function loaderPorts() { - MSG="Modify Ports (0-65535) (Leave empty for default):" - HTTPPORT=$(grep -i '^HTTP_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) - DUFSPORT=$(grep -i '^DUFS_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) - TTYDPORT=$(grep -i '^TTYD_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + local MSG="Modify Ports (0-65535) (Leave empty for default):" + local HTTPPORT=$(grep -i '^HTTP_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + local DUFSPORT=$(grep -i '^DUFS_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + local TTYDPORT=$(grep -i '^TTYD_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) while true; do dialog --backtitle "$(backtitle)" --title "Loader Ports" \ --form "${MSG}" 11 70 3 "HTTP" 1 1 "${HTTPPORT:-8080}" 1 10 55 0 "DUFS" 2 1 "${DUFSPORT:-7304}" 2 10 55 0 "TTYD" 3 1 "${TTYDPORT:-7681}" 3 10 55 0 \ @@ -1640,9 +1644,9 @@ function loaderPorts() { RET=$? case ${RET} in 0) # ok-button - HTTPPORT=$(sed -n '1p' "${TMP_PATH}/resp") - DUFSPORT=$(sed -n '2p' "${TMP_PATH}/resp") - TTYDPORT=$(sed -n '3p' "${TMP_PATH}/resp") + HTTP=$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null) + DUFS=$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null) + TTYD=$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null) EP="" for P in "${HTTPPORT}" "${DUFSPORT}" "${TTYDPORT}"; do check_port "${P}" || EP="${EP} ${P}"; done if [ -n "${EP}" ]; then @@ -1654,7 +1658,7 @@ function loaderPorts() { if [ ! "${HTTPPORT:-8080}" = "8080" ]; then echo "HTTP_PORT=${HTTPPORT}" >>"/etc/arc.conf"; /etc/init.d/S90thttpd restart >/dev/null 2>&1; fi if [ ! "${DUFSPORT:-7304}" = "7304" ]; then echo "DUFS_PORT=${DUFSPORT}" >>"/etc/arc.conf"; /etc/init.d/S99dufs restart >/dev/null 2>&1; fi if [ ! "${TTYDPORT:-7681}" = "7681" ]; then echo "TTYD_PORT=${TTYDPORT}" >>"/etc/arc.conf"; /etc/init.d/S99ttyd restart >/dev/null 2>&1; fi - RDXZ_PATH="${TMP_PATH}/rdxz_tmp" + local RDXZ_PATH="${TMP_PATH}/rdxz_tmp" rm -rf "${RDXZ_PATH}" mkdir -p "${RDXZ_PATH}" [ -f "${ARC_RAMDISK_USER_FILE}" ] && ( @@ -1670,7 +1674,7 @@ function loaderPorts() { if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then ( cd "${RDXZ_PATH}" - RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') + local RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') find . 2>/dev/null | cpio -o -H newc -R root:root | pv -n -s ${RDSIZE:-1} | xz -9 --check=crc32 >"${ARC_RAMDISK_USER_FILE}" ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Loader Ports" \ --progressbox "Changing Ports..." 30 100 @@ -1745,8 +1749,8 @@ function formatDisks() { while read -r KNAME SIZE TYPE PKNAME; do [ -z "${KNAME}" ] && continue [ "${KNAME}" = "N/A" ] && continue - [[ "${KNAME}" = /dev/md* ]] && continue - [[ "${KNAME}" = "${LOADER_DISK}" || "${PKNAME}" = "${LOADER_DISK}" ]] && continue + [ "${KNAME:0:7}" = "/dev/md" ] && continue + [ "${KNAME}" = "${LOADER_DISK}" ] || [ "${PKNAME}" = "${LOADER_DISK}" ] && continue [ -z "${SIZE}" ] && SIZE="Unknown" printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${TYPE}" >>"${TMP_PATH}/opts" done < <(lsblk -Jpno KNAME,SIZE,TYPE,PKNAME 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.pkname)"' 2>/dev/null) @@ -1773,7 +1777,7 @@ function formatDisks() { done fi for I in ${RESP}; do - if [[ "${I}" = /dev/mmc* ]]; then + if [ "${I:0:8}" = "/dev/mmc" ]; then echo y | mkfs.ext4 -T largefile4 -E nodiscard "${I}" else echo y | mkfs.ext4 -T largefile4 "${I}" @@ -1786,77 +1790,135 @@ function formatDisks() { } ############################################################################### -# Clone Loader Disk -function cloneLoader() { - rm -f "${TMP_PATH}/opts" >/dev/null - while read -r KNAME SIZE TYPE PKNAME; do - [ -z "${KNAME}" ] && continue - [ "${KNAME}" = "N/A" ] && continue - [ "${TYPE}" != "disk" ] && continue - [[ "${KNAME}" = /dev/md* ]] && continue - [[ "${KNAME}" = "${LOADER_DISK}" || "${PKNAME}" = "${LOADER_DISK}" ]] && continue - [ -z "${SIZE}" ] && SIZE="Unknown" - printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${TYPE}" >>"${TMP_PATH}/opts" - done < <(lsblk -Jpno KNAME,SIZE,TYPE,PKNAME 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.pkname)"' 2>/dev/null) +# Clone bootloader disk +function cloneBootloaderDisk() { + rm -f "${TMP_PATH}/opts" + while read -r KNAME ID SIZE PKNAME; do + [ "${KNAME}" = "N/A" ] || [ "${SIZE:0:1}" = "0" ] && continue + [ "${KNAME}" = "${LOADER_DISK}" ] || [ "${PKNAME}" = "${LOADER_DISK}" ] && continue + printf "\"%s\" \"%-6s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${ID}" >>"${TMP_PATH}/opts" + done <<<"$(lsblk -Jdpno KNAME,ID,SIZE,PKNAME 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.id) \(.size) \(.pkname)"' 2>/dev/null)" + if [ ! -f "${TMP_PATH}/opts" ]; then - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ --msgbox "No disk found!" 0 0 return fi - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ - --radiolist "Choose a Destination" 0 0 0 --file "${TMP_PATH}/opts" \ + + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + --radiolist "Choose a destination:" 0 0 0 --file "${TMP_PATH}/opts" \ 2>${TMP_PATH}/resp [ $? -ne 0 ] && return - resp=$(cat ${TMP_PATH}/resp) - if [ -z "${resp}" ]; then - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + RESP=$(cat "${TMP_PATH}/resp") + + if [ -z "${RESP}" ]; then + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ --msgbox "No disk selected!" 0 0 return - else - SIZE=$(df -m ${resp} 2>/dev/null | awk 'NR=2 {print $2}') - if [ ${SIZE:-0} -lt 1024 ]; then - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ - --msgbox "Disk ${resp} size is less than 1GB and cannot be cloned!" 0 0 - return - fi - MSG="" - MSG+="Warning:\nDisk ${resp} will be formatted and written to the bootloader. Please confirm that important data has been backed up. \nDo you want to continue?" - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ - --yesno "${MSG}" 0 0 - [ $? -ne 0 ] && return fi + + SIZE=$(df -m "${RESP}" 2>/dev/null | awk 'NR==2 {print $2}') + if [ ${SIZE:-0} -lt 1024 ]; then + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + --msgbox "$(printf "Disk %s size is less than 1GB and cannot be cloned!" "${RESP}")" 0 0 + return + fi + + MSG="$(printf "Warning:\nDisk %s will be formatted and written to the bootloader. Please confirm that important data has been backed up. \nDo you want to continue?" "${RESP}")" + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + --yesno "${MSG}" 0 0 + [ $? -ne 0 ] && return + ( - rm -rf "${PART3_PATH}/dl" >/dev/null + rm -f "${LOG_FILE}" + rm -rf "${PART3_PATH}/dl" CLEARCACHE=0 - gzip -dc "${ARC_PATH}/grub.img.gz" | dd of="${resp}" bs=1M conv=fsync status=progress - hdparm -z "${resp}" # reset disk cache - fdisk -l "${resp}" + gzip -dc "${ARC_PATH}/grub.img.gz" | dd of="${RESP}" bs=1M conv=fsync status=progress + hdparm -z "${RESP}" # reset disk cache + fdisk -l "${RESP}" + sleep 1 + + NEW_BLDISK_P1="$(lsblk "${RESP}" -pno KNAME,LABEL 2>/dev/null | grep 'ARC1' | awk '{print $1}')" + NEW_BLDISK_P2="$(lsblk "${RESP}" -pno KNAME,LABEL 2>/dev/null | grep 'ARC2' | awk '{print $1}')" + NEW_BLDISK_P3="$(lsblk "${RESP}" -pno KNAME,LABEL 2>/dev/null | grep 'ARC3' | awk '{print $1}')" + SIZEOFDISK=$(cat /sys/block/${RESP/\/dev\//}/size) + ENDSECTOR=$(($(fdisk -l ${RESP} | grep "${NEW_BLDISK_P3}" | awk '{print $3}') + 1)) + + if [ ${SIZEOFDISK}0 -ne ${ENDSECTOR}0 ]; then + echo -e "\033[1;36mResizing ${NEW_BLDISK_P3}\033[0m" + echo -e "d\n\nn\n\n\n\n\nn\nw" | fdisk "${RESP}" >/dev/null 2>&1 + resize2fs "${NEW_BLDISK_P3}" + fdisk -l "${RESP}" + sleep 1 + fi + + function __umountNewBlDisk() { + umount "${TMP_PATH}/sdX1" 2>/dev/null + umount "${TMP_PATH}/sdX2" 2>/dev/null + umount "${TMP_PATH}/sdX3" 2>/dev/null + } + + mkdir -p "${TMP_PATH}/sdX1" "${TMP_PATH}/sdX2" "${TMP_PATH}/sdX3" + mount "${NEW_BLDISK_P1}" "${TMP_PATH}/sdX1" || { + printf "Can't mount %s." "${NEW_BLDISK_P1}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + mount "${NEW_BLDISK_P2}" "${TMP_PATH}/sdX2" || { + printf "Can't mount %s." "${NEW_BLDISK_P2}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + mount "${NEW_BLDISK_P3}" "${TMP_PATH}/sdX3" || { + printf "Can't mount %s." "${NEW_BLDISK_P3}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + + SIZEOLD1="$(du -sm "${PART1_PATH}" 2>/dev/null | awk '{print $1}')" + SIZEOLD2="$(du -sm "${PART2_PATH}" 2>/dev/null | awk '{print $1}')" + SIZEOLD3="$(du -sm "${PART3_PATH}" 2>/dev/null | awk '{print $1}')" + SIZENEW1="$(df -m "${NEW_BLDISK_P1}" 2>/dev/null | awk 'NR==2 {print $4}')" + SIZENEW2="$(df -m "${NEW_BLDISK_P2}" 2>/dev/null | awk 'NR==2 {print $4}')" + SIZENEW3="$(df -m "${NEW_BLDISK_P3}" 2>/dev/null | awk 'NR==2 {print $4}')" + + if [ ${SIZEOLD1:-0} -ge ${SIZENEW1:-0} ] || [ ${SIZEOLD2:-0} -ge ${SIZENEW2:-0} ] || [ ${SIZEOLD3:-0} -ge ${SIZENEW3:-0} ]; then + MSG="Cloning failed due to insufficient remaining disk space on the selected hard drive." + echo "${MSG}" >"${LOG_FILE}" + __umountNewBlDisk + break + fi + + cp -vRf "${PART1_PATH}/". "${TMP_PATH}/sdX1/" || { + printf "Can't copy to %s." "${NEW_BLDISK_P1}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + cp -vRf "${PART2_PATH}/". "${TMP_PATH}/sdX2/" || { + printf "Can't copy to %s." "${NEW_BLDISK_P2}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + cp -vRf "${PART3_PATH}/". "${TMP_PATH}/sdX3/" || { + printf "Can't copy to %s." "${NEW_BLDISK_P3}" >"${LOG_FILE}" + __umountNewBlDisk + break + } + sync + __umountNewBlDisk sleep 3 - - mkdir -p "${TMP_PATH}/sdX1" - mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC1 | awk '{print $1}')" "${TMP_PATH}/sdX1" - cp -vRf "${PART1_PATH}/". "${TMP_PATH}/sdX1/" - sync - umount "${TMP_PATH}/sdX1" - - mkdir -p "${TMP_PATH}/sdX2" - mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC2 | awk '{print $1}')" "${TMP_PATH}/sdX2" - cp -vRf "${PART2_PATH}/". "${TMP_PATH}/sdX2/" - sync - umount "${TMP_PATH}/sdX2" - - mkdir -p "${TMP_PATH}/sdX3" - mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC3 | awk '{print $1}')" "${TMP_PATH}/sdX3" - cp -vRf "${PART3_PATH}/". "${TMP_PATH}/sdX3/" - sync - umount "${TMP_PATH}/sdX3" - sleep 3 - ) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Clone Loader" \ --progressbox "Cloning ..." 20 100 - dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ - --msgbox "Bootloader has been cloned to disk ${resp},\nplease remove the current bootloader disk!\nReboot?" 0 0 - rebootTo config + + if [ -f "${LOG_FILE}" ]; then + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + --msgbox "$(cat ${LOG_FILE})" 0 0 + else + dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + --msgbox "$(printf "Bootloader has been cloned to disk %s, please remove the current bootloader disk!\nReboot?" "${RESP}")" 0 0 + rebootTo config + fi return } @@ -1869,7 +1931,7 @@ function resetLoader() { fi [ -d "${UNTAR_PAT_PATH}" ] && rm -rf "${UNTAR_PAT_PATH}" >/dev/null [ -f "${USER_CONFIG_FILE}" ] && rm -f "${USER_CONFIG_FILE}" >/dev/null - dialog --backtitle "$(backtitle)" --title "Reset Loader" --aspect 18 \ + dialog --backtitle "$(backtitle)" --title "Reset Loader" --aspect 18 \ --yesno "Reset successful.\nReboot required!" 0 0 [ $? -ne 0 ] && return rebootTo config @@ -1908,11 +1970,7 @@ function greplogs() { done rm -rf "${TMP_PATH}/mdX" fi - if [ ${SYSLOG} -eq 1 ]; then - MSG+="System logs found!\n" - else - MSG+="Can't find system logs!\n" - fi + [ ${SYSLOG} -eq 1 ] && MSG+="System logs found!\n" || MSG+="Can't find system logs!\n" ADDONS=0 if [ -d "${PART1_PATH}/logs" ]; then @@ -1980,7 +2038,6 @@ function getbackup() { # SataDOM Menu function satadomMenu() { rm -f "${TMP_PATH}/opts" >/dev/null - echo "0 \"Create SATA node(ARC)\"" >>"${TMP_PATH}/opts" echo "1 \"Native SATA Disk(SYNO)\"" >>"${TMP_PATH}/opts" echo "2 \"Fake SATA DOM(Redpill)\"" >>"${TMP_PATH}/opts" dialog --backtitle "$(backtitle)" --title "Switch SATA DOM" \ diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 96d4fc07..69b1fbce 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -4,14 +4,14 @@ # Overlay Init Section [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh -. ${ARC_PATH}/include/addons.sh -. ${ARC_PATH}/include/modules.sh -. ${ARC_PATH}/include/update.sh -. ${ARC_PATH}/include/storage.sh -. ${ARC_PATH}/include/network.sh -. ${ARC_PATH}/include/compat.sh -. ${ARC_PATH}/arc-functions.sh +. "${ARC_PATH}/include/functions.sh" +. "${ARC_PATH}/include/addons.sh" +. "${ARC_PATH}/include/modules.sh" +. "${ARC_PATH}/include/update.sh" +. "${ARC_PATH}/include/storage.sh" +. "${ARC_PATH}/include/network.sh" +. "${ARC_PATH}/include/compat.sh" +. "${ARC_PATH}/arc-functions.sh" # Get Keymap and Timezone Config onlineCheck @@ -105,8 +105,8 @@ function arcModel() { PM="$(readConfigEntriesArray "${P}" "${D_FILE}" | sort)" while read -r M; do echo "${M} ${P}" >>"${TMP_PATH}/modellist" - done < <(echo "${PM}") - done < <(echo "${PS}") + done <<<"$(echo "${PM}")" + done <<<"$(echo "${PS}")" if [ "${ARCMODE}" = "config" ]; then while true; do echo -n "" >"${TMP_PATH}/menu" @@ -159,7 +159,7 @@ function arcModel() { else [ ${COMPATIBLE} -eq 1 ] && echo -e "${M} \"\t$(printf "\Zb%-15s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "${A}" "${DTS}" "${IGPUS}" "${HBAS}" "${M_2_CACHE}" "${M_2_STORAGE}" "${USBS}" "${BETA}")\" ">>"${TMP_PATH}/menu" fi - done < <(cat "${TMP_PATH}/modellist") + done <"${TMP_PATH}/modellist" ARCCONF="$(readConfigKey "${MODEL:-SA6400}.serial" "${S_FILE}")" [ -n "${ARCCONF}" ] && MSG="Supported Models for your Hardware (x = supported / + = need Addons)\n$(printf "\Zb%-16s\Zn \Zb%-15s\Zn \Zb%-5s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "Model" "Platform" "DT" "Arc" "Intel iGPU" "HBA" "M.2 Cache" "M.2 Volume" "USB Mount" "Source")" || MSG="Supported Models for your Hardware (x = supported / + = need Addons) | Syno Models can have faulty Values.\n$(printf "\Zb%-16s\Zn \Zb%-15s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "Model" "Platform" "DT" "Intel iGPU" "HBA" "M.2 Cache" "M.2 Volume" "USB Mount" "Source")" [ -n "${ARCCONF}" ] && TITLEMSG="Arc Model" || TITLEMSG="Model" @@ -284,7 +284,7 @@ function arcVersion() { echo "${V}" >>"${TMP_PATH}/versions" fi PREV="${V}" - done < <(echo "${PVS}") + done <<<"$(echo "${PVS}")" DSMPVS="$(cat ${TMP_PATH}/versions)" dialog --backtitle "$(backtitlep)" --colors --title "Version" \ --no-items --menu "Choose a DSM Build" 0 0 0 ${DSMPVS} \ @@ -308,8 +308,8 @@ function arcVersion() { 2>"${TMP_PATH}/resp" RET=$? [ ${RET} -ne 0 ] && return - PAT_URL="$(cat "${TMP_PATH}/resp" | sed -n '1p')" - PAT_HASH="$(cat "${TMP_PATH}/resp" | sed -n '2p')" + PAT_URL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" + PAT_HASH="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" [ -n "${PAT_URL}" ] && [ -n "${PAT_HASH}" ] && VALID="true" && break done fi @@ -335,7 +335,7 @@ function arcVersion() { writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}" while IFS=': ' read -r KEY VALUE; do writeConfigKey "synoinfo.\"${KEY}\"" "${VALUE}" "${USER_CONFIG_FILE}" - done < <(readConfigMap "platforms.${PLATFORM}.synoinfo" "${P_FILE}") + done <<<"$(readConfigMap "platforms.${PLATFORM}.synoinfo" "${P_FILE}")" # Check Addons for Platform ADDONS="$(readConfigKey "addons" "${USER_CONFIG_FILE}")" DEVICENIC="$(readConfigKey "device.nic" "${USER_CONFIG_FILE}")" @@ -375,14 +375,14 @@ function arcVersion() { if ! checkAddonExist "${ADDON}" "${PLATFORM}"; then deleteConfigKey "addons.\"${ADDON}\"" "${USER_CONFIG_FILE}" fi - done < <(readConfigMap "addons" "${USER_CONFIG_FILE}") + done <<<"$(readConfigMap "addons" "${USER_CONFIG_FILE}")" KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")" [ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}" if [ -n "${PLATFORM}" ] && [ -n "${KVERP}" ]; then writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" - done < <(getAllModules "${PLATFORM}" "${KVERP}") + done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" fi # Check for Only Version if [ "${ONLYVERSION}" = "true" ]; then @@ -961,7 +961,7 @@ else A) networkdiag; NEXT="A" ;; # System Section # Arc Section - 4) [ "${ARCOPTS}" = "true" ] && ARCOPTS='false' || ARCOPTS='true' + 4) ARCOPTS=$([ "${ARCOPTS}" = "true" ] && echo 'false' || echo 'true') ARCOPTS="${ARCOPTS}" NEXT="4" ;; @@ -975,15 +975,15 @@ else P) storagepanelMenu; NEXT="P" ;; Q) sequentialIOMenu; NEXT="Q" ;; # Boot Section - 6) [ "${BOOTOPTS}" = "true" ] && BOOTOPTS='false' || BOOTOPTS='true' + 6) BOOTOPTS=$([ "${BOOTOPTS}" = "true" ] && echo 'false' || echo 'true') BOOTOPTS="${BOOTOPTS}" NEXT="6" ;; - m) [ "${KERNELLOAD}" = "kexec" ] && KERNELLOAD='power' || KERNELLOAD='kexec' + m) KERNELLOAD=$([ "${KERNELLOAD}" = "kexec" ] && echo 'power' || echo 'kexec') writeConfigKey "kernelload" "${KERNELLOAD}" "${USER_CONFIG_FILE}" NEXT="m" ;; - E) [ "${EMMCBOOT}" = "true" ] && EMMCBOOT='false' || EMMCBOOT='true' + E) EMMCBOOT=$([ "${EMMCBOOT}" = "true" ] && echo 'false' || echo 'true') if [ "${EMMCBOOT}" = "false" ]; then writeConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}" deleteConfigKey "synoinfo.disk_swap" "${USER_CONFIG_FILE}" @@ -1002,13 +1002,13 @@ else NEXT="E" ;; i) bootipwaittime; NEXT="i" ;; - q) [ "${DIRECTBOOT}" = "false" ] && DIRECTBOOT='true' || DIRECTBOOT='false' + q) DIRECTBOOT=$([ "${DIRECTBOOT}" = "true" ] && echo 'false' || echo 'true') grub-editenv ${USER_GRUBENVFILE} create writeConfigKey "directboot" "${DIRECTBOOT}" "${USER_CONFIG_FILE}" NEXT="q" ;; # DSM Section - 7) [ "${DSMOPTS}" = "true" ] && DSMOPTS='false' || DSMOPTS='true' + 7) DSMOPTS=$([ "${DSMOPTS}" = "true" ] && echo 'false' || echo 'true') DSMOPTS="${DSMOPTS}" NEXT="7" ;; @@ -1022,7 +1022,7 @@ else M) mountDSM; NEXT="M" ;; T) disablescheduledTasks; NEXT="T" ;; Z) loaderPorts; NEXT="Z" ;; - K) [ "${KERNEL}" = "official" ] && KERNEL='custom' || KERNEL='official' + K) KERNEL=$([ "${KERNEL}" = "official" ] && echo 'custom' || echo 'official') writeConfigKey "kernel" "${KERNEL}" "${USER_CONFIG_FILE}" dialog --backtitle "$(backtitle)" --title "Kernel" \ --infobox "Switching Kernel to ${KERNEL}! Stay patient..." 4 50 @@ -1038,13 +1038,13 @@ else writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.\"${ID}\"" "" "${USER_CONFIG_FILE}" - done < <(getAllModules "${PLATFORM}" "${KVERP}") + done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" fi writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="K" ;; - H) [ "${HDDSORT}" = "true" ] && HDDSORT='false' || HDDSORT='true' + H) HDDSORT=$([ "${HDDSORT}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "hddsort" "${HDDSORT}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1062,7 +1062,7 @@ else BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="h" ;; - O) [ "${ODP}" = "false" ] && ODP='true' || ODP='false' + O) ODP=$([ "${ODP}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1070,25 +1070,25 @@ else ;; B) getbackup; NEXT="B" ;; # Loader Section - 8) [ "${LOADEROPTS}" = "true" ] && LOADEROPTS='false' || LOADEROPTS='true' + 8) LOADEROPTS=$([ "${LOADEROPTS}" = "true" ] && echo 'false' || echo 'true') LOADEROPTS="${LOADEROPTS}" NEXT="8" ;; D) staticIPMenu; NEXT="D" ;; - c) [ "${ARCOFFLINE}" = "true" ] && ARCOFFLINE='false' || ARCOFFLINE='true' + c) ARCOFFLINE=$([ "${ARCOFFLINE}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "arc.offline" "${ARCOFFLINE}" "${USER_CONFIG_FILE}" - [ "${ARCOFFLINE}" = "false" ] && exec arc.sh + [ "${ARCOFFLINE}" = "false" ] && exec "${ARC_PATH}/arc.sh" NEXT="c" ;; f) bootScreen; NEXT="f" ;; - W) [ "${RD_COMPRESSED}" = "true" ] && RD_COMPRESSED='false' || RD_COMPRESSED='true' + W) RD_COMPRESSED=$([ "${RD_COMPRESSED}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="W" ;; X) satadomMenu; NEXT="X" ;; - u) [ "${LKM}" = "prod" ] && LKM='dev' || LKM='prod' + u) LKM=$([ "${LKM}" = "prod" ] && echo 'dev' || echo 'prod') writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" diff --git a/files/initrd/opt/arc/boot.sh b/files/initrd/opt/arc/boot.sh index e93a9d03..b1b4a532 100755 --- a/files/initrd/opt/arc/boot.sh +++ b/files/initrd/opt/arc/boot.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" # Clear logs for dbgutils addons rm -rf "${PART1_PATH}/logs" >/dev/null 2>&1 || true @@ -189,7 +189,7 @@ fi # Cmdline NIC Settings ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) ETHM=$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null) -ETHN=$(echo ${ETHX} | wc -w) +ETHN=$(echo "${ETHX}" | wc -w) [ -z "${ETHM}" ] && ETHM=${ETHN} NIC=0 for N in ${ETHX}; do @@ -203,16 +203,16 @@ CMDLINE['netif_num']="${NIC}" # Read user network settings while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && CMDLINE["network.${KEY}"]="${VALUE}" -done < <(readConfigMap "network" "${USER_CONFIG_FILE}") +done <<<"$(readConfigMap "network" "${USER_CONFIG_FILE}")" # Read user cmdline while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}" -done < <(readConfigMap "cmdline" "${USER_CONFIG_FILE}") +done <<<"$(readConfigMap "cmdline" "${USER_CONFIG_FILE}")" # Prepare command line CMDLINE_LINE="" -for KEY in ${!CMDLINE[@]}; do +for KEY in "${!CMDLINE[@]}"; do VALUE="${CMDLINE[${KEY}]}" CMDLINE_LINE+=" ${KEY}" [ -n "${VALUE}" ] && CMDLINE_LINE+="=${VALUE}" @@ -223,14 +223,14 @@ echo "${CMDLINE_LINE}" >"${PART1_PATH}/cmdline.yml" function _bootwait() { # Exec Bootwait to check SSH/Web connection BOOTWAIT=5 - busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB + w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB MSG="" - while test ${BOOTWAIT} -ge 0; do + while [ ${BOOTWAIT} -ge 0 ]; do MSG="\033[1;33mAccess SSH/Web will interrupt boot...\033[0m" - echo -en "\r${MSG}" - busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC + printf "\r${MSG}" + w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC if ! diff WB WC >/dev/null 2>&1; then - echo -en "\r\033[1;33mAccess SSH/Web detected and boot is interrupted.\033[0m\n" + printf "\r\033[1;33mAccess SSH/Web detected and boot is interrupted.\033[0m\n" rm -f WB WC exit 0 fi @@ -238,7 +238,7 @@ function _bootwait() { BOOTWAIT=$((BOOTWAIT - 1)) done rm -f WB WC - echo -en "\r$(printf "%$((${#MSG} * 2))s" " ")\n" + printf "\r%$((${#MSG} * 2))s\n" " " return 0 } @@ -249,7 +249,7 @@ if [ "${DIRECTBOOT}" = "true" ]; then grub-editenv ${USER_GRUBENVFILE} set dsm_cmdline="${CMDLINE_DIRECT}" grub-editenv ${USER_GRUBENVFILE} set next_entry="direct" _bootwait || true - echo -e "\033[1;34mReboot with Directboot\033[0m" + printf "\033[1;34mReboot with Directboot\033[0m" reboot exit 0 elif [ "${DIRECTBOOT}" = "false" ]; then @@ -257,12 +257,12 @@ elif [ "${DIRECTBOOT}" = "false" ]; then grub-editenv ${USER_GRUBENVFILE} unset next_entry KERNELLOAD="$(readConfigKey "kernelload" "${USER_CONFIG_FILE}")" BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")" - [ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30 + BOOTIPWAIT=${BOOTIPWAIT:-20} IPCON="" if [ "${ARCPATCH}" = "true" ]; then - echo -e "\033[1;37mDetected ${ETHN} NIC\033[0m | \033[1;34mUsing ${NIC} NIC for Arc Patch:\033[0m" + printf "\033[1;37mDetected ${ETHN} NIC\033[0m | \033[1;34mUsing ${NIC} NIC for Arc Patch:\033[0m" else - echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m" + printf "\033[1;37mDetected ${ETHN} NIC:\033[0m" fi echo [ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true @@ -272,27 +272,27 @@ elif [ "${DIRECTBOOT}" = "false" ]; then DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do if [ "0" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" + printf "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" break fi - COUNT=$((${COUNT} + 1)) - IP="$(getIP ${N})" + COUNT=$(($COUNT + 1)) + IP="$(getIP "${N}")" if [ -n "${IP}" ]; then SPEED=$(ethtool ${N} 2>/dev/null | grep "Speed:" | awk '{print $2}') - if [[ "${IP}" =~ ^169\.254\..* ]]; then - echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" + if echo "${IP}" | grep -q "^169\.254\."; then + printf "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" else - echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" + printf "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" [ -z "${IPCON}" ] && IPCON="${IP}" fi break fi if [ -z "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m" + printf "\r${DRIVER}: \033[1;37mDOWN\033[0m" break fi if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" + printf "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" break fi sleep 1 @@ -302,23 +302,23 @@ elif [ "${DIRECTBOOT}" = "false" ]; then DSMLOGO="$(readConfigKey "boot.dsmlogo" "${USER_CONFIG_FILE}")" if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ]; then - [[ "${IPCON}" =~ ^169\.254\..* ]] && IPCON="" + echo "${IPCON}" | grep -q "^169\.254\." && IPCON="" [ -n "${IPCON}" ] && URL="http://${IPCON}:5000" || URL="http://find.synology.com/" - python ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png" + python3 ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png" [ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>/dev/null || true fi for T in $(w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do if [ -w "/dev/${T}" ]; then - [ -n "${IPCON}" ] && echo -e "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\n" >"/dev/${T}" 2>/dev/null || echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\nNo IP found.\033[0m\n" >"/dev/${T}" 2>/dev/null + [ -n "${IPCON}" ] && printf "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\n" >"/dev/${T}" 2>/dev/null || echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\nNo IP found.\033[0m\n" >"/dev/${T}" 2>/dev/null fi done - echo -e "\033[1;37mLoading DSM Kernel...\033[0m" + printf "\033[1;37mLoading DSM Kernel...\033[0m" # Executes DSM kernel via KEXEC KEXECARGS="-a" if [ $(echo "${KVER:-4}" | cut -d'.' -f1) -lt 4 ] && [ ${EFI} -eq 1 ]; then - echo -e "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m" + printf "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m" KEXECARGS+=" --noefi" fi kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog diff --git a/files/initrd/opt/arc/bzImage-to-vmlinux.sh b/files/initrd/opt/arc/bzImage-to-vmlinux.sh index 5241e925..59c19214 100755 --- a/files/initrd/opt/arc/bzImage-to-vmlinux.sh +++ b/files/initrd/opt/arc/bzImage-to-vmlinux.sh @@ -1,16 +1,16 @@ #!/usr/bin/env bash read_u8() { - dd if=$1 bs=1 skip=$(($2)) count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' + dd if="${1}" bs=1 skip="$((${2}))" count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' } read_u32() { - dd if=$1 bs=1 skip=$(($2)) count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' + dd if="${1}" bs=1 skip="$((${2}))" count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' } set -x -setup_size=$(read_u8 $1 0x1f1) -payload_offset=$(read_u32 $1 0x248) -payload_length=$(read_u32 $1 0x24c) -inner_pos=$((($setup_size + 1) * 512)) +setup_size=$(read_u8 "${1}" 0x1f1) +payload_offset=$(read_u32 "${1}" 0x248) +payload_length=$(read_u32 "${1}" 0x24c) +inner_pos=$(((setup_size + 1) * 512)) -tail -c+$(($inner_pos + 1)) $1 | tail -c+$(($payload_offset + 1)) | head -c $(($payload_length)) | head -c $(($payload_length - 4)) | unlzma >$2 \ No newline at end of file +tail -c+$((inner_pos + 1)) "${1}" | tail -c+$((payload_offset + 1)) | head -c "${payload_length}" | head -c $((payload_length - 4)) | unlzma >"${2}" \ No newline at end of file diff --git a/files/initrd/opt/arc/calc_run_size.sh b/files/initrd/opt/arc/calc_run_size.sh index e648b837..dc5a3f4b 100755 --- a/files/initrd/opt/arc/calc_run_size.sh +++ b/files/initrd/opt/arc/calc_run_size.sh @@ -7,28 +7,22 @@ # objdump -h a.out | sh calc_run_size.sh NUM='\([0-9a-fA-F]*[ \t]*\)' -OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p') -if [ -z "$OUT" ]; then +OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/0x\1 0x\4/p') + +if [ -z "${OUT}" ]; then echo "Never found .bss or .brk file offset" >&2 exit 1 fi -OUT=$(echo ${OUT# }) -sizeA=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -offsetA=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -sizeB=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -offsetB=$(printf "%d" 0x${OUT%% *}) +read -r sizeA offsetA sizeB offsetB <<<$(echo ${OUT} | awk '{printf "%d %d %d %d", strtonum($1), strtonum($2), strtonum($3), strtonum($4)}') -run_size=$((${offsetA} + ${sizeA} + ${sizeB})) +runSize=$((offsetA + sizeA + sizeB)) # BFD linker shows the same file offset in ELF. if [ "${offsetA}" -ne "${offsetB}" ]; then # Gold linker shows them as consecutive. - endB=$((${offsetB} + ${sizeB})) - if [ "$endB" != "$run_size" ]; then + endSize=$((offsetB + sizeB)) + if [ "${endSize}" -ne "${runSize}" ]; then printf "sizeA: 0x%x\n" ${sizeA} >&2 printf "offsetA: 0x%x\n" ${offsetA} >&2 printf "sizeB: 0x%x\n" ${sizeB} >&2 @@ -38,5 +32,5 @@ if [ "${offsetA}" -ne "${offsetB}" ]; then fi fi -printf "%d\n" ${run_size} +printf "%d\n" ${runSize} exit 0 \ No newline at end of file diff --git a/files/initrd/opt/arc/extract-vmlinux b/files/initrd/opt/arc/extract-vmlinux index 8995cd30..94c56c08 100755 --- a/files/initrd/opt/arc/extract-vmlinux +++ b/files/initrd/opt/arc/extract-vmlinux @@ -10,38 +10,34 @@ # # ---------------------------------------------------------------------- -check_vmlinux() -{ - # Use readelf to check if it's a valid ELF - # TODO: find a better to way to check that it's really vmlinux - # and not just an elf - readelf -h $1 > /dev/null 2>&1 || return 1 +check_vmlinux() { + # Use readelf to check if it's a valid ELF + # TODO: find a better to way to check that it's really vmlinux + # and not just an elf + readelf -h $1 >/dev/null 2>&1 || return 1 - cat $1 - exit 0 + cat $1 + exit 0 } -try_decompress() -{ - # The obscure use of the "tr" filter is to work around older versions of - # "grep" that report the byte offset of the line instead of the pattern. +try_decompress() { + # The obscure use of the "tr" filter is to work around older versions of + # "grep" that report the byte offset of the line instead of the pattern. - # Try to find the header ($1) and decompress from here - for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` - do - pos=${pos%%:*} - tail -c+$pos "$img" | $3 > $tmp 2> /dev/null - check_vmlinux $tmp - done + # Try to find the header ($1) and decompress from here + for pos in $(tr "$1\n$2" "\n$2=" <"$img" | grep -abo "^$2"); do + pos=${pos%%:*} + tail -c+$pos "$img" | $3 >$tmp 2>/dev/null + check_vmlinux $tmp + done } # Check invocation: me=${0##*/} img=$1 -if [ $# -ne 1 -o ! -s "$img" ] -then - echo "Usage: $me " >&2 - exit 2 +if [ $# -ne 1 ] || [ ! -s "$img" ]; then + echo "Usage: $me " >&2 + exit 2 fi # Prepare temp files: @@ -61,4 +57,4 @@ try_decompress '(\265/\375' xxx unzstd check_vmlinux $img # Bail out: -echo "$me: Cannot find vmlinux." >&2 +echo "$me: Cannot find vmlinux." >&2 \ No newline at end of file diff --git a/files/initrd/opt/arc/include/addons.sh b/files/initrd/opt/arc/include/addons.sh index 5bbb12b3..8bd2a730 100755 --- a/files/initrd/opt/arc/include/addons.sh +++ b/files/initrd/opt/arc/include/addons.sh @@ -8,9 +8,9 @@ function availableAddons() { fi local ARCOFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")" local ARCCONF="$(readConfigKey "${MODEL}.serial" "${S_FILE}")" - for D in $(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort); do + while read -r D; do [ ! -f "${D}/manifest.yml" ] && continue - local ADDON=$(basename ${D}) + local ADDON=$(basename "${D}") local AVAILABLE="$(readConfigKey "${1}" "${D}/manifest.yml")" [ "${AVAILABLE}" = false ] && continue local SYSTEM=$(readConfigKey "system" "${D}/manifest.yml") @@ -37,7 +37,7 @@ function availableAddons() { else [ "${AVAILABLE}" = true ] && echo -e "${ADDON}\t${BETA}${DESC}" fi - done + done <<<"$(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort)" } ############################################################################### @@ -76,7 +76,7 @@ function installAddon() { [ ${HAS_FILES} -ne 1 ] && return 1 cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}" chmod +x "${RAMDISK_PATH}/addons/${ADDON}.sh" - [ -d ${TMP_PATH}/${ADDON}/root ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}") + [ -d "${TMP_PATH}/${ADDON}/root" ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}") rm -rf "${TMP_PATH}/${ADDON}" return 0 } @@ -84,7 +84,7 @@ function installAddon() { ############################################################################### # Untar an addon to correct path # 1 - Addon file path -# Return name of addon on sucess or empty on error +# Return name of addon on success or empty on error function untarAddon() { if [ -z "${1}" ]; then echo "" @@ -92,23 +92,24 @@ function untarAddon() { fi rm -rf "${TMP_PATH}/addon" mkdir -p "${TMP_PATH}/addon" - tar -xaf "${1}" -C "${TMP_PATH}/addon" || return + tar -xaf "${1}" -C "${TMP_PATH}/addon" || return 1 local ADDON=$(readConfigKey "name" "${TMP_PATH}/addon/manifest.yml") - [ -z "${ADDON}" ] && return + [ -z "${ADDON}" ] && return 1 rm -rf "${ADDONS_PATH}/${ADDON}" mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${ADDON}" echo "${ADDON}" + return 0 } ############################################################################### # Detect if has new local plugins to install/reinstall function updateAddon() { - for F in $(ls ${ADDONS_PATH}/*.addon 2>/dev/null); do + while read -r F; do local ADDON=$(basename "${F}" | sed 's|.addon||') rm -rf "${ADDONS_PATH}/${ADDON}" mkdir -p "${ADDONS_PATH}/${ADDON}" echo "Installing ${F} to ${ADDONS_PATH}/${ADDON}" tar -xaf "${F}" -C "${ADDONS_PATH}/${ADDON}" rm -f "${F}" - done + done <<<"$(ls ${ADDONS_PATH}/*.addon 2>/dev/null)" } diff --git a/files/initrd/opt/arc/include/configFile.sh b/files/initrd/opt/arc/include/configFile.sh index 06d99cfc..0d6df4f4 100755 --- a/files/initrd/opt/arc/include/configFile.sh +++ b/files/initrd/opt/arc/include/configFile.sh @@ -4,7 +4,7 @@ # 1 - Path of Key # 2 - Path of yaml config file function deleteConfigKey() { - yq eval 'del(.'${1}')' --inplace "${2}" 2>/dev/null + yq eval "del(.${1})" --inplace "${2}" 2>/dev/null } ############################################################################### @@ -13,7 +13,8 @@ function deleteConfigKey() { # 2 - Value # 3 - Path of yaml config file function writeConfigKey() { - [ "${2}" = "{}" ] && yq eval '.'${1}' = {}' --inplace "${3}" 2>/dev/null || yq eval '.'${1}' = "'"${2}"'"' --inplace "${3}" 2>/dev/null + local value="${2}" + [ "${value}" = "{}" ] && yq eval ".${1} = {}" --inplace "${3}" 2>/dev/null || yq eval ".${1} = \"${value}\"" --inplace "${3}" 2>/dev/null } ############################################################################### @@ -22,8 +23,20 @@ function writeConfigKey() { # 2 - Path of yaml config file # Return Value function readConfigKey() { - RESULT=$(yq eval '.'${1}' | explode(.)' "${2}" 2>/dev/null) - [ "${RESULT}" = "null" ] && echo "" || echo "${RESULT}" + local result=$(yq eval ".${1} | explode(.)" "${2}" 2>/dev/null) + [ "${result}" = "null" ] && echo "" || echo "${result}" +} + +############################################################################### +# Write to yaml config file +# 1 - format +# 2 - string +# 3 - Path of yaml config file +function mergeConfigStr() { + local xmlfile=$(mktemp) + echo "${2}" | yq -p "${1}" -o y >"${xmlfile}" + yq eval-all --inplace '. as $item ireduce ({}; . * $item)' --inplace "${3}" "${xmlfile}" 2>/dev/null + rm -f "${xmlfile}" } ############################################################################### @@ -41,7 +54,7 @@ function initConfigKey() { # 2 - Path of yaml config file # Returns map of values function readConfigMap() { - yq eval '.'${1}' | explode(.) | to_entries | map([.key, .value] | join(": ")) | .[]' "${2}" 2>/dev/null + yq eval ".${1} | explode(.) | to_entries | map([.key, .value] | join(\": \")) | .[]" "${2}" 2>/dev/null } ############################################################################### @@ -50,7 +63,7 @@ function readConfigMap() { # 2 - Path of yaml config file # Returns array/map of values function readConfigArray() { - yq eval '.'${1}'[]' "${2}" 2>/dev/null + yq eval ".${1}[]" "${2}" 2>/dev/null } ############################################################################### @@ -59,7 +72,7 @@ function readConfigArray() { # 2 - Path of yaml config file # Returns array of values function readConfigEntriesArray() { - yq eval '.'${1}' | explode(.) | to_entries | map([.key])[] | .[]' "${2}" 2>/dev/null + yq eval ".${1} | explode(.) | to_entries | map([.key])[] | .[]" "${2}" 2>/dev/null } ############################################################################### diff --git a/files/initrd/opt/arc/include/functions.sh b/files/initrd/opt/arc/include/functions.sh index 3765868b..2fb981ea 100755 --- a/files/initrd/opt/arc/include/functions.sh +++ b/files/initrd/opt/arc/include/functions.sh @@ -1,13 +1,13 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/consts.sh -. ${ARC_PATH}/include/configFile.sh -. ${ARC_PATH}/include/addons.sh +. "${ARC_PATH}/include/consts.sh" +. "${ARC_PATH}/include/configFile.sh" +. "${ARC_PATH}/include/addons.sh" ############################################################################### # Check loader disk function checkBootLoader() { - while read KNAME RO; do + while read -r KNAME RO; do [ -z "${KNAME}" ] && continue [ "${RO}" = "0" ] && continue hdparm -r0 "${KNAME}" >/dev/null 2>&1 || true @@ -40,48 +40,41 @@ function dieLog() { } ############################################################################### -# Check if a item exists into array +# Check if an item exists in an array # 1 - Item # 2.. - Array # Return 0 if exists function arrayExistItem() { - EXISTS=1 - ITEM="${1}" + local ITEM="${1}" shift for i in "$@"; do - [ "${i}" = "${ITEM}" ] || continue - EXISTS=0 - break + [ "${i}" = "${ITEM}" ] && return 0 done - return ${EXISTS} + return 1 } ############################################################################### # Generate a number with 6 digits from 1 to 30000 function random() { - printf "%06d" $((${RANDOM} % 30000 + 1)) + printf "%06d" $((RANDOM % 30000 + 1)) } ############################################################################### -# Generate a hexa number from 0x00 to 0xFF +# Generate a hex number from 0x00 to 0xFF function randomhex() { - printf "&02X" "$((${RANDOM} % 255 + 1))" + printf "%02X" $((RANDOM % 255 + 1)) } ############################################################################### # Generate a random letter function genRandomLetter() { - for i in A B C D E F G H J K L M N P Q R S T V W X Y Z; do - echo ${i} - done | sort -R | tail -1 + echo {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1 } ############################################################################### # Generate a random digit (0-9A-Z) function genRandomValue() { - for i in 0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T V W X Y Z; do - echo ${i} - done | sort -R | tail -1 + echo {0..9} {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1 } ############################################################################### @@ -90,6 +83,7 @@ function genRandomValue() { # 2 - Arc # Returns serial number function generateSerial() { + local PREFIX MIDDLE SUFFIX SERIAL PREFIX="$(readConfigArray "${1}.prefix" "${S_FILE}" 2>/dev/null | sort -R | tail -1)" MIDDLE="$(readConfigArray "${1}.middle" "${S_FILE}" 2>/dev/null | sort -R | tail -1)" if [ "${2}" = "true" ]; then @@ -111,7 +105,7 @@ function generateSerial() { ;; esac - SERIAL="$(echo "${SERIAL}" | tr '[:lower:]' '[:upper:]')" + local SERIAL="$(echo "${SERIAL}" | tr '[:lower:]' '[:upper:]')" echo "${SERIAL}" return 0 } @@ -123,16 +117,17 @@ function generateSerial() { # 3 - Arc MAC # Returns serial number function generateMacAddress() { + local MACPRE MACSUF NUM MACS MACPRE="$(readConfigKey "${1}.macpre" "${S_FILE}")" if [ "${3}" = "true" ]; then MACSUF="$(readConfigKey "${1}.mac" "${S_FILE}" 2>/dev/null)" else - MACSUF="$(printf '%02x%02x%02x' $((${RANDOM} % 256)) $((${RANDOM} % 256)) $((${RANDOM} % 256)))" + MACSUF="$(printf '%02x%02x%02x' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))" fi NUM=${2:-1} local MACS="" for I in $(seq 1 ${NUM}); do - MACS+="$(printf '%06x%06x' $((0x${MACPRE:-"001132"})) $(($((0x${MACSUF})) + ${I})))" + MACS+="$(printf '%06x%06x' $((0x${MACPRE:-"001132"})) $((0x${MACSUF} + I)))" [ ${I} -lt ${NUM} ] && MACS+=" " done @@ -147,6 +142,7 @@ function generateMacAddress() { # 2 - Serial number to test # Returns 1 if serial number is invalid function validateSerial() { + local PREFIX MIDDLE SUFFIX P M S L PREFIX="$(readConfigArray "${1}.prefix" "${S_FILE}" 2>/dev/null)" MIDDLE="$(readConfigArray "${1}.middle" "${S_FILE}" 2>/dev/null)" SUFFIX="$(readConfigKey "${1}.suffix" "${S_FILE}" 2>/dev/null)" @@ -178,29 +174,12 @@ function validateSerial() { return 0 } -############################################################################### -# Check if a item exists into array -# 1 - Item -# 2.. - Array -# Return 0 if exists -function arrayExistItem() { - EXISTS=1 - ITEM="${1}" - shift - for i in "$@"; do - [ "${i}" = "${ITEM}" ] || continue - EXISTS=0 - break - done - return ${EXISTS} -} - ############################################################################### # Get values in .conf K=V file # 1 - key # 2 - file function _get_conf_kv() { - grep "${1}" "${2}" | sed "s|^${1}=\"\(.*\)\"$|\1|g" + grep "^${1}=" "${2}" 2>/dev/null | cut -d'=' -f2- | sed 's/^"//;s/"$//' 2>/dev/null } ############################################################################### @@ -211,46 +190,57 @@ function _get_conf_kv() { function _set_conf_kv() { # Delete if [ -z "${2}" ]; then - sed -i "${3}" -e "s/^${1}=.*$//" + sed -i "/^${1}=/d" "${3}" 2>/dev/null return $?; fi # Replace if grep -q "^${1}=" "${3}"; then - sed -i "${3}" -e "s\"^${1}=.*\"${1}=\\\"${2}\\\"\"" + sed -i "s#^${1}=.*#${1}=\"${2}\"#" "${3}" 2>/dev/null return $? fi # Add if doesn't exist echo "${1}=\"${2}\"" >>"${3}" + return $? } ############################################################################### -# sort netif busid +# sort netif name +# @1 -mac1,mac2,mac3... function _sort_netif() { local ETHLIST="" - local ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) + local ETHX="$(ls /sys/class/net/ 2>/dev/null | grep eth)" # real network cards list for N in ${ETHX}; do local MAC="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g; s/.*/\L&/')" local BUS="$(ethtool -i ${N} 2>/dev/null | grep bus-info | cut -d' ' -f2)" ETHLIST="${ETHLIST}${BUS} ${MAC} ${N}\n" done + local ETHLISTTMPM="" local ETHLISTTMPB="$(echo -e "${ETHLIST}" | sort)" - local ETHLIST="$(echo -e "${ETHLISTTMPB}" | grep -v '^$')" + if [ -n "${1}" ]; then + local MACS="$(echo "${1}" | sed 's/://g; s/,/ /g; s/.*/\L&/')" + for MACX in ${MACS}; do + ETHLISTTMPM="${ETHLISTTMPM}$(echo -e "${ETHLISTTMPB}" | grep "${MACX}")\n" + ETHLISTTMPB="$(echo -e "${ETHLISTTMPB}" | grep -v "${MACX}")\n" + done + fi + ETHLIST="$(echo -e "${ETHLISTTMPM}${ETHLISTTMPB}" | grep -v '^$')" local ETHSEQ="$(echo -e "${ETHLIST}" | awk '{print $3}' | sed 's/eth//g')" local ETHNUM="$(echo -e "${ETHLIST}" | wc -l)" + # echo "${ETHSEQ}" # sort if [ ! "${ETHSEQ}" = "$(seq 0 $((${ETHNUM:0} - 1)))" ]; then /etc/init.d/S41dhcpcd stop >/dev/null 2>&1 /etc/init.d/S40network stop >/dev/null 2>&1 for i in $(seq 0 $((${ETHNUM:0} - 1))); do - ip link set dev eth${i} name tmp${i} + ip link set dev "eth${i}" name "tmp${i}" done I=0 for i in ${ETHSEQ}; do - ip link set dev tmp${i} name eth${I} - I=$((${I} + 1)) + ip link set dev "tmp${i}" name "eth${I}" + I=$((I + 1)) done /etc/init.d/S40network start >/dev/null 2>&1 /etc/init.d/S41dhcpcd start >/dev/null 2>&1 @@ -277,19 +267,12 @@ function getBus() { # 1 - ethN function getIP() { local IP="" - MACR="$(cat /sys/class/net/${1}/address 2>/dev/null | sed 's/://g' | tr '[:lower:]' '[:upper:]')" - IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" - if [ -n "${IPR}" ]; then - IFS='/' read -r -a IPRA <<<"${IPR}" - IP=${IPRA[0]} + if [ -n "${1}" ] && [ -d "/sys/class/net/${1}" ]; then + IP=$(ip route show dev "${1}" 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') + [ -z "${IP}" ] && IP=$(ip addr show "${1}" scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) else - if [ -n "${1}" ] && [ -d "/sys/class/net/${1}" ]; then - IP=$(ip route show dev ${1} 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') - [ -z "${IP}" ] && IP=$(ip addr show ${1} scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) - else - IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1) - [ -z "${IP}" ] && IP=$(ip addr show scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) - fi + IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1) + [ -z "${IP}" ] && IP=$(ip addr show scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) fi echo "${IP}" return 0 @@ -301,8 +284,11 @@ function getIP() { function getLogo() { local MODEL="${1}" rm -f "${PART3_PATH}/logo.png" - STATUS=$(curl -skL -m 10 -w "%{http_code}" "https://www.synology.com/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png") - if [ $? -ne 0 -o ${STATUS:-0} -ne 200 -o ! -f "${PART3_PATH}/logo.png" ]; then + if [ $? -ne 0 ]; then + return 1 + fi + local STATUS=$(curl -skL --connect-timeout 10 -w "%{http_code}" "https://www.synology.com/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png") + if [ $? -ne 0 ] || [ "${STATUS:-0}" -ne 200 ] || [ ! -f "${PART3_PATH}/logo.png" ]; then rm -f "${PART3_PATH}/logo.png" return 1 fi @@ -339,53 +325,83 @@ function convert_netmask() { # 1 - key name # 2 - key string function checkCmdline() { - return $(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | grep -q "${2}") + grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep -q "^${1}=\"\?${2}\"\?" } ############################################################################### -# get logo of model +# set Cmdline # 1 - key name # 2 - key string function setCmdline() { [ -z "${1}" ] && return 1 if [ -n "${2}" ]; then - grub-editenv ${USER_GRUBENVFILE} set "${1}=${2}" + grub-editenv "${USER_GRUBENVFILE}" set "${1}=${2}" else - grub-editenv ${USER_GRUBENVFILE} unset "${1}" + grub-editenv "${USER_GRUBENVFILE}" unset "${1}" fi } ############################################################################### -# get logo of model -# check Cmdline +# add Cmdline # 1 - key name # 2 - key string function addCmdline() { - local CMDLINE="$(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2-)" + local CMDLINE + CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')" [ -n "${CMDLINE}" ] && CMDLINE="${CMDLINE} ${2}" || CMDLINE="${2}" setCmdline "${1}" "${CMDLINE}" } ############################################################################### -# get logo of model -# 1 - model +# del Cmdline +# 1 - key name +# 2 - key string function delCmdline() { - local CMDLINE="$(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2-)" - CMDLINE="$(echo "${CMDLINE}" | sed "s/ *${2}//; s/^[[:space:]]*//;s/[[:space:]]*$//")" + local CMDLINE + CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')" + CMDLINE="$(echo "${CMDLINE}" | sed "s/[ \t]*${2}//; s/^[ \t]*//;s/[ \t]*$//")" setCmdline "${1}" "${CMDLINE}" } +############################################################################### +# check CPU Intel(VT-d)/AMD(AMD-Vi) +function checkCPU_VT_d() { + lsmod | grep -q msr || modprobe msr 2>/dev/null + if grep -q "GenuineIntel" /proc/cpuinfo; then + local VT_D_ENABLED=$(rdmsr 0x3a 2>/dev/null) + [ "$((${VT_D_ENABLED:-0x0} & 0x5))" -eq $((0x5)) ] && return 0 + elif grep -q "AuthenticAMD" /proc/cpuinfo; then + local IOMMU_ENABLED=$(rdmsr 0xC0010114 2>/dev/null) + [ "$((${IOMMU_ENABLED:-0x0} & 0x1))" -eq $((0x1)) ] && return 0 + else + return 1 + fi +} +############################################################################### +# check BIOS Intel(VT-d)/AMD(AMD-Vi) +function checkBIOS_VT_d() { + if grep -q "GenuineIntel" /proc/cpuinfo; then + dmesg | grep -iq "DMAR-IR.*DRHD base" && return 0 + elif grep -q "AuthenticAMD" /proc/cpuinfo; then + # TODO: need check + dmesg | grep -iq "AMD-Vi.*enabled" && return 0 + else + return 1 + fi +} + ############################################################################### # Rebooting # (based on pocopico's TCRP code) function rebootTo() { local MODES="config recovery junior automated update bios memtest" - [ -z "${1}" ] && exit 1 - if ! echo "${MODES}" | grep -qw "${1}"; then exit 1; fi - [ "${1}" = "automated" ] && echo "arc-${MODEL}-${PRODUCTVER}-${ARC_VERSION}" >"${PART3_PATH}/automated" - [ ! -f "${USER_GRUBENVFILE}" ] && grub-editenv ${USER_GRUBENVFILE} create - # echo -e "Rebooting to ${1} mode..." - grub-editenv ${USER_GRUBENVFILE} set next_entry="${1}" + if [ -z "${1}" ] || ! echo "${MODES}" | grep -qw "${1}"; then exit 1; fi + # echo "Rebooting to ${1} mode" + GRUBPATH="$(dirname "$(find "${PART1_PATH}/" -name grub.cfg 2>/dev/null | head -1)")" + [ -z "${GRUBPATH}" ] && exit 1 + ENVFILE="${GRUBPATH}/grubenv" + [ ! -f "${ENVFILE}" ] && grub-editenv "${ENVFILE}" create + grub-editenv "${ENVFILE}" set next_entry="${1}" exec reboot } diff --git a/files/initrd/opt/arc/include/modules.sh b/files/initrd/opt/arc/include/modules.sh index 9c45df4c..78266975 100755 --- a/files/initrd/opt/arc/include/modules.sh +++ b/files/initrd/opt/arc/include/modules.sh @@ -1,3 +1,37 @@ +############################################################################### +# Unpack modules from a tgz file +# 1 - Platform +# 2 - Kernel Version +function unpackModules() { + local PLATFORM=${1} + local KVER=${2} + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + fi +} + +############################################################################### +# Packag modules to a tgz file +# 1 - Platform +# 2 - Kernel Version +function packagModules() { + local PLATFORM=${1} + local KVER=${2} + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + + if [ "${KERNEL}" = "custom" ]; then + tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + else + tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + fi +} + ############################################################################### # Return list of all modules available # 1 - Platform @@ -7,26 +41,19 @@ function getAllModules() { local KVER=${2} if [ -z "${PLATFORM}" ] || [ -z "${KVER}" ]; then - echo "" return 1 fi - # Unzip modules for temporary folder - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - fi - # Get list of all modules + + unpackModules "${PLATFORM}" "${KVER}" + for F in $(ls ${TMP_PATH}/modules/*.ko 2>/dev/null); do - local X=$(basename ${F}) + local X=$(basename "${F}") local M=${X:0:-3} - local DESC=$(modinfo ${F} | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}') + local DESC=$(modinfo "${F}" 2>/dev/null | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}') [ -z "${DESC}" ] && DESC="${X}" echo "${M} \"${DESC}\"" done + rm -rf "${TMP_PATH}/modules" } @@ -45,30 +72,22 @@ function installModules() { echo "ERROR: installModules: Platform or Kernel Version not defined" >"${LOG_FILE}" return 1 fi - # Unzip modules for temporary folder - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}" - fi - if [ $? -ne 0 ]; then - return 1 - fi + + unpackModules "${PLATFORM}" "${KVER}" local ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")" for F in $(ls "${TMP_PATH}/modules/"*.ko 2>/dev/null); do - local M=$(basename ${F}) - [ "${ODP}" = "true" -a -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue + local M=$(basename "${F}") + [ "${ODP}" == "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue if echo "${MLIST}" | grep -wq "${M:0:-3}"; then cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}" else rm -f "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}" fi done + mkdir -p "${RAMDISK_PATH}/usr/lib/firmware" + local KERNEL=$(readConfigKey "kernel" "${USER_CONFIG_FILE}") if [ "${KERNEL}" = "custom" ]; then tar -zxf "${CUSTOM_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}" else @@ -78,7 +97,6 @@ function installModules() { return 1 fi - # Clean rm -rf "${TMP_PATH}/modules" return 0 } @@ -97,21 +115,12 @@ function addToModules() { echo "" return 1 fi - # Unzip modules for temporary folder - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - fi - cp -f ${KOFILE} ${TMP_PATH}/modules - if [ "${KERNEL}" = "custom" ]; then - tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - else - tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - fi + + unpackModules "${PLATFORM}" "${KVER}" + + cp -f "${KOFILE}" "${TMP_PATH}/modules" + + packagModules "${PLATFORM}" "${KVER}" } ############################################################################### @@ -128,21 +137,12 @@ function delToModules() { echo "" return 1 fi - # Unzip modules for temporary folder - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - fi - rm -f ${TMP_PATH}/modules/${KONAME} - if [ "${KERNEL}" = "custom" ]; then - tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - else - tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - fi + + unpackModules "${PLATFORM}" "${KVER}" + + rm -f "${TMP_PATH}/modules/${KONAME}" + + packagModules "${PLATFORM}" "${KVER}" } ############################################################################### @@ -153,15 +153,16 @@ function delToModules() { function getdepends() { function _getdepends() { if [ -f "${TMP_PATH}/modules/${1}.ko" ]; then - depends=($(modinfo "${TMP_PATH}/modules/${1}.ko" 2>/dev/null | grep depends: | awk -F: '{print $2}' | awk '$1=$1' | sed 's/,/ /g')) + local depends=($(modinfo "${TMP_PATH}/modules/${1}.ko" 2>/dev/null | grep depends: | awk -F: '{print $2}' | awk '$1=$1' | sed 's/,/ /g')) if [ ${#depends[@]} -gt 0 ]; then - for k in ${depends[@]}; do + for k in "${depends[@]}"; do echo "${k}" _getdepends "${k}" done fi fi } + local PLATFORM=${1} local KVER=${2} local KONAME=${3} @@ -170,16 +171,10 @@ function getdepends() { echo "" return 1 fi - # Unzip modules for temporary folder - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - fi - local DPS=($(_getdepends ${KONAME} | tr ' ' '\n' | sort -u)) - echo ${DPS[@]} + + unpackModules "${PLATFORM}" "${KVER}" + + local DPS=($(_getdepends "${KONAME}" | tr ' ' '\n' | sort -u)) + echo "${DPS[@]}" rm -rf "${TMP_PATH}/modules" } \ No newline at end of file diff --git a/files/initrd/opt/arc/include/network.sh b/files/initrd/opt/arc/include/network.sh index 41c35899..cb659513 100755 --- a/files/initrd/opt/arc/include/network.sh +++ b/files/initrd/opt/arc/include/network.sh @@ -4,7 +4,7 @@ function getnet() { MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")" ARCPATCH="$(readConfigKey "arc.patch" "${USER_CONFIG_FILE}")" NICPORTS="$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null)" - ETHN=$(echo ${ETHX} | wc -w) + ETHN=$(echo "${ETHX}" | wc -w) if [ "${ARCPATCH}" = "true" ]; then MACS=($(generateMacAddress "${MODEL}" "${ETHN}" "true")) for I in $(seq 1 ${ETHN}); do @@ -44,7 +44,7 @@ function getnet() { # Get Amount of NIC ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)" # Get actual IP -for ETH in ${ETHX}; do - IPCON=$(getIP ${ETH}) +for N in ${ETHX}; do + IPCON=$(getIP "${N}") [ -n "${IPCON}" ] && break done \ No newline at end of file diff --git a/files/initrd/opt/arc/include/storage.sh b/files/initrd/opt/arc/include/storage.sh index 16b18f84..12c69ddc 100755 --- a/files/initrd/opt/arc/include/storage.sh +++ b/files/initrd/opt/arc/include/storage.sh @@ -25,7 +25,7 @@ function getmap() { ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')" PORT=$(echo ${ATAPORT} | sed 's/ata//') HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$') - done < <(ls -l /sys/class/scsi_host | grep -F "${PCI}") + done <<<"$(ls -l /sys/class/scsi_host | grep -F "${PCI}")" while read -r PORT; do ls -l /sys/block | grep -F -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0 PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd) @@ -33,7 +33,7 @@ function getmap() { [ ${ATTACH} = 1 ] && CONPORTS="$((${CONPORTS} + 1))" && echo "$((${PORT} - 1))" >>"${TMP_PATH}/ports" [ ${DUMMY} = 1 ] # Do nothing for now NUMPORTS=$((${NUMPORTS} + 1)) - done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n) + done <<<"$(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n)" [ ${NUMPORTS} -gt 8 ] && NUMPORTS=8 [ ${CONPORTS} -gt 8 ] && CONPORTS=8 echo -n "${NUMPORTS}" >>"${TMP_PATH}/drivesmax" @@ -131,7 +131,7 @@ function getmap() { elif [ ${D} = ${LASTDRIVE} ]; then LASTDRIVE=$((${D} + 1)) fi - done < <(cat "${TMP_PATH}/ports") + done <<<"$(cat "${TMP_PATH}/ports")" fi } diff --git a/files/initrd/opt/arc/include/update.sh b/files/initrd/opt/arc/include/update.sh index 925a0405..f9b3bdcd 100755 --- a/files/initrd/opt/arc/include/update.sh +++ b/files/initrd/opt/arc/include/update.sh @@ -307,7 +307,7 @@ function updateModules() { writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" - done < <(getAllModules "${PLATFORM}" "${KVERP}") + done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" dialog --backtitle "$(backtitle)" --title "Update Modules" \ --infobox "Rewrite successful!" 3 50 sleep 2 diff --git a/files/initrd/opt/arc/init.sh b/files/initrd/opt/arc/init.sh index 96d82bc0..51a3ab0c 100755 --- a/files/initrd/opt/arc/init.sh +++ b/files/initrd/opt/arc/init.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" # Get Loader Disk Bus [ -z "${LOADER_DISK}" ] && die "Loader Disk not found!" @@ -20,14 +20,15 @@ BANNER="$(figlet -c -w "$(((${COLUMNS})))" "Arc Loader")" TITLE="Version:" TITLE+=" ${ARC_VERSION} (${ARC_BUILD})" [ -n "${ARC_BRANCH}" ] && TITLE+=" | Branch: ${ARC_BRANCH}" -printf "\033[1;30m%*s\n" ${COLUMNS} "" -printf "\033[1;30m%*s\033[A\n" ${COLUMNS} "" -printf "\033[1;34m%*s\033[0m\n" ${COLUMNS} "${BANNER}" -printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" +printf "\033[1;30m%*s\n" "${COLUMNS}" "" +printf "\033[1;30m%*s\033[A\n" "${COLUMNS}" "" +printf "\033[1;34m%*s\033[0m\n" "${COLUMNS}" "${BANNER}" +printf "\033[1;34m%*s\033[0m\n" "$(((${#TITLE} + ${COLUMNS}) / 2))" "${TITLE}" TITLE="Boot:" [ ${EFI} -eq 1 ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]" TITLE+=" [${BUS}]" -printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" +printf "\033[1;34m%*s\033[0m\n" "$(((${#TITLE} + ${COLUMNS}) / 2))" "${TITLE}" +printf "\n" # Check for Config File if [ ! -f "${USER_CONFIG_FILE}" ]; then @@ -91,7 +92,7 @@ if [ -n "${ARC_BRANCH}" ]; then writeConfigKey "arc.branch" "${ARC_BRANCH}" "${USER_CONFIG_FILE}" fi # Sort network interfaces -if arrayExistItem "sortnetif:" $(readConfigMap "addons" "${USER_CONFIG_FILE}"); then +if arrayExistItem "sortnetif:" "$(readConfigMap "addons" "${USER_CONFIG_FILE}")"; then _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")" fi # Read/Write IP/Mac to config @@ -101,10 +102,10 @@ for N in ${ETHX}; do IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" if [ -n "${IPR}" ] && [ "1" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then IFS='/' read -r -a IPRA <<<"${IPR}" - ip addr flush dev ${N} - ip addr add ${IPRA[0]}/${IPRA[1]:-"255.255.255.0"} dev ${N} + ip addr flush dev "${N}" + ip addr add "${IPRA[0]}/${IPRA[1]:-"255.255.255.0"}" dev "${N}" if [ -n "${IPRA[2]}" ]; then - ip route add default via ${IPRA[2]} dev ${N} + ip route add default via "${IPRA[2]}" dev "${N}" fi if [ -n "${IPRA[3]:-${IPRA[2]}}" ]; then sed -i "/nameserver ${IPRA[3]:-${IPRA[2]}}/d" /etc/resolv.conf @@ -112,14 +113,12 @@ for N in ${ETHX}; do fi sleep 1 fi - [ "${N::3}" = "eth" ] && ethtool -s ${N} wol g 2>/dev/null || true - # [ "${N::3}" = "eth" ] && ethtool -K ${N} rxhash off 2>/dev/null || true + [ "${N::3}" = "eth" ] && ethtool -s "${N}" wol g 2>/dev/null || true initConfigKey "${N}" "${MACR}" "${USER_CONFIG_FILE}" done -ETHN=$(echo ${ETHX} | wc -w) +ETHN=$(echo "${ETHX}" | wc -w) writeConfigKey "device.nic" "${ETHN}" "${USER_CONFIG_FILE}" # No network devices -echo [ ${ETHN} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." # Get the VID/PID if we are in USB @@ -135,9 +134,8 @@ elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then fi # Inform user and check bus -echo -e "Loader Disk: \033[1;34m${LOADER_DISK}\033[0m" -echo -e "Loader Disk Type: \033[1;34m${BUS}\033[0m" -echo +printf "Loader Disk: \033[1;34m${LOADER_DISK}\033[0m" +printf "Loader Disk Type: \033[1;34m${BUS}\033[0m\n" # Save variables to user config file writeConfigKey "vid" "${VID}" "${USER_CONFIG_FILE}" @@ -147,28 +145,26 @@ writeConfigKey "pid" "${PID}" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" ARCMODE="$(readConfigKey "arc.mode" "${USER_CONFIG_FILE}")" if [ "${ARCMODE}" = "config" ]; then - echo -e "\033[1;34mStarting Config Mode...\033[0m" + printf "\033[1;34mStarting Config Mode...\033[0m\n" elif [ "${ARCMODE}" = "automated" ]; then - echo -e "\033[1;34mStarting automated Build Mode...\033[0m" + printf "\033[1;34mStarting automated Build Mode...\033[0m\n" elif [ "${ARCMODE}" = "update" ]; then - echo -e "\033[1;34mStarting Update Mode...\033[0m" + printf "\033[1;34mStarting Update Mode...\033[0m\n" elif [ "${BUILDDONE}" = "true" ] && [ "${ARCMODE}" = "dsm" ]; then - echo -e "\033[1;34mStarting DSM Mode...\033[0m" + printf "\033[1;34mStarting DSM Mode...\033[0m\n" if [ -f "${ARC_PATH}/boot.sh" ]; then - exec boot.sh && exit 0 + exec "${ARC_PATH}/boot.sh" && exit 0 else - echo -e "\033[1;31mError: Can't find Arc System Files...\033[0m" + printf "\033[1;31mError: Can't find Arc System Files...\033[0m\n" fi else - echo -e "\033[1;34mStarting Config Mode...\033[0m" + printf "\033[1;34mStarting Config Mode...\033[0m\n" fi -echo BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")" -[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30 -echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m" +BOOTIPWAIT=${BOOTIPWAIT:-20} +printf "\033[1;37mDetected ${ETHN} NIC:\033[0m\n" IPCON="" -echo [ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true sleep 3 for N in ${ETHX}; do @@ -176,33 +172,32 @@ for N in ${ETHX}; do DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do if [ "0" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" + printf "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m\n" break fi - COUNT=$((${COUNT} + 1)) - IP="$(getIP ${N})" + COUNT=$((COUNT + 1)) + IP="$(getIP "${N}")" if [ -n "${IP}" ]; then SPEED=$(ethtool ${N} 2>/dev/null | grep "Speed:" | awk '{print $2}') - if [[ "${IP}" =~ ^169\.254\..* ]]; then - echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" + if echo "${IP}" | grep -q "^169\.254\."; then + printf "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m\n" else - echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" + printf "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m\n" [ -z "${IPCON}" ] && IPCON="${IP}" fi break fi if [ -z "$(cat /sys/class/net/${N}}/carrier 2>/dev/null)" ]; then - echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m" + printf "\r${DRIVER}: \033[1;37mDOWN\033[0m\n" break fi if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" + printf "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m\n" break fi sleep 1 done done -echo mkdir -p "${ADDONS_PATH}" mkdir -p "${CUSTOM_PATH}" @@ -213,16 +208,15 @@ mkdir -p "${PATCH_PATH}" mkdir -p "${USER_UP_PATH}" # Load Arc Overlay -echo -e "\033[1;34mLoading Arc Overlay...\033[0m" -echo -echo -e "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}:${TTYDPORT}\033[0m to configure Loader." +printf "\033[1;34mLoading Arc Overlay...\033[0m\n" +printf "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}:${TTYDPORT}\033[0m to configure Loader.\n" # Check memory and load Arc RAM=$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo 2>/dev/null) -if [ ${RAM} -le 3500 ]; then - echo -e "\033[1;31mYou have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of RAM.\033[0m\n\033[1;31mUse arc.sh to proceed. Not recommended!\033[0m" +if [ "${RAM:-0}" -le 3500 ]; then + printf "\033[1;31mYou have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of RAM.\033[0m\n\033[1;31mUse arc.sh to proceed. Not recommended!\033[0m" else - arc.sh + "${ARC_PATH}/arc.sh" fi exit 0 \ No newline at end of file diff --git a/files/initrd/opt/arc/ramdisk-patch.sh b/files/initrd/opt/arc/ramdisk-patch.sh index 9823e5c5..bc71f544 100755 --- a/files/initrd/opt/arc/ramdisk-patch.sh +++ b/files/initrd/opt/arc/ramdisk-patch.sh @@ -2,9 +2,9 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh -. ${ARC_PATH}/include/addons.sh -. ${ARC_PATH}/include/modules.sh +. "${ARC_PATH}/include/functions.sh" +. "${ARC_PATH}/include/addons.sh" +. "${ARC_PATH}/include/modules.sh" set -o pipefail # Get exit code from process piped @@ -20,10 +20,7 @@ rm -f "${MOD_RDGZ_FILE}" # Unzipping ramdisk rm -rf "${RAMDISK_PATH}" mkdir -p "${RAMDISK_PATH}" -( - cd "${RAMDISK_PATH}" - xz -dc <"${ORI_RDGZ_FILE}" | cpio -idm -) >/dev/null 2>&1 +(cd "${RAMDISK_PATH}" && xz -dc <"${ORI_RDGZ_FILE}" | cpio -idm) >/dev/null 2>&1 || true # Read Model Data PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")" @@ -82,32 +79,30 @@ declare -A MODULES # Read synoinfo and addons 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}")" 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 user 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) -PATCHES=() -PATCHES+=("ramdisk-etc-rc-*.patch") -PATCHES+=("ramdisk-init-script-*.patch") -PATCHES+=("ramdisk-post-init-script-*.patch") -PATCHES+=("ramdisk-disable-root-pwd-*.patch") -PATCHES+=("ramdisk-disable-disabled-ports-*.patch") -for PE in ${PATCHES[@]}; do +PATCHES=( + "ramdisk-etc-rc-*.patch" + "ramdisk-init-script-*.patch" + "ramdisk-post-init-script-*.patch" + "ramdisk-disable-root-pwd-*.patch" + "ramdisk-disable-disabled-ports-*.patch" +) +for PE in "${PATCHES[@]}"; do RET=1 echo "Patching with ${PE}" >"${LOG_FILE}" for PF in $(ls ${PATCH_PATH}/${PE} 2>/dev/null); do echo "Patching with ${PF}" >>"${LOG_FILE}" - ( - cd "${RAMDISK_PATH}" - patch -p1 -i "${PF}" >>"${LOG_FILE}" 2>&1 # busybox patch and gun patch have different processing methods and parameters. - ) + (cd "${RAMDISK_PATH}" && patch -p1 -i "${PF}") >>"${LOG_FILE}" 2>&1 RET=$? [ ${RET} -eq 0 ] && break done @@ -118,7 +113,7 @@ done echo "Set synoinfo SN" >"${LOG_FILE}" _set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 _set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 -for KEY in ${!SYNOINFO[@]}; do +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 _set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 @@ -131,7 +126,7 @@ rm -f "${TMP_PATH}/rp.txt" touch "${TMP_PATH}/rp.txt" echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" -for KEY in ${!SYNOINFO[@]}; do +for KEY in "${!SYNOINFO[@]}"; do echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" done @@ -149,20 +144,23 @@ gzip -dc "${LKMS_PATH}/rp-${PLATFORM}-${KVERP}-${LKM}.ko.gz" >"${RAMDISK_PATH}/u # 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" -echo "export LOADERLABEL=\"ARC\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export LOADERVERSION=\"${ARC_VERSION}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export LOADERBUILD=\"${ARC_BUILD}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export LOADERBRANCH=\"${ARCBRANCH}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export PLATFORM=\"${PLATFORM}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export PRODUCTVER=\"${PRODUCTVER}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export MODEL=\"${MODEL}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export MODELID=\"${MODELID}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export MLINK=\"${PAT_URL}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export MCHECKSUM=\"${PAT_HASH}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export LAYOUT=\"${LAYOUT}\"" >>"${RAMDISK_PATH}/addons/addons.sh" -echo "export KEYMAP=\"${KEYMAP}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +{ + echo "#!/bin/sh" + echo 'echo "addons.sh called with params ${@}"' + echo "export LOADERLABEL=\"ARC\"" + echo "export LOADERVERSION=\"${ARC_VERSION}\"" + echo "export LOADERBUILD=\"${ARC_BUILD}\"" + echo "export LOADERBRANCH=\"${ARCBRANCH}\"" + echo "export PLATFORM=\"${PLATFORM}\"" + echo "export PRODUCTVER=\"${PRODUCTVER}\"" + echo "export PRODUCTVERL=\"${PRODUCTVERL}\"" + echo "export MODEL=\"${MODEL}\"" + echo "export MODELID=\"${MODELID}\"" + echo "export MLINK=\"${PATURL}\"" + echo "export MCHECKSUM=\"${PATSUM}\"" + echo "export LAYOUT=\"${LAYOUT}\"" + echo "export KEYMAP=\"${KEYMAP}\"" +} >"${RAMDISK_PATH}/addons/addons.sh" chmod +x "${RAMDISK_PATH}/addons/addons.sh" # System Addons @@ -179,7 +177,7 @@ for ADDON in "redpill" "revert" "misc" "eudev" "disks" "localrss" "notify" "wol" done # User Addons -for ADDON in ${!ADDONS[@]}; do +for ADDON in "${!ADDONS[@]}"; do PARAMS=${ADDONS[${ADDON}]} installAddon "${ADDON}" "${PLATFORM}" || echo "Addon ${ADDON} not found" echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1 @@ -230,18 +228,18 @@ done # SA6400 patches if [ "${PLATFORM}" = "epyc7002" ]; then echo -n " - Apply Epyc7002 Fixes" - sed -i 's#/dev/console#/var/log/lrc#g' ${RAMDISK_PATH}/usr/bin/busybox - sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' ${RAMDISK_PATH}/linuxrc.syno + sed -i 's#/dev/console#/var/log/lrc#g' "${RAMDISK_PATH}/usr/bin/busybox" + sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' "${RAMDISK_PATH}/linuxrc.syno" fi # Broadwellntbap patches if [ "${PLATFORM}" = "broadwellntbap" ]; then echo -n " - Apply Broadwellntbap Fixes" - sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' ${RAMDISK_PATH}/usr/syno/share/environments.sh + sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' "${RAMDISK_PATH}/usr/syno/share/environments.sh" fi # Call user patch scripts -for F in $(ls -1 ${USER_UP_PATH}/*.sh 2>/dev/null); do +for F in $(ls -1 "${USER_UP_PATH}/"*.sh 2>/dev/null); do echo "Calling ${F}" >"${LOG_FILE}" . "${F}" >>"${LOG_FILE}" 2>&1 || exit 1 done diff --git a/files/initrd/opt/arc/vmlinux-to-bzImage.sh b/files/initrd/opt/arc/vmlinux-to-bzImage.sh index 2f2c5145..2f46b5af 100755 --- a/files/initrd/opt/arc/vmlinux-to-bzImage.sh +++ b/files/initrd/opt/arc/vmlinux-to-bzImage.sh @@ -3,72 +3,62 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" -KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")" +KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${ARC_PATH}/platforms.yml")" # Adapted from: scripts/Makefile.lib # Usage: size_append FILE [FILE2] [FILEn]... # Output: LE HEX with size of file in bytes (to STDOUT) file_size_le() { printf $( - dec_size=0 - for F in "${@}"; do - fsize=$(stat -c "%s" ${F}) - dec_size=$((${dec_size} + ${fsize})) - done - printf "%08x\n" ${dec_size} | - sed 's/\(..\)/\1 /g' | { - read ch0 ch1 ch2 ch3 - for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do - printf '%s%03o' '\' $((0x${ch})) - done + local dec_size=0 + for F in "$@"; do dec_size=$((dec_size + $(stat -c "%s" "${F}"))); done + printf "%08x\n" "${dec_size}" | sed 's/\(..\)/\1 /g' | { + read -r ch0 ch1 ch2 ch3 + for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done } ) } size_le() { printf $( - printf "%08x\n" "${@}" | - sed 's/\(..\)/\1 /g' | { - read ch0 ch1 ch2 ch3 - for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do - printf '%s%03o' '\' $((0x${ch})) - done + printf "%08x\n" "${@}" | sed 's/\(..\)/\1 /g' | { + read -r ch0 ch1 ch2 ch3 + for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done } ) } VMLINUX_MOD=${1} ZIMAGE_MOD=${2} -KVER_MAJOR=${KVER:0:1} -if [ ${KVER_MAJOR} -eq 4 ]; then +if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then # Kernel version 4.x or 3.x (bromolow) - #zImage_head 16494 - #payload( - # vmlinux.bin x - # padding 0xf00000-x - # vmlinux.bin size 4 - #) 0xf00004 - #zImage_tail( - # unknown 72 - # run_size 4 - # unknown 30 - # vmlinux.bin size 4 - # unknown 114460 - #) 114570 - #crc32 4 + # zImage_head 16494 + # payload( + # vmlinux.bin x + # padding 0xf00000-x + # vmlinux.bin size 4 + # ) 0xf00004 + # zImage_tail( + # unknown 72 + # run_size 4 + # unknown 30 + # vmlinux.bin size 4 + # unknown 114460 + # ) 114570 + # crc32 4 gzip -dc "${ARC_PATH}/bzImage-template-v4.gz" >"${ZIMAGE_MOD}" || exit 1 dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=16494 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745134 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745244 seek=1 conv=notrunc || exit 1 - RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") - size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=15745210 seek=1 conv=notrunc|| exit 1 - size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") + size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=15745210 seek=1 conv=notrunc || exit 1 + size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 else # Kernel version 5.x gzip -dc "${ARC_PATH}/bzImage-template-v5.gz" >"${ZIMAGE_MOD}" || exit 1 @@ -76,7 +66,7 @@ else dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=14561 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34463421 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34479132 seek=1 conv=notrunc || exit 1 - # RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") - # size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=34626904 seek=1 conv=notrunc || exit 1 - size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + # RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") + # size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=34626904 seek=1 conv=notrunc || exit 1 + size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 fi \ No newline at end of file diff --git a/files/initrd/opt/arc/zimage-patch.sh b/files/initrd/opt/arc/zimage-patch.sh index 020a2339..b529b9ad 100755 --- a/files/initrd/opt/arc/zimage-patch.sh +++ b/files/initrd/opt/arc/zimage-patch.sh @@ -2,7 +2,7 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" set -o pipefail # Get exit code from process piped @@ -23,11 +23,11 @@ if [ "${KERNEL}" = "custom" ]; then gzip -dc "${CUSTOM_PATH}/bzImage-${PLATFORM}-${KVERP}.gz" >"${MOD_ZIMAGE_FILE}" else # Extract vmlinux - ${ARC_PATH}/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/bzImage-to-vmlinux.sh" "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog # Patch boot params and ramdisk check - ${ARC_PATH}/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/kpatch" "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog # rebuild zImage - ${ARC_PATH}/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/vmlinux-to-bzImage.sh" "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog fi sync \ No newline at end of file diff --git a/files/p1/boot/grub/grub.cfg b/files/p1/boot/grub/grub.cfg index 803d8573..e0bfdd2b 100644 --- a/files/p1/boot/grub/grub.cfg +++ b/files/p1/boot/grub/grub.cfg @@ -78,10 +78,10 @@ set menu_color_normal=white/black set menu_color_highlight=white/red set color_normal=white/black -set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" +set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait nointremap net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" search --set=root --label "ARC3" -if [ -s /zImage-dsm -a -s /initrd-dsm ]; then +if [ -s /zImage-dsm ] && [ -s /initrd-dsm ]; then if [ "${default}" = "direct" ]; then set timeout="1" menuentry 'DSM Direct Mode' --id direct { From 1021427900a51d3049f3914f7e887b79de3193b6 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 12:01:21 +0100 Subject: [PATCH 2/7] grub: fix Signed-off-by: AuxXxilium --- files/p1/boot/grub/grub.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/files/p1/boot/grub/grub.cfg b/files/p1/boot/grub/grub.cfg index e0bfdd2b..c70e954f 100644 --- a/files/p1/boot/grub/grub.cfg +++ b/files/p1/boot/grub/grub.cfg @@ -12,7 +12,6 @@ insmod fat insmod ext2 insmod ata insmod btrfs -insmod ntfs insmod part_msdos insmod part_gpt @@ -81,7 +80,7 @@ set color_normal=white/black set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait nointremap net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" search --set=root --label "ARC3" -if [ -s /zImage-dsm ] && [ -s /initrd-dsm ]; then +if [ -s /zImage-dsm -a -s /initrd-dsm ]; then if [ "${default}" = "direct" ]; then set timeout="1" menuentry 'DSM Direct Mode' --id direct { From 27493c7f4f34cb2c5207dc1b77b072c80a4317c4 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 12:30:57 +0100 Subject: [PATCH 3/7] tree: rework menu order and fix logic Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc-functions.sh | 30 ++++++-------- files/initrd/opt/arc/arc.sh | 48 +++++++++++------------ files/initrd/opt/arc/include/functions.sh | 8 ++++ 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/files/initrd/opt/arc/arc-functions.sh b/files/initrd/opt/arc/arc-functions.sh index 5dc83e4f..c26fe4e9 100755 --- a/files/initrd/opt/arc/arc-functions.sh +++ b/files/initrd/opt/arc/arc-functions.sh @@ -1746,14 +1746,12 @@ function bootipwaittime() { # let user format disks from inside arc function formatDisks() { rm -f "${TMP_PATH}/opts" - while read -r KNAME SIZE TYPE PKNAME; do - [ -z "${KNAME}" ] && continue - [ "${KNAME}" = "N/A" ] && continue + while read -r KNAME SIZE TYPE MODEL; do + [ "${KNAME}" = "N/A" ] || [ "${SIZE:0:1}" = "0" ] && continue [ "${KNAME:0:7}" = "/dev/md" ] && continue - [ "${KNAME}" = "${LOADER_DISK}" ] || [ "${PKNAME}" = "${LOADER_DISK}" ] && continue - [ -z "${SIZE}" ] && SIZE="Unknown" - printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${TYPE}" >>"${TMP_PATH}/opts" - done < <(lsblk -Jpno KNAME,SIZE,TYPE,PKNAME 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.pkname)"' 2>/dev/null) + [ "${KNAME:0:8}" = "${LOADER_DISK}" ] && continue + printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${MODEL}" "${TYPE}" >>"${TMP_PATH}/opts" + done < <(lsblk -Jpno KNAME,SIZE,TYPE,MODEL 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.model)"' 2>/dev/null) if [ ! -f "${TMP_PATH}/opts" ]; then dialog --backtitle "$(backtitle)" --title "Format Disks" \ --msgbox "No disk found!" 0 0 @@ -1791,13 +1789,14 @@ function formatDisks() { ############################################################################### # Clone bootloader disk -function cloneBootloaderDisk() { +function cloneLoader() { rm -f "${TMP_PATH}/opts" - while read -r KNAME ID SIZE PKNAME; do + while read -r KNAME SIZE TYPE MODEL; do [ "${KNAME}" = "N/A" ] || [ "${SIZE:0:1}" = "0" ] && continue - [ "${KNAME}" = "${LOADER_DISK}" ] || [ "${PKNAME}" = "${LOADER_DISK}" ] && continue - printf "\"%s\" \"%-6s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${ID}" >>"${TMP_PATH}/opts" - done <<<"$(lsblk -Jdpno KNAME,ID,SIZE,PKNAME 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.id) \(.size) \(.pkname)"' 2>/dev/null)" + [ "${KNAME:0:7}" = "/dev/md" ] && continue + [ "${KNAME:0:8}" = "${LOADER_DISK}" ] && continue + printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${MODEL}" "${TYPE}" >>"${TMP_PATH}/opts" + done < <(lsblk -Jpno KNAME,SIZE,TYPE,MODEL 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.model)"' 2>/dev/null) if [ ! -f "${TMP_PATH}/opts" ]; then dialog --backtitle "$(backtitle)" --title "Clone Loader" \ @@ -1853,12 +1852,6 @@ function cloneBootloaderDisk() { sleep 1 fi - function __umountNewBlDisk() { - umount "${TMP_PATH}/sdX1" 2>/dev/null - umount "${TMP_PATH}/sdX2" 2>/dev/null - umount "${TMP_PATH}/sdX3" 2>/dev/null - } - mkdir -p "${TMP_PATH}/sdX1" "${TMP_PATH}/sdX2" "${TMP_PATH}/sdX3" mount "${NEW_BLDISK_P1}" "${TMP_PATH}/sdX1" || { printf "Can't mount %s." "${NEW_BLDISK_P1}" >"${LOG_FILE}" @@ -1931,6 +1924,7 @@ function resetLoader() { fi [ -d "${UNTAR_PAT_PATH}" ] && rm -rf "${UNTAR_PAT_PATH}" >/dev/null [ -f "${USER_CONFIG_FILE}" ] && rm -f "${USER_CONFIG_FILE}" >/dev/null + [ -f "${ARC_RAMDISK_USER_FILE}" ] && rm -f "${ARC_RAMDISK_USER_FILE}" >/dev/null dialog --backtitle "$(backtitle)" --title "Reset Loader" --aspect 18 \ --yesno "Reset successful.\nReboot required!" 0 0 [ $? -ne 0 ] && return diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 69b1fbce..17a5bf17 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -874,6 +874,14 @@ else if readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q "sequentialio"; then echo "Q \"SequentialIO Options \" " >>"${TMP_PATH}/menu" fi + if [ "${PLATFORM}" = "epyc7002" ]; then + echo "K \"Kernel: \Z4${KERNEL}\Zn \" " >>"${TMP_PATH}/menu" + fi + if [ "${DT}" = "true" ]; then + echo "H \"Hotplug/SortDrives: \Z4${HDDSORT}\Zn \" " >>"${TMP_PATH}/menu" + else + echo "h \"USB Mount: \Z4${USBMOUNT}\Zn \" " >>"${TMP_PATH}/menu" + fi fi if [ "${BOOTOPTS}" = "true" ]; then echo "6 \"\Z1Hide Boot Options\Zn \" " >>"${TMP_PATH}/menu" @@ -898,23 +906,14 @@ else echo "= \"\Z4===== DSM =====\Zn \" " >>"${TMP_PATH}/menu" echo "j \"Cmdline \" " >>"${TMP_PATH}/menu" echo "k \"Synoinfo \" " >>"${TMP_PATH}/menu" - echo "l \"Edit User Config \" " >>"${TMP_PATH}/menu" - echo "s \"Allow Downgrade \" " >>"${TMP_PATH}/menu" - echo "t \"Change User Password \" " >>"${TMP_PATH}/menu" echo "N \"Add new User\" " >>"${TMP_PATH}/menu" + echo "t \"Change User Password \" " >>"${TMP_PATH}/menu" echo "J \"Reset Network Config \" " >>"${TMP_PATH}/menu" - echo "M \"Mount DSM Storage Pool (not SHR) \" " >>"${TMP_PATH}/menu" echo "T \"Disable all scheduled Tasks \" " >>"${TMP_PATH}/menu" - if [ "${PLATFORM}" = "epyc7002" ]; then - echo "K \"Kernel: \Z4${KERNEL}\Zn \" " >>"${TMP_PATH}/menu" - fi - if [ "${DT}" = "true" ]; then - echo "H \"Hotplug/SortDrives: \Z4${HDDSORT}\Zn \" " >>"${TMP_PATH}/menu" - else - echo "h \"USB Mount: \Z4${USBMOUNT}\Zn \" " >>"${TMP_PATH}/menu" - fi + echo "M \"Mount DSM Storage Pool (not SHR) \" " >>"${TMP_PATH}/menu" + echo "l \"Edit User Config \" " >>"${TMP_PATH}/menu" + echo "s \"Allow Downgrade Version \" " >>"${TMP_PATH}/menu" echo "O \"Official Driver Priority: \Z4${ODP}\Zn \" " >>"${TMP_PATH}/menu" - echo "B \"Grep DSM Config from Backup \" " >>"${TMP_PATH}/menu" fi fi if [ "${LOADEROPTS}" = "true" ]; then @@ -923,24 +922,25 @@ else echo "8 \"\Z1Show Loader Options\Zn \" " >>"${TMP_PATH}/menu" fi if [ "${LOADEROPTS}" = "true" ]; then - echo "= \"\Z4===== Loader =====\Zn \" " >>"${TMP_PATH}/menu" - echo "= \"\Z1== Edit with caution! ==\Zn \" " >>"${TMP_PATH}/menu" - echo "D \"StaticIP for Loader/DSM \" " >>"${TMP_PATH}/menu" + echo "= \"\Z4===== Loader =====\Zn \" " >>"${TMP_PATH}/menu" echo "c \"Offline Mode: \Z4${ARCOFFLINE}\Zn \" " >>"${TMP_PATH}/menu" + echo "D \"StaticIP for Loader/DSM \" " >>"${TMP_PATH}/menu" echo "f \"Bootscreen Options \" " >>"${TMP_PATH}/menu" - echo "W \"RD Compression: \Z4${RD_COMPRESSED}\Zn \" " >>"${TMP_PATH}/menu" - echo "X \"Sata DOM: \Z4${SATADOM}\Zn \" " >>"${TMP_PATH}/menu" - echo "u \"LKM Version: \Z4${LKM}\Zn \" " >>"${TMP_PATH}/menu" - echo "L \"Grep Logs from dbgutils \" " >>"${TMP_PATH}/menu" echo "U \"Change Loader Password \" " >>"${TMP_PATH}/menu" echo "Z \"Change Loader Ports \" " >>"${TMP_PATH}/menu" echo "w \"Reset Loader to Defaults \" " >>"${TMP_PATH}/menu" + echo "L \"Grep Logs from dbgutils \" " >>"${TMP_PATH}/menu" + echo "B \"Grep DSM Config from Backup \" " >>"${TMP_PATH}/menu" + echo "= \"\Z1== Edit with caution! ==\Zn \" " >>"${TMP_PATH}/menu" + echo "W \"RD Compression: \Z4${RD_COMPRESSED}\Zn \" " >>"${TMP_PATH}/menu" + echo "X \"Sata DOM: \Z4${SATADOM}\Zn \" " >>"${TMP_PATH}/menu" + echo "u \"LKM Version: \Z4${LKM}\Zn \" " >>"${TMP_PATH}/menu" echo "C \"Clone Loader to another Disk \" " >>"${TMP_PATH}/menu" echo "n \"Grub Bootloader Config \" " >>"${TMP_PATH}/menu" echo "y \"Choose a Keymap for Loader \" " >>"${TMP_PATH}/menu" echo "F \"\Z1Formate Disks \Zn \" " >>"${TMP_PATH}/menu" fi - echo "= \"\Z4===== Misc =====\Zn \" " >>"${TMP_PATH}/menu" + echo "= \"\Z4===== Misc =====\Zn \" " >>"${TMP_PATH}/menu" echo "x \"Backup/Restore/Recovery \" " >>"${TMP_PATH}/menu" [ "${ARCOFFLINE}" != "true" ] && echo "z \"Update Menu \" " >>"${TMP_PATH}/menu" echo "I \"Power/Service Menu \" " >>"${TMP_PATH}/menu" @@ -1021,7 +1021,6 @@ else J) resetDSMNetwork; NEXT="J" ;; M) mountDSM; NEXT="M" ;; T) disablescheduledTasks; NEXT="T" ;; - Z) loaderPorts; NEXT="Z" ;; K) KERNEL=$([ "${KERNEL}" = "official" ] && echo 'custom' || echo 'official') writeConfigKey "kernel" "${KERNEL}" "${USER_CONFIG_FILE}" dialog --backtitle "$(backtitle)" --title "Kernel" \ @@ -1074,13 +1073,15 @@ else LOADEROPTS="${LOADEROPTS}" NEXT="8" ;; - D) staticIPMenu; NEXT="D" ;; c) ARCOFFLINE=$([ "${ARCOFFLINE}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "arc.offline" "${ARCOFFLINE}" "${USER_CONFIG_FILE}" [ "${ARCOFFLINE}" = "false" ] && exec "${ARC_PATH}/arc.sh" NEXT="c" ;; + D) staticIPMenu; NEXT="D" ;; f) bootScreen; NEXT="f" ;; + Z) loaderPorts; NEXT="Z" ;; + U) loaderPassword; NEXT="U" ;; W) RD_COMPRESSED=$([ "${RD_COMPRESSED}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" @@ -1095,7 +1096,6 @@ else NEXT="u" ;; L) greplogs; NEXT="L" ;; - U) loaderPassword; NEXT="U" ;; w) resetLoader; NEXT="w" ;; C) cloneLoader; NEXT="C" ;; n) editGrubCfg; NEXT="n" ;; diff --git a/files/initrd/opt/arc/include/functions.sh b/files/initrd/opt/arc/include/functions.sh index 2fb981ea..ff611037 100755 --- a/files/initrd/opt/arc/include/functions.sh +++ b/files/initrd/opt/arc/include/functions.sh @@ -597,4 +597,12 @@ function check_port() { return 1 fi fi +} + +############################################################################### +# Unmount new boot loader disk +function __umountNewBlDisk() { + umount "${TMP_PATH}/sdX1" 2>/dev/null + umount "${TMP_PATH}/sdX2" 2>/dev/null + umount "${TMP_PATH}/sdX3" 2>/dev/null } \ No newline at end of file From 2d0dd7d7e90a60692b0ede21070021b941a1756d Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 13:39:15 +0100 Subject: [PATCH 4/7] tree: rework 2 Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc-functions.sh | 154 +++++++++--------- files/initrd/opt/arc/arc.sh | 58 +++---- files/initrd/opt/arc/boot.sh | 56 +++---- files/initrd/opt/arc/bzImage-to-vmlinux.sh | 14 +- files/initrd/opt/arc/calc_run_size.sh | 22 ++- files/initrd/opt/arc/extract-vmlinux | 44 +++--- files/initrd/opt/arc/include/addons.sh | 19 ++- files/initrd/opt/arc/include/configFile.sh | 27 +--- files/initrd/opt/arc/include/functions.sh | 176 ++++++++++----------- files/initrd/opt/arc/include/modules.sh | 137 ++++++++-------- files/initrd/opt/arc/include/network.sh | 6 +- files/initrd/opt/arc/include/storage.sh | 6 +- files/initrd/opt/arc/include/update.sh | 2 +- files/initrd/opt/arc/init.sh | 80 +++++----- files/initrd/opt/arc/ramdisk-patch.sh | 82 +++++----- files/initrd/opt/arc/vmlinux-to-bzImage.sh | 72 +++++---- files/initrd/opt/arc/zimage-patch.sh | 8 +- files/p1/boot/grub/grub.cfg | 2 +- 18 files changed, 489 insertions(+), 476 deletions(-) diff --git a/files/initrd/opt/arc/arc-functions.sh b/files/initrd/opt/arc/arc-functions.sh index c26fe4e9..70b1470d 100755 --- a/files/initrd/opt/arc/arc-functions.sh +++ b/files/initrd/opt/arc/arc-functions.sh @@ -275,7 +275,7 @@ function modulesMenu() { 2>${TMP_PATH}/resp [ $? -ne 0 ] && break VALUE="$(cat "${TMP_PATH}/resp")" - if echo "${VALUE}" | grep -q " "; then + if [[ ${VALUE} = *" "* ]]; then dialog --backtitle "$(backtitle)" --title "Blacklist Module" \ --yesno "Invalid list, No spaces should appear, retry?" 0 0 [ $? -eq 0 ] && continue || break @@ -334,10 +334,10 @@ function cmdlineMenu() { RET=$? case ${RET} in 0) # ok-button - NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" - VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" - [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}" - [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}" + NAME="$(cat "${TMP_PATH}/resp" | sed -n '1p')" + VALUE="$(cat "${TMP_PATH}/resp" | sed -n '2p')" + [[ "${NAME}" = *= ]] && NAME="${NAME%?}" + [[ "${VALUE}" = =* ]] && VALUE="${VALUE#*=}" if [ -z "${NAME//\"/}" ]; then dialog --clear --backtitle "$(backtitle)" --title "User Cmdline" \ --yesno "Invalid Parameter Name, retry?" 0 0 @@ -539,10 +539,10 @@ function synoinfoMenu() { RET=$? case ${RET} in 0) # ok-button - NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" - VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" - [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}" - [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}" + NAME="$(cat "${TMP_PATH}/resp" | sed -n '1p')" + VALUE="$(cat "${TMP_PATH}/resp" | sed -n '2p')" + [[ "${NAME}" = *= ]] && NAME="${NAME%?}" + [[ "${VALUE}" = =* ]] && VALUE="${VALUE#*=}" if [ -z "${NAME//\"/}" ]; then dialog --clear --backtitle "$(backtitle)" --title "User Cmdline" \ --yesno "Invalid Parameter Name, retry?" 0 0 @@ -971,8 +971,8 @@ function sysinfo() { CPU="$(cat /proc/cpuinfo 2>/dev/null | grep 'model name' | uniq | awk -F':' '{print $2}')" SECURE=$(dmesg 2>/dev/null | grep -i "Secure Boot" | awk -F'] ' '{print $2}') VENDOR=$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i') - ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true - ETHN=$(echo "${ETHX}" | wc -w) + ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) + ETHN=$(echo ${ETHX} | wc -w) ARC_BRANCH="$(readConfigKey "arc.branch" "${USER_CONFIG_FILE}")" CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1140,7 +1140,6 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l) - [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1149,7 +1148,6 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l) - [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1183,7 +1181,6 @@ function sysinfo() { NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://") PORT=$(ls -l /sys/class/nvme 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n) PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[N:${PORT}:" | wc -l) - [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) done @@ -1191,7 +1188,6 @@ function sysinfo() { TEXT+="\n VMBUS Controller:\n" NAME="vmbus:acpi" PORTNUM=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep 'vmbus:acpi' | wc -l) - [ ${PORTNUM} -eq 0 ] && continue TEXT+="\Zb ${NAME}\Zn\n Disks: ${PORTNUM}\n" NUMPORTS=$((${NUMPORTS} + ${PORTNUM})) fi @@ -1271,7 +1267,7 @@ function uploadDiag () { # Shows Networkdiag to user function networkdiag() { ( - ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true + ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) for N in ${ETHX}; do echo DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') @@ -1375,7 +1371,7 @@ function credits() { ############################################################################### # Setting Static IP for Loader function staticIPMenu() { - ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true + ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep -v lo) IPCON="" for N in ${ETHX}; do MACR="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g')" @@ -1390,10 +1386,10 @@ function staticIPMenu() { RET=$? case ${RET} in 0) # ok-button - address="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" - netmask="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" - gateway="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null)" - dnsname="$(sed -n '4p' "${TMP_PATH}/resp" 2>/dev/null)" + address="$(cat "${TMP_PATH}/resp" | sed -n '1p')" + netmask="$(cat "${TMP_PATH}/resp" | sed -n '2p')" + gateway="$(cat "${TMP_PATH}/resp" | sed -n '3p')" + dnsname="$(cat "${TMP_PATH}/resp" | sed -n '4p')" ( if [ -z "${address}" ]; then if [ -n "$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" ]; then @@ -1557,8 +1553,8 @@ function addNewDSMUser() { --form "${MSG}" 8 60 3 "username:" 1 1 "user" 1 10 50 0 "password:" 2 1 "passwd" 2 10 50 0 \ 2>"${TMP_PATH}/resp" [ $? -ne 0 ] && return - username="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" - password="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" + username="$(cat "${TMP_PATH}/resp" | sed -n '1p')" + password="$(cat "${TMP_PATH}/resp" | sed -n '2p')" ( ONBOOTUP="" ONBOOTUP="${ONBOOTUP}if synouser --enum local | grep -q ^${username}\$; then synouser --setpw ${username} ${password}; else synouser --add ${username} ${password} arc 0 user@arc.arc 1; fi\n" @@ -1595,12 +1591,12 @@ function loaderPassword() { dialog --backtitle "$(backtitle)" --title "Loader Password" \ --inputbox "New password: (Empty value 'arc')" 0 70 \ 2>${TMP_PATH}/resp - [ $? -ne 0 ] && return - local STRPASSWD="$(cat "${TMP_PATH}/resp")" - local NEWPASSWD="$(openssl passwd -6 -salt $(openssl rand -hex 8) "${STRPASSWD:-arc}")" + [ $? -ne 0 ] && continue + STRPASSWD="$(cat "${TMP_PATH}/resp")" + NEWPASSWD="$(openssl passwd -6 -salt $(openssl rand -hex 8) "${STRPASSWD:-arc}")" cp -p /etc/shadow /etc/shadow- sed -i "s|^root:[^:]*|root:${NEWPASSWD}|" /etc/shadow - local RDXZ_PATH="${TMP_PATH}/rdxz_tmp" + RDXZ_PATH="${TMP_PATH}/rdxz_tmp" rm -rf "${RDXZ_PATH}" mkdir -p "${RDXZ_PATH}" [ -f "${ARC_RAMDISK_USER_FILE}" ] && ( @@ -1616,7 +1612,7 @@ function loaderPassword() { if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then ( cd "${RDXZ_PATH}" - local RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') + RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') find . 2>/dev/null | cpio -o -H newc -R root:root | pv -n -s ${RDSIZE:-1} | xz -9 --check=crc32 >"${ARC_RAMDISK_USER_FILE}" ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Loader Password" \ --progressbox "Changing Loader password..." 30 100 @@ -1633,10 +1629,10 @@ function loaderPassword() { ############################################################################### # Change Arc Loader Password function loaderPorts() { - local MSG="Modify Ports (0-65535) (Leave empty for default):" - local HTTPPORT=$(grep -i '^HTTP_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) - local DUFSPORT=$(grep -i '^DUFS_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) - local TTYDPORT=$(grep -i '^TTYD_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + MSG="Modify Ports (0-65535) (Leave empty for default):" + HTTPPORT=$(grep -i '^HTTP_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + DUFSPORT=$(grep -i '^DUFS_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) + TTYDPORT=$(grep -i '^TTYD_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2) while true; do dialog --backtitle "$(backtitle)" --title "Loader Ports" \ --form "${MSG}" 11 70 3 "HTTP" 1 1 "${HTTPPORT:-8080}" 1 10 55 0 "DUFS" 2 1 "${DUFSPORT:-7304}" 2 10 55 0 "TTYD" 3 1 "${TTYDPORT:-7681}" 3 10 55 0 \ @@ -1644,9 +1640,9 @@ function loaderPorts() { RET=$? case ${RET} in 0) # ok-button - HTTP=$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null) - DUFS=$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null) - TTYD=$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null) + HTTPPORT=$(sed -n '1p' "${TMP_PATH}/resp") + DUFSPORT=$(sed -n '2p' "${TMP_PATH}/resp") + TTYDPORT=$(sed -n '3p' "${TMP_PATH}/resp") EP="" for P in "${HTTPPORT}" "${DUFSPORT}" "${TTYDPORT}"; do check_port "${P}" || EP="${EP} ${P}"; done if [ -n "${EP}" ]; then @@ -1658,7 +1654,7 @@ function loaderPorts() { if [ ! "${HTTPPORT:-8080}" = "8080" ]; then echo "HTTP_PORT=${HTTPPORT}" >>"/etc/arc.conf"; /etc/init.d/S90thttpd restart >/dev/null 2>&1; fi if [ ! "${DUFSPORT:-7304}" = "7304" ]; then echo "DUFS_PORT=${DUFSPORT}" >>"/etc/arc.conf"; /etc/init.d/S99dufs restart >/dev/null 2>&1; fi if [ ! "${TTYDPORT:-7681}" = "7681" ]; then echo "TTYD_PORT=${TTYDPORT}" >>"/etc/arc.conf"; /etc/init.d/S99ttyd restart >/dev/null 2>&1; fi - local RDXZ_PATH="${TMP_PATH}/rdxz_tmp" + RDXZ_PATH="${TMP_PATH}/rdxz_tmp" rm -rf "${RDXZ_PATH}" mkdir -p "${RDXZ_PATH}" [ -f "${ARC_RAMDISK_USER_FILE}" ] && ( @@ -1674,7 +1670,7 @@ function loaderPorts() { if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then ( cd "${RDXZ_PATH}" - local RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') + RDSIZE=$(du -sb ${RDXZ_PATH} 2>/dev/null | awk '{print $1}') find . 2>/dev/null | cpio -o -H newc -R root:root | pv -n -s ${RDSIZE:-1} | xz -9 --check=crc32 >"${ARC_RAMDISK_USER_FILE}" ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Loader Ports" \ --progressbox "Changing Ports..." 30 100 @@ -1775,7 +1771,7 @@ function formatDisks() { done fi for I in ${RESP}; do - if [ "${I:0:8}" = "/dev/mmc" ]; then + if [[ "${I}" = /dev/mmc* ]]; then echo y | mkfs.ext4 -T largefile4 -E nodiscard "${I}" else echo y | mkfs.ext4 -T largefile4 "${I}" @@ -1799,38 +1795,34 @@ function cloneLoader() { done < <(lsblk -Jpno KNAME,SIZE,TYPE,MODEL 2>/dev/null | sed 's|null|"N/A"|g' | jq -r '.blockdevices[] | "\(.kname) \(.size) \(.type) \(.model)"' 2>/dev/null) if [ ! -f "${TMP_PATH}/opts" ]; then - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ --msgbox "No disk found!" 0 0 return fi - - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --radiolist "Choose a destination:" 0 0 0 --file "${TMP_PATH}/opts" \ + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + --radiolist "Choose a Destination" 0 0 0 --file "${TMP_PATH}/opts" \ 2>${TMP_PATH}/resp [ $? -ne 0 ] && return - RESP=$(cat "${TMP_PATH}/resp") - - if [ -z "${RESP}" ]; then - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ + resp=$(cat ${TMP_PATH}/resp) + if [ -z "${resp}" ]; then + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ --msgbox "No disk selected!" 0 0 return + else + SIZE=$(df -m ${resp} 2>/dev/null | awk 'NR=2 {print $2}') + if [ ${SIZE:-0} -lt 1024 ]; then + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + --msgbox "Disk ${resp} size is less than 1GB and cannot be cloned!" 0 0 + return + fi + MSG="" + MSG+="Warning:\nDisk ${resp} will be formatted and written to the bootloader. Please confirm that important data has been backed up. \nDo you want to continue?" + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + --yesno "${MSG}" 0 0 + [ $? -ne 0 ] && return fi - - SIZE=$(df -m "${RESP}" 2>/dev/null | awk 'NR==2 {print $2}') - if [ ${SIZE:-0} -lt 1024 ]; then - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --msgbox "$(printf "Disk %s size is less than 1GB and cannot be cloned!" "${RESP}")" 0 0 - return - fi - - MSG="$(printf "Warning:\nDisk %s will be formatted and written to the bootloader. Please confirm that important data has been backed up. \nDo you want to continue?" "${RESP}")" - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --yesno "${MSG}" 0 0 - [ $? -ne 0 ] && return - ( - rm -f "${LOG_FILE}" - rm -rf "${PART3_PATH}/dl" + rm -rf "${PART3_PATH}/dl" >/dev/null CLEARCACHE=0 gzip -dc "${ARC_PATH}/grub.img.gz" | dd of="${RESP}" bs=1M conv=fsync status=progress @@ -1901,17 +1893,30 @@ function cloneLoader() { sync __umountNewBlDisk sleep 3 - ) 2>&1 | dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --progressbox "Cloning ..." 20 100 - if [ -f "${LOG_FILE}" ]; then - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --msgbox "$(cat ${LOG_FILE})" 0 0 - else - dialog --backtitle "$(backtitle)" --title "Clone Loader" \ - --msgbox "$(printf "Bootloader has been cloned to disk %s, please remove the current bootloader disk!\nReboot?" "${RESP}")" 0 0 - rebootTo config - fi + mkdir -p "${TMP_PATH}/sdX1" + mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC1 | awk '{print $1}')" "${TMP_PATH}/sdX1" + cp -vRf "${PART1_PATH}/". "${TMP_PATH}/sdX1/" + sync + umount "${TMP_PATH}/sdX1" + + mkdir -p "${TMP_PATH}/sdX2" + mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC2 | awk '{print $1}')" "${TMP_PATH}/sdX2" + cp -vRf "${PART2_PATH}/". "${TMP_PATH}/sdX2/" + sync + umount "${TMP_PATH}/sdX2" + + mkdir -p "${TMP_PATH}/sdX3" + mount "$(lsblk "${resp}" -pno KNAME,LABEL 2>/dev/null | grep ARC3 | awk '{print $1}')" "${TMP_PATH}/sdX3" + cp -vRf "${PART3_PATH}/". "${TMP_PATH}/sdX3/" + sync + umount "${TMP_PATH}/sdX3" + sleep 3 + ) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + --progressbox "Cloning ..." 20 100 + dialog --backtitle "$(backtitle)" --colors --title "Clone Loader" \ + --msgbox "Bootloader has been cloned to disk ${resp},\nplease remove the current bootloader disk!\nReboot?" 0 0 + rebootTo config return } @@ -1964,7 +1969,11 @@ function greplogs() { done rm -rf "${TMP_PATH}/mdX" fi - [ ${SYSLOG} -eq 1 ] && MSG+="System logs found!\n" || MSG+="Can't find system logs!\n" + if [ ${SYSLOG} -eq 1 ]; then + MSG+="System logs found!\n" + else + MSG+="Can't find system logs!\n" + fi ADDONS=0 if [ -d "${PART1_PATH}/logs" ]; then @@ -2032,6 +2041,7 @@ function getbackup() { # SataDOM Menu function satadomMenu() { rm -f "${TMP_PATH}/opts" >/dev/null + echo "0 \"Create SATA node(ARC)\"" >>"${TMP_PATH}/opts" echo "1 \"Native SATA Disk(SYNO)\"" >>"${TMP_PATH}/opts" echo "2 \"Fake SATA DOM(Redpill)\"" >>"${TMP_PATH}/opts" dialog --backtitle "$(backtitle)" --title "Switch SATA DOM" \ diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 17a5bf17..3b2c75af 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -4,14 +4,14 @@ # Overlay Init Section [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" -. "${ARC_PATH}/include/addons.sh" -. "${ARC_PATH}/include/modules.sh" -. "${ARC_PATH}/include/update.sh" -. "${ARC_PATH}/include/storage.sh" -. "${ARC_PATH}/include/network.sh" -. "${ARC_PATH}/include/compat.sh" -. "${ARC_PATH}/arc-functions.sh" +. ${ARC_PATH}/include/functions.sh +. ${ARC_PATH}/include/addons.sh +. ${ARC_PATH}/include/modules.sh +. ${ARC_PATH}/include/update.sh +. ${ARC_PATH}/include/storage.sh +. ${ARC_PATH}/include/network.sh +. ${ARC_PATH}/include/compat.sh +. ${ARC_PATH}/arc-functions.sh # Get Keymap and Timezone Config onlineCheck @@ -105,8 +105,8 @@ function arcModel() { PM="$(readConfigEntriesArray "${P}" "${D_FILE}" | sort)" while read -r M; do echo "${M} ${P}" >>"${TMP_PATH}/modellist" - done <<<"$(echo "${PM}")" - done <<<"$(echo "${PS}")" + done < <(echo "${PM}") + done < <(echo "${PS}") if [ "${ARCMODE}" = "config" ]; then while true; do echo -n "" >"${TMP_PATH}/menu" @@ -159,7 +159,7 @@ function arcModel() { else [ ${COMPATIBLE} -eq 1 ] && echo -e "${M} \"\t$(printf "\Zb%-15s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "${A}" "${DTS}" "${IGPUS}" "${HBAS}" "${M_2_CACHE}" "${M_2_STORAGE}" "${USBS}" "${BETA}")\" ">>"${TMP_PATH}/menu" fi - done <"${TMP_PATH}/modellist" + done < <(cat "${TMP_PATH}/modellist") ARCCONF="$(readConfigKey "${MODEL:-SA6400}.serial" "${S_FILE}")" [ -n "${ARCCONF}" ] && MSG="Supported Models for your Hardware (x = supported / + = need Addons)\n$(printf "\Zb%-16s\Zn \Zb%-15s\Zn \Zb%-5s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "Model" "Platform" "DT" "Arc" "Intel iGPU" "HBA" "M.2 Cache" "M.2 Volume" "USB Mount" "Source")" || MSG="Supported Models for your Hardware (x = supported / + = need Addons) | Syno Models can have faulty Values.\n$(printf "\Zb%-16s\Zn \Zb%-15s\Zn \Zb%-5s\Zn \Zb%-12s\Zn \Zb%-5s\Zn \Zb%-10s\Zn \Zb%-12s\Zn \Zb%-10s\Zn \Zb%-10s\Zn" "Model" "Platform" "DT" "Intel iGPU" "HBA" "M.2 Cache" "M.2 Volume" "USB Mount" "Source")" [ -n "${ARCCONF}" ] && TITLEMSG="Arc Model" || TITLEMSG="Model" @@ -284,7 +284,7 @@ function arcVersion() { echo "${V}" >>"${TMP_PATH}/versions" fi PREV="${V}" - done <<<"$(echo "${PVS}")" + done < <(echo "${PVS}") DSMPVS="$(cat ${TMP_PATH}/versions)" dialog --backtitle "$(backtitlep)" --colors --title "Version" \ --no-items --menu "Choose a DSM Build" 0 0 0 ${DSMPVS} \ @@ -308,8 +308,8 @@ function arcVersion() { 2>"${TMP_PATH}/resp" RET=$? [ ${RET} -ne 0 ] && return - PAT_URL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)" - PAT_HASH="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)" + PAT_URL="$(cat "${TMP_PATH}/resp" | sed -n '1p')" + PAT_HASH="$(cat "${TMP_PATH}/resp" | sed -n '2p')" [ -n "${PAT_URL}" ] && [ -n "${PAT_HASH}" ] && VALID="true" && break done fi @@ -335,7 +335,7 @@ function arcVersion() { writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}" while IFS=': ' read -r KEY VALUE; do writeConfigKey "synoinfo.\"${KEY}\"" "${VALUE}" "${USER_CONFIG_FILE}" - done <<<"$(readConfigMap "platforms.${PLATFORM}.synoinfo" "${P_FILE}")" + done < <(readConfigMap "platforms.${PLATFORM}.synoinfo" "${P_FILE}") # Check Addons for Platform ADDONS="$(readConfigKey "addons" "${USER_CONFIG_FILE}")" DEVICENIC="$(readConfigKey "device.nic" "${USER_CONFIG_FILE}")" @@ -375,14 +375,14 @@ function arcVersion() { if ! checkAddonExist "${ADDON}" "${PLATFORM}"; then deleteConfigKey "addons.\"${ADDON}\"" "${USER_CONFIG_FILE}" fi - done <<<"$(readConfigMap "addons" "${USER_CONFIG_FILE}")" + done < <(readConfigMap "addons" "${USER_CONFIG_FILE}") KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")" [ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}" if [ -n "${PLATFORM}" ] && [ -n "${KVERP}" ]; then writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" - done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" + done < <(getAllModules "${PLATFORM}" "${KVERP}") fi # Check for Only Version if [ "${ONLYVERSION}" = "true" ]; then @@ -961,7 +961,7 @@ else A) networkdiag; NEXT="A" ;; # System Section # Arc Section - 4) ARCOPTS=$([ "${ARCOPTS}" = "true" ] && echo 'false' || echo 'true') + 4) [ "${ARCOPTS}" = "true" ] && ARCOPTS='false' || ARCOPTS='true' ARCOPTS="${ARCOPTS}" NEXT="4" ;; @@ -975,15 +975,15 @@ else P) storagepanelMenu; NEXT="P" ;; Q) sequentialIOMenu; NEXT="Q" ;; # Boot Section - 6) BOOTOPTS=$([ "${BOOTOPTS}" = "true" ] && echo 'false' || echo 'true') + 6) [ "${BOOTOPTS}" = "true" ] && BOOTOPTS='false' || BOOTOPTS='true' BOOTOPTS="${BOOTOPTS}" NEXT="6" ;; - m) KERNELLOAD=$([ "${KERNELLOAD}" = "kexec" ] && echo 'power' || echo 'kexec') + m) [ "${KERNELLOAD}" = "kexec" ] && KERNELLOAD='power' || KERNELLOAD='kexec' writeConfigKey "kernelload" "${KERNELLOAD}" "${USER_CONFIG_FILE}" NEXT="m" ;; - E) EMMCBOOT=$([ "${EMMCBOOT}" = "true" ] && echo 'false' || echo 'true') + E) [ "${EMMCBOOT}" = "true" ] && EMMCBOOT='false' || EMMCBOOT='true' if [ "${EMMCBOOT}" = "false" ]; then writeConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}" deleteConfigKey "synoinfo.disk_swap" "${USER_CONFIG_FILE}" @@ -1002,13 +1002,13 @@ else NEXT="E" ;; i) bootipwaittime; NEXT="i" ;; - q) DIRECTBOOT=$([ "${DIRECTBOOT}" = "true" ] && echo 'false' || echo 'true') + q) [ "${DIRECTBOOT}" = "false" ] && DIRECTBOOT='true' || DIRECTBOOT='false' grub-editenv ${USER_GRUBENVFILE} create writeConfigKey "directboot" "${DIRECTBOOT}" "${USER_CONFIG_FILE}" NEXT="q" ;; # DSM Section - 7) DSMOPTS=$([ "${DSMOPTS}" = "true" ] && echo 'false' || echo 'true') + 7) [ "${DSMOPTS}" = "true" ] && DSMOPTS='false' || DSMOPTS='true' DSMOPTS="${DSMOPTS}" NEXT="7" ;; @@ -1037,13 +1037,13 @@ else writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.\"${ID}\"" "" "${USER_CONFIG_FILE}" - done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" + done < <(getAllModules "${PLATFORM}" "${KVERP}") fi writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="K" ;; - H) HDDSORT=$([ "${HDDSORT}" = "true" ] && echo 'false' || echo 'true') + H) [ "${HDDSORT}" = "true" ] && HDDSORT='false' || HDDSORT='true' writeConfigKey "hddsort" "${HDDSORT}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1061,7 +1061,7 @@ else BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="h" ;; - O) ODP=$([ "${ODP}" = "true" ] && echo 'false' || echo 'true') + O) [ "${ODP}" = "false" ] && ODP='true' || ODP='false' writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" @@ -1069,13 +1069,13 @@ else ;; B) getbackup; NEXT="B" ;; # Loader Section - 8) LOADEROPTS=$([ "${LOADEROPTS}" = "true" ] && echo 'false' || echo 'true') + 8) [ "${LOADEROPTS}" = "true" ] && LOADEROPTS='false' || LOADEROPTS='true' LOADEROPTS="${LOADEROPTS}" NEXT="8" ;; c) ARCOFFLINE=$([ "${ARCOFFLINE}" = "true" ] && echo 'false' || echo 'true') writeConfigKey "arc.offline" "${ARCOFFLINE}" "${USER_CONFIG_FILE}" - [ "${ARCOFFLINE}" = "false" ] && exec "${ARC_PATH}/arc.sh" + [ "${ARCOFFLINE}" = "false" ] && exec arc.sh NEXT="c" ;; D) staticIPMenu; NEXT="D" ;; @@ -1089,7 +1089,7 @@ else NEXT="W" ;; X) satadomMenu; NEXT="X" ;; - u) LKM=$([ "${LKM}" = "prod" ] && echo 'dev' || echo 'prod') + u) [ "${LKM}" = "prod" ] && LKM='dev' || LKM='prod' writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" diff --git a/files/initrd/opt/arc/boot.sh b/files/initrd/opt/arc/boot.sh index b1b4a532..e93a9d03 100755 --- a/files/initrd/opt/arc/boot.sh +++ b/files/initrd/opt/arc/boot.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" +. ${ARC_PATH}/include/functions.sh # Clear logs for dbgutils addons rm -rf "${PART1_PATH}/logs" >/dev/null 2>&1 || true @@ -189,7 +189,7 @@ fi # Cmdline NIC Settings ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) ETHM=$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null) -ETHN=$(echo "${ETHX}" | wc -w) +ETHN=$(echo ${ETHX} | wc -w) [ -z "${ETHM}" ] && ETHM=${ETHN} NIC=0 for N in ${ETHX}; do @@ -203,16 +203,16 @@ CMDLINE['netif_num']="${NIC}" # Read user network settings while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && CMDLINE["network.${KEY}"]="${VALUE}" -done <<<"$(readConfigMap "network" "${USER_CONFIG_FILE}")" +done < <(readConfigMap "network" "${USER_CONFIG_FILE}") # Read user cmdline while IFS=': ' read -r KEY VALUE; do [ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}" -done <<<"$(readConfigMap "cmdline" "${USER_CONFIG_FILE}")" +done < <(readConfigMap "cmdline" "${USER_CONFIG_FILE}") # Prepare command line CMDLINE_LINE="" -for KEY in "${!CMDLINE[@]}"; do +for KEY in ${!CMDLINE[@]}; do VALUE="${CMDLINE[${KEY}]}" CMDLINE_LINE+=" ${KEY}" [ -n "${VALUE}" ] && CMDLINE_LINE+="=${VALUE}" @@ -223,14 +223,14 @@ echo "${CMDLINE_LINE}" >"${PART1_PATH}/cmdline.yml" function _bootwait() { # Exec Bootwait to check SSH/Web connection BOOTWAIT=5 - w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB + busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB MSG="" - while [ ${BOOTWAIT} -ge 0 ]; do + while test ${BOOTWAIT} -ge 0; do MSG="\033[1;33mAccess SSH/Web will interrupt boot...\033[0m" - printf "\r${MSG}" - w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC + echo -en "\r${MSG}" + busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC if ! diff WB WC >/dev/null 2>&1; then - printf "\r\033[1;33mAccess SSH/Web detected and boot is interrupted.\033[0m\n" + echo -en "\r\033[1;33mAccess SSH/Web detected and boot is interrupted.\033[0m\n" rm -f WB WC exit 0 fi @@ -238,7 +238,7 @@ function _bootwait() { BOOTWAIT=$((BOOTWAIT - 1)) done rm -f WB WC - printf "\r%$((${#MSG} * 2))s\n" " " + echo -en "\r$(printf "%$((${#MSG} * 2))s" " ")\n" return 0 } @@ -249,7 +249,7 @@ if [ "${DIRECTBOOT}" = "true" ]; then grub-editenv ${USER_GRUBENVFILE} set dsm_cmdline="${CMDLINE_DIRECT}" grub-editenv ${USER_GRUBENVFILE} set next_entry="direct" _bootwait || true - printf "\033[1;34mReboot with Directboot\033[0m" + echo -e "\033[1;34mReboot with Directboot\033[0m" reboot exit 0 elif [ "${DIRECTBOOT}" = "false" ]; then @@ -257,12 +257,12 @@ elif [ "${DIRECTBOOT}" = "false" ]; then grub-editenv ${USER_GRUBENVFILE} unset next_entry KERNELLOAD="$(readConfigKey "kernelload" "${USER_CONFIG_FILE}")" BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")" - BOOTIPWAIT=${BOOTIPWAIT:-20} + [ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30 IPCON="" if [ "${ARCPATCH}" = "true" ]; then - printf "\033[1;37mDetected ${ETHN} NIC\033[0m | \033[1;34mUsing ${NIC} NIC for Arc Patch:\033[0m" + echo -e "\033[1;37mDetected ${ETHN} NIC\033[0m | \033[1;34mUsing ${NIC} NIC for Arc Patch:\033[0m" else - printf "\033[1;37mDetected ${ETHN} NIC:\033[0m" + echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m" fi echo [ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true @@ -272,27 +272,27 @@ elif [ "${DIRECTBOOT}" = "false" ]; then DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do if [ "0" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - printf "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" + echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" break fi - COUNT=$(($COUNT + 1)) - IP="$(getIP "${N}")" + COUNT=$((${COUNT} + 1)) + IP="$(getIP ${N})" if [ -n "${IP}" ]; then SPEED=$(ethtool ${N} 2>/dev/null | grep "Speed:" | awk '{print $2}') - if echo "${IP}" | grep -q "^169\.254\."; then - printf "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" + if [[ "${IP}" =~ ^169\.254\..* ]]; then + echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" else - printf "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" + echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" [ -z "${IPCON}" ] && IPCON="${IP}" fi break fi if [ -z "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - printf "\r${DRIVER}: \033[1;37mDOWN\033[0m" + echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m" break fi if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - printf "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" + echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" break fi sleep 1 @@ -302,23 +302,23 @@ elif [ "${DIRECTBOOT}" = "false" ]; then DSMLOGO="$(readConfigKey "boot.dsmlogo" "${USER_CONFIG_FILE}")" if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ]; then - echo "${IPCON}" | grep -q "^169\.254\." && IPCON="" + [[ "${IPCON}" =~ ^169\.254\..* ]] && IPCON="" [ -n "${IPCON}" ] && URL="http://${IPCON}:5000" || URL="http://find.synology.com/" - python3 ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png" + python ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png" [ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>/dev/null || true fi for T in $(w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do if [ -w "/dev/${T}" ]; then - [ -n "${IPCON}" ] && printf "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\n" >"/dev/${T}" 2>/dev/null || echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\nNo IP found.\033[0m\n" >"/dev/${T}" 2>/dev/null + [ -n "${IPCON}" ] && echo -e "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\n" >"/dev/${T}" 2>/dev/null || echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\nNo IP found.\033[0m\n" >"/dev/${T}" 2>/dev/null fi done - printf "\033[1;37mLoading DSM Kernel...\033[0m" + echo -e "\033[1;37mLoading DSM Kernel...\033[0m" # Executes DSM kernel via KEXEC KEXECARGS="-a" if [ $(echo "${KVER:-4}" | cut -d'.' -f1) -lt 4 ] && [ ${EFI} -eq 1 ]; then - printf "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m" + echo -e "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m" KEXECARGS+=" --noefi" fi kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog diff --git a/files/initrd/opt/arc/bzImage-to-vmlinux.sh b/files/initrd/opt/arc/bzImage-to-vmlinux.sh index 59c19214..5241e925 100755 --- a/files/initrd/opt/arc/bzImage-to-vmlinux.sh +++ b/files/initrd/opt/arc/bzImage-to-vmlinux.sh @@ -1,16 +1,16 @@ #!/usr/bin/env bash read_u8() { - dd if="${1}" bs=1 skip="$((${2}))" count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' + dd if=$1 bs=1 skip=$(($2)) count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' } read_u32() { - dd if="${1}" bs=1 skip="$((${2}))" count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' + dd if=$1 bs=1 skip=$(($2)) count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' } set -x -setup_size=$(read_u8 "${1}" 0x1f1) -payload_offset=$(read_u32 "${1}" 0x248) -payload_length=$(read_u32 "${1}" 0x24c) -inner_pos=$(((setup_size + 1) * 512)) +setup_size=$(read_u8 $1 0x1f1) +payload_offset=$(read_u32 $1 0x248) +payload_length=$(read_u32 $1 0x24c) +inner_pos=$((($setup_size + 1) * 512)) -tail -c+$((inner_pos + 1)) "${1}" | tail -c+$((payload_offset + 1)) | head -c "${payload_length}" | head -c $((payload_length - 4)) | unlzma >"${2}" \ No newline at end of file +tail -c+$(($inner_pos + 1)) $1 | tail -c+$(($payload_offset + 1)) | head -c $(($payload_length)) | head -c $(($payload_length - 4)) | unlzma >$2 \ No newline at end of file diff --git a/files/initrd/opt/arc/calc_run_size.sh b/files/initrd/opt/arc/calc_run_size.sh index dc5a3f4b..e648b837 100755 --- a/files/initrd/opt/arc/calc_run_size.sh +++ b/files/initrd/opt/arc/calc_run_size.sh @@ -7,22 +7,28 @@ # objdump -h a.out | sh calc_run_size.sh NUM='\([0-9a-fA-F]*[ \t]*\)' -OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/0x\1 0x\4/p') - -if [ -z "${OUT}" ]; then +OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p') +if [ -z "$OUT" ]; then echo "Never found .bss or .brk file offset" >&2 exit 1 fi -read -r sizeA offsetA sizeB offsetB <<<$(echo ${OUT} | awk '{printf "%d %d %d %d", strtonum($1), strtonum($2), strtonum($3), strtonum($4)}') +OUT=$(echo ${OUT# }) +sizeA=$(printf "%d" 0x${OUT%% *}) +OUT=${OUT#* } +offsetA=$(printf "%d" 0x${OUT%% *}) +OUT=${OUT#* } +sizeB=$(printf "%d" 0x${OUT%% *}) +OUT=${OUT#* } +offsetB=$(printf "%d" 0x${OUT%% *}) -runSize=$((offsetA + sizeA + sizeB)) +run_size=$((${offsetA} + ${sizeA} + ${sizeB})) # BFD linker shows the same file offset in ELF. if [ "${offsetA}" -ne "${offsetB}" ]; then # Gold linker shows them as consecutive. - endSize=$((offsetB + sizeB)) - if [ "${endSize}" -ne "${runSize}" ]; then + endB=$((${offsetB} + ${sizeB})) + if [ "$endB" != "$run_size" ]; then printf "sizeA: 0x%x\n" ${sizeA} >&2 printf "offsetA: 0x%x\n" ${offsetA} >&2 printf "sizeB: 0x%x\n" ${sizeB} >&2 @@ -32,5 +38,5 @@ if [ "${offsetA}" -ne "${offsetB}" ]; then fi fi -printf "%d\n" ${runSize} +printf "%d\n" ${run_size} exit 0 \ No newline at end of file diff --git a/files/initrd/opt/arc/extract-vmlinux b/files/initrd/opt/arc/extract-vmlinux index 94c56c08..8995cd30 100755 --- a/files/initrd/opt/arc/extract-vmlinux +++ b/files/initrd/opt/arc/extract-vmlinux @@ -10,34 +10,38 @@ # # ---------------------------------------------------------------------- -check_vmlinux() { - # Use readelf to check if it's a valid ELF - # TODO: find a better to way to check that it's really vmlinux - # and not just an elf - readelf -h $1 >/dev/null 2>&1 || return 1 +check_vmlinux() +{ + # Use readelf to check if it's a valid ELF + # TODO: find a better to way to check that it's really vmlinux + # and not just an elf + readelf -h $1 > /dev/null 2>&1 || return 1 - cat $1 - exit 0 + cat $1 + exit 0 } -try_decompress() { - # The obscure use of the "tr" filter is to work around older versions of - # "grep" that report the byte offset of the line instead of the pattern. +try_decompress() +{ + # The obscure use of the "tr" filter is to work around older versions of + # "grep" that report the byte offset of the line instead of the pattern. - # Try to find the header ($1) and decompress from here - for pos in $(tr "$1\n$2" "\n$2=" <"$img" | grep -abo "^$2"); do - pos=${pos%%:*} - tail -c+$pos "$img" | $3 >$tmp 2>/dev/null - check_vmlinux $tmp - done + # Try to find the header ($1) and decompress from here + for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` + do + pos=${pos%%:*} + tail -c+$pos "$img" | $3 > $tmp 2> /dev/null + check_vmlinux $tmp + done } # Check invocation: me=${0##*/} img=$1 -if [ $# -ne 1 ] || [ ! -s "$img" ]; then - echo "Usage: $me " >&2 - exit 2 +if [ $# -ne 1 -o ! -s "$img" ] +then + echo "Usage: $me " >&2 + exit 2 fi # Prepare temp files: @@ -57,4 +61,4 @@ try_decompress '(\265/\375' xxx unzstd check_vmlinux $img # Bail out: -echo "$me: Cannot find vmlinux." >&2 \ No newline at end of file +echo "$me: Cannot find vmlinux." >&2 diff --git a/files/initrd/opt/arc/include/addons.sh b/files/initrd/opt/arc/include/addons.sh index 8bd2a730..5bbb12b3 100755 --- a/files/initrd/opt/arc/include/addons.sh +++ b/files/initrd/opt/arc/include/addons.sh @@ -8,9 +8,9 @@ function availableAddons() { fi local ARCOFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")" local ARCCONF="$(readConfigKey "${MODEL}.serial" "${S_FILE}")" - while read -r D; do + for D in $(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort); do [ ! -f "${D}/manifest.yml" ] && continue - local ADDON=$(basename "${D}") + local ADDON=$(basename ${D}) local AVAILABLE="$(readConfigKey "${1}" "${D}/manifest.yml")" [ "${AVAILABLE}" = false ] && continue local SYSTEM=$(readConfigKey "system" "${D}/manifest.yml") @@ -37,7 +37,7 @@ function availableAddons() { else [ "${AVAILABLE}" = true ] && echo -e "${ADDON}\t${BETA}${DESC}" fi - done <<<"$(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort)" + done } ############################################################################### @@ -76,7 +76,7 @@ function installAddon() { [ ${HAS_FILES} -ne 1 ] && return 1 cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}" chmod +x "${RAMDISK_PATH}/addons/${ADDON}.sh" - [ -d "${TMP_PATH}/${ADDON}/root" ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}") + [ -d ${TMP_PATH}/${ADDON}/root ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}") rm -rf "${TMP_PATH}/${ADDON}" return 0 } @@ -84,7 +84,7 @@ function installAddon() { ############################################################################### # Untar an addon to correct path # 1 - Addon file path -# Return name of addon on success or empty on error +# Return name of addon on sucess or empty on error function untarAddon() { if [ -z "${1}" ]; then echo "" @@ -92,24 +92,23 @@ function untarAddon() { fi rm -rf "${TMP_PATH}/addon" mkdir -p "${TMP_PATH}/addon" - tar -xaf "${1}" -C "${TMP_PATH}/addon" || return 1 + tar -xaf "${1}" -C "${TMP_PATH}/addon" || return local ADDON=$(readConfigKey "name" "${TMP_PATH}/addon/manifest.yml") - [ -z "${ADDON}" ] && return 1 + [ -z "${ADDON}" ] && return rm -rf "${ADDONS_PATH}/${ADDON}" mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${ADDON}" echo "${ADDON}" - return 0 } ############################################################################### # Detect if has new local plugins to install/reinstall function updateAddon() { - while read -r F; do + for F in $(ls ${ADDONS_PATH}/*.addon 2>/dev/null); do local ADDON=$(basename "${F}" | sed 's|.addon||') rm -rf "${ADDONS_PATH}/${ADDON}" mkdir -p "${ADDONS_PATH}/${ADDON}" echo "Installing ${F} to ${ADDONS_PATH}/${ADDON}" tar -xaf "${F}" -C "${ADDONS_PATH}/${ADDON}" rm -f "${F}" - done <<<"$(ls ${ADDONS_PATH}/*.addon 2>/dev/null)" + done } diff --git a/files/initrd/opt/arc/include/configFile.sh b/files/initrd/opt/arc/include/configFile.sh index 0d6df4f4..06d99cfc 100755 --- a/files/initrd/opt/arc/include/configFile.sh +++ b/files/initrd/opt/arc/include/configFile.sh @@ -4,7 +4,7 @@ # 1 - Path of Key # 2 - Path of yaml config file function deleteConfigKey() { - yq eval "del(.${1})" --inplace "${2}" 2>/dev/null + yq eval 'del(.'${1}')' --inplace "${2}" 2>/dev/null } ############################################################################### @@ -13,8 +13,7 @@ function deleteConfigKey() { # 2 - Value # 3 - Path of yaml config file function writeConfigKey() { - local value="${2}" - [ "${value}" = "{}" ] && yq eval ".${1} = {}" --inplace "${3}" 2>/dev/null || yq eval ".${1} = \"${value}\"" --inplace "${3}" 2>/dev/null + [ "${2}" = "{}" ] && yq eval '.'${1}' = {}' --inplace "${3}" 2>/dev/null || yq eval '.'${1}' = "'"${2}"'"' --inplace "${3}" 2>/dev/null } ############################################################################### @@ -23,20 +22,8 @@ function writeConfigKey() { # 2 - Path of yaml config file # Return Value function readConfigKey() { - local result=$(yq eval ".${1} | explode(.)" "${2}" 2>/dev/null) - [ "${result}" = "null" ] && echo "" || echo "${result}" -} - -############################################################################### -# Write to yaml config file -# 1 - format -# 2 - string -# 3 - Path of yaml config file -function mergeConfigStr() { - local xmlfile=$(mktemp) - echo "${2}" | yq -p "${1}" -o y >"${xmlfile}" - yq eval-all --inplace '. as $item ireduce ({}; . * $item)' --inplace "${3}" "${xmlfile}" 2>/dev/null - rm -f "${xmlfile}" + RESULT=$(yq eval '.'${1}' | explode(.)' "${2}" 2>/dev/null) + [ "${RESULT}" = "null" ] && echo "" || echo "${RESULT}" } ############################################################################### @@ -54,7 +41,7 @@ function initConfigKey() { # 2 - Path of yaml config file # Returns map of values function readConfigMap() { - yq eval ".${1} | explode(.) | to_entries | map([.key, .value] | join(\": \")) | .[]" "${2}" 2>/dev/null + yq eval '.'${1}' | explode(.) | to_entries | map([.key, .value] | join(": ")) | .[]' "${2}" 2>/dev/null } ############################################################################### @@ -63,7 +50,7 @@ function readConfigMap() { # 2 - Path of yaml config file # Returns array/map of values function readConfigArray() { - yq eval ".${1}[]" "${2}" 2>/dev/null + yq eval '.'${1}'[]' "${2}" 2>/dev/null } ############################################################################### @@ -72,7 +59,7 @@ function readConfigArray() { # 2 - Path of yaml config file # Returns array of values function readConfigEntriesArray() { - yq eval ".${1} | explode(.) | to_entries | map([.key])[] | .[]" "${2}" 2>/dev/null + yq eval '.'${1}' | explode(.) | to_entries | map([.key])[] | .[]' "${2}" 2>/dev/null } ############################################################################### diff --git a/files/initrd/opt/arc/include/functions.sh b/files/initrd/opt/arc/include/functions.sh index ff611037..39b4173c 100755 --- a/files/initrd/opt/arc/include/functions.sh +++ b/files/initrd/opt/arc/include/functions.sh @@ -1,13 +1,13 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/consts.sh" -. "${ARC_PATH}/include/configFile.sh" -. "${ARC_PATH}/include/addons.sh" +. ${ARC_PATH}/include/consts.sh +. ${ARC_PATH}/include/configFile.sh +. ${ARC_PATH}/include/addons.sh ############################################################################### # Check loader disk function checkBootLoader() { - while read -r KNAME RO; do + while read KNAME RO; do [ -z "${KNAME}" ] && continue [ "${RO}" = "0" ] && continue hdparm -r0 "${KNAME}" >/dev/null 2>&1 || true @@ -40,41 +40,48 @@ function dieLog() { } ############################################################################### -# Check if an item exists in an array +# Check if a item exists into array # 1 - Item # 2.. - Array # Return 0 if exists function arrayExistItem() { - local ITEM="${1}" + EXISTS=1 + ITEM="${1}" shift for i in "$@"; do - [ "${i}" = "${ITEM}" ] && return 0 + [ "${i}" = "${ITEM}" ] || continue + EXISTS=0 + break done - return 1 + return ${EXISTS} } ############################################################################### # Generate a number with 6 digits from 1 to 30000 function random() { - printf "%06d" $((RANDOM % 30000 + 1)) + printf "%06d" $((${RANDOM} % 30000 + 1)) } ############################################################################### -# Generate a hex number from 0x00 to 0xFF +# Generate a hexa number from 0x00 to 0xFF function randomhex() { - printf "%02X" $((RANDOM % 255 + 1)) + printf "&02X" "$((${RANDOM} % 255 + 1))" } ############################################################################### # Generate a random letter function genRandomLetter() { - echo {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1 + for i in A B C D E F G H J K L M N P Q R S T V W X Y Z; do + echo ${i} + done | sort -R | tail -1 } ############################################################################### # Generate a random digit (0-9A-Z) function genRandomValue() { - echo {0..9} {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1 + for i in 0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T V W X Y Z; do + echo ${i} + done | sort -R | tail -1 } ############################################################################### @@ -83,7 +90,6 @@ function genRandomValue() { # 2 - Arc # Returns serial number function generateSerial() { - local PREFIX MIDDLE SUFFIX SERIAL PREFIX="$(readConfigArray "${1}.prefix" "${S_FILE}" 2>/dev/null | sort -R | tail -1)" MIDDLE="$(readConfigArray "${1}.middle" "${S_FILE}" 2>/dev/null | sort -R | tail -1)" if [ "${2}" = "true" ]; then @@ -105,7 +111,7 @@ function generateSerial() { ;; esac - local SERIAL="$(echo "${SERIAL}" | tr '[:lower:]' '[:upper:]')" + SERIAL="$(echo "${SERIAL}" | tr '[:lower:]' '[:upper:]')" echo "${SERIAL}" return 0 } @@ -117,17 +123,16 @@ function generateSerial() { # 3 - Arc MAC # Returns serial number function generateMacAddress() { - local MACPRE MACSUF NUM MACS MACPRE="$(readConfigKey "${1}.macpre" "${S_FILE}")" if [ "${3}" = "true" ]; then MACSUF="$(readConfigKey "${1}.mac" "${S_FILE}" 2>/dev/null)" else - MACSUF="$(printf '%02x%02x%02x' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))" + MACSUF="$(printf '%02x%02x%02x' $((${RANDOM} % 256)) $((${RANDOM} % 256)) $((${RANDOM} % 256)))" fi NUM=${2:-1} local MACS="" for I in $(seq 1 ${NUM}); do - MACS+="$(printf '%06x%06x' $((0x${MACPRE:-"001132"})) $((0x${MACSUF} + I)))" + MACS+="$(printf '%06x%06x' $((0x${MACPRE:-"001132"})) $(($((0x${MACSUF})) + ${I})))" [ ${I} -lt ${NUM} ] && MACS+=" " done @@ -142,7 +147,6 @@ function generateMacAddress() { # 2 - Serial number to test # Returns 1 if serial number is invalid function validateSerial() { - local PREFIX MIDDLE SUFFIX P M S L PREFIX="$(readConfigArray "${1}.prefix" "${S_FILE}" 2>/dev/null)" MIDDLE="$(readConfigArray "${1}.middle" "${S_FILE}" 2>/dev/null)" SUFFIX="$(readConfigKey "${1}.suffix" "${S_FILE}" 2>/dev/null)" @@ -174,12 +178,29 @@ function validateSerial() { return 0 } +############################################################################### +# Check if a item exists into array +# 1 - Item +# 2.. - Array +# Return 0 if exists +function arrayExistItem() { + EXISTS=1 + ITEM="${1}" + shift + for i in "$@"; do + [ "${i}" = "${ITEM}" ] || continue + EXISTS=0 + break + done + return ${EXISTS} +} + ############################################################################### # Get values in .conf K=V file # 1 - key # 2 - file function _get_conf_kv() { - grep "^${1}=" "${2}" 2>/dev/null | cut -d'=' -f2- | sed 's/^"//;s/"$//' 2>/dev/null + grep "${1}" "${2}" | sed "s|^${1}=\"\(.*\)\"$|\1|g" } ############################################################################### @@ -190,57 +211,46 @@ function _get_conf_kv() { function _set_conf_kv() { # Delete if [ -z "${2}" ]; then - sed -i "/^${1}=/d" "${3}" 2>/dev/null + sed -i "${3}" -e "s/^${1}=.*$//" return $?; fi # Replace if grep -q "^${1}=" "${3}"; then - sed -i "s#^${1}=.*#${1}=\"${2}\"#" "${3}" 2>/dev/null + sed -i "${3}" -e "s\"^${1}=.*\"${1}=\\\"${2}\\\"\"" return $? fi # Add if doesn't exist echo "${1}=\"${2}\"" >>"${3}" - return $? } ############################################################################### -# sort netif name -# @1 -mac1,mac2,mac3... +# sort netif busid function _sort_netif() { local ETHLIST="" - local ETHX="$(ls /sys/class/net/ 2>/dev/null | grep eth)" # real network cards list + local ETHX=$(ip -o link show | awk -F': ' '{print $2}' | grep eth) for N in ${ETHX}; do local MAC="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g; s/.*/\L&/')" local BUS="$(ethtool -i ${N} 2>/dev/null | grep bus-info | cut -d' ' -f2)" ETHLIST="${ETHLIST}${BUS} ${MAC} ${N}\n" done - local ETHLISTTMPM="" local ETHLISTTMPB="$(echo -e "${ETHLIST}" | sort)" - if [ -n "${1}" ]; then - local MACS="$(echo "${1}" | sed 's/://g; s/,/ /g; s/.*/\L&/')" - for MACX in ${MACS}; do - ETHLISTTMPM="${ETHLISTTMPM}$(echo -e "${ETHLISTTMPB}" | grep "${MACX}")\n" - ETHLISTTMPB="$(echo -e "${ETHLISTTMPB}" | grep -v "${MACX}")\n" - done - fi - ETHLIST="$(echo -e "${ETHLISTTMPM}${ETHLISTTMPB}" | grep -v '^$')" + local ETHLIST="$(echo -e "${ETHLISTTMPB}" | grep -v '^$')" local ETHSEQ="$(echo -e "${ETHLIST}" | awk '{print $3}' | sed 's/eth//g')" local ETHNUM="$(echo -e "${ETHLIST}" | wc -l)" - # echo "${ETHSEQ}" # sort if [ ! "${ETHSEQ}" = "$(seq 0 $((${ETHNUM:0} - 1)))" ]; then /etc/init.d/S41dhcpcd stop >/dev/null 2>&1 /etc/init.d/S40network stop >/dev/null 2>&1 for i in $(seq 0 $((${ETHNUM:0} - 1))); do - ip link set dev "eth${i}" name "tmp${i}" + ip link set dev eth${i} name tmp${i} done I=0 for i in ${ETHSEQ}; do - ip link set dev "tmp${i}" name "eth${I}" - I=$((I + 1)) + ip link set dev tmp${i} name eth${I} + I=$((${I} + 1)) done /etc/init.d/S40network start >/dev/null 2>&1 /etc/init.d/S41dhcpcd start >/dev/null 2>&1 @@ -267,12 +277,19 @@ function getBus() { # 1 - ethN function getIP() { local IP="" - if [ -n "${1}" ] && [ -d "/sys/class/net/${1}" ]; then - IP=$(ip route show dev "${1}" 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') - [ -z "${IP}" ] && IP=$(ip addr show "${1}" scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) + MACR="$(cat /sys/class/net/${1}/address 2>/dev/null | sed 's/://g' | tr '[:lower:]' '[:upper:]')" + IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" + if [ -n "${IPR}" ]; then + IFS='/' read -r -a IPRA <<<"${IPR}" + IP=${IPRA[0]} else - IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1) - [ -z "${IP}" ] && IP=$(ip addr show scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) + if [ -n "${1}" ] && [ -d "/sys/class/net/${1}" ]; then + IP=$(ip route show dev ${1} 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') + [ -z "${IP}" ] && IP=$(ip addr show ${1} scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) + else + IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1) + [ -z "${IP}" ] && IP=$(ip addr show scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1) + fi fi echo "${IP}" return 0 @@ -284,11 +301,8 @@ function getIP() { function getLogo() { local MODEL="${1}" rm -f "${PART3_PATH}/logo.png" - if [ $? -ne 0 ]; then - return 1 - fi - local STATUS=$(curl -skL --connect-timeout 10 -w "%{http_code}" "https://www.synology.com/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png") - if [ $? -ne 0 ] || [ "${STATUS:-0}" -ne 200 ] || [ ! -f "${PART3_PATH}/logo.png" ]; then + STATUS=$(curl -skL -m 10 -w "%{http_code}" "https://www.synology.com/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png") + if [ $? -ne 0 -o ${STATUS:-0} -ne 200 -o ! -f "${PART3_PATH}/logo.png" ]; then rm -f "${PART3_PATH}/logo.png" return 1 fi @@ -325,83 +339,53 @@ function convert_netmask() { # 1 - key name # 2 - key string function checkCmdline() { - grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep -q "^${1}=\"\?${2}\"\?" + return $(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | grep -q "${2}") } ############################################################################### -# set Cmdline +# get logo of model # 1 - key name # 2 - key string function setCmdline() { [ -z "${1}" ] && return 1 if [ -n "${2}" ]; then - grub-editenv "${USER_GRUBENVFILE}" set "${1}=${2}" + grub-editenv ${USER_GRUBENVFILE} set "${1}=${2}" else - grub-editenv "${USER_GRUBENVFILE}" unset "${1}" + grub-editenv ${USER_GRUBENVFILE} unset "${1}" fi } ############################################################################### -# add Cmdline +# get logo of model +# check Cmdline # 1 - key name # 2 - key string function addCmdline() { - local CMDLINE - CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')" + local CMDLINE="$(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2-)" [ -n "${CMDLINE}" ] && CMDLINE="${CMDLINE} ${2}" || CMDLINE="${2}" setCmdline "${1}" "${CMDLINE}" } ############################################################################### -# del Cmdline -# 1 - key name -# 2 - key string +# get logo of model +# 1 - model function delCmdline() { - local CMDLINE - CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')" - CMDLINE="$(echo "${CMDLINE}" | sed "s/[ \t]*${2}//; s/^[ \t]*//;s/[ \t]*$//")" + local CMDLINE="$(grub-editenv ${USER_GRUBENVFILE} list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2-)" + CMDLINE="$(echo "${CMDLINE}" | sed "s/ *${2}//; s/^[[:space:]]*//;s/[[:space:]]*$//")" setCmdline "${1}" "${CMDLINE}" } -############################################################################### -# check CPU Intel(VT-d)/AMD(AMD-Vi) -function checkCPU_VT_d() { - lsmod | grep -q msr || modprobe msr 2>/dev/null - if grep -q "GenuineIntel" /proc/cpuinfo; then - local VT_D_ENABLED=$(rdmsr 0x3a 2>/dev/null) - [ "$((${VT_D_ENABLED:-0x0} & 0x5))" -eq $((0x5)) ] && return 0 - elif grep -q "AuthenticAMD" /proc/cpuinfo; then - local IOMMU_ENABLED=$(rdmsr 0xC0010114 2>/dev/null) - [ "$((${IOMMU_ENABLED:-0x0} & 0x1))" -eq $((0x1)) ] && return 0 - else - return 1 - fi -} -############################################################################### -# check BIOS Intel(VT-d)/AMD(AMD-Vi) -function checkBIOS_VT_d() { - if grep -q "GenuineIntel" /proc/cpuinfo; then - dmesg | grep -iq "DMAR-IR.*DRHD base" && return 0 - elif grep -q "AuthenticAMD" /proc/cpuinfo; then - # TODO: need check - dmesg | grep -iq "AMD-Vi.*enabled" && return 0 - else - return 1 - fi -} - ############################################################################### # Rebooting # (based on pocopico's TCRP code) function rebootTo() { local MODES="config recovery junior automated update bios memtest" - if [ -z "${1}" ] || ! echo "${MODES}" | grep -qw "${1}"; then exit 1; fi - # echo "Rebooting to ${1} mode" - GRUBPATH="$(dirname "$(find "${PART1_PATH}/" -name grub.cfg 2>/dev/null | head -1)")" - [ -z "${GRUBPATH}" ] && exit 1 - ENVFILE="${GRUBPATH}/grubenv" - [ ! -f "${ENVFILE}" ] && grub-editenv "${ENVFILE}" create - grub-editenv "${ENVFILE}" set next_entry="${1}" + [ -z "${1}" ] && exit 1 + if ! echo "${MODES}" | grep -qw "${1}"; then exit 1; fi + [ "${1}" = "automated" ] && echo "arc-${MODEL}-${PRODUCTVER}-${ARC_VERSION}" >"${PART3_PATH}/automated" + [ ! -f "${USER_GRUBENVFILE}" ] && grub-editenv ${USER_GRUBENVFILE} create + # echo -e "Rebooting to ${1} mode..." + grub-editenv ${USER_GRUBENVFILE} set next_entry="${1}" exec reboot } diff --git a/files/initrd/opt/arc/include/modules.sh b/files/initrd/opt/arc/include/modules.sh index 78266975..9c45df4c 100755 --- a/files/initrd/opt/arc/include/modules.sh +++ b/files/initrd/opt/arc/include/modules.sh @@ -1,37 +1,3 @@ -############################################################################### -# Unpack modules from a tgz file -# 1 - Platform -# 2 - Kernel Version -function unpackModules() { - local PLATFORM=${1} - local KVER=${2} - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - - rm -rf "${TMP_PATH}/modules" - mkdir -p "${TMP_PATH}/modules" - if [ "${KERNEL}" = "custom" ]; then - tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - else - tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" - fi -} - -############################################################################### -# Packag modules to a tgz file -# 1 - Platform -# 2 - Kernel Version -function packagModules() { - local PLATFORM=${1} - local KVER=${2} - local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" - - if [ "${KERNEL}" = "custom" ]; then - tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - else - tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . - fi -} - ############################################################################### # Return list of all modules available # 1 - Platform @@ -41,19 +7,26 @@ function getAllModules() { local KVER=${2} if [ -z "${PLATFORM}" ] || [ -z "${KVER}" ]; then + echo "" return 1 fi - - unpackModules "${PLATFORM}" "${KVER}" - + # Unzip modules for temporary folder + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + fi + # Get list of all modules for F in $(ls ${TMP_PATH}/modules/*.ko 2>/dev/null); do - local X=$(basename "${F}") + local X=$(basename ${F}) local M=${X:0:-3} - local DESC=$(modinfo "${F}" 2>/dev/null | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}') + local DESC=$(modinfo ${F} | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}') [ -z "${DESC}" ] && DESC="${X}" echo "${M} \"${DESC}\"" done - rm -rf "${TMP_PATH}/modules" } @@ -72,22 +45,30 @@ function installModules() { echo "ERROR: installModules: Platform or Kernel Version not defined" >"${LOG_FILE}" return 1 fi - - unpackModules "${PLATFORM}" "${KVER}" + # Unzip modules for temporary folder + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}" + fi + if [ $? -ne 0 ]; then + return 1 + fi local ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")" for F in $(ls "${TMP_PATH}/modules/"*.ko 2>/dev/null); do - local M=$(basename "${F}") - [ "${ODP}" == "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue + local M=$(basename ${F}) + [ "${ODP}" = "true" -a -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue if echo "${MLIST}" | grep -wq "${M:0:-3}"; then cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}" else rm -f "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}" fi done - mkdir -p "${RAMDISK_PATH}/usr/lib/firmware" - local KERNEL=$(readConfigKey "kernel" "${USER_CONFIG_FILE}") if [ "${KERNEL}" = "custom" ]; then tar -zxf "${CUSTOM_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}" else @@ -97,6 +78,7 @@ function installModules() { return 1 fi + # Clean rm -rf "${TMP_PATH}/modules" return 0 } @@ -115,12 +97,21 @@ function addToModules() { echo "" return 1 fi - - unpackModules "${PLATFORM}" "${KVER}" - - cp -f "${KOFILE}" "${TMP_PATH}/modules" - - packagModules "${PLATFORM}" "${KVER}" + # Unzip modules for temporary folder + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + fi + cp -f ${KOFILE} ${TMP_PATH}/modules + if [ "${KERNEL}" = "custom" ]; then + tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + else + tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + fi } ############################################################################### @@ -137,12 +128,21 @@ function delToModules() { echo "" return 1 fi - - unpackModules "${PLATFORM}" "${KVER}" - - rm -f "${TMP_PATH}/modules/${KONAME}" - - packagModules "${PLATFORM}" "${KVER}" + # Unzip modules for temporary folder + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + fi + rm -f ${TMP_PATH}/modules/${KONAME} + if [ "${KERNEL}" = "custom" ]; then + tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + else + tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" . + fi } ############################################################################### @@ -153,16 +153,15 @@ function delToModules() { function getdepends() { function _getdepends() { if [ -f "${TMP_PATH}/modules/${1}.ko" ]; then - local depends=($(modinfo "${TMP_PATH}/modules/${1}.ko" 2>/dev/null | grep depends: | awk -F: '{print $2}' | awk '$1=$1' | sed 's/,/ /g')) + depends=($(modinfo "${TMP_PATH}/modules/${1}.ko" 2>/dev/null | grep depends: | awk -F: '{print $2}' | awk '$1=$1' | sed 's/,/ /g')) if [ ${#depends[@]} -gt 0 ]; then - for k in "${depends[@]}"; do + for k in ${depends[@]}; do echo "${k}" _getdepends "${k}" done fi fi } - local PLATFORM=${1} local KVER=${2} local KONAME=${3} @@ -171,10 +170,16 @@ function getdepends() { echo "" return 1 fi - - unpackModules "${PLATFORM}" "${KVER}" - - local DPS=($(_getdepends "${KONAME}" | tr ' ' '\n' | sort -u)) - echo "${DPS[@]}" + # Unzip modules for temporary folder + rm -rf "${TMP_PATH}/modules" + mkdir -p "${TMP_PATH}/modules" + local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")" + if [ "${KERNEL}" = "custom" ]; then + tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + else + tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" + fi + local DPS=($(_getdepends ${KONAME} | tr ' ' '\n' | sort -u)) + echo ${DPS[@]} rm -rf "${TMP_PATH}/modules" } \ No newline at end of file diff --git a/files/initrd/opt/arc/include/network.sh b/files/initrd/opt/arc/include/network.sh index cb659513..41c35899 100755 --- a/files/initrd/opt/arc/include/network.sh +++ b/files/initrd/opt/arc/include/network.sh @@ -4,7 +4,7 @@ function getnet() { MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")" ARCPATCH="$(readConfigKey "arc.patch" "${USER_CONFIG_FILE}")" NICPORTS="$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null)" - ETHN=$(echo "${ETHX}" | wc -w) + ETHN=$(echo ${ETHX} | wc -w) if [ "${ARCPATCH}" = "true" ]; then MACS=($(generateMacAddress "${MODEL}" "${ETHN}" "true")) for I in $(seq 1 ${ETHN}); do @@ -44,7 +44,7 @@ function getnet() { # Get Amount of NIC ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)" # Get actual IP -for N in ${ETHX}; do - IPCON=$(getIP "${N}") +for ETH in ${ETHX}; do + IPCON=$(getIP ${ETH}) [ -n "${IPCON}" ] && break done \ No newline at end of file diff --git a/files/initrd/opt/arc/include/storage.sh b/files/initrd/opt/arc/include/storage.sh index 12c69ddc..16b18f84 100755 --- a/files/initrd/opt/arc/include/storage.sh +++ b/files/initrd/opt/arc/include/storage.sh @@ -25,7 +25,7 @@ function getmap() { ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')" PORT=$(echo ${ATAPORT} | sed 's/ata//') HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$') - done <<<"$(ls -l /sys/class/scsi_host | grep -F "${PCI}")" + done < <(ls -l /sys/class/scsi_host | grep -F "${PCI}") while read -r PORT; do ls -l /sys/block | grep -F -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0 PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd) @@ -33,7 +33,7 @@ function getmap() { [ ${ATTACH} = 1 ] && CONPORTS="$((${CONPORTS} + 1))" && echo "$((${PORT} - 1))" >>"${TMP_PATH}/ports" [ ${DUMMY} = 1 ] # Do nothing for now NUMPORTS=$((${NUMPORTS} + 1)) - done <<<"$(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n)" + done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n) [ ${NUMPORTS} -gt 8 ] && NUMPORTS=8 [ ${CONPORTS} -gt 8 ] && CONPORTS=8 echo -n "${NUMPORTS}" >>"${TMP_PATH}/drivesmax" @@ -131,7 +131,7 @@ function getmap() { elif [ ${D} = ${LASTDRIVE} ]; then LASTDRIVE=$((${D} + 1)) fi - done <<<"$(cat "${TMP_PATH}/ports")" + done < <(cat "${TMP_PATH}/ports") fi } diff --git a/files/initrd/opt/arc/include/update.sh b/files/initrd/opt/arc/include/update.sh index f9b3bdcd..925a0405 100755 --- a/files/initrd/opt/arc/include/update.sh +++ b/files/initrd/opt/arc/include/update.sh @@ -307,7 +307,7 @@ function updateModules() { writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" while read -r ID DESC; do writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" - done <<<"$(getAllModules "${PLATFORM}" "${KVERP}")" + done < <(getAllModules "${PLATFORM}" "${KVERP}") dialog --backtitle "$(backtitle)" --title "Update Modules" \ --infobox "Rewrite successful!" 3 50 sleep 2 diff --git a/files/initrd/opt/arc/init.sh b/files/initrd/opt/arc/init.sh index 51a3ab0c..96d82bc0 100755 --- a/files/initrd/opt/arc/init.sh +++ b/files/initrd/opt/arc/init.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" +. ${ARC_PATH}/include/functions.sh # Get Loader Disk Bus [ -z "${LOADER_DISK}" ] && die "Loader Disk not found!" @@ -20,15 +20,14 @@ BANNER="$(figlet -c -w "$(((${COLUMNS})))" "Arc Loader")" TITLE="Version:" TITLE+=" ${ARC_VERSION} (${ARC_BUILD})" [ -n "${ARC_BRANCH}" ] && TITLE+=" | Branch: ${ARC_BRANCH}" -printf "\033[1;30m%*s\n" "${COLUMNS}" "" -printf "\033[1;30m%*s\033[A\n" "${COLUMNS}" "" -printf "\033[1;34m%*s\033[0m\n" "${COLUMNS}" "${BANNER}" -printf "\033[1;34m%*s\033[0m\n" "$(((${#TITLE} + ${COLUMNS}) / 2))" "${TITLE}" +printf "\033[1;30m%*s\n" ${COLUMNS} "" +printf "\033[1;30m%*s\033[A\n" ${COLUMNS} "" +printf "\033[1;34m%*s\033[0m\n" ${COLUMNS} "${BANNER}" +printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" TITLE="Boot:" [ ${EFI} -eq 1 ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]" TITLE+=" [${BUS}]" -printf "\033[1;34m%*s\033[0m\n" "$(((${#TITLE} + ${COLUMNS}) / 2))" "${TITLE}" -printf "\n" +printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" # Check for Config File if [ ! -f "${USER_CONFIG_FILE}" ]; then @@ -92,7 +91,7 @@ if [ -n "${ARC_BRANCH}" ]; then writeConfigKey "arc.branch" "${ARC_BRANCH}" "${USER_CONFIG_FILE}" fi # Sort network interfaces -if arrayExistItem "sortnetif:" "$(readConfigMap "addons" "${USER_CONFIG_FILE}")"; then +if arrayExistItem "sortnetif:" $(readConfigMap "addons" "${USER_CONFIG_FILE}"); then _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")" fi # Read/Write IP/Mac to config @@ -102,10 +101,10 @@ for N in ${ETHX}; do IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" if [ -n "${IPR}" ] && [ "1" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then IFS='/' read -r -a IPRA <<<"${IPR}" - ip addr flush dev "${N}" - ip addr add "${IPRA[0]}/${IPRA[1]:-"255.255.255.0"}" dev "${N}" + ip addr flush dev ${N} + ip addr add ${IPRA[0]}/${IPRA[1]:-"255.255.255.0"} dev ${N} if [ -n "${IPRA[2]}" ]; then - ip route add default via "${IPRA[2]}" dev "${N}" + ip route add default via ${IPRA[2]} dev ${N} fi if [ -n "${IPRA[3]:-${IPRA[2]}}" ]; then sed -i "/nameserver ${IPRA[3]:-${IPRA[2]}}/d" /etc/resolv.conf @@ -113,12 +112,14 @@ for N in ${ETHX}; do fi sleep 1 fi - [ "${N::3}" = "eth" ] && ethtool -s "${N}" wol g 2>/dev/null || true + [ "${N::3}" = "eth" ] && ethtool -s ${N} wol g 2>/dev/null || true + # [ "${N::3}" = "eth" ] && ethtool -K ${N} rxhash off 2>/dev/null || true initConfigKey "${N}" "${MACR}" "${USER_CONFIG_FILE}" done -ETHN=$(echo "${ETHX}" | wc -w) +ETHN=$(echo ${ETHX} | wc -w) writeConfigKey "device.nic" "${ETHN}" "${USER_CONFIG_FILE}" # No network devices +echo [ ${ETHN} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." # Get the VID/PID if we are in USB @@ -134,8 +135,9 @@ elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then fi # Inform user and check bus -printf "Loader Disk: \033[1;34m${LOADER_DISK}\033[0m" -printf "Loader Disk Type: \033[1;34m${BUS}\033[0m\n" +echo -e "Loader Disk: \033[1;34m${LOADER_DISK}\033[0m" +echo -e "Loader Disk Type: \033[1;34m${BUS}\033[0m" +echo # Save variables to user config file writeConfigKey "vid" "${VID}" "${USER_CONFIG_FILE}" @@ -145,26 +147,28 @@ writeConfigKey "pid" "${PID}" "${USER_CONFIG_FILE}" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" ARCMODE="$(readConfigKey "arc.mode" "${USER_CONFIG_FILE}")" if [ "${ARCMODE}" = "config" ]; then - printf "\033[1;34mStarting Config Mode...\033[0m\n" + echo -e "\033[1;34mStarting Config Mode...\033[0m" elif [ "${ARCMODE}" = "automated" ]; then - printf "\033[1;34mStarting automated Build Mode...\033[0m\n" + echo -e "\033[1;34mStarting automated Build Mode...\033[0m" elif [ "${ARCMODE}" = "update" ]; then - printf "\033[1;34mStarting Update Mode...\033[0m\n" + echo -e "\033[1;34mStarting Update Mode...\033[0m" elif [ "${BUILDDONE}" = "true" ] && [ "${ARCMODE}" = "dsm" ]; then - printf "\033[1;34mStarting DSM Mode...\033[0m\n" + echo -e "\033[1;34mStarting DSM Mode...\033[0m" if [ -f "${ARC_PATH}/boot.sh" ]; then - exec "${ARC_PATH}/boot.sh" && exit 0 + exec boot.sh && exit 0 else - printf "\033[1;31mError: Can't find Arc System Files...\033[0m\n" + echo -e "\033[1;31mError: Can't find Arc System Files...\033[0m" fi else - printf "\033[1;34mStarting Config Mode...\033[0m\n" + echo -e "\033[1;34mStarting Config Mode...\033[0m" fi +echo BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")" -BOOTIPWAIT=${BOOTIPWAIT:-20} -printf "\033[1;37mDetected ${ETHN} NIC:\033[0m\n" +[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30 +echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m" IPCON="" +echo [ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true sleep 3 for N in ${ETHX}; do @@ -172,32 +176,33 @@ for N in ${ETHX}; do DRIVER=$(ls -ld /sys/class/net/${N}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do if [ "0" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then - printf "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m\n" + echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m" break fi - COUNT=$((COUNT + 1)) - IP="$(getIP "${N}")" + COUNT=$((${COUNT} + 1)) + IP="$(getIP ${N})" if [ -n "${IP}" ]; then SPEED=$(ethtool ${N} 2>/dev/null | grep "Speed:" | awk '{print $2}') - if echo "${IP}" | grep -q "^169\.254\."; then - printf "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m\n" + if [[ "${IP}" =~ ^169\.254\..* ]]; then + echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m" else - printf "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m\n" + echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m" [ -z "${IPCON}" ] && IPCON="${IP}" fi break fi if [ -z "$(cat /sys/class/net/${N}}/carrier 2>/dev/null)" ]; then - printf "\r${DRIVER}: \033[1;37mDOWN\033[0m\n" + echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m" break fi if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - printf "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m\n" + echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m" break fi sleep 1 done done +echo mkdir -p "${ADDONS_PATH}" mkdir -p "${CUSTOM_PATH}" @@ -208,15 +213,16 @@ mkdir -p "${PATCH_PATH}" mkdir -p "${USER_UP_PATH}" # Load Arc Overlay -printf "\033[1;34mLoading Arc Overlay...\033[0m\n" -printf "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}:${TTYDPORT}\033[0m to configure Loader.\n" +echo -e "\033[1;34mLoading Arc Overlay...\033[0m" +echo +echo -e "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}:${TTYDPORT}\033[0m to configure Loader." # Check memory and load Arc RAM=$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo 2>/dev/null) -if [ "${RAM:-0}" -le 3500 ]; then - printf "\033[1;31mYou have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of RAM.\033[0m\n\033[1;31mUse arc.sh to proceed. Not recommended!\033[0m" +if [ ${RAM} -le 3500 ]; then + echo -e "\033[1;31mYou have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of RAM.\033[0m\n\033[1;31mUse arc.sh to proceed. Not recommended!\033[0m" else - "${ARC_PATH}/arc.sh" + arc.sh fi exit 0 \ No newline at end of file diff --git a/files/initrd/opt/arc/ramdisk-patch.sh b/files/initrd/opt/arc/ramdisk-patch.sh index bc71f544..9823e5c5 100755 --- a/files/initrd/opt/arc/ramdisk-patch.sh +++ b/files/initrd/opt/arc/ramdisk-patch.sh @@ -2,9 +2,9 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" -. "${ARC_PATH}/include/addons.sh" -. "${ARC_PATH}/include/modules.sh" +. ${ARC_PATH}/include/functions.sh +. ${ARC_PATH}/include/addons.sh +. ${ARC_PATH}/include/modules.sh set -o pipefail # Get exit code from process piped @@ -20,7 +20,10 @@ rm -f "${MOD_RDGZ_FILE}" # Unzipping ramdisk rm -rf "${RAMDISK_PATH}" mkdir -p "${RAMDISK_PATH}" -(cd "${RAMDISK_PATH}" && xz -dc <"${ORI_RDGZ_FILE}" | cpio -idm) >/dev/null 2>&1 || true +( + cd "${RAMDISK_PATH}" + xz -dc <"${ORI_RDGZ_FILE}" | cpio -idm +) >/dev/null 2>&1 # Read Model Data PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")" @@ -79,30 +82,32 @@ declare -A MODULES # Read synoinfo and addons 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}") 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 user 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) -PATCHES=( - "ramdisk-etc-rc-*.patch" - "ramdisk-init-script-*.patch" - "ramdisk-post-init-script-*.patch" - "ramdisk-disable-root-pwd-*.patch" - "ramdisk-disable-disabled-ports-*.patch" -) -for PE in "${PATCHES[@]}"; do +PATCHES=() +PATCHES+=("ramdisk-etc-rc-*.patch") +PATCHES+=("ramdisk-init-script-*.patch") +PATCHES+=("ramdisk-post-init-script-*.patch") +PATCHES+=("ramdisk-disable-root-pwd-*.patch") +PATCHES+=("ramdisk-disable-disabled-ports-*.patch") +for PE in ${PATCHES[@]}; do RET=1 echo "Patching with ${PE}" >"${LOG_FILE}" for PF in $(ls ${PATCH_PATH}/${PE} 2>/dev/null); do echo "Patching with ${PF}" >>"${LOG_FILE}" - (cd "${RAMDISK_PATH}" && patch -p1 -i "${PF}") >>"${LOG_FILE}" 2>&1 + ( + cd "${RAMDISK_PATH}" + 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 @@ -113,7 +118,7 @@ done echo "Set synoinfo SN" >"${LOG_FILE}" _set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 _set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 -for KEY in "${!SYNOINFO[@]}"; do +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 _set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1 @@ -126,7 +131,7 @@ rm -f "${TMP_PATH}/rp.txt" touch "${TMP_PATH}/rp.txt" echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" -for KEY in "${!SYNOINFO[@]}"; do +for KEY in ${!SYNOINFO[@]}; do echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt" done @@ -144,23 +149,20 @@ gzip -dc "${LKMS_PATH}/rp-${PLATFORM}-${KVERP}-${LKM}.ko.gz" >"${RAMDISK_PATH}/u # Addons echo "Create addons.sh" >"${LOG_FILE}" mkdir -p "${RAMDISK_PATH}/addons" -{ - echo "#!/bin/sh" - echo 'echo "addons.sh called with params ${@}"' - echo "export LOADERLABEL=\"ARC\"" - echo "export LOADERVERSION=\"${ARC_VERSION}\"" - echo "export LOADERBUILD=\"${ARC_BUILD}\"" - echo "export LOADERBRANCH=\"${ARCBRANCH}\"" - echo "export PLATFORM=\"${PLATFORM}\"" - echo "export PRODUCTVER=\"${PRODUCTVER}\"" - echo "export PRODUCTVERL=\"${PRODUCTVERL}\"" - echo "export MODEL=\"${MODEL}\"" - echo "export MODELID=\"${MODELID}\"" - echo "export MLINK=\"${PATURL}\"" - echo "export MCHECKSUM=\"${PATSUM}\"" - echo "export LAYOUT=\"${LAYOUT}\"" - echo "export KEYMAP=\"${KEYMAP}\"" -} >"${RAMDISK_PATH}/addons/addons.sh" +echo "#!/bin/sh" >"${RAMDISK_PATH}/addons/addons.sh" +echo 'echo "addons.sh called with params ${@}"' >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export LOADERLABEL=\"ARC\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export LOADERVERSION=\"${ARC_VERSION}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export LOADERBUILD=\"${ARC_BUILD}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export LOADERBRANCH=\"${ARCBRANCH}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export PLATFORM=\"${PLATFORM}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export PRODUCTVER=\"${PRODUCTVER}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export MODEL=\"${MODEL}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export MODELID=\"${MODELID}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export MLINK=\"${PAT_URL}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +echo "export MCHECKSUM=\"${PAT_HASH}\"" >>"${RAMDISK_PATH}/addons/addons.sh" +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" # System Addons @@ -177,7 +179,7 @@ for ADDON in "redpill" "revert" "misc" "eudev" "disks" "localrss" "notify" "wol" done # User Addons -for ADDON in "${!ADDONS[@]}"; do +for ADDON in ${!ADDONS[@]}; do PARAMS=${ADDONS[${ADDON}]} installAddon "${ADDON}" "${PLATFORM}" || echo "Addon ${ADDON} not found" echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1 @@ -228,18 +230,18 @@ done # SA6400 patches if [ "${PLATFORM}" = "epyc7002" ]; then echo -n " - Apply Epyc7002 Fixes" - sed -i 's#/dev/console#/var/log/lrc#g' "${RAMDISK_PATH}/usr/bin/busybox" - sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' "${RAMDISK_PATH}/linuxrc.syno" + sed -i 's#/dev/console#/var/log/lrc#g' ${RAMDISK_PATH}/usr/bin/busybox + sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' ${RAMDISK_PATH}/linuxrc.syno fi # Broadwellntbap patches if [ "${PLATFORM}" = "broadwellntbap" ]; then echo -n " - Apply Broadwellntbap Fixes" - sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' "${RAMDISK_PATH}/usr/syno/share/environments.sh" + sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' ${RAMDISK_PATH}/usr/syno/share/environments.sh fi # Call user patch scripts -for F in $(ls -1 "${USER_UP_PATH}/"*.sh 2>/dev/null); do +for F in $(ls -1 ${USER_UP_PATH}/*.sh 2>/dev/null); do echo "Calling ${F}" >"${LOG_FILE}" . "${F}" >>"${LOG_FILE}" 2>&1 || exit 1 done diff --git a/files/initrd/opt/arc/vmlinux-to-bzImage.sh b/files/initrd/opt/arc/vmlinux-to-bzImage.sh index 2f46b5af..2f2c5145 100755 --- a/files/initrd/opt/arc/vmlinux-to-bzImage.sh +++ b/files/initrd/opt/arc/vmlinux-to-bzImage.sh @@ -3,62 +3,72 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" +. ${ARC_PATH}/include/functions.sh PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" -KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${ARC_PATH}/platforms.yml")" +KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")" # Adapted from: scripts/Makefile.lib # Usage: size_append FILE [FILE2] [FILEn]... # Output: LE HEX with size of file in bytes (to STDOUT) file_size_le() { printf $( - local dec_size=0 - for F in "$@"; do dec_size=$((dec_size + $(stat -c "%s" "${F}"))); done - printf "%08x\n" "${dec_size}" | sed 's/\(..\)/\1 /g' | { - read -r ch0 ch1 ch2 ch3 - for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done + dec_size=0 + for F in "${@}"; do + fsize=$(stat -c "%s" ${F}) + dec_size=$((${dec_size} + ${fsize})) + done + printf "%08x\n" ${dec_size} | + sed 's/\(..\)/\1 /g' | { + read ch0 ch1 ch2 ch3 + for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do + printf '%s%03o' '\' $((0x${ch})) + done } ) } size_le() { printf $( - printf "%08x\n" "${@}" | sed 's/\(..\)/\1 /g' | { - read -r ch0 ch1 ch2 ch3 - for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done + printf "%08x\n" "${@}" | + sed 's/\(..\)/\1 /g' | { + read ch0 ch1 ch2 ch3 + for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do + printf '%s%03o' '\' $((0x${ch})) + done } ) } VMLINUX_MOD=${1} ZIMAGE_MOD=${2} -if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then +KVER_MAJOR=${KVER:0:1} +if [ ${KVER_MAJOR} -eq 4 ]; then # Kernel version 4.x or 3.x (bromolow) - # zImage_head 16494 - # payload( - # vmlinux.bin x - # padding 0xf00000-x - # vmlinux.bin size 4 - # ) 0xf00004 - # zImage_tail( - # unknown 72 - # run_size 4 - # unknown 30 - # vmlinux.bin size 4 - # unknown 114460 - # ) 114570 - # crc32 4 + #zImage_head 16494 + #payload( + # vmlinux.bin x + # padding 0xf00000-x + # vmlinux.bin size 4 + #) 0xf00004 + #zImage_tail( + # unknown 72 + # run_size 4 + # unknown 30 + # vmlinux.bin size 4 + # unknown 114460 + #) 114570 + #crc32 4 gzip -dc "${ARC_PATH}/bzImage-template-v4.gz" >"${ZIMAGE_MOD}" || exit 1 dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=16494 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745134 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745244 seek=1 conv=notrunc || exit 1 - RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") - size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=15745210 seek=1 conv=notrunc || exit 1 - size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") + size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=15745210 seek=1 conv=notrunc|| exit 1 + size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 else # Kernel version 5.x gzip -dc "${ARC_PATH}/bzImage-template-v5.gz" >"${ZIMAGE_MOD}" || exit 1 @@ -66,7 +76,7 @@ else dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=14561 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34463421 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34479132 seek=1 conv=notrunc || exit 1 - # RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") - # size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=34626904 seek=1 conv=notrunc || exit 1 - size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + # RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") + # size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=34626904 seek=1 conv=notrunc || exit 1 + size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 fi \ No newline at end of file diff --git a/files/initrd/opt/arc/zimage-patch.sh b/files/initrd/opt/arc/zimage-patch.sh index b529b9ad..020a2339 100755 --- a/files/initrd/opt/arc/zimage-patch.sh +++ b/files/initrd/opt/arc/zimage-patch.sh @@ -2,7 +2,7 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. "${ARC_PATH}/include/functions.sh" +. ${ARC_PATH}/include/functions.sh set -o pipefail # Get exit code from process piped @@ -23,11 +23,11 @@ if [ "${KERNEL}" = "custom" ]; then gzip -dc "${CUSTOM_PATH}/bzImage-${PLATFORM}-${KVERP}.gz" >"${MOD_ZIMAGE_FILE}" else # Extract vmlinux - "${ARC_PATH}/bzImage-to-vmlinux.sh" "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog + ${ARC_PATH}/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog # Patch boot params and ramdisk check - "${ARC_PATH}/kpatch" "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog + ${ARC_PATH}/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog # rebuild zImage - "${ARC_PATH}/vmlinux-to-bzImage.sh" "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog + ${ARC_PATH}/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog fi sync \ No newline at end of file diff --git a/files/p1/boot/grub/grub.cfg b/files/p1/boot/grub/grub.cfg index c70e954f..62edb4a2 100644 --- a/files/p1/boot/grub/grub.cfg +++ b/files/p1/boot/grub/grub.cfg @@ -77,7 +77,7 @@ set menu_color_normal=white/black set menu_color_highlight=white/red set color_normal=white/black -set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait nointremap net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" +set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" search --set=root --label "ARC3" if [ -s /zImage-dsm -a -s /initrd-dsm ]; then From 32ffa70cb19b0be4b6b181fb4fcc9c304bb9a175 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 19:53:20 +0100 Subject: [PATCH 5/7] tree: rework Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc.sh | 16 ++--- files/initrd/opt/arc/boot.sh | 2 +- files/initrd/opt/arc/bzImage-to-vmlinux.sh | 14 ++--- files/initrd/opt/arc/calc_run_size.sh | 22 +++---- files/initrd/opt/arc/extract-vmlinux | 44 ++++++------- files/initrd/opt/arc/include/functions.sh | 6 +- files/initrd/opt/arc/init.sh | 2 +- files/initrd/opt/arc/ramdisk-patch.sh | 6 +- files/initrd/opt/arc/vmlinux-to-bzImage.sh | 72 ++++++++++------------ files/initrd/opt/arc/zimage-patch.sh | 8 +-- 10 files changed, 86 insertions(+), 106 deletions(-) diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 3b2c75af..070fb229 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -4,14 +4,14 @@ # Overlay Init Section [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh -. ${ARC_PATH}/include/addons.sh -. ${ARC_PATH}/include/modules.sh -. ${ARC_PATH}/include/update.sh -. ${ARC_PATH}/include/storage.sh -. ${ARC_PATH}/include/network.sh -. ${ARC_PATH}/include/compat.sh -. ${ARC_PATH}/arc-functions.sh +. "${ARC_PATH}/include/functions.sh" +. "${ARC_PATH}/include/addons.sh" +. "${ARC_PATH}/include/modules.sh" +. "${ARC_PATH}/include/update.sh" +. "${ARC_PATH}/include/storage.sh" +. "${ARC_PATH}/include/network.sh" +. "${ARC_PATH}/include/compat.sh" +. "${ARC_PATH}/arc-functions.sh" # Get Keymap and Timezone Config onlineCheck diff --git a/files/initrd/opt/arc/boot.sh b/files/initrd/opt/arc/boot.sh index e93a9d03..42d8e780 100755 --- a/files/initrd/opt/arc/boot.sh +++ b/files/initrd/opt/arc/boot.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" # Clear logs for dbgutils addons rm -rf "${PART1_PATH}/logs" >/dev/null 2>&1 || true diff --git a/files/initrd/opt/arc/bzImage-to-vmlinux.sh b/files/initrd/opt/arc/bzImage-to-vmlinux.sh index 5241e925..ec5e3f92 100755 --- a/files/initrd/opt/arc/bzImage-to-vmlinux.sh +++ b/files/initrd/opt/arc/bzImage-to-vmlinux.sh @@ -1,16 +1,16 @@ #!/usr/bin/env bash read_u8() { - dd if=$1 bs=1 skip=$(($2)) count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' + dd if="${1}" bs=1 skip="$((${2}))" count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+' } read_u32() { - dd if=$1 bs=1 skip=$(($2)) count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' + dd if="${1}" bs=1 skip="$((${2}))" count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+' } set -x -setup_size=$(read_u8 $1 0x1f1) -payload_offset=$(read_u32 $1 0x248) -payload_length=$(read_u32 $1 0x24c) -inner_pos=$((($setup_size + 1) * 512)) +setup_size=$(read_u8 "${1}" 0x1f1) +payload_offset=$(read_u32 "${1}" 0x248) +payload_length=$(read_u32 "${1}" 0x24c) +inner_pos=$(((setup_size + 1) * 512)) -tail -c+$(($inner_pos + 1)) $1 | tail -c+$(($payload_offset + 1)) | head -c $(($payload_length)) | head -c $(($payload_length - 4)) | unlzma >$2 \ No newline at end of file +tail -c+$(($inner_pos + 1)) "${1}" | tail -c+$(($payload_offset + 1)) | head -c "${payload_length}" | head -c $(($payload_length - 4)) | unlzma >"${2}" \ No newline at end of file diff --git a/files/initrd/opt/arc/calc_run_size.sh b/files/initrd/opt/arc/calc_run_size.sh index e648b837..dc5a3f4b 100755 --- a/files/initrd/opt/arc/calc_run_size.sh +++ b/files/initrd/opt/arc/calc_run_size.sh @@ -7,28 +7,22 @@ # objdump -h a.out | sh calc_run_size.sh NUM='\([0-9a-fA-F]*[ \t]*\)' -OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p') -if [ -z "$OUT" ]; then +OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/0x\1 0x\4/p') + +if [ -z "${OUT}" ]; then echo "Never found .bss or .brk file offset" >&2 exit 1 fi -OUT=$(echo ${OUT# }) -sizeA=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -offsetA=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -sizeB=$(printf "%d" 0x${OUT%% *}) -OUT=${OUT#* } -offsetB=$(printf "%d" 0x${OUT%% *}) +read -r sizeA offsetA sizeB offsetB <<<$(echo ${OUT} | awk '{printf "%d %d %d %d", strtonum($1), strtonum($2), strtonum($3), strtonum($4)}') -run_size=$((${offsetA} + ${sizeA} + ${sizeB})) +runSize=$((offsetA + sizeA + sizeB)) # BFD linker shows the same file offset in ELF. if [ "${offsetA}" -ne "${offsetB}" ]; then # Gold linker shows them as consecutive. - endB=$((${offsetB} + ${sizeB})) - if [ "$endB" != "$run_size" ]; then + endSize=$((offsetB + sizeB)) + if [ "${endSize}" -ne "${runSize}" ]; then printf "sizeA: 0x%x\n" ${sizeA} >&2 printf "offsetA: 0x%x\n" ${offsetA} >&2 printf "sizeB: 0x%x\n" ${sizeB} >&2 @@ -38,5 +32,5 @@ if [ "${offsetA}" -ne "${offsetB}" ]; then fi fi -printf "%d\n" ${run_size} +printf "%d\n" ${runSize} exit 0 \ No newline at end of file diff --git a/files/initrd/opt/arc/extract-vmlinux b/files/initrd/opt/arc/extract-vmlinux index 8995cd30..94c56c08 100755 --- a/files/initrd/opt/arc/extract-vmlinux +++ b/files/initrd/opt/arc/extract-vmlinux @@ -10,38 +10,34 @@ # # ---------------------------------------------------------------------- -check_vmlinux() -{ - # Use readelf to check if it's a valid ELF - # TODO: find a better to way to check that it's really vmlinux - # and not just an elf - readelf -h $1 > /dev/null 2>&1 || return 1 +check_vmlinux() { + # Use readelf to check if it's a valid ELF + # TODO: find a better to way to check that it's really vmlinux + # and not just an elf + readelf -h $1 >/dev/null 2>&1 || return 1 - cat $1 - exit 0 + cat $1 + exit 0 } -try_decompress() -{ - # The obscure use of the "tr" filter is to work around older versions of - # "grep" that report the byte offset of the line instead of the pattern. +try_decompress() { + # The obscure use of the "tr" filter is to work around older versions of + # "grep" that report the byte offset of the line instead of the pattern. - # Try to find the header ($1) and decompress from here - for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` - do - pos=${pos%%:*} - tail -c+$pos "$img" | $3 > $tmp 2> /dev/null - check_vmlinux $tmp - done + # Try to find the header ($1) and decompress from here + for pos in $(tr "$1\n$2" "\n$2=" <"$img" | grep -abo "^$2"); do + pos=${pos%%:*} + tail -c+$pos "$img" | $3 >$tmp 2>/dev/null + check_vmlinux $tmp + done } # Check invocation: me=${0##*/} img=$1 -if [ $# -ne 1 -o ! -s "$img" ] -then - echo "Usage: $me " >&2 - exit 2 +if [ $# -ne 1 ] || [ ! -s "$img" ]; then + echo "Usage: $me " >&2 + exit 2 fi # Prepare temp files: @@ -61,4 +57,4 @@ try_decompress '(\265/\375' xxx unzstd check_vmlinux $img # Bail out: -echo "$me: Cannot find vmlinux." >&2 +echo "$me: Cannot find vmlinux." >&2 \ No newline at end of file diff --git a/files/initrd/opt/arc/include/functions.sh b/files/initrd/opt/arc/include/functions.sh index 39b4173c..abcc6fe8 100755 --- a/files/initrd/opt/arc/include/functions.sh +++ b/files/initrd/opt/arc/include/functions.sh @@ -1,8 +1,8 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/consts.sh -. ${ARC_PATH}/include/configFile.sh -. ${ARC_PATH}/include/addons.sh +. "${ARC_PATH}/include/consts.sh" +. "${ARC_PATH}/include/configFile.sh" +. "${ARC_PATH}/include/addons.sh" ############################################################################### # Check loader disk diff --git a/files/initrd/opt/arc/init.sh b/files/initrd/opt/arc/init.sh index 96d82bc0..56ea73eb 100755 --- a/files/initrd/opt/arc/init.sh +++ b/files/initrd/opt/arc/init.sh @@ -3,7 +3,7 @@ set -e [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" # Get Loader Disk Bus [ -z "${LOADER_DISK}" ] && die "Loader Disk not found!" diff --git a/files/initrd/opt/arc/ramdisk-patch.sh b/files/initrd/opt/arc/ramdisk-patch.sh index 9823e5c5..a94d18f1 100755 --- a/files/initrd/opt/arc/ramdisk-patch.sh +++ b/files/initrd/opt/arc/ramdisk-patch.sh @@ -2,9 +2,9 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh -. ${ARC_PATH}/include/addons.sh -. ${ARC_PATH}/include/modules.sh +. "${ARC_PATH}/include/functions.sh" +. "${ARC_PATH}/include/addons.sh" +. "${ARC_PATH}/include/modules.sh" set -o pipefail # Get exit code from process piped diff --git a/files/initrd/opt/arc/vmlinux-to-bzImage.sh b/files/initrd/opt/arc/vmlinux-to-bzImage.sh index 2f2c5145..2f46b5af 100755 --- a/files/initrd/opt/arc/vmlinux-to-bzImage.sh +++ b/files/initrd/opt/arc/vmlinux-to-bzImage.sh @@ -3,72 +3,62 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" -KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")" +KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${ARC_PATH}/platforms.yml")" # Adapted from: scripts/Makefile.lib # Usage: size_append FILE [FILE2] [FILEn]... # Output: LE HEX with size of file in bytes (to STDOUT) file_size_le() { printf $( - dec_size=0 - for F in "${@}"; do - fsize=$(stat -c "%s" ${F}) - dec_size=$((${dec_size} + ${fsize})) - done - printf "%08x\n" ${dec_size} | - sed 's/\(..\)/\1 /g' | { - read ch0 ch1 ch2 ch3 - for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do - printf '%s%03o' '\' $((0x${ch})) - done + local dec_size=0 + for F in "$@"; do dec_size=$((dec_size + $(stat -c "%s" "${F}"))); done + printf "%08x\n" "${dec_size}" | sed 's/\(..\)/\1 /g' | { + read -r ch0 ch1 ch2 ch3 + for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done } ) } size_le() { printf $( - printf "%08x\n" "${@}" | - sed 's/\(..\)/\1 /g' | { - read ch0 ch1 ch2 ch3 - for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do - printf '%s%03o' '\' $((0x${ch})) - done + printf "%08x\n" "${@}" | sed 's/\(..\)/\1 /g' | { + read -r ch0 ch1 ch2 ch3 + for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done } ) } VMLINUX_MOD=${1} ZIMAGE_MOD=${2} -KVER_MAJOR=${KVER:0:1} -if [ ${KVER_MAJOR} -eq 4 ]; then +if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then # Kernel version 4.x or 3.x (bromolow) - #zImage_head 16494 - #payload( - # vmlinux.bin x - # padding 0xf00000-x - # vmlinux.bin size 4 - #) 0xf00004 - #zImage_tail( - # unknown 72 - # run_size 4 - # unknown 30 - # vmlinux.bin size 4 - # unknown 114460 - #) 114570 - #crc32 4 + # zImage_head 16494 + # payload( + # vmlinux.bin x + # padding 0xf00000-x + # vmlinux.bin size 4 + # ) 0xf00004 + # zImage_tail( + # unknown 72 + # run_size 4 + # unknown 30 + # vmlinux.bin size 4 + # unknown 114460 + # ) 114570 + # crc32 4 gzip -dc "${ARC_PATH}/bzImage-template-v4.gz" >"${ZIMAGE_MOD}" || exit 1 dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=16494 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745134 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745244 seek=1 conv=notrunc || exit 1 - RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") - size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=15745210 seek=1 conv=notrunc|| exit 1 - size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") + size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=15745210 seek=1 conv=notrunc || exit 1 + size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 else # Kernel version 5.x gzip -dc "${ARC_PATH}/bzImage-template-v5.gz" >"${ZIMAGE_MOD}" || exit 1 @@ -76,7 +66,7 @@ else dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=14561 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34463421 seek=1 conv=notrunc || exit 1 file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34479132 seek=1 conv=notrunc || exit 1 - # RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh") - # size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=34626904 seek=1 conv=notrunc || exit 1 - size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 + # RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | sh "${ARC_PATH}/calc_run_size.sh") + # size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=34626904 seek=1 conv=notrunc || exit 1 + size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1 fi \ No newline at end of file diff --git a/files/initrd/opt/arc/zimage-patch.sh b/files/initrd/opt/arc/zimage-patch.sh index 020a2339..b529b9ad 100755 --- a/files/initrd/opt/arc/zimage-patch.sh +++ b/files/initrd/opt/arc/zimage-patch.sh @@ -2,7 +2,7 @@ [[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" -. ${ARC_PATH}/include/functions.sh +. "${ARC_PATH}/include/functions.sh" set -o pipefail # Get exit code from process piped @@ -23,11 +23,11 @@ if [ "${KERNEL}" = "custom" ]; then gzip -dc "${CUSTOM_PATH}/bzImage-${PLATFORM}-${KVERP}.gz" >"${MOD_ZIMAGE_FILE}" else # Extract vmlinux - ${ARC_PATH}/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/bzImage-to-vmlinux.sh" "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog # Patch boot params and ramdisk check - ${ARC_PATH}/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/kpatch" "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog # rebuild zImage - ${ARC_PATH}/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog + "${ARC_PATH}/vmlinux-to-bzImage.sh" "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog fi sync \ No newline at end of file From 3555ec84ad29e73a0a8e0dc2d7045ed583279349 Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 20:08:59 +0100 Subject: [PATCH 6/7] build: update Signed-off-by: AuxXxilium --- .github/workflows/autobuild.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml index 28ac0b1d..0292130e 100644 --- a/.github/workflows/autobuild.yml +++ b/.github/workflows/autobuild.yml @@ -45,8 +45,12 @@ jobs: sudo timedatectl set-timezone "Europe/Berlin" sudo apt update - sudo apt install -y jq gawk cpio gettext libelf-dev qemu-utils busybox dialog curl sed - sudo snap install yq + sudo apt install -y locales busybox dialog gettext sed gawk jq curl + sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils cpio xz-utils lz4 lzma bzip2 gzip zstd + # sudo snap install yq + if ! command -v yq &>/dev/null || ! yq --version 2>/dev/null | grep -q "v4."; then + sudo curl -kL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq && sudo chmod a+x /usr/bin/yq + fi df -h From 9323868f05210f95b8438ab4bb5e4c9f5453eeea Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Wed, 20 Nov 2024 20:15:15 +0100 Subject: [PATCH 7/7] grub: update Signed-off-by: AuxXxilium --- files/p1/boot/grub/grub.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/p1/boot/grub/grub.cfg b/files/p1/boot/grub/grub.cfg index 62edb4a2..c70e954f 100644 --- a/files/p1/boot/grub/grub.cfg +++ b/files/p1/boot/grub/grub.cfg @@ -77,7 +77,7 @@ set menu_color_normal=white/black set menu_color_highlight=white/red set color_normal=white/black -set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" +set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait nointremap net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable" search --set=root --label "ARC3" if [ -s /zImage-dsm -a -s /initrd-dsm ]; then