diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5bea89b6..18f29ee50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -134,7 +134,7 @@ jobs: getOffline "files/p3/configs" echo "Get Buildroot" getBuildroot "latest" "br" - echo "BR_VERSION=${TAG}" >> $GITHUB_ENV + #echo "BR_VERSION=${TAG}" >> $GITHUB_ENV echo "BUILD_TIME=$(date +'%Y-%m-%d %H:%M')" >> $GITHUB_ENV echo "OK" @@ -234,7 +234,6 @@ jobs: Time: ${{ env.BUILD_TIME }} ### Versions: - Buildroot: ${{ env.BR_VERSION }} Addons: ${{ env.ADDONSTAG }} Configs: ${{ env.CONFIGSTAG }} Modules: ${{ env.MODULESTAG }} @@ -244,4 +243,4 @@ jobs: artifacts: | arc-*.zip update.zip - checksum.sha256 \ No newline at end of file + checksum.sha256 diff --git a/.github/workflows/custom.yml b/.github/workflows/custom.yml index e2c24d51c..c202b35af 100644 --- a/.github/workflows/custom.yml +++ b/.github/workflows/custom.yml @@ -47,7 +47,6 @@ jobs: MODEL = jsonbody.get('model', '') PRODUCTVER = jsonbody.get('version', '') ADDONS = jsonbody.get('addons', '') - MACSYS = jsonbody.get('macsys', '') CUSTOMKERNEL = jsonbody.get('customkernel', '') FORMAT = jsonbody.get('format', '') except ValueError as e: @@ -56,7 +55,6 @@ jobs: set_output("MODEL", MODEL) set_output("PRODUCTVER", PRODUCTVER) set_output("ADDONS", ADDONS) - set_output("MACSYS", MACSYS) set_output("CUSTOMKERNEL", CUSTOMKERNEL) set_output("FORMAT", FORMAT) @@ -121,7 +119,6 @@ jobs: writeConfigKey "model" "${{ env.MODEL }}" "${PRESET_CONFIG_FILE}" writeConfigKey "productver" "${{ env.PRODUCTVER }}" "${PRESET_CONFIG_FILE}" writeConfigKey "arc" "{}" "${PRESET_CONFIG_FILE}" - writeConfigKey "arc.macsys" "${{ env.MACSYS }}" "${PRESET_CONFIG_FILE}" writeConfigKey "arc.custom" "true" "${PRESET_CONFIG_FILE}" if [ "${{ env.MODEL }}" = "SA6400" ]; then writeConfigKey "arc.kernel" "${{ env.KERNEL }}" "${PRESET_CONFIG_FILE}" diff --git a/files/initrd/opt/arc/arc-functions.sh b/files/initrd/opt/arc/arc-functions.sh index 25e9377f1..cf3219cd9 100755 --- a/files/initrd/opt/arc/arc-functions.sh +++ b/files/initrd/opt/arc/arc-functions.sh @@ -8,7 +8,7 @@ function editUserConfig() { [ $? -ne 0 ] && return 1 mv -f "${TMP_PATH}/userconfig" "${USER_CONFIG_FILE}" ERRORS=$(yq eval "${USER_CONFIG_FILE}" 2>&1) - [ $? -eq 0 ] && break + [ $? -eq 0 ] && continue || break dialog --backtitle "$(backtitle)" --title "Invalid YAML format" --msgbox "${ERRORS}" 0 0 done OLDMODEL="${MODEL}" @@ -274,7 +274,9 @@ function cmdlineMenu() { MSG+=" * \Z4pci=nommconf\Zn\n Disable the use of Memory-Mapped Configuration for PCI devices(use this parameter cautiously).\n" MSG+="\nEnter the Parameter Name and Value you want to add.\n" LINENUM=$(($(echo -e "${MSG}" | wc -l) + 10)) + RET=0 while true; do + [ ${RET} -eq 255 ] && MSG+="Commonly used Parameter (Format: Name=Value):\n" dialog --clear --backtitle "$(backtitle)" \ --colors --title "User Cmdline" \ --form "${MSG}" ${LINENUM:-16} 80 2 "Name:" 1 1 "" 1 10 55 0 "Value:" 2 1 "" 2 10 55 0 \ @@ -296,7 +298,7 @@ function cmdlineMenu() { break ;; 255) # ESC - break + # break ;; esac done @@ -473,7 +475,9 @@ function synoinfoMenu() { #MSG+=" * \Z4support_config_swap=yes\Zn\n TO-DO.\n" MSG+="\nEnter the Parameter Name and Value you want to add.\n" LINENUM=$(($(echo -e "${MSG}" | wc -l) + 10)) + RET=0 while true; do + [ ${RET} -eq 255 ] && MSG+="Commonly used Synoinfo (Format: Name=Value):\n" dialog --clear --backtitle "$(backtitle)" \ --colors --title "Synoinfo Entries" \ --form "${MSG}" ${LINENUM:-16} 80 2 "Name:" 1 1 "" 1 10 55 0 "Value:" 2 1 "" 2 10 55 0 \ @@ -486,7 +490,7 @@ function synoinfoMenu() { if [ -z "${NAME//\"/}" ]; then dialog --clear --backtitle "$(backtitle)" --title "User Cmdline" \ --yesno "Invalid Parameter Name, retry?" 0 0 - [ $? -eq 0 ] && break + [ $? -eq 0 ] && continue || break fi writeConfigKey "synoinfo.\"${NAME//\"/}\"" "${VALUE}" "${USER_CONFIG_FILE}" break @@ -495,7 +499,7 @@ function synoinfoMenu() { break ;; 255) # ESC - break + # break ;; esac done @@ -1020,8 +1024,8 @@ function sysinfo() { # Get System Informations CPU=$(echo $(cat /proc/cpuinfo 2>/dev/null | grep 'model name' | uniq | awk -F':' '{print $2}')) VENDOR=$(dmesg 2>/dev/null | grep -i "DMI:" | sed 's/\[.*\] DMI: //i') - ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true - NIC="$(readConfigKey "device.nic" "${USER_CONFIG_FILE}")" + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) + ETHN=$(ls /sys/class/net/ 2>/dev/null | grep eth | wc -l) CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")" BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" if [ "${CONFDONE}" == "true" ]; then @@ -1046,7 +1050,6 @@ function sysinfo() { DIRECTBOOT="$(readConfigKey "arc.directboot" "${USER_CONFIG_FILE}")" LKM="$(readConfigKey "lkm" "${USER_CONFIG_FILE}")" KERNELLOAD="$(readConfigKey "arc.kernelload" "${USER_CONFIG_FILE}")" - MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" OFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")" ARCIPV6="$(readConfigKey "arc.ipv6" "${USER_CONFIG_FILE}")" CONFIGVER="$(readConfigKey "arc.version" "${USER_CONFIG_FILE}")" @@ -1060,6 +1063,7 @@ function sysinfo() { LKMVERSION=$(cat "${LKMS_PATH}/VERSION") CONFIGSVERSION=$(cat "${MODEL_CONFIG_PATH}/VERSION") PATCHESVERSION=$(cat "${PATCH_PATH}/VERSION") + TIMEOUT=5 TEXT="" # Print System Informations TEXT+="\n\Z4> System: ${MACHINE} | ${BOOTSYS}\Zn" @@ -1069,42 +1073,36 @@ function sysinfo() { TEXT+="\n AES | ACPI: \Zb${AESSYS} | ${ACPISYS}\Zn" TEXT+="\n Date: \Zb$(date)\Zn" TEXT+="\n" - TEXT+="\n\Z4> Network: ${NIC} NIC\Zn" + TEXT+="\n\Z4> Network: ${ETHN} NIC\Zn" for ETH in ${ETHX}; do - IP="" - STATICIP="$(readConfigKey "static.${ETH}" "${USER_CONFIG_FILE}")" + COUNT=0 DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') NETBUS=$(ethtool -i ${ETH} 2>/dev/null | grep bus-info | cut -d' ' -f2) - MAC="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" - MACR=$(cat /sys/class/net/${ETH}/address | sed 's/://g') - COUNT=0 while true; do - if [ "${STATICIP}" == "true" ]; then - IP="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" - MSG="STATIC" - else - IP=$(getIP ${ETH}) - MSG="DHCP" + if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then + TEXT+="\n${DRIVER}: \ZbDOWN\Zn" + break fi + if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then + TEXT+="\n${DRIVER}: \ZbNOT CONNECTED\Zn" + break + fi + if [ ${COUNT} -ge ${TIMEOUT} ]; then + TEXT+="\n${DRIVER}: \ZbTIMEOUT\Zn" + break + fi + COUNT=$((${COUNT} + 1)) + IP="$(getIP ${ETH})" if [ -n "${IP}" ]; then SPEED=$(ethtool ${ETH} 2>/dev/null | grep "Speed:" | awk '{print $2}') if [[ "${IP}" =~ ^169\.254\..* ]]; then - TEXT+="\n${ETH} -> ${DRIVER} (${SPEED} | ${MSG}):\Zb LINK LOCAL | Mac: ${MACR} (${MAC})\Zn" + TEXT+="${DRIVER} (${SPEED}): \ZbLINK LOCAL (No DHCP server found.)\Zn" else - TEXT+="\n${ETH} -> ${DRIVER} (${SPEED} | ${MSG}):\Zb ${IP} | Mac: ${MACR} (${MAC})\Zn" + TEXT+="${DRIVER} (${SPEED}): \Zb${IP}\Zn" fi break fi - if [ ${COUNT} -gt 3 ]; then - TEXT+="\n${ETH} -> ${DRIVER}\Zb: TIMEOUT | MAC: ${MACR} (${MAC})\Zn" - break - fi - sleep 3 - if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then - TEXT+="\n${ETH} -> ${DRIVER}\Zb: NOT CONNECTED | MAC: ${MACR} (${MAC})\Zn" - break - fi - COUNT=$((${COUNT} + 3)) + sleep 1 done TEXT+="\n\Zb$(lspci -s ${NETBUS} -nnk)\Zn\n" done @@ -1125,7 +1123,6 @@ function sysinfo() { fi TEXT+="\n Modules loaded: \Zb${MODULESINFO}\Zn" TEXT+="\n\Z4>> Settings\Zn" - TEXT+="\n MacSys: \Zb${MACSYS}\Zn" TEXT+="\n IPv6: \Zb${ARCIPV6}\Zn" TEXT+="\n Offline Mode: \Zb${OFFLINE}\Zn" if [[ "${REMAP}" == "acports" || "${REMAP}" == "maxports" ]]; then @@ -1271,6 +1268,10 @@ function networkdiag() { echo -e "Link: NOT CONNECTED" continue fi + if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then + echo -e "Link: DOWN" + continue + fi echo -e "Link: CONNECTED" addr=$(getIP ${ETH}) netmask=$(ifconfig ${ETH} | grep inet | grep 255 | awk '{print $4}' | cut -f2 -d':') @@ -1346,77 +1347,54 @@ function credits() { ############################################################################### # allow setting Static IP for Loader function staticIPMenu() { - # Get Amount of NIC - ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) # real network cards list for ETH in ${ETHX}; do - STATIC="$(readConfigKey "static.${ETH}" "${USER_CONFIG_FILE}")" - DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') - TEXT="" - TEXT+="This Feature allow you to set a StaticIP for the Loader.\n" - TEXT+="Actual Settings are:\n" - TEXT+="\nNIC: ${ETH} (${DRIVER})\n" - TEXT+="StaticIP: ${STATIC}\n" - if [ "${STATIC}" == "true" ]; then - IPADDR="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" - NETMASK="$(readConfigKey "netmask.${ETH}" "${USER_CONFIG_FILE}")" - GATEWAY="$(readConfigKey "gateway.${ETH}" "${USER_CONFIG_FILE}")" - NAMESERVER="$(readConfigKey "nameserver.${ETH}" "${USER_CONFIG_FILE}")" - TEXT+="IP: ${IPADDR}\n" - TEXT+="NETMASK: ${NETMASK}\n" - TEXT+="GATEWAY: ${GATEWAY}\n" - TEXT+="NAMESERVER: ${NAMESERVER}\n" - else - IPADDR="" - NETMASK="" - GATEWAY="" - NAMESERVER="" - fi - TEXT+="" - TEXT+="Do you want to change Config?" - dialog --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --yesno "${TEXT}" 0 0 - [ $? -ne 0 ] && return 1 - dialog --clear --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --menu "DHCP or STATIC?" 0 0 0 \ - 1 "DHCP" \ - 2 "STATIC" \ - 2>"${TMP_PATH}/opts" - opts=$(cat ${TMP_PATH}/opts) - [ -z "${opts}" ] && return 1 - if [ ${opts} -eq 1 ]; then - writeConfigKey "static.${ETH}" "false" "${USER_CONFIG_FILE}" - /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true - elif [ ${opts} -eq 2 ]; then - dialog --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --inputbox "Type a Static IP\nLike: 192.168.0.2" 0 0 "${IPADDR}" \ - 2>"${TMP_PATH}/resp" - [ $? -ne 0 ] && return 1 - IPADDR=$(cat "${TMP_PATH}/resp") - dialog --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --inputbox "Type a Netmask\nLike: 24" 0 0 "${NETMASK}" \ - 2>"${TMP_PATH}/resp" - [ $? -ne 0 ] && return 1 - NETMASK=$(cat "${TMP_PATH}/resp") - dialog --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --inputbox "Type a Gateway\nLike: 192.168.0.1" 0 0 "${GATEWAY}" \ + MACR="$(cat /sys/class/net/${ETH}/address 2>/dev/null | sed 's/://g')" + IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" + IFS='/' read -r -a IPRA <<<"$IPR" + + MSG="Set to ${ETH}(${MACR}): (Delete if empty)" + while true; do + dialog --backtitle "$(backtitle)" --title "StaticIP" \ + --form "${MSG}" 10 60 4 "address" 1 1 "${IPRA[0]}" 1 9 36 16 "netmask" 2 1 "${IPRA[1]}" 2 9 36 16 "gateway" 3 1 "${IPRA[2]}" 3 9 36 16 "dns" 4 1 "${IPRA[3]}" 4 9 36 16 \ 2>"${TMP_PATH}/resp" - [ $? -ne 0 ] && return 1 - GATEWAY=$(cat "${TMP_PATH}/resp") - writeConfigKey "ip.${ETH}" "${IPADDR}" "${USER_CONFIG_FILE}" - writeConfigKey "netmask.${ETH}" "${NETMASK}" "${USER_CONFIG_FILE}" - writeConfigKey "gateway.${ETH}" "${GATEWAY}" "${USER_CONFIG_FILE}" - writeConfigKey "static.${ETH}" "true" "${USER_CONFIG_FILE}" - #NETMASK=$(convert_netmask "${NETMASK}") - /etc/init.d/S41dhcpcd stop >/dev/null 2>&1 || true - ip addr add ${IPADDR}/${NETMASK} dev ${ETH} - ip route add default via ${GATEWAY} dev ${ETH} - /etc/init.d/S40network restart - IP="${IPADDR}" - fi + RET=$? + case ${RET} in + 0) # ok-button + dialog --backtitle "$(backtitle)" --title "StaticIP" \ + --infobox "Setting IP ..." 0 0 + 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 + deleteConfigKey "network.${MACR}" "${USER_CONFIG_FILE}" + else + ip addr flush dev $ETH + ip addr add ${address}/${netmask:-"255.255.255.0"} dev $ETH + if [ -n "${gateway}" ]; then + ip route add default via ${gateway} dev $ETH + fi + if [ -n "${dnsname:-${gateway}}" ]; then + sed -i "/nameserver ${dnsname:-${gateway}}/d" /etc/resolv.conf + echo "nameserver ${dnsname:-${gateway}}" >>/etc/resolv.conf + fi + writeConfigKey "network.${MACR}" "${address}/${netmask}/${gateway}/${dnsname}" "${USER_CONFIG_FILE}" + sleep 1 + fi + writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" + BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" + break + ;; + 1) # cancel-button + break + ;; + 255) # ESC + break 2 + ;; + esac + done done - dialog --backtitle "$(backtitle)" --title "DHCP/StaticIP" \ - --msgbox "Settings written and enabled.\nThis will be not applied to DSM." 5 50 - return } ############################################################################### @@ -1544,7 +1522,7 @@ function addNewDSMUser() { ( 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" - ONBOOTUP="${ONBOOTUP}synogroup --member administrators ${username}\n" + ONBOOTUP="${ONBOOTUP}synogroup --memberadd administrators ${username}\n" ONBOOTUP="${ONBOOTUP}echo \"DELETE FROM task WHERE task_name LIKE ''ARCONBOOTUPRR_ADDUSER'';\" | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db\n" mkdir -p "${TMP_PATH}/mdX" @@ -1606,50 +1584,48 @@ function saveMenu() { ############################################################################### # let user format disks from inside arc -function formatdisks() { - rm -f "${TMP_PATH}/opts" >/dev/null - while read KNAME SIZE PKNAME; do +function formatDisks() { + rm -f "${TMP_PATH}/opts" + while read -r KNAME SIZE PKNAME; do [ -z "${KNAME}" ] && continue [[ "${KNAME}" = /dev/md* ]] && continue - [[ "${KNAME}" == "${LOADER_DISK}" || "${PKNAME}" == "${LOADER_DISK}" ]] && continue + [[ "${KNAME}" = "${LOADER_DISK}" || "${PKNAME}" = "${LOADER_DISK}" ]] && continue [ -n "${PKNAME}" ] && PARTITION=" (Partition)" || PARTITION=" (Disk)" [ -z "${SIZE}" ] && SIZE="Unknown" echo "\"${KNAME}\" \"${SIZE}${PARTITION}\" \"off\"" >>"${TMP_PATH}/opts" done < <(lsblk -pno KNAME,SIZE,PKNAME) if [ ! -f "${TMP_PATH}/opts" ]; then - dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ + dialog --backtitle "$(backtitle)" --title "Format Disks" \ --msgbox "No disk found!" 0 0 - return 1 + return fi - dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ - --checklist "Select Disk(s)" 0 0 0 --file "${TMP_PATH}/opts" \ + dialog --backtitle "$(backtitle)" --title "Format Disks" \ + --checklist "Select Disks" 0 0 0 --file "${TMP_PATH}/opts" \ 2>${TMP_PATH}/resp [ $? -ne 0 ] && return - resp=$(cat ${TMP_PATH}/resp) - [ -z "${resp}" ] && return - dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ + RESP=$(cat "${TMP_PATH}/resp") + [ -z "${RESP}" ] && return + dialog --backtitle "$(backtitle)" --title "Format Disks" \ --yesno "Warning:\nThis operation is irreversible. Please backup important data. Do you want to continue?" 0 0 [ $? -ne 0 ] && return if [ $(ls /dev/md[0-9]* 2>/dev/null | wc -l) -gt 0 ]; then - dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ - --yesno "Warning:\nThe current HDD(s) are in Raid, do you still want to format them?" 0 0 + dialog --backtitle "$(backtitle)" --title "Format Disks" \ + --yesno "Warning:\nThe current hds is in raid, do you still want to format them?" 0 0 [ $? -ne 0 ] && return for I in $(ls /dev/md[0-9]* 2>/dev/null); do - mdadm -S "${I}" + mdadm -S "${I}" >/dev/null 2>&1 done fi - ( - for I in ${resp}; do - if [[ "${I}" = /dev/mmc* ]]; then - echo y | mkfs.ext4 -T largefile4 -E nodiscard "${I}" - else - echo y | mkfs.ext4 -T largefile4 "${I}" - fi - done - ) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ + for I in ${RESP}; do + if [[ "${I}" = /dev/mmc* ]]; then + echo y | mkfs.ext4 -T largefile4 -E nodiscard "${I}" + else + echo y | mkfs.ext4 -T largefile4 "${I}" + fi + done 2>&1 | dialog --backtitle "$(backtitle)" --title "Format Disks" \ --progressbox "Formatting ..." 20 100 - dialog --backtitle "$(backtitle)" --colors --title "Format Disks" \ - --msgbox "Formatting is complete." 5 30 + dialog --backtitle "$(backtitle)" --title "Format Disks" \ + --msgbox "Formatting is complete." 0 0 return } @@ -1957,7 +1933,9 @@ function rebootMenu() { echo -e "update \"Automated Update Mode\"" >>"${TMP_PATH}/opts" echo -e "recovery \"Recovery Mode\"" >>"${TMP_PATH}/opts" echo -e "junior \"Reinstall Mode\"" >>"${TMP_PATH}/opts" - echo -e "bios \"BIOS/UEFI\"" >>"${TMP_PATH}/opts" + if efibootmgr | grep -q "^Boot0000"; then + echo -e "bios \"BIOS/UEFI\"" >>"${TMP_PATH}/opts" + fi echo -e "poweroff \"Shutdown\"" >>"${TMP_PATH}/opts" echo -e "shell \"Exit to Shell Cmdline\"" >>"${TMP_PATH}/opts" echo -e "init \"Restart Loader Init\"" >>"${TMP_PATH}/opts" @@ -2013,7 +1991,7 @@ function resetDSMNetwork { for I in ${DSMROOTS}; do mount -t ext4 "${I}" "${TMP_PATH}/mdX" [ $? -ne 0 ] && continue - rm -f "${TMP_PATH}/mdX/etc/sysconfig/network-scripts/ifcfg-bond"* "${TMP_PATH}/mdX/etc/sysconfig/network-scripts/ifcfg-eth"* + rm -f "${TMP_PATH}/mdX/etc.defaults/sysconfig/network-scripts/ifcfg-bond"* "${TMP_PATH}/mdX/etc.defaults/sysconfig/network-scripts/ifcfg-eth"* sync umount "${TMP_PATH}/mdX" done @@ -2059,4 +2037,100 @@ function governorSelection () { dialog --backtitle "$(backtitle)" --title "DSM Frequency Scaling" \ --msgbox "CPU frequency scaling not supported!" 0 0 fi +} + +############################################################################### +# Where the magic happens! +function dtsMenu() { + # Loop menu + while true; do + [ -f "${USER_UP_PATH}/${MODEL}.dts" ] && CUSTOMDTS="Yes" || CUSTOMDTS="No" + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --default-item ${NEXT} --menu "Choose an option" 0 0 0 \ + % "Custom dts: ${CUSTOMDTS}" \ + 1 "Upload dts file" \ + 2 "Delete dts file" \ + 3 "Edit dts file" \ + 2>${TMP_PATH}/resp + [ $? -ne 0 ] && return + case "$(cat ${TMP_PATH}/resp)" in + %) ;; + 1) + if ! tty 2>/dev/null | grep -q "/dev/pts"; then #if ! tty 2>/dev/null | grep -q "/dev/pts" || [ -z "${SSH_TTY}" ]; then + MSG="" + MSG+="This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n" + MSG+="$(printf "Or upload the dts file to %s via DUFS, Will be automatically imported when building." "${USER_UP_PATH}/${MODEL}.dts")" + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --msgbox "${MSG}" 0 0 + return + fi + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --msgbox "Currently, only dts format files are supported. Please prepare and click to confirm uploading.\n(located in /mnt/p3/users/)" 0 0 + TMP_UP_PATH="${TMP_PATH}/users" + DTC_ERRLOG="/tmp/dtc.log" + rm -rf "${TMP_UP_PATH}" + mkdir -p "${TMP_UP_PATH}" + pushd "${TMP_UP_PATH}" + RET=1 + rz -be + for F in $(ls -A 2>/dev/null); do + USER_FILE="${TMP_UP_PATH}/${F}" + dtc -q -I dts -O dtb "${F}" >"test.dtb" 2>"${DTC_ERRLOG}" + RET=$? + break + done + popd + if [ ${RET} -ne 0 ] || [ -z "${USER_FILE}" ]; then + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --msgbox "Not a valid dts file, please try again!\n\n$(cat "${DTC_ERRLOG}")" 0 0 + else + [ -d "{USER_UP_PATH}" ] || mkdir -p "${USER_UP_PATH}" + cp -f "${USER_FILE}" "${USER_UP_PATH}/${MODEL}.dts" + dialog --backtitle "$(backtitle)" --title "$(TEXT "Custom DTS")" \ + --msgbox "A valid dts file, Automatically import at compile time." 0 0 + fi + rm -rf "${DTC_ERRLOG}" + writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" + BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" + ;; + 2) + rm -f "${USER_UP_PATH}/${MODEL}.dts" + writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" + BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" + ;; + 3) + rm -rf "${TMP_PATH}/model.dts" + if [ -f "${USER_UP_PATH}/${MODEL}.dts" ]; then + cp -f "${USER_UP_PATH}/${MODEL}.dts" "${TMP_PATH}/model.dts" + else + ODTB="$(ls ${PART2_PATH}/*.dtb 2>/dev/null | head -1)" + if [ -f "${ODTB}" ]; then + dtc -q -I dtb -O dts "${ODTB}" >"${TMP_PATH}/model.dts" + else + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --msgbox "No dts file to edit. Please upload first!" 0 0 + continue + fi + fi + DTC_ERRLOG="/tmp/dtc.log" + while true; do + dialog --backtitle "$(backtitle)" --title "Edit with caution" \ + --editbox "${TMP_PATH}/model.dts" 0 0 2>"${TMP_PATH}/modelEdit.dts" + [ $? -ne 0 ] && rm -f "${TMP_PATH}/model.dts" "${TMP_PATH}/modelEdit.dts" && return + dtc -q -I dts -O dtb "${TMP_PATH}/modelEdit.dts" >"test.dtb" 2>"${DTC_ERRLOG}" + if [ $? -ne 0 ]; then + dialog --backtitle "$(backtitle)" --title "Custom DTS" \ + --msgbox "Not a valid dts file, please try again!\n\n$(cat "${DTC_ERRLOG}")" 0 0 + else + mkdir -p "${USER_UP_PATH}" + cp -f "${TMP_PATH}/modelEdit.dts" "${USER_UP_PATH}/${MODEL}.dts" + rm -r "${TMP_PATH}/model.dts" "${TMP_PATH}/modelEdit.dts" + writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" + BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" + break + fi + done + ;; + esac + done } \ No newline at end of file diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index f7033d63d..d4c3ee785 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -98,7 +98,6 @@ KERNEL="$(readConfigKey "arc.kernel" "${USER_CONFIG_FILE}")" KERNELLOAD="$(readConfigKey "arc.kernelload" "${USER_CONFIG_FILE}")" KERNELPANIC="$(readConfigKey "arc.kernelpanic" "${USER_CONFIG_FILE}")" ARC_KEY="$(readConfigKey "arc.key" "${USER_CONFIG_FILE}")" -MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" ODP="$(readConfigKey "arc.odp" "${USER_CONFIG_FILE}")" OFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")" RD_COMPRESSED="$(readConfigKey "rd-compressed" "${USER_CONFIG_FILE}")" @@ -394,8 +393,6 @@ function arcVersion() { [ "${MOD}" == "${ID}" ] && echo "N ${ID}.ko" >>"${USER_UP_PATH}/modulelist" done done < <(getAllModules "${PLATFORM}" "${KVERP}") - [ "${PLATFORM}" != "epyc7002" ] && echo "N cpufreq_conservative.ko" >>"${USER_UP_PATH}/modulelist" - [ "${PLATFORM}" != "epyc7002" ] && echo "N cpufreq_ondemand.ko" >>"${USER_UP_PATH}/modulelist" # Check for Only Version if [ "${ONLYVERSION}" == "true" ]; then # Build isn't done @@ -559,6 +556,11 @@ function arcSettings() { if [ "${ACPISYS}" == "false" ]; then dialog --backtitle "$(backtitle)" --title "Arc Warning" \ --msgbox "WARN: Your System doesn't have ACPI Support for CPU Frequency Scaling in DSM." 5 90 + else + if [ "${PLATFORM}" != "epyc7002" ]; then + echo "N cpufreq_conservative.ko" >>"${USER_UP_PATH}/modulelist" + echo "N cpufreq_ondemand.ko" >>"${USER_UP_PATH}/modulelist" + fi fi fi EMMCBOOT="$(readConfigKey "arc.emmcboot" "${USER_CONFIG_FILE}")" @@ -617,7 +619,6 @@ function arcSummary() { fi DIRECTBOOT="$(readConfigKey "arc.directboot" "${USER_CONFIG_FILE}")" KERNELLOAD="$(readConfigKey "arc.kernelload" "${USER_CONFIG_FILE}")" - MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" OFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")" ARCIPV6="$(readConfigKey "arc.ipv6" "${USER_CONFIG_FILE}")" HDDSORT="$(readConfigKey "arc.hddsort" "${USER_CONFIG_FILE}")" @@ -639,7 +640,6 @@ function arcSummary() { SUMMARY+="\n" SUMMARY+="\n\Z4> Arc Information\Zn" SUMMARY+="\n>> Arc Patch: \Zb${ARCPATCH}\Zn" - SUMMARY+="\n>> MacSys: \Zb${MACSYS}\Zn" [ -n "${PORTMAP}" ] && SUMMARY+="\n>> SataPortmap: \Zb${PORTMAP}\Zn" [ -n "${DISKMAP}" ] && SUMMARY+="\n>> DiskIdxMap: \Zb${DISKMAP}\Zn" [ -n "${PORTREMAP}" ] && SUMMARY+="\n>> SataRemap: \Zb${PORTREMAP}\Zn" @@ -973,9 +973,12 @@ else echo "d \"DSM Modules \" " >>"${TMP_PATH}/menu" echo "g \"DSM Frequency Scaling \" " >>"${TMP_PATH}/menu" echo "e \"DSM Version \" " >>"${TMP_PATH}/menu" - if [ ${SATACONTROLLER} -gt 0 ]; then + if [ "${DT}" == "false" ] && [ ${SATACONTROLLER} -gt 0 ]; then echo "S \"DSM Sata PortMap \" " >>"${TMP_PATH}/menu" fi + if [ "${DT}" == "true" ]; then + echo "o \"DSM DTS Map \" " >>"${TMP_PATH}/menu" + fi echo "P \"DSM StoragePanel Options\" " >>"${TMP_PATH}/menu" echo "Q \"DSM SequentialIO Options\" " >>"${TMP_PATH}/menu" if [ -n "${ARCCONF}" ]; then @@ -1009,6 +1012,7 @@ else echo "s \"Allow Downgrade \" " >>"${TMP_PATH}/menu" echo "t \"Change User Password \" " >>"${TMP_PATH}/menu" echo "N \"Add new User\" " >>"${TMP_PATH}/menu" + echo "D \"StaticIP \" " >>"${TMP_PATH}/menu" echo "J \"Reset DSM Network Config \" " >>"${TMP_PATH}/menu" if [ "${PLATFORM}" == "epyc7002" ]; then echo "K \"Kernel: \Z4${KERNEL}\Zn \" " >>"${TMP_PATH}/menu" @@ -1019,7 +1023,6 @@ else echo "c \"IPv6 Boot Support: \Z4${ARCIPV6}\Zn \" " >>"${TMP_PATH}/menu" echo "O \"Official Driver Priority: \Z4${ODP}\Zn \" " >>"${TMP_PATH}/menu" echo "E \"eMMC Boot Support: \Z4${EMMCBOOT}\Zn \" " >>"${TMP_PATH}/menu" - echo "o \"Switch MacSys: \Z4${MACSYS}\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 "T \"Force enable SSH in DSM \" " >>"${TMP_PATH}/menu" @@ -1033,7 +1036,6 @@ else if [ "${DEVOPTS}" == "true" ]; then echo "= \"\Z4========= Loader =========\Zn \" " >>"${TMP_PATH}/menu" echo "R \"Automated Mode: \Z4${CUSTOM}\Zn \" " >>"${TMP_PATH}/menu" - echo "D \"Loader DHCP/StaticIP \" " >>"${TMP_PATH}/menu" echo "B \"Grep DSM Config from Backup \" " >>"${TMP_PATH}/menu" echo "L \"Grep Logs from dbgutils \" " >>"${TMP_PATH}/menu" echo "w \"Reset Loader to Defaults\" " >>"${TMP_PATH}/menu" @@ -1080,6 +1082,7 @@ else g) governorMenu; NEXT="g" ;; e) ONLYVERSION="true" && arcVersion; NEXT="e" ;; S) storageMenu; NEXT="S" ;; + o) dtsMenu; NEXT="o" ;; P) storagepanelMenu; NEXT="P" ;; Q) sequentialIOMenu; NEXT="Q" ;; p) ONLYPATCH="true" && arcPatch; NEXT="p" ;; @@ -1179,12 +1182,6 @@ else BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" NEXT="E" ;; - o) [ "${MACSYS}" == "hardware" ] && MACSYS='custom' || MACSYS='hardware' - writeConfigKey "arc.macsys" "${MACSYS}" "${USER_CONFIG_FILE}" - writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" - BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")" - NEXT="o" - ;; W) [ "${RD_COMPRESSED}" == "true" ] && RD_COMPRESSED='false' || RD_COMPRESSED='true' writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}" writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}" @@ -1211,7 +1208,7 @@ else L) greplogs; NEXT="L" ;; T) forcessh; NEXT="T" ;; C) cloneLoader; NEXT="C" ;; - F) formatdisks; NEXT="F" ;; + F) formatDisks; NEXT="F" ;; G) package; NEXT="G" ;; # Misc Settings x) backupMenu; NEXT="x" ;; diff --git a/files/initrd/opt/arc/boot.sh b/files/initrd/opt/arc/boot.sh index 09cf05b21..b3b83c32c 100755 --- a/files/initrd/opt/arc/boot.sh +++ b/files/initrd/opt/arc/boot.sh @@ -44,22 +44,19 @@ MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")" MODELID="$(readConfigKey "modelid" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" LKM="$(readConfigKey "lkm" "${USER_CONFIG_FILE}")" -MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" CPU="$(echo $(cat /proc/cpuinfo 2>/dev/null | grep 'model name' | uniq | awk -F':' '{print $2}'))" -RAMTOTAL=$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024 / 1024}' /proc/meminfo 2>/dev/null) -RAM="${RAMTOTAL}GB" +RAMTOTAL=$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo 2>/dev/null) VENDOR=$(dmesg 2>/dev/null | grep -i "DMI:" | sed 's/\[.*\] DMI: //i') echo -e "\033[1;37mDSM:\033[0m" echo -e "Model: \033[1;37m${MODELID:-${MODEL}}\033[0m" echo -e "Version: \033[1;37m${PRODUCTVER}\033[0m" echo -e "LKM: \033[1;37m${LKM}\033[0m" -echo -e "Macsys: \033[1;37m${MACSYS}\033[0m" echo echo -e "\033[1;37mSystem:\033[0m" echo -e "VENDOR: \033[1;37m${VENDOR}\033[0m" echo -e "CPU: \033[1;37m${CPU}\033[0m" -echo -e "MEM: \033[1;37m${RAM}\033[0m" +echo -e "MEM: \033[1;37m${RAMTOTAL}MB\033[0m" echo if ! readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then @@ -133,6 +130,7 @@ CMDLINE['consoleblank']="600" CMDLINE['earlyprintk']="" CMDLINE['earlycon']="uart8250,io,0x3f8,115200n8" CMDLINE['root']="/dev/md0" +CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7" CMDLINE['loglevel']="15" CMDLINE['log_buf_len']="32M" CMDLINE["HddHotplug"]="1" @@ -152,26 +150,19 @@ fi if echo "purley broadwellnkv2" | grep -wq "${PLATFORM}"; then CMDLINE["SASmodel"]="1" fi -if echo "broadwell broadwellnk" | grep -wq "${PLATFORM}"; then - [ "${CMDLINE['modprobe.blacklist']}" != "" ] && CMDLINE['modprobe.blacklist']+="," - CMDLINE['modprobe.blacklist']+="mpt2sas" -fi # Cmdline NIC Settings -NIC=0 -ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) # real network cards list -for ETH in ${ETHX}; do - MAC="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" - [ -n "${MAC}" ] && NIC=$((${NIC} + 1)) && CMDLINE["mac${NIC}"]="${MAC}" -done -ETHN=$(ls /sys/class/net/ 2>/dev/null | grep eth | wc -l) -[ ${NIC} -ne ${ETHN} ] && echo -e "\033[1;31mWarning: NIC mismatch (NICs: ${NIC} | Real: ${ETHN})\033[0m" -CMDLINE['netif_num']="${NIC}" -if [ "${MACSYS}" == "hardware" ]; then - CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7" -elif [ "${MACSYS}" == "custom" ]; then - CMDLINE['skip_vender_mac_interfaces']="$(seq -s, ${NIC} 7)" -fi +MAC1="$(readConfigKey "mac.eth0" "${USER_CONFIG_FILE}")" +MAC2="$(readConfigKey "mac.eth1" "${USER_CONFIG_FILE}")" +CMDLINE['netif_num']="0" +[[ -z "${MAC1}" && -n "${MAC2}" ]] && MAC1=${MAC2} && MAC2="" # Sanity check +[ -n "${MAC1}" ] && CMDLINE['mac1']="${MAC1}" && CMDLINE['netif_num']="1" +[ -n "${MAC2}" ] && CMDLINE['mac2']="${MAC2}" && CMDLINE['netif_num']="2" + +# Read user network settings +while IFS=': ' read -r KEY VALUE; do + [ -n "${KEY}" ] && CMDLINE["network.${KEY}"]="${VALUE}" +done < <(readConfigMap "network" "${USER_CONFIG_FILE}") # Read user cmdline while IFS=': ' read -r KEY VALUE; do @@ -197,45 +188,50 @@ if [ "${DIRECTBOOT}" == "true" ]; then reboot exit 0 elif [ "${DIRECTBOOT}" == "false" ]; then + ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) + ETHN=$(ls /sys/class/net/ 2>/dev/null | grep eth | wc -l) BOOTIPWAIT="$(readConfigKey "arc.bootipwait" "${USER_CONFIG_FILE}")" [ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=20 - echo -e "\033[1;34mDetected ${NIC} NIC.\033[0m \033[1;37mWaiting for DHCP Connection:\033[0m" - IPCON="" + echo -e "\033[1;34mDetected ${ETHN} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" for ETH in ${ETHX}; do - IP="" - DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') COUNT=0 + DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do - IP=$(getIP ${ETH}) - MSG="DHCP" + if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then + echo -e "\r\033[1;37m${DRIVER}:\033[0m DOWN" + break + fi if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then echo -e "\r\033[1;37m${DRIVER}:\033[0m NOT CONNECTED" break - elif [ -n "${IP}" ]; then + fi + if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then + echo -e "\r\033[1;37m${DRIVER}:\033[0m TIMEOUT" + break + fi + COUNT=$((${COUNT} + 1)) + IP="$(getIP ${ETH})" + if [ -n "${IP}" ]; then SPEED=$(ethtool ${ETH} 2>/dev/null | grep "Speed:" | awk '{print $2}') if [[ "${IP}" =~ ^169\.254\..* ]]; then - echo -e "\r\033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m LINK LOCAL (No DHCP server found.)" + echo -e "\r\033[1;37m${DRIVER} (${SPEED}):\033[0m LINK LOCAL (No DHCP server found.)" else - echo -e "\r\033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m Access \033[1;34mhttp://${IP}:5000\033[0m to connect to DSM via web." - [ ! -n "${IPCON}" ] && IPCON="${IP}" + echo -e "\r\033[1;37m${DRIVER} (${SPEED}):\033[0m Access \033[1;34mhttp://${IP}:5000\033[0m to connect to DSM via web." + [ -z "${IPCON}" ] && IPCON="${IP}" fi break - elif [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - echo -e "\r\033[1;37m${DRIVER}:\033[0m TIMEOUT" - break fi - sleep 5 - COUNT=$((${COUNT} + 4)) + sleep 1 done done # Exec Bootwait to check SSH/Web connection BOOTWAIT=5 - w -h 2>/dev/null | grep -v tty1 | awk '{print $1" "$2" "$3}' >WB + busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB MSG="" while test ${BOOTWAIT} -ge 0; do MSG="\033[1;33mAccess SSH/Web will interrupt boot...\033[0m" echo -en "\r${MSG}" - w -h 2>/dev/null | grep -v tty1 | awk '{print $1" "$2" "$3}' >WC + busybox 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" rm -f WB WC @@ -271,7 +267,7 @@ elif [ "${DIRECTBOOT}" == "false" ]; then fi kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog echo -e "\033[1;37mBooting DSM...\033[0m" - for T in $(w -h 2>/dev/null | awk '{print $2}'); do + for T in $(busybox w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do [ -w "/dev/${T}" ] && echo -e "\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\nUse \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n" >"/dev/${T}" 2>/dev/null || true done @@ -279,6 +275,6 @@ elif [ "${DIRECTBOOT}" == "false" ]; then rm -rf "${PART1_PATH}/logs" >/dev/null 2>&1 || true KERNELLOAD="$(readConfigKey "arc.kernelload" "${USER_CONFIG_FILE}")" - [ "${KERNELLOAD}" == "kexec" ] && kexec -i -a -e || poweroff + [ "${KERNELLOAD}" == "kexec" ] && kexec -a -e || poweroff exit 0 fi \ No newline at end of file diff --git a/files/initrd/opt/arc/include/functions.py b/files/initrd/opt/arc/include/functions.py index ab43a19da..c740abff7 100755 --- a/files/initrd/opt/arc/include/functions.py +++ b/files/initrd/opt/arc/include/functions.py @@ -42,56 +42,59 @@ def makeqr(data, file, location, output): """ Generate a QRCode. """ - import fcntl, struct - import qrcode - from PIL import Image - - FBIOGET_VSCREENINFO = 0x4600 - FBIOPUT_VSCREENINFO = 0x4601 - FBIOGET_FSCREENINFO = 0x4602 - FBDEV = "/dev/fb0" - if data is not None: - qr = qrcode.QRCode(version=1, box_size=10, error_correction=qrcode.constants.ERROR_CORRECT_H, border=4,) - qr.add_data(data) - qr.make(fit=True) - img = qr.make_image(fill_color="grey", back_color="black") - img = img.convert("RGBA") - pixels = img.load() - for i in range(img.size[0]): - for j in range(img.size[1]): - if pixels[i, j] == (255, 255, 255, 255): - pixels[i, j] = (255, 255, 255, 0) - - if os.path.exists(os.path.join(WORK_PATH, "logo.png")): - icon = Image.open(os.path.join(WORK_PATH, "logo.png")) - icon = icon.convert("RGBA") - img.paste(icon.resize((int(img.size[0] / 5), int(img.size[1] / 5))), (int((img.size[0] - int(img.size[0] / 5)) / 2), int((img.size[1] - int(img.size[1] / 5)) / 2),),) - - if file is not None: - img = Image.open(file) - # img = img.convert("RGBA") - # pixels = img.load() - # for i in range(img.size[0]): - # for j in range(img.size[1]): - # if pixels[i, j] == (255, 255, 255, 255): - # pixels[i, j] = (255, 255, 255, 0) - - (xres, yres) = (1920, 1080) - with open(FBDEV, "rb") as fb: - vi = fcntl.ioctl(fb, FBIOGET_VSCREENINFO, bytes(160)) - res = struct.unpack("I" * 40, vi) - if res[0] != 0 and res[1] != 0: - (xres, yres) = (res[0], res[1]) - xqr, yqr = (int(xres / 8), int(xres / 8)) - img = img.resize((xqr, yqr)) - - alpha = Image.new("RGBA", (xres, yres), (0, 0, 0, 0)) - if int(location) not in range(0, 8): - location = 0 - loc = (img.size[0] * int(location), alpha.size[1] - img.size[1]) - alpha.paste(img, loc) - alpha.save(output) - + try: + import fcntl, struct + import qrcode + from PIL import Image + + FBIOGET_VSCREENINFO = 0x4600 + FBIOPUT_VSCREENINFO = 0x4601 + FBIOGET_FSCREENINFO = 0x4602 + FBDEV = "/dev/fb0" + if data is not None: + qr = qrcode.QRCode(version=1, box_size=10, error_correction=qrcode.constants.ERROR_CORRECT_H, border=4,) + qr.add_data(data) + qr.make(fit=True) + img = qr.make_image(fill_color="grey", back_color="black") + img = img.convert("RGBA") + pixels = img.load() + for i in range(img.size[0]): + for j in range(img.size[1]): + if pixels[i, j] == (255, 255, 255, 255): + pixels[i, j] = (255, 255, 255, 0) + + if os.path.exists(os.path.join(WORK_PATH, "logo.png")): + icon = Image.open(os.path.join(WORK_PATH, "logo.png")) + icon = icon.convert("RGBA") + img.paste(icon.resize((int(img.size[0] / 5), int(img.size[1] / 5))), (int((img.size[0] - int(img.size[0] / 5)) / 2), int((img.size[1] - int(img.size[1] / 5)) / 2),),) + + if file is not None: + img = Image.open(file) + # img = img.convert("RGBA") + # pixels = img.load() + # for i in range(img.size[0]): + # for j in range(img.size[1]): + # if pixels[i, j] == (255, 255, 255, 255): + # pixels[i, j] = (255, 255, 255, 0) + + (xres, yres) = (1920, 1080) + with open(FBDEV, "rb") as fb: + vi = fcntl.ioctl(fb, FBIOGET_VSCREENINFO, bytes(160)) + res = struct.unpack("I" * 40, vi) + if res[0] != 0 and res[1] != 0: + (xres, yres) = (res[0], res[1]) + xqr, yqr = (int(xres / 8), int(xres / 8)) + img = img.resize((xqr, yqr)) + + alpha = Image.new("RGBA", (xres, yres), (0, 0, 0, 0)) + if int(location) not in range(0, 8): + location = 0 + loc = (img.size[0] * int(location), alpha.size[1] - img.size[1]) + alpha.paste(img, loc) + alpha.save(output) + + except: + pass @cli.command() @click.option("-p", "--platforms", type=str, help="The platforms of Syno.") @@ -105,8 +108,8 @@ def getmodels(platforms=None): adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])) session = requests.Session() - session.mount('http://', adapter) - session.mount('https://', adapter) + session.mount("http://", adapter) + session.mount("https://", adapter) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) if platforms is not None and platforms != "": diff --git a/files/initrd/opt/arc/init.sh b/files/initrd/opt/arc/init.sh index bb6c29cc7..fab9b0b6f 100755 --- a/files/initrd/opt/arc/init.sh +++ b/files/initrd/opt/arc/init.sh @@ -50,7 +50,6 @@ initConfigKey "arc.kernel" "official" "${USER_CONFIG_FILE}" initConfigKey "arc.kernelload" "power" "${USER_CONFIG_FILE}" initConfigKey "arc.kernelpanic" "5" "${USER_CONFIG_FILE}" initConfigKey "arc.key" "" "${USER_CONFIG_FILE}" -initConfigKey "arc.macsys" "hardware" "${USER_CONFIG_FILE}" initConfigKey "arc.nic" "" "${USER_CONFIG_FILE}" initConfigKey "arc.odp" "false" "${USER_CONFIG_FILE}" initConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}" @@ -62,8 +61,6 @@ initConfigKey "arc.version" "${ARC_VERSION}" "${USER_CONFIG_FILE}" initConfigKey "cmdline" "{}" "${USER_CONFIG_FILE}" initConfigKey "device" "{}" "${USER_CONFIG_FILE}" initConfigKey "device.externalcontroller" "false" "${USER_CONFIG_FILE}" -initConfigKey "gateway" "{}" "${USER_CONFIG_FILE}" -initConfigKey "ip" "{}" "${USER_CONFIG_FILE}" initConfigKey "keymap" "" "${USER_CONFIG_FILE}" initConfigKey "layout" "" "${USER_CONFIG_FILE}" initConfigKey "lkm" "prod" "${USER_CONFIG_FILE}" @@ -71,7 +68,7 @@ initConfigKey "mac" "{}" "${USER_CONFIG_FILE}" initConfigKey "modules" "{}" "${USER_CONFIG_FILE}" initConfigKey "model" "" "${USER_CONFIG_FILE}" initConfigKey "modelid" "" "${USER_CONFIG_FILE}" -initConfigKey "netmask" "{}" "${USER_CONFIG_FILE}" +initConfigKey "network" "{}" "${USER_CONFIG_FILE}" initConfigKey "platform" "" "${USER_CONFIG_FILE}" initConfigKey "productver" "" "${USER_CONFIG_FILE}" initConfigKey "ramdisk-hash" "" "${USER_CONFIG_FILE}" @@ -87,36 +84,31 @@ ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) # real network cards list if arrayExistItem "sortnetif:" $(readConfigMap "addons" "${USER_CONFIG_FILE}"); then _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")" fi -MACSYS="$(readConfigKey "arc.macsys" "${USER_CONFIG_FILE}")" -# Write Mac to config -NIC=0 +# Read/Write IP/Mac config for ETH in ${ETHX}; do - MACR=$(cat /sys/class/net/${ETH}/address | sed 's/://g') - if [ -z "${MACR}" ]; then - MACR="9009d0123456" - fi - initConfigKey "mac.${ETH}" "${MACR}" "${USER_CONFIG_FILE}" - if [ "${MACSYS}" == "custom" ]; then - MACA="$(readConfigKey "mac.${ETH}" "${USER_CONFIG_FILE}")" - if [ -n "${MACA}" ] && [ "${MACA}" != "${MACR}" ]; then - MAC="${MACA:0:2}:${MACA:2:2}:${MACA:4:2}:${MACA:6:2}:${MACA:8:2}:${MACA:10:2}" - echo "Setting ${ETH} MAC to ${MAC}" - ip link set dev ${ETH} address ${MAC} >/dev/null 2>&1 || true - STATICIP="$(readConfigKey "static.${ETH}" "${USER_CONFIG_FILE}")" - sleep 2 + MACR="$(cat /sys/class/net/${ETH}/address 2>/dev/null | sed 's/://g')" + IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" + if [ -n "${IPR}" ]; then + IFS='/' read -r -a IPRA <<<"$IPR" + ip addr flush dev $ETH + ip addr add ${IPRA[0]}/${IPRA[1]:-"255.255.255.0"} dev $ETH + if [ -n "${IPRA[2]}" ]; then + ip route add default via ${IPRA[2]} dev $ETH + fi + if [ -n "${IPRA[3]:-${IPRA[2]}}" ]; then + sed -i "/nameserver ${IPRA[3]:-${IPRA[2]}}/d" /etc/resolv.conf + echo "nameserver ${IPRA[3]:-${IPRA[2]}}" >>/etc/resolv.conf fi + sleep 1 fi - NIC=$((${NIC} + 1)) + [ "${ETH::3}" = "eth" ] && ethtool -s ${ETH} wol g 2>/dev/null || true + initConfigKey "mac.${ETH}" "${MACR}" "${USER_CONFIG_FILE}" done -#/etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true -#sleep 5 ETHN=$(ls /sys/class/net/ 2>/dev/null | grep eth | wc -l) -[ ${NIC} -ne ${ETHN} ] && echo -e "\033[1;31mWarning: NIC mismatch (NICs: ${NIC} | Real: ${ETHN})\033[0m" -# Write NIC Amount to config -writeConfigKey "device.nic" "${NIC}" "${USER_CONFIG_FILE}" +writeConfigKey "device.nic" "${ETHN}" "${USER_CONFIG_FILE}" # No network devices echo -[ ${NIC} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." +[ ${ETHN} -le 0 ] && die "No NIC found! - Loader does not work without Network connection." # Get the VID/PID if we are in USB VID="0x46f4" @@ -168,52 +160,36 @@ fi echo BOOTIPWAIT="$(readConfigKey "arc.bootipwait" "${USER_CONFIG_FILE}")" -[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30 -echo -e "\033[1;34mDetected ${NIC} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" +[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=20 +echo -e "\033[1;34mDetected ${ETHN} NIC.\033[0m \033[1;37mWaiting for Connection:\033[0m" for ETH in ${ETHX}; do - IP="" - STATICIP="$(readConfigKey "static.${ETH}" "${USER_CONFIG_FILE}")" - ARCNIC="$(readConfigKey "arc.nic" "${USER_CONFIG_FILE}")" - DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') COUNT=0 + DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}') while true; do - ARCIP="$(readConfigKey "ip.${ETH}" "${USER_CONFIG_FILE}")" - if [ "${STATICIP}" == "true" ] && [ -n "${ARCIP}" ]; then - /etc/init.d/S41dhcpcd stop >/dev/null 2>&1 || true - ip addr flush dev ${ETH} 2>/dev/null || true - NETMASK="$(readConfigKey "netmask.${ETH}" "${USER_CONFIG_FILE}")" - GATEWAY="$(readConfigKey "gateway.${ETH}" "${USER_CONFIG_FILE}")" - NAMESERVER="$(readConfigKey "nameserver.${ETH}" "${USER_CONFIG_FILE}")" - IP=${ARCIP} - #NETMASK=$(convert_netmask "${NETMASK}") - ip addr add ${ARCIP}/${NETMASK} dev ${ETH} 2>/dev/null || true - ip route add default via ${GATEWAY} dev ${ETH} 2>/dev/null || true - echo "nameserver ${NAMESERVER}" >>/etc/resolv.conf.head 2>/dev/null || true - /etc/init.d/S40network restart 2>/dev/null || true - MSG="STATIC" - else - IP=$(getIP ${ETH}) - writeConfigKey "static.${ETH}" "false" "${USER_CONFIG_FILE}" - MSG="DHCP" + if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then + echo -e "\r\033[1;37m${DRIVER}:\033[0m DOWN" + break fi if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then echo -e "\r\033[1;37m${DRIVER}:\033[0m NOT CONNECTED" break - elif [ -n "${IP}" ]; then + fi + if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then + echo -e "\r\033[1;37m${DRIVER}:\033[0m TIMEOUT" + break + fi + COUNT=$((${COUNT} + 1)) + IP="$(getIP ${ETH})" + if [ -n "${IP}" ]; then SPEED=$(ethtool ${ETH} 2>/dev/null | grep "Speed:" | awk '{print $2}') - writeConfigKey "ip.${ETH}" "${IP}" "${USER_CONFIG_FILE}" if [[ "${IP}" =~ ^169\.254\..* ]]; then - echo -e "\r\033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m LINK LOCAL (No DHCP server found.)" + echo -e "\r\033[1;37m${DRIVER} (${SPEED}):\033[0m LINK LOCAL (No DHCP server found.)" else - echo -e "\r\033[1;37m${DRIVER} (${SPEED} | ${MSG}):\033[0m Access \033[1;34mhttp://${IP}:7681\033[0m to connect to Arc via web." + echo -e "\r\033[1;37m${DRIVER} (${SPEED}):\033[0m Access \033[1;34mhttp://${IP}:7681\033[0m to connect to Arc via web interface." fi break - elif [ ${COUNT} -ge ${BOOTIPWAIT} ]; then - echo -e echo -e "\r\033[1;37m${DRIVER}:\033[0m TIMEOUT" - break fi - sleep 5 - COUNT=$((${COUNT} + 4)) + sleep 1 done done diff --git a/files/initrd/opt/arc/ramdisk-patch.sh b/files/initrd/opt/arc/ramdisk-patch.sh index 55ab00956..62535fc4f 100755 --- a/files/initrd/opt/arc/ramdisk-patch.sh +++ b/files/initrd/opt/arc/ramdisk-patch.sh @@ -165,7 +165,7 @@ chmod +x "${RAMDISK_PATH}/addons/addons.sh" for ADDON in "redpill" "revert" "misc" "eudev" "disks" "localrss" "notify" "updatenotify" "wol" "mountloader"; do PARAMS="" if [ "${ADDON}" == "disks" ]; then - PARAMS=${HDDSORT:-"false"} + PARAMS=${HDDSORT} [ -f "${USER_UP_PATH}/${MODEL}.dts" ] && cp -f "${USER_UP_PATH}/${MODEL}.dts" "${RAMDISK_PATH}/addons/model.dts" fi installAddon "${ADDON}" "${PLATFORM}" || exit 1 @@ -176,7 +176,7 @@ done if grep -q "^flags.*acpi.*" /proc/cpuinfo; then for ADDON in "cpufreqscaling"; do CPUGOVERNOR="$(readConfigKey "arc.governor" "${USER_CONFIG_FILE}")" - PARAMS=${CPUGOVERNOR:-"performance"} + PARAMS=${CPUGOVERNOR} installAddon "${ADDON}" "${PLATFORM}" || exit 1 echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1 done diff --git a/files/p3/custom/bzImage-epyc7002-7.2-5.10.55.gz b/files/p3/custom/bzImage-epyc7002-7.2-5.10.55.gz index 0001b4956..6ef5b7b33 100644 Binary files a/files/p3/custom/bzImage-epyc7002-7.2-5.10.55.gz and b/files/p3/custom/bzImage-epyc7002-7.2-5.10.55.gz differ diff --git a/files/p3/custom/firmware.tgz b/files/p3/custom/firmware.tgz index c8a23e588..7d4ef9583 100644 Binary files a/files/p3/custom/firmware.tgz and b/files/p3/custom/firmware.tgz differ diff --git a/files/p3/custom/modules-epyc7002-7.2-5.10.55.tgz b/files/p3/custom/modules-epyc7002-7.2-5.10.55.tgz index 4b85bc40f..ffdadeaa5 100644 Binary files a/files/p3/custom/modules-epyc7002-7.2-5.10.55.tgz and b/files/p3/custom/modules-epyc7002-7.2-5.10.55.tgz differ diff --git a/scripts/func.sh b/scripts/func.sh index 8783f6d0f..a45338770 100755 --- a/scripts/func.sh +++ b/scripts/func.sh @@ -206,8 +206,8 @@ function getBuildroot() { local TAG="${1:-latest}" local DEST_PATH="${2:-br}" - if [ "${1}" = "latest" ]; then - TAG=$(curl -s "https://api.github.com/repos/AuxXxilium/arc-buildroot/releases" | jq -r ".[0].tag_name") + if [ "${TAG}" = "latest" ]; then + TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-buildroot/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')" fi [ ! -d "${DEST_PATH}" ] && mkdir -p "${DEST_PATH}" rm -f "${DEST_PATH}/bzImage-arc" @@ -220,7 +220,7 @@ function getBuildroot() { echo "TAG=${TAG}; Status=${STATUS}" [ ${STATUS} -ne 200 ] && exit 1 - echo "Getting Buildroot end" + echo "Getting Buildroot end - ${TAG}" } # Get latest Offline @@ -397,4 +397,4 @@ _EOF_ rm -f "${OVAPATH}" ovftool/ovftool "OVA_${VMNAME}/${VMNAME}.vmx" "${OVAPATH}" rm -rf "OVA_${VMNAME}" -} \ No newline at end of file +}