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 {