diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml
index 3fbea123..cd1c2cb9 100644
--- a/.github/workflows/issues.yml
+++ b/.github/workflows/issues.yml
@@ -176,23 +176,6 @@ jobs:
echo "TAG=${TAG}" >> $GITHUB_ENV
- case "${{ env.size }}" in
- 2GB)
- echo "2GB"
- ;;
- 4GB)
- echo "4GB"
- resizeImg rr/rr.img +2048M
- ;;
- 8GB)
- echo "8GB"
- resizeImg rr/rr.img +6144M
- ;;
- *)
- echo "unknown size"
- ;;
- esac
-
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" rr/rr.img
@@ -254,6 +237,26 @@ jobs:
echo "Of course, you can also modify the settings yourself."
} >README.txt
+ case "${{ env.size }}" in
+ 2GB)
+ echo "2GB"
+ gzip -dc "files/initrd/opt/rr/grub.img.gz" > rr/rr_2GB.img
+ repackImg rr/rr.img rr/rr_2GB.img
+ rm -f rr/rr.img
+ mv -f rr/rr_2GB.img rr/rr.img
+ ;;
+ 4GB)
+ echo "4GB"
+ ;;
+ 8GB)
+ echo "8GB"
+ resizeImg rr/rr.img +4096M
+ ;;
+ *)
+ echo "unknown size"
+ ;;
+ esac
+
case "${{ env.format }}" in
ova)
echo "OVA"
diff --git a/files/initrd/opt/rr/boot.sh b/files/initrd/opt/rr/boot.sh
index 8078dc0a..b618f73d 100755
--- a/files/initrd/opt/rr/boot.sh
+++ b/files/initrd/opt/rr/boot.sh
@@ -32,14 +32,14 @@ WTITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}${RR_RELEASE:+(${RR_RELEA
DATE="$(date)"
printf "\033[1;44m%*s\n" "${COLUMNS}" ""
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
-printf "\033[1;31m%*s\033[0m\n" "$(((${#WTITLE} + ${COLUMNS}) / 2))" "${WTITLE}"
+printf "\033[1;31m%*s\033[0m\n" "$(((${#WTITLE} + COLUMNS) / 2))" "${WTITLE}"
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;32m%*s\033[0m\n" "${COLUMNS}" "${DATE}"
BTITLE="Boot Type:"
BTITLE+="$([ ${EFI} -eq 1 ] && echo " [UEFI]" || echo " [BIOS]")"
BTITLE+="$([ "${BUS}" = "usb" ] && echo " [${BUS^^} flashdisk]" || echo " [${BUS^^} DoM]")"
-printf "\033[1;33m%*s\033[0m\n" $(((${#BTITLE} + ${COLUMNS}) / 2)) "${BTITLE}"
+printf "\033[1;33m%*s\033[0m\n" $(((${#BTITLE} + COLUMNS) / 2)) "${BTITLE}"
if [ -f "${PART1_PATH}/.upgraded" ]; then
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
@@ -378,7 +378,7 @@ else
COUNT=0
BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")"
BOOTIPWAIT=${BOOTIPWAIT:-10}
- while [ ${COUNT} -lt $((${BOOTIPWAIT} + 32)) ]; do
+ while [ ${COUNT} -lt $((BOOTIPWAIT + 32)) ]; do
MSG=""
for N in ${ETHX}; do
if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
diff --git a/files/initrd/opt/rr/helper.sh b/files/initrd/opt/rr/helper.sh
index 7eae386b..d5adfc42 100755
--- a/files/initrd/opt/rr/helper.sh
+++ b/files/initrd/opt/rr/helper.sh
@@ -23,10 +23,10 @@ trap 'flock -u 911; rm -f "${TMP_PATH}/helper.lock"' EXIT INT TERM HUP
{
printf "$(TEXT "Closing this window or press 'ctrl + c' to exit the assistance.")\n"
- printf "$(TEXT "Please give the following link to the helper. (Click to open and copy)")\n"
+ printf "$(TEXT "Please give the following link to the helper. (Click to open and copy)")\n"
printf " 👇\n"
sshx -q --name "RR-Helper" 2>&1
- [ $? -ne 0 ] && while true; do sleep 1; done
+ [ $? -ne 0 ] && while true; do sleep 1; done
} | dialog --colors --aspect 50 --title "$(TEXT "Online Assistance")" --progressbox "$(TEXT "Notice: Please keep this window open.")" 20 100 2>&1
clear
diff --git a/files/initrd/opt/rr/include/configFile.sh b/files/initrd/opt/rr/include/configFile.sh
index beab8e23..4b23c279 100755
--- a/files/initrd/opt/rr/include/configFile.sh
+++ b/files/initrd/opt/rr/include/configFile.sh
@@ -48,7 +48,7 @@ function mergeConfigModules() {
XF=$(mktemp 2>/dev/null)
XF=${XF:-/tmp/tmp.XXXXXXXXXX}
echo -en "${ML}" | yq -p p -o y >"${XF}"
- deleteConfigKey "modules.\"RRORG\"" "${XF}"
+ deleteConfigKey 'modules."RRORG"' "${XF}"
yq eval-all --inplace '. as $item ireduce ({}; . * $item)' --inplace "${2}" "${XF}" 2>/dev/null
rm -f "${XF}"
}
diff --git a/files/initrd/opt/rr/include/functions.sh b/files/initrd/opt/rr/include/functions.sh
index ea8bc1ce..8d281133 100755
--- a/files/initrd/opt/rr/include/functions.sh
+++ b/files/initrd/opt/rr/include/functions.sh
@@ -114,12 +114,12 @@ function generateSerial() {
SERIAL="${PREFIX:-"0000"}${MIDDLE:-"XXX"}"
case "${SUFFIX:-"alpha"}" in
- numeric)
- SERIAL+="$(random)"
- ;;
- alpha)
- SERIAL+="$(genRandomLetter)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomLetter)"
- ;;
+ numeric)
+ SERIAL+="$(random)"
+ ;;
+ alpha)
+ SERIAL+="$(genRandomLetter)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomLetter)"
+ ;;
esac
echo "${SERIAL}"
}
@@ -167,16 +167,16 @@ function validateSerial() {
return 1
fi
case "${SUFFIX:-"alpha"}" in
- numeric)
- if ! echo "${S}" | grep -q "^[0-9]\{6\}$"; then
- return 1
- fi
- ;;
- alpha)
- if ! echo "${S}" | grep -q "^[A-Z][0-9][0-9][0-9][0-9][A-Z]$"; then
- return 1
- fi
- ;;
+ numeric)
+ if ! echo "${S}" | grep -q "^[0-9]\{6\}$"; then
+ return 1
+ fi
+ ;;
+ alpha)
+ if ! echo "${S}" | grep -q "^[A-Z][0-9][0-9][0-9][0-9][A-Z]$"; then
+ return 1
+ fi
+ ;;
esac
return 0
}
diff --git a/files/initrd/opt/rr/init.sh b/files/initrd/opt/rr/init.sh
index 14afce5f..0c40c29e 100755
--- a/files/initrd/opt/rr/init.sh
+++ b/files/initrd/opt/rr/init.sh
@@ -32,7 +32,7 @@ TITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}${RR_RELEASE:+(${RR_RELEAS
DATE="$(date)"
printf "\033[1;44m%*s\n" "${COLUMNS}" ""
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
-printf "\033[1;31m%*s\033[0m\n" "$(((${#TITLE} + ${COLUMNS}) / 2))" "${TITLE}"
+printf "\033[1;31m%*s\033[0m\n" "$(((${#TITLE} + COLUMNS) / 2))" "${TITLE}"
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;32m%*s\033[0m\n" "${COLUMNS}" "${DATE}"
diff --git a/files/initrd/opt/rr/menu.sh b/files/initrd/opt/rr/menu.sh
index 8ba14506..eda58f65 100755
--- a/files/initrd/opt/rr/menu.sh
+++ b/files/initrd/opt/rr/menu.sh
@@ -374,24 +374,24 @@ function productversMenu() {
2>"${TMP_PATH}/resp"
RET=$?
case ${RET} in
- 0)
- # ok-button
- paturl="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- patsum="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- break
- ;;
- 3)
- # extra-button
- continue
- ;;
- 1)
- # cancel-button
- return 0
- ;;
- 255)
- # ESC
- return 0
- ;;
+ 0)
+ # ok-button
+ paturl="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ patsum="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ break
+ ;;
+ 3)
+ # extra-button
+ continue
+ ;;
+ 1)
+ # cancel-button
+ return 0
+ ;;
+ 255)
+ # ESC
+ return 0
+ ;;
esac
done
@@ -430,8 +430,8 @@ function reconfiguringV() {
writeConfigKey "kver" "${KVER}" "${USER_CONFIG_FILE}"
writeConfigKey "kpre" "${KPRE}" "${USER_CONFIG_FILE}"
# Check kernel
- if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] &&
- [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
+ if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] \
+ && [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
:
else
KERNEL='official'
@@ -530,8 +530,8 @@ function setConfigFromDSM() {
writeConfigKey "kver" "${KVER}" "${USER_CONFIG_FILE}"
writeConfigKey "kpre" "${KPRE}" "${USER_CONFIG_FILE}"
# Check kernel
- if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] &&
- [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
+ if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] \
+ && [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
:
else
KERNEL='official'
@@ -683,119 +683,119 @@ function addonMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && return 1
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- a)
- rm -f "${TMP_PATH}/menu"
- while read -r ADDON DESC; do
- arrayExistItem "${ADDON}" "${!ADDONS[@]}" && continue # Check if addon has already been added
- echo "${ADDON} ${DESC}" >>"${TMP_PATH}/menu"
- done <<<"$(availableAddons "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
- if [ ! -f "${TMP_PATH}/menu" ]; then
+ a)
+ rm -f "${TMP_PATH}/menu"
+ while read -r ADDON DESC; do
+ arrayExistItem "${ADDON}" "${!ADDONS[@]}" && continue # Check if addon has already been added
+ echo "${ADDON} ${DESC}" >>"${TMP_PATH}/menu"
+ done <<<"$(availableAddons "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
+ if [ ! -f "${TMP_PATH}/menu" ]; then
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(TEXT "No available addons to add")" 0 0
+ NEXT="e"
+ continue
+ fi
DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(TEXT "No available addons to add")" 0 0
- NEXT="e"
- continue
- fi
- DIALOG --title "$(TEXT "Addons")" \
- --menu "$(TEXT "Select an addon")" 0 0 25 --file "${TMP_PATH}/menu" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- ADDON="${resp}"
- if [ "$(readAddonKey "${ADDON}" "params")" = "true" ]; then
- DIALOG --title "$(TEXT "Addons")" \
- --inputbox "$(TEXT "Type a optional params to addon")" 0 70 \
+ --menu "$(TEXT "Select an addon")" 0 0 25 --file "${TMP_PATH}/menu" \
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && continue
resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- # [ -z "${resp}" ] && continue # Addons params can be empty
- VALUE="${resp}"
- else
- VALUE=""
- fi
- ADDONS[${ADDON}]="${VALUE}"
- writeConfigKey "addons.\"${ADDON}\"" "${VALUE}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- ;;
- d)
- if [ ${#ADDONS[@]} -eq 0 ]; then
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(TEXT "No user addons to remove")" 0 0
- continue
- fi
- rm -f "${TMP_PATH}/opts"
- for I in "${!ADDONS[@]}"; do
- echo "\"${I}\" \"${I}\" \"off\"" >>"${TMP_PATH}/opts"
- done
- DIALOG --title "$(TEXT "Addons")" \
- --no-tags --checklist "$(TEXT "Select addon to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- ADDON="${resp}"
- for I in ${ADDON}; do
- unset "ADDONS[${I}]"
- deleteConfigKey "addons.\"${I}\"" "${USER_CONFIG_FILE}"
- done
- touch "${PART1_PATH}/.build"
- ;;
- s)
- MSG="$(TEXT "Name with color \"\Z4blue\Zn\" have been added, with color \"\Z1red\Zn\" are not added.\n")"
- MSG+="\n"
- while read -r ADDON DESC; do
- if arrayExistItem "${ADDON}" "${!ADDONS[@]}"; then
- MSG+="\Z4${ADDON}:\Zn \Z5${DESC}\Zn\n"
+ [ -z "${resp}" ] && continue
+ ADDON="${resp}"
+ if [ "$(readAddonKey "${ADDON}" "params")" = "true" ]; then
+ DIALOG --title "$(TEXT "Addons")" \
+ --inputbox "$(TEXT "Type a optional params to addon")" 0 70 \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ # [ -z "${resp}" ] && continue # Addons params can be empty
+ VALUE="${resp}"
else
- MSG+="\Z1${ADDON}:\Z1 \Z5${DESC}\Zn\n"
+ VALUE=""
fi
- done <<<"$(availableAddons "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "${MSG}" 0 0
- ;;
- u)
- if ! tty 2>/dev/null | grep -q "/dev/pts"; then #if ! tty 2>/dev/null | grep -q "/dev/pts" || [ -z "${SSH_TTY}" ]; then
- MSG="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
+ ADDONS[${ADDON}]="${VALUE}"
+ writeConfigKey "addons.\"${ADDON}\"" "${VALUE}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ ;;
+ d)
+ if [ ${#ADDONS[@]} -eq 0 ]; then
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(TEXT "No user addons to remove")" 0 0
+ continue
+ fi
+ rm -f "${TMP_PATH}/opts"
+ for I in "${!ADDONS[@]}"; do
+ echo "\"${I}\" \"${I}\" \"off\"" >>"${TMP_PATH}/opts"
+ done
+ DIALOG --title "$(TEXT "Addons")" \
+ --no-tags --checklist "$(TEXT "Select addon to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ ADDON="${resp}"
+ for I in ${ADDON}; do
+ unset "ADDONS[${I}]"
+ deleteConfigKey "addons.\"${I}\"" "${USER_CONFIG_FILE}"
+ done
+ touch "${PART1_PATH}/.build"
+ ;;
+ s)
+ MSG="$(TEXT "Name with color \"\Z4blue\Zn\" have been added, with color \"\Z1red\Zn\" are not added.\n")"
+ MSG+="\n"
+ while read -r ADDON DESC; do
+ if arrayExistItem "${ADDON}" "${!ADDONS[@]}"; then
+ MSG+="\Z4${ADDON}:\Zn \Z5${DESC}\Zn\n"
+ else
+ MSG+="\Z1${ADDON}:\Z1 \Z5${DESC}\Zn\n"
+ fi
+ done <<<"$(availableAddons "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
DIALOG --title "$(TEXT "Addons")" \
--msgbox "${MSG}" 0 0
- continue
- fi
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(TEXT "Please upload the *.addon file.")" 0 0
- TMP_UP_PATH="${TMP_PATH}/users"
- rm -rf "${TMP_UP_PATH}"
- mkdir -p "${TMP_UP_PATH}"
- (cd "${TMP_UP_PATH}" && rz -be) || true
- USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
- if [ -z "${USER_FILE}" ]; then
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
- else
- if [ -d "${ADDONS_PATH}/$(basename "${USER_FILE}" .addon)" ]; then
+ ;;
+ u)
+ if ! tty 2>/dev/null | grep -q "/dev/pts"; then #if ! tty 2>/dev/null | grep -q "/dev/pts" || [ -z "${SSH_TTY}" ]; then
+ MSG="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
DIALOG --title "$(TEXT "Addons")" \
- --yesno "$(TEXT "The addon already exists. Do you want to overwrite it?")" 0 0
- RET=$?
- if [ ${RET} -ne 0 ]; then
- rm -rf "${TMP_UP_PATH}"
- return 1
+ --msgbox "${MSG}" 0 0
+ continue
+ fi
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(TEXT "Please upload the *.addon file.")" 0 0
+ TMP_UP_PATH="${TMP_PATH}/users"
+ rm -rf "${TMP_UP_PATH}"
+ mkdir -p "${TMP_UP_PATH}"
+ (cd "${TMP_UP_PATH}" && rz -be) || true
+ USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
+ if [ -z "${USER_FILE}" ]; then
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
+ else
+ if [ -d "${ADDONS_PATH}/$(basename "${USER_FILE}" .addon)" ]; then
+ DIALOG --title "$(TEXT "Addons")" \
+ --yesno "$(TEXT "The addon already exists. Do you want to overwrite it?")" 0 0
+ RET=$?
+ if [ ${RET} -ne 0 ]; then
+ rm -rf "${TMP_UP_PATH}"
+ return 1
+ fi
+ fi
+ ADDON="$(untarAddon "${USER_FILE}")"
+ rm -rf "${TMP_UP_PATH}"
+ if [ -n "${ADDON}" ]; then
+ [ -f "${ADDONS_PATH}/VERSION" ] && rm -f "${ADDONS_PATH}/VERSION"
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(printf "$(TEXT "Addon '%s' added to loader, Please enable it in 'Add an addon' menu.")" "${ADDON}")" 0 0
+ touch "${PART1_PATH}/.build"
+ else
+ DIALOG --title "$(TEXT "Addons")" \
+ --msgbox "$(TEXT "File format not recognized!")" 0 0
fi
fi
- ADDON="$(untarAddon "${USER_FILE}")"
- rm -rf "${TMP_UP_PATH}"
- if [ -n "${ADDON}" ]; then
- [ -f "${ADDONS_PATH}/VERSION" ] && rm -f "${ADDONS_PATH}/VERSION"
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(printf "$(TEXT "Addon '%s' added to loader, Please enable it in 'Add an addon' menu.")" "${ADDON}")" 0 0
- touch "${PART1_PATH}/.build"
- else
- DIALOG --title "$(TEXT "Addons")" \
- --msgbox "$(TEXT "File format not recognized!")" 0 0
- fi
- fi
- ;;
- e)
- return 0
- ;;
+ ;;
+ e)
+ return 0
+ ;;
esac
done
}
@@ -821,173 +821,173 @@ function moduleMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && break
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- s)
- while true; do
- DIALOG --title "$(TEXT "Modules")" \
- --infobox "$(TEXT "Reading modules ...")" 0 0
- ALLMODULES=$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")
- unset USERMODULES
- declare -A USERMODULES
- while IFS=': ' read -r KEY VALUE; do
- [ -n "${KEY}" ] && USERMODULES["${KEY}"]="${VALUE}"
- done <<<"$(readConfigMap "modules" "${USER_CONFIG_FILE}")"
- rm -f "${TMP_PATH}/opts"
- while read -r ID DESC; do
- arrayExistItem "${ID}" "${!USERMODULES[@]}" && ACT="on" || ACT="off"
- echo "${ID} ${DESC} ${ACT}" >>"${TMP_PATH}/opts"
- done <<<${ALLMODULES}
- DIALOG --title "$(TEXT "Modules")" \
- --extra-button --extra-label "$(TEXT "Select all")" \
- --help-button --help-label "$(TEXT "Deselect all")" \
- --checklist "$(TEXT "Select modules to include")" 0 0 0 --file "${TMP_PATH}/opts" \
- 2>"${TMP_PATH}/resp"
- RET=$?
- case ${RET} in
- 0)
- # ok-button
- writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
- mergeConfigModules "$(cat "${TMP_PATH}/resp" 2>/dev/null)" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- break
- ;;
- 3)
- # extra-button
- writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
- mergeConfigModules "$(echo "${ALLMODULES}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- ;;
- 2)
- # help-button
- writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
- esac
- done
- ;;
- l)
- DIALOG --title "$(TEXT "Modules")" \
- --infobox "$(TEXT "Selecting loaded modules")" 0 0
- writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
- while read -r J; do
- writeConfigKey "modules.\"${J}\"" "" "${USER_CONFIG_FILE}"
- done <<<"$(getLoadedModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
- touch "${PART1_PATH}/.build"
- ;;
- u)
- 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+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).")"
- DIALOG --title "$(TEXT "Modules")" \
- --msgbox "${MSG}" 0 0
- return 1
- fi
- MSG=""
- MSG+="$(TEXT "This function is experimental and dangerous. If you don't know much, please exit.\n")"
- MSG+="$(TEXT "The imported .ko of this function will be implanted into the corresponding arch's modules package, which will affect all models of the arch.\n")"
- MSG+="$(TEXT "This program will not determine the availability of imported modules or even make type judgments, as please double check if it is correct.\n")"
- MSG+="$(TEXT "If you want to remove it, please go to the \"Update Menu\" -> \"Update modules\" to forcibly update the modules. All imports will be reset.\n")"
- MSG+="$(TEXT "Do you want to continue?")"
- DIALOG --title "$(TEXT "Modules")" \
- --yesno "${MSG}" 0 0
- [ $? -ne 0 ] && continue
- DIALOG --title "$(TEXT "Modules")" \
- --msgbox "$(TEXT "Please upload the *.ko file.")" 0 0
- TMP_UP_PATH="${TMP_PATH}/users"
- rm -rf "${TMP_UP_PATH}"
- mkdir -p "${TMP_UP_PATH}"
- (cd "${TMP_UP_PATH}" && rz -be) || true
- USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
- if [ -n "${USER_FILE}" ] && [ "${USER_FILE##*.}" = "ko" ]; then
- addToModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" "${USER_FILE}"
- [ -f "${MODULES_PATH}/VERSION" ] && rm -f "${MODULES_PATH}/VERSION"
- DIALOG --title "$(TEXT "Modules")" \
- --msgbox "$(printf "$(TEXT "Module '%s' added to %s-%s")" "$(basename "${USER_FILE}" .ko)" "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")" 0 0
- rm -rf "${TMP_UP_PATH}"
- touch "${PART1_PATH}/.build"
- else
- DIALOG --title "$(TEXT "Modules")" \
- --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
- rm -rf "${TMP_UP_PATH}"
- fi
- ;;
- i)
- DEPS="$(getdepends "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" i915)"
- DELS=()
- while IFS=': ' read -r KEY VALUE; do
- [ -z "${KEY}" ] && continue
- if echo "${DEPS}" | grep -wq "${KEY}"; then
- DELS+=("${KEY}")
- fi
- done <<<"$(readConfigMap "modules" "${USER_CONFIG_FILE}")"
- if [ ${#DELS[@]} -eq 0 ]; then
- DIALOG --title "$(TEXT "Modules")" \
- --msgbox "$(TEXT "No i915 with dependencies module to deselect.")" 0 0
- else
- for ID in "${DELS[@]}"; do
- deleteConfigKey "modules.\"${ID}\"" "${USER_CONFIG_FILE}"
+ s)
+ while true; do
+ DIALOG --title "$(TEXT "Modules")" \
+ --infobox "$(TEXT "Reading modules ...")" 0 0
+ ALLMODULES=$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")
+ unset USERMODULES
+ declare -A USERMODULES
+ while IFS=': ' read -r KEY VALUE; do
+ [ -n "${KEY}" ] && USERMODULES["${KEY}"]="${VALUE}"
+ done <<<"$(readConfigMap "modules" "${USER_CONFIG_FILE}")"
+ rm -f "${TMP_PATH}/opts"
+ while read -r ID DESC; do
+ arrayExistItem "${ID}" "${!USERMODULES[@]}" && ACT="on" || ACT="off"
+ echo "${ID} ${DESC} ${ACT}" >>"${TMP_PATH}/opts"
+ done <<<${ALLMODULES}
+ DIALOG --title "$(TEXT "Modules")" \
+ --extra-button --extra-label "$(TEXT "Select all")" \
+ --help-button --help-label "$(TEXT "Deselect all")" \
+ --checklist "$(TEXT "Select modules to include")" 0 0 0 --file "${TMP_PATH}/opts" \
+ 2>"${TMP_PATH}/resp"
+ RET=$?
+ case ${RET} in
+ 0)
+ # ok-button
+ writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
+ mergeConfigModules "$(cat "${TMP_PATH}/resp" 2>/dev/null)" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ break
+ ;;
+ 3)
+ # extra-button
+ writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
+ mergeConfigModules "$(echo "${ALLMODULES}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ ;;
+ 2)
+ # help-button
+ writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
+ esac
done
+ ;;
+ l)
DIALOG --title "$(TEXT "Modules")" \
- --msgbox "$(printf "$(TEXT "Module %s deselected.")\n" "${DELS[@]}")" 0 0
- fi
- touch "${PART1_PATH}/.build"
- ;;
- p)
- [ "${ODP}" = "false" ] && ODP='true' || ODP='false'
- writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- ;;
- f)
- if [ -f ${USER_UP_PATH}/modulelist ]; then
- cp -f "${USER_UP_PATH}/modulelist" "${TMP_PATH}/modulelist.tmp"
- else
- cp -f "${WORK_PATH}/patch/modulelist" "${TMP_PATH}/modulelist.tmp"
- fi
- while true; do
- DIALOG --title "$(TEXT "Edit with caution")" \
- --editbox "${TMP_PATH}/modulelist.tmp" 0 0 2>"${TMP_PATH}/modulelist.user"
- [ $? -ne 0 ] && break
- [ ! -d "${USER_UP_PATH}" ] && mkdir -p "${USER_UP_PATH}"
- mv -f "${TMP_PATH}/modulelist.user" "${USER_UP_PATH}/modulelist"
- dos2unix "${USER_UP_PATH}/modulelist" >/dev/null 2>&1 || true
+ --infobox "$(TEXT "Selecting loaded modules")" 0 0
+ writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
+ while read -r J; do
+ writeConfigKey "modules.\"${J}\"" "" "${USER_CONFIG_FILE}"
+ done <<<"$(getLoadedModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")"
touch "${PART1_PATH}/.build"
- break
- done
- ;;
- b)
- # modprobe.blacklist
- MSG=""
- MSG+="$(TEXT "The blacklist is used to prevent the kernel from loading specific modules.\n")"
- MSG+="$(TEXT "The blacklist is a list of module names separated by ','.\n")"
- MSG+="$(TEXT "For example: \Z4evbug,cdc_ether\Zn\n")"
- while true; do
- modblacklist="$(readConfigKey "modblacklist" "${USER_CONFIG_FILE}")"
- DIALOG --title "$(TEXT "Modules")" \
- --inputbox "${MSG}" 12 70 "${modblacklist}" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && break
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && break
- VALUE="${resp}"
- if echo "${VALUE}" | grep -q " "; then
- DIALOG --title "$(TEXT "Cmdline")" \
- --yesno "$(TEXT "Invalid list, No spaces should appear, retry?")" 0 0
- [ $? -eq 0 ] && continue || break
+ ;;
+ u)
+ 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+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).")"
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "${MSG}" 0 0
+ return 1
fi
- writeConfigKey "modblacklist" "${VALUE}" "${USER_CONFIG_FILE}"
+ MSG=""
+ MSG+="$(TEXT "This function is experimental and dangerous. If you don't know much, please exit.\n")"
+ MSG+="$(TEXT "The imported .ko of this function will be implanted into the corresponding arch's modules package, which will affect all models of the arch.\n")"
+ MSG+="$(TEXT "This program will not determine the availability of imported modules or even make type judgments, as please double check if it is correct.\n")"
+ MSG+="$(TEXT "If you want to remove it, please go to the \"Update Menu\" -> \"Update modules\" to forcibly update the modules. All imports will be reset.\n")"
+ MSG+="$(TEXT "Do you want to continue?")"
+ DIALOG --title "$(TEXT "Modules")" \
+ --yesno "${MSG}" 0 0
+ [ $? -ne 0 ] && continue
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "$(TEXT "Please upload the *.ko file.")" 0 0
+ TMP_UP_PATH="${TMP_PATH}/users"
+ rm -rf "${TMP_UP_PATH}"
+ mkdir -p "${TMP_UP_PATH}"
+ (cd "${TMP_UP_PATH}" && rz -be) || true
+ USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
+ if [ -n "${USER_FILE}" ] && [ "${USER_FILE##*.}" = "ko" ]; then
+ addToModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" "${USER_FILE}"
+ [ -f "${MODULES_PATH}/VERSION" ] && rm -f "${MODULES_PATH}/VERSION"
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "$(printf "$(TEXT "Module '%s' added to %s-%s")" "$(basename "${USER_FILE}" .ko)" "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}")" 0 0
+ rm -rf "${TMP_UP_PATH}"
+ touch "${PART1_PATH}/.build"
+ else
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
+ rm -rf "${TMP_UP_PATH}"
+ fi
+ ;;
+ i)
+ DEPS="$(getdepends "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" i915)"
+ DELS=()
+ while IFS=': ' read -r KEY VALUE; do
+ [ -z "${KEY}" ] && continue
+ if echo "${DEPS}" | grep -wq "${KEY}"; then
+ DELS+=("${KEY}")
+ fi
+ done <<<"$(readConfigMap "modules" "${USER_CONFIG_FILE}")"
+ if [ ${#DELS[@]} -eq 0 ]; then
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "$(TEXT "No i915 with dependencies module to deselect.")" 0 0
+ else
+ for ID in "${DELS[@]}"; do
+ deleteConfigKey "modules.\"${ID}\"" "${USER_CONFIG_FILE}"
+ done
+ DIALOG --title "$(TEXT "Modules")" \
+ --msgbox "$(printf "$(TEXT "Module %s deselected.")\n" "${DELS[@]}")" 0 0
+ fi
+ touch "${PART1_PATH}/.build"
+ ;;
+ p)
+ [ "${ODP}" = "false" ] && ODP='true' || ODP='false'
+ writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ ;;
+ f)
+ if [ -f ${USER_UP_PATH}/modulelist ]; then
+ cp -f "${USER_UP_PATH}/modulelist" "${TMP_PATH}/modulelist.tmp"
+ else
+ cp -f "${WORK_PATH}/patch/modulelist" "${TMP_PATH}/modulelist.tmp"
+ fi
+ while true; do
+ DIALOG --title "$(TEXT "Edit with caution")" \
+ --editbox "${TMP_PATH}/modulelist.tmp" 0 0 2>"${TMP_PATH}/modulelist.user"
+ [ $? -ne 0 ] && break
+ [ ! -d "${USER_UP_PATH}" ] && mkdir -p "${USER_UP_PATH}"
+ mv -f "${TMP_PATH}/modulelist.user" "${USER_UP_PATH}/modulelist"
+ dos2unix "${USER_UP_PATH}/modulelist" >/dev/null 2>&1 || true
+ touch "${PART1_PATH}/.build"
+ break
+ done
+ ;;
+ b)
+ # modprobe.blacklist
+ MSG=""
+ MSG+="$(TEXT "The blacklist is used to prevent the kernel from loading specific modules.\n")"
+ MSG+="$(TEXT "The blacklist is a list of module names separated by ','.\n")"
+ MSG+="$(TEXT "For example: \Z4evbug,cdc_ether\Zn\n")"
+ while true; do
+ modblacklist="$(readConfigKey "modblacklist" "${USER_CONFIG_FILE}")"
+ DIALOG --title "$(TEXT "Modules")" \
+ --inputbox "${MSG}" 12 70 "${modblacklist}" \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && break
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && break
+ VALUE="${resp}"
+ if echo "${VALUE}" | grep -q " "; then
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --yesno "$(TEXT "Invalid list, No spaces should appear, retry?")" 0 0
+ [ $? -eq 0 ] && continue || break
+ fi
+ writeConfigKey "modblacklist" "${VALUE}" "${USER_CONFIG_FILE}"
+ break
+ done
+ ;;
+ e)
break
- done
- ;;
- e)
- break
- ;;
+ ;;
esac
done
}
@@ -1011,157 +1011,157 @@ function cmdlineMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && return
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- a)
- MSG=""
- MSG+="$(TEXT "Commonly used cmdlines:\n")"
- MSG+="$(TEXT " * \Z4SpectreAll_on=\Zn\n Enable Spectre and Meltdown protection to mitigate the threat of speculative execution vulnerability.\n")"
- MSG+="$(TEXT " * \Z4disable_mtrr_trim=\Zn\n disables kernel trim any uncacheable memory out.\n")"
- MSG+="$(TEXT " * \Z4intel_idle.max_cstate=1\Zn\n Set the maximum C-state depth allowed by the intel_idle driver.\n")"
- MSG+="$(TEXT " * \Z4pcie_port_pm=off\Zn\n Turn off the power management of the PCIe port.\n")"
- MSG+="$(TEXT " * \Z4libata.force=noncq\Zn\n Disable NCQ for all SATA ports.\n")"
- MSG+="$(TEXT " * \Z4SataPortMap=??\Zn\n Sata Port Map(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4DiskIdxMap=??\Zn\n Disk Index Map, Modify disk name sequence(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4ahci_remap=4>5:5>8:12>16\Zn\n Remap data port sequence(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4scsi_mod.scan=sync\Zn\n Synchronize scanning of devices on the SCSI bus during system startup(Resolve the disorderly order of HBA disks).\n")"
- MSG+="$(TEXT " * \Z4i915.enable_guc=2\Zn\n Enable the GuC firmware on Intel graphics hardware.(value: 1,2 or 3)\n")"
- MSG+="$(TEXT " * \Z4i915.max_vfs=7\Zn\n Set the maximum number of virtual functions (VFs) that can be created for Intel graphics hardware.\n")"
- MSG+="$(TEXT " * \Z4i915.modeset=0\Zn\n Disable the kernel mode setting (KMS) feature of the i915 driver.\n")"
- MSG+="$(TEXT " * \Z4apparmor.mode=complain\Zn\n Set the AppArmor security module to complain mode.\n")"
- MSG+="$(TEXT " * \Z4acpi_enforce_resources=lax\Zn\n Resolve the issue of some devices (such as fan controllers) not recognizing or using properly.\n")"
- MSG+="$(TEXT " * \Z4pci=nommconf\Zn\n Disable the use of Memory-Mapped Configuration for PCI devices(use this parameter cautiously).\n")"
- MSG+="$(TEXT " * \Z4consoleblank=300\Zn\n Set the console to auto turnoff display 300 seconds after no activity (measured in seconds).\n")"
- MSG+="$(TEXT "Please enter the parameter key and value you need to add.\n")"
+ a)
+ MSG=""
+ MSG+="$(TEXT "Commonly used cmdlines:\n")"
+ MSG+="$(TEXT " * \Z4SpectreAll_on=\Zn\n Enable Spectre and Meltdown protection to mitigate the threat of speculative execution vulnerability.\n")"
+ MSG+="$(TEXT " * \Z4disable_mtrr_trim=\Zn\n disables kernel trim any uncacheable memory out.\n")"
+ MSG+="$(TEXT " * \Z4intel_idle.max_cstate=1\Zn\n Set the maximum C-state depth allowed by the intel_idle driver.\n")"
+ MSG+="$(TEXT " * \Z4pcie_port_pm=off\Zn\n Turn off the power management of the PCIe port.\n")"
+ MSG+="$(TEXT " * \Z4libata.force=noncq\Zn\n Disable NCQ for all SATA ports.\n")"
+ MSG+="$(TEXT " * \Z4SataPortMap=??\Zn\n Sata Port Map(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4DiskIdxMap=??\Zn\n Disk Index Map, Modify disk name sequence(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4ahci_remap=4>5:5>8:12>16\Zn\n Remap data port sequence(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4scsi_mod.scan=sync\Zn\n Synchronize scanning of devices on the SCSI bus during system startup(Resolve the disorderly order of HBA disks).\n")"
+ MSG+="$(TEXT " * \Z4i915.enable_guc=2\Zn\n Enable the GuC firmware on Intel graphics hardware.(value: 1,2 or 3)\n")"
+ MSG+="$(TEXT " * \Z4i915.max_vfs=7\Zn\n Set the maximum number of virtual functions (VFs) that can be created for Intel graphics hardware.\n")"
+ MSG+="$(TEXT " * \Z4i915.modeset=0\Zn\n Disable the kernel mode setting (KMS) feature of the i915 driver.\n")"
+ MSG+="$(TEXT " * \Z4apparmor.mode=complain\Zn\n Set the AppArmor security module to complain mode.\n")"
+ MSG+="$(TEXT " * \Z4acpi_enforce_resources=lax\Zn\n Resolve the issue of some devices (such as fan controllers) not recognizing or using properly.\n")"
+ MSG+="$(TEXT " * \Z4pci=nommconf\Zn\n Disable the use of Memory-Mapped Configuration for PCI devices(use this parameter cautiously).\n")"
+ MSG+="$(TEXT " * \Z4consoleblank=300\Zn\n Set the console to auto turnoff display 300 seconds after no activity (measured in seconds).\n")"
+ MSG+="$(TEXT "Please enter the parameter key and value you need to add.\n")"
- LINENUM=0
- while read -r L; do LINENUM=$((LINENUM + 1 + ${#L} / 96)); done <<<"$(printf "${MSG}")" # When the width is 100, each line displays 96 characters.
- LINENUM=$((${LINENUM:-0} + 9)) # When there are 2 parameters, 9 is the minimum value to include 1 line of MSG.
+ LINENUM=0
+ while read -r L; do LINENUM=$((LINENUM + 1 + ${#L} / 96)); done <<<"$(printf "${MSG}")" # When the width is 100, each line displays 96 characters.
+ LINENUM=$((${LINENUM:-0} + 9)) # When there are 2 parameters, 9 is the minimum value to include 1 line of MSG.
- DIALOG_MAXX=$(ttysize 2>/dev/null | awk '{print $1}')
- DIALOG_MAXY=$(ttysize 2>/dev/null | awk '{print $2}')
- if [ ${LINENUM:-0} -ge ${DIALOG_MAXY:-0} ]; then
- MSG="$(TEXT "Please enter the parameter key and value you need to add.\n")"
- LINENUM=9
- fi
+ DIALOG_MAXX=$(ttysize 2>/dev/null | awk '{print $1}')
+ DIALOG_MAXY=$(ttysize 2>/dev/null | awk '{print $2}')
+ if [ ${LINENUM:-0} -ge ${DIALOG_MAXY:-0} ]; then
+ MSG="$(TEXT "Please enter the parameter key and value you need to add.\n")"
+ LINENUM=9
+ fi
- while true; do
+ while true; do
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --form "${MSG}" ${LINENUM:-9} 100 2 "Name:" 1 1 "" 1 10 85 0 "Value:" 2 1 "" 2 10 85 0 \
+ 2>"${TMP_PATH}/resp"
+ RET=$?
+ case ${RET} in
+ 0)
+ # ok-button
+ NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}"
+ [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}"
+ if [ -z "${NAME//\"/}" ]; then
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --yesno "$(TEXT "Invalid parameter name, retry?")" 0 0
+ [ $? -eq 0 ] && continue || break
+ fi
+ writeConfigKey "cmdline.\"${NAME//\"/}\"" "${VALUE}" "${USER_CONFIG_FILE}"
+ break
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
+ esac
+ done
+ ;;
+ d)
+ # Read cmdline from user config
+ unset CMDLINE
+ declare -A CMDLINE
+ while IFS=': ' read -r KEY VALUE; do
+ [ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
+ done <<<"$(readConfigMap "cmdline" "${USER_CONFIG_FILE}")"
+ if [ ${#CMDLINE[@]} -eq 0 ]; then
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --msgbox "$(TEXT "No user cmdline to remove")" 0 0
+ continue
+ fi
+ rm -f "${TMP_PATH}/opts"
+ for I in "${!CMDLINE[@]}"; do
+ echo "\"${I}\" \"${CMDLINE[${I}]}\" \"off\"" >>"${TMP_PATH}/opts"
+ done
DIALOG --title "$(TEXT "Cmdline")" \
- --form "${MSG}" ${LINENUM:-9} 100 2 "Name:" 1 1 "" 1 10 85 0 "Value:" 2 1 "" 2 10 85 0 \
+ --checklist "$(TEXT "Select cmdline to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
2>"${TMP_PATH}/resp"
- RET=$?
- case ${RET} in
- 0)
- # ok-button
- NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}"
- [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}"
- if [ -z "${NAME//\"/}" ]; then
- DIALOG --title "$(TEXT "Cmdline")" \
- --yesno "$(TEXT "Invalid parameter name, retry?")" 0 0
- [ $? -eq 0 ] && continue || break
- fi
- writeConfigKey "cmdline.\"${NAME//\"/}\"" "${VALUE}" "${USER_CONFIG_FILE}"
- break
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
- esac
- done
- ;;
- d)
- # Read cmdline from user config
- unset CMDLINE
- declare -A CMDLINE
- while IFS=': ' read -r KEY VALUE; do
- [ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
- done <<<"$(readConfigMap "cmdline" "${USER_CONFIG_FILE}")"
- if [ ${#CMDLINE[@]} -eq 0 ]; then
- DIALOG --title "$(TEXT "Cmdline")" \
- --msgbox "$(TEXT "No user cmdline to remove")" 0 0
- continue
- fi
- rm -f "${TMP_PATH}/opts"
- for I in "${!CMDLINE[@]}"; do
- echo "\"${I}\" \"${CMDLINE[${I}]}\" \"off\"" >>"${TMP_PATH}/opts"
- done
- DIALOG --title "$(TEXT "Cmdline")" \
- --checklist "$(TEXT "Select cmdline to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- for I in ${resp}; do
- unset "CMDLINE[${I}]"
- deleteConfigKey "cmdline.\"${I}\"" "${USER_CONFIG_FILE}"
- done
- ;;
- s)
- MSG="$(TEXT "Note: (MAC will not be set to NIC, Only for activation services.)")"
- sn="${SN}"
- mac1="${MAC1}"
- mac2="${MAC2}"
- while true; do
- DIALOG --title "$(TEXT "Cmdline")" \
- --extra-button --extra-label "$(TEXT "Random")" \
- --form "${MSG}" 11 70 3 "sn" 1 1 "${sn}" 1 5 60 0 "mac1" 2 1 "${mac1}" 2 5 60 0 "mac2" 3 1 "${mac2}" 3 5 60 0 \
- 2>"${TMP_PATH}/resp"
- RET=$?
- case ${RET} in
- 0)
- # ok-button
- sn="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/.*/\U&/')"
- mac1="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/[:-]//g' | sed 's/.*/\U&/')"
- mac2="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/[:-]//g' | sed 's/.*/\U&/')"
- if [ -z "${sn}" ] || [ -z "${mac1}" ]; then
- DIALOG --title "$(TEXT "Cmdline")" \
- --yesno "$(TEXT "Invalid SN/MAC, retry?")" 0 0
- [ $? -eq 0 ] && continue || break
- fi
- SN="${sn}"
- writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
- MAC1="${mac1}"
- writeConfigKey "mac1" "${MAC1}" "${USER_CONFIG_FILE}"
- MAC2="${mac2}"
- writeConfigKey "mac2" "${MAC2}" "${USER_CONFIG_FILE}"
- break
- ;;
- 3)
- # extra-button
- sn=$(generateSerial "${MODEL}")
- NETIF_NUM=2
- MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
- for I in $(seq 1 ${NETIF_NUM}); do
- eval mac${I}="$(echo ${MACS} | cut -d' ' -f${I})"
- done
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
- esac
- done
- ;;
- # m)
- # ITEMS=""
- # while IFS=': ' read -r KEY VALUE; do
- # ITEMS+="${KEY}: ${VALUE}\n"
- # done <<<$(readConfigMap "platforms.${PLATFORM}.cmdline" "${WORK_PATH}/platforms.yml")
- # DIALOG --title "$(TEXT "Cmdline")" \
- # --msgbox "${ITEMS}" 0 0
- # ;;
- e)
- return 0
- ;;
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ for I in ${resp}; do
+ unset "CMDLINE[${I}]"
+ deleteConfigKey "cmdline.\"${I}\"" "${USER_CONFIG_FILE}"
+ done
+ ;;
+ s)
+ MSG="$(TEXT "Note: (MAC will not be set to NIC, Only for activation services.)")"
+ sn="${SN}"
+ mac1="${MAC1}"
+ mac2="${MAC2}"
+ while true; do
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --extra-button --extra-label "$(TEXT "Random")" \
+ --form "${MSG}" 11 70 3 "sn" 1 1 "${sn}" 1 5 60 0 "mac1" 2 1 "${mac1}" 2 5 60 0 "mac2" 3 1 "${mac2}" 3 5 60 0 \
+ 2>"${TMP_PATH}/resp"
+ RET=$?
+ case ${RET} in
+ 0)
+ # ok-button
+ sn="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/.*/\U&/')"
+ mac1="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/[:-]//g' | sed 's/.*/\U&/')"
+ mac2="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null | sed 's/[:-]//g' | sed 's/.*/\U&/')"
+ if [ -z "${sn}" ] || [ -z "${mac1}" ]; then
+ DIALOG --title "$(TEXT "Cmdline")" \
+ --yesno "$(TEXT "Invalid SN/MAC, retry?")" 0 0
+ [ $? -eq 0 ] && continue || break
+ fi
+ SN="${sn}"
+ writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
+ MAC1="${mac1}"
+ writeConfigKey "mac1" "${MAC1}" "${USER_CONFIG_FILE}"
+ MAC2="${mac2}"
+ writeConfigKey "mac2" "${MAC2}" "${USER_CONFIG_FILE}"
+ break
+ ;;
+ 3)
+ # extra-button
+ sn=$(generateSerial "${MODEL}")
+ NETIF_NUM=2
+ MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
+ for I in $(seq 1 ${NETIF_NUM}); do
+ eval mac${I}="$(echo ${MACS} | cut -d' ' -f${I})"
+ done
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
+ esac
+ done
+ ;;
+ # m)
+ # ITEMS=""
+ # while IFS=': ' read -r KEY VALUE; do
+ # ITEMS+="${KEY}: ${VALUE}\n"
+ # done <<<$(readConfigMap "platforms.${PLATFORM}.cmdline" "${WORK_PATH}/platforms.yml")
+ # DIALOG --title "$(TEXT "Cmdline")" \
+ # --msgbox "${ITEMS}" 0 0
+ # ;;
+ e)
+ return 0
+ ;;
esac
done
}
@@ -1181,91 +1181,91 @@ function synoinfoMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && return
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- a)
- MSG=""
- MSG+="$(TEXT "Commonly used synoinfo:\n")"
- MSG+="$(TEXT " * \Z4support_apparmor=no\Zn\n Disable apparmor.\n")"
- MSG+="$(TEXT " * \Z4maxdisks=??\Zn\n Maximum number of disks supported.\n")"
- MSG+="$(TEXT " * \Z4internalportcfg=0x????\Zn\n Internal(sata) disks mask(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4esataportcfg=0x????\Zn\n Esata disks mask(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4usbportcfg=0x????\Zn\n USB disks mask(Not apply to DT models).\n")"
- MSG+="$(TEXT " * \Z4max_sys_raid_disks=12\Zn\n Maximum number of system partition(md0) raid disks.\n")"
- MSG+="$(TEXT "Please enter the parameter key and value you need to add.\n")"
+ a)
+ MSG=""
+ MSG+="$(TEXT "Commonly used synoinfo:\n")"
+ MSG+="$(TEXT " * \Z4support_apparmor=no\Zn\n Disable apparmor.\n")"
+ MSG+="$(TEXT " * \Z4maxdisks=??\Zn\n Maximum number of disks supported.\n")"
+ MSG+="$(TEXT " * \Z4internalportcfg=0x????\Zn\n Internal(sata) disks mask(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4esataportcfg=0x????\Zn\n Esata disks mask(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4usbportcfg=0x????\Zn\n USB disks mask(Not apply to DT models).\n")"
+ MSG+="$(TEXT " * \Z4max_sys_raid_disks=12\Zn\n Maximum number of system partition(md0) raid disks.\n")"
+ MSG+="$(TEXT "Please enter the parameter key and value you need to add.\n")"
- LINENUM=0
- while read -r line; do LINENUM=$((LINENUM + 1 + ${#line} / 96)); done <<<"$(printf "${MSG}")" # When the width is 100, each line displays 96 characters.
- LINENUM=$((${LINENUM:-0} + 9)) # When there are 2 parameters, 9 is the minimum value to include 1 line of MSG.
+ LINENUM=0
+ while read -r line; do LINENUM=$((LINENUM + 1 + ${#line} / 96)); done <<<"$(printf "${MSG}")" # When the width is 100, each line displays 96 characters.
+ LINENUM=$((${LINENUM:-0} + 9)) # When there are 2 parameters, 9 is the minimum value to include 1 line of MSG.
- DIALOG_MAXX=$(ttysize 2>/dev/null | awk '{print $1}')
- DIALOG_MAXY=$(ttysize 2>/dev/null | awk '{print $2}')
- if [ ${LINENUM:-0} -ge ${DIALOG_MAXY:-0} ]; then
- MSG="$(TEXT "Please enter the parameter key and value you need to add.\n")"
- LINENUM=9
- fi
+ DIALOG_MAXX=$(ttysize 2>/dev/null | awk '{print $1}')
+ DIALOG_MAXY=$(ttysize 2>/dev/null | awk '{print $2}')
+ if [ ${LINENUM:-0} -ge ${DIALOG_MAXY:-0} ]; then
+ MSG="$(TEXT "Please enter the parameter key and value you need to add.\n")"
+ LINENUM=9
+ fi
- while true; do
+ while true; do
+ DIALOG --title "$(TEXT "Synoinfo")" \
+ --form "${MSG}" ${LINENUM:-9} 100 2 "Name:" 1 1 "" 1 10 85 0 "Value:" 2 1 "" 2 10 85 0 \
+ 2>"${TMP_PATH}/resp"
+ RET=$?
+ case ${RET} in
+ 0)
+ # ok-button
+ NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}"
+ [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}"
+ if [ -z "${NAME//\"/}" ]; then
+ DIALOG --title "$(TEXT "Synoinfo")" \
+ --yesno "$(TEXT "Invalid parameter name, retry?")" 0 0
+ [ $? -eq 0 ] && continue || break
+ fi
+ writeConfigKey "synoinfo.\"${NAME//\"/}\"" "${VALUE}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ break
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
+ esac
+ done
+ ;;
+ d)
+ # Read synoinfo from user config
+ unset SYNOINFO
+ declare -A SYNOINFO
+ while IFS=': ' read -r KEY VALUE; do
+ [ -n "${KEY}" ] && SYNOINFO["${KEY}"]="${VALUE}"
+ done <<<"$(readConfigMap "synoinfo" "${USER_CONFIG_FILE}")"
+ if [ ${#SYNOINFO[@]} -eq 0 ]; then
+ DIALOG --title "$(TEXT "Synoinfo")" \
+ --msgbox "$(TEXT "No synoinfo entries to remove")" 0 0
+ continue
+ fi
+ rm -f "${TMP_PATH}/opts"
+ for I in "${!SYNOINFO[@]}"; do
+ echo "\"${I}\" \"${SYNOINFO[${I}]}\" \"off\"" >>"${TMP_PATH}/opts"
+ done
DIALOG --title "$(TEXT "Synoinfo")" \
- --form "${MSG}" ${LINENUM:-9} 100 2 "Name:" 1 1 "" 1 10 85 0 "Value:" 2 1 "" 2 10 85 0 \
+ --checklist "$(TEXT "Select synoinfo entry to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
2>"${TMP_PATH}/resp"
- RET=$?
- case ${RET} in
- 0)
- # ok-button
- NAME="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- VALUE="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- [ "${NAME: -1}" = "=" ] && NAME="${NAME:0:-1}"
- [ "${VALUE:0:1}" = "=" ] && VALUE="${VALUE:1}"
- if [ -z "${NAME//\"/}" ]; then
- DIALOG --title "$(TEXT "Synoinfo")" \
- --yesno "$(TEXT "Invalid parameter name, retry?")" 0 0
- [ $? -eq 0 ] && continue || break
- fi
- writeConfigKey "synoinfo.\"${NAME//\"/}\"" "${VALUE}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- break
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
- esac
- done
- ;;
- d)
- # Read synoinfo from user config
- unset SYNOINFO
- declare -A SYNOINFO
- while IFS=': ' read -r KEY VALUE; do
- [ -n "${KEY}" ] && SYNOINFO["${KEY}"]="${VALUE}"
- done <<<"$(readConfigMap "synoinfo" "${USER_CONFIG_FILE}")"
- if [ ${#SYNOINFO[@]} -eq 0 ]; then
- DIALOG --title "$(TEXT "Synoinfo")" \
- --msgbox "$(TEXT "No synoinfo entries to remove")" 0 0
- continue
- fi
- rm -f "${TMP_PATH}/opts"
- for I in "${!SYNOINFO[@]}"; do
- echo "\"${I}\" \"${SYNOINFO[${I}]}\" \"off\"" >>"${TMP_PATH}/opts"
- done
- DIALOG --title "$(TEXT "Synoinfo")" \
- --checklist "$(TEXT "Select synoinfo entry to remove")" 0 0 0 --file "${TMP_PATH}/opts" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- for I in ${resp}; do
- unset "SYNOINFO[${I}]"
- deleteConfigKey "synoinfo.\"${I}\"" "${USER_CONFIG_FILE}"
- done
- touch "${PART1_PATH}/.build"
- ;;
- e)
- return 0
- ;;
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ for I in ${resp}; do
+ unset "SYNOINFO[${I}]"
+ deleteConfigKey "synoinfo.\"${I}\"" "${USER_CONFIG_FILE}"
+ done
+ touch "${PART1_PATH}/.build"
+ ;;
+ e)
+ return 0
+ ;;
esac
done
}
@@ -1329,22 +1329,22 @@ function extractPatFiles() {
header="$(od -bcN2 "${PAT_PATH}" | head -1 | awk '{print $3}')"
case ${header} in
- 105)
- echo "$(TEXT "Uncompressed tar")"
- isencrypted="no"
- ;;
- 213)
- echo "$(TEXT "Compressed tar")"
- isencrypted="no"
- ;;
- 255)
- echo "$(TEXT "Encrypted")"
- isencrypted="yes"
- ;;
- *)
- echo -e "$(TEXT "Could not determine if pat file is encrypted or not, maybe corrupted, try again!")" >"${LOG_FILE}"
- return 1
- ;;
+ 105)
+ echo "$(TEXT "Uncompressed tar")"
+ isencrypted="no"
+ ;;
+ 213)
+ echo "$(TEXT "Compressed tar")"
+ isencrypted="no"
+ ;;
+ 255)
+ echo "$(TEXT "Encrypted")"
+ isencrypted="yes"
+ ;;
+ *)
+ echo -e "$(TEXT "Could not determine if pat file is encrypted or not, maybe corrupted, try again!")" >"${LOG_FILE}"
+ return 1
+ ;;
esac
rm -rf "${EXT_PATH}"
@@ -1372,11 +1372,11 @@ function extractPatFiles() {
RET=$?
fi
- if [ ${RET} -ne 0 ] ||
- [ ! -f "${EXT_PATH}/grub_cksum.syno" ] ||
- [ ! -f "${EXT_PATH}/GRUB_VER" ] ||
- [ ! -f "${EXT_PATH}/zImage" ] ||
- [ ! -f "${EXT_PATH}/rd.gz" ]; then
+ if [ ${RET} -ne 0 ] \
+ || [ ! -f "${EXT_PATH}/grub_cksum.syno" ] \
+ || [ ! -f "${EXT_PATH}/GRUB_VER" ] \
+ || [ ! -f "${EXT_PATH}/zImage" ] \
+ || [ ! -f "${EXT_PATH}/rd.gz" ]; then
printf "%s\n%s: %d\n" "$(TEXT "pat Invalid, try again!")" "$(TEXT "Error")" "${RET}" >"${LOG_FILE}"
return 1
fi
@@ -1577,79 +1577,79 @@ function customDTS() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && return 1
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- u)
- 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+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
- MSG+="$(printf "$(TEXT "Or upload the dts file to %s via DUFS, Will be automatically imported when building.\n")" "${USER_UP_PATH}/model.dts")"
- DIALOG --title "$(TEXT "Custom DTS")" \
- --msgbox "${MSG}" 0 0
- return 1
- fi
- DIALOG --title "$(TEXT "Custom DTS")" \
- --msgbox "$(TEXT "Currently, only dts format files are supported. Please prepare and click to confirm uploading.\n(saved in /mnt/p3/users/)\n")" 0 0
- TMP_UP_PATH="${TMP_PATH}/users"
- rm -rf "${TMP_UP_PATH}"
- mkdir -p "${TMP_UP_PATH}"
- (cd "${TMP_UP_PATH}" && rz -be) || true
- USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
- DTC_ERRLOG="/tmp/dtc.log"
- [ -n "${USER_FILE}" ] && dtc -q -I dts -O dtb "${USER_FILE}" >"test.dtb" 2>"${DTC_ERRLOG}"
- RET=$?
- if [ -z "${USER_FILE}" ] || [ ${RET} -ne 0 ]; then
- MSG="$(printf "%s\n%s:\n%s\n" "$(TEXT "Not a valid dts file, please try again!")" "$(TEXT "Error")" "$(cat "${DTC_ERRLOG}")")"
- DIALOG --title "$(TEXT "Custom DTS")" \
- --msgbox "${MSG}" 0 0
- else
- [ -d "${USER_UP_PATH}" ] || mkdir -p "${USER_UP_PATH}"
- cp -f "${USER_FILE}" "${USER_UP_PATH}/model.dts"
- DIALOG --title "$(TEXT "Custom DTS")" \
- --msgbox "$(TEXT "A valid dts file, Automatically import at compile time.")" 0 0
- fi
- rm -f "${DTC_ERRLOG}"
- rm -rf "${TMP_UP_PATH}"
- touch "${PART1_PATH}/.build"
- ;;
- d)
- rm -f "${USER_UP_PATH}/model.dts"
- touch "${PART1_PATH}/.build"
- ;;
- i)
- 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="$(find "${PART2_PATH}" -type f -name "*.dtb" | head -1)"
- if [ -f "${ODTB}" ]; then
- dtc -q -I dtb -O dts "${ODTB}" >"${TMP_PATH}/model.dts"
- else
+ u)
+ 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+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
+ MSG+="$(printf "$(TEXT "Or upload the dts file to %s via DUFS, Will be automatically imported when building.\n")" "${USER_UP_PATH}/model.dts")"
DIALOG --title "$(TEXT "Custom DTS")" \
- --msgbox "$(TEXT "No dts file to edit. Please upload first!")" 0 0
- continue
+ --msgbox "${MSG}" 0 0
+ return 1
fi
- fi
- DTC_ERRLOG="/tmp/dtc.log"
- while true; do
- DIALOG --title "$(TEXT "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 1
- dtc -q -I dts -O dtb "${TMP_PATH}/modelEdit.dts" >"test.dtb" 2>"${DTC_ERRLOG}"
- if [ $? -ne 0 ]; then
+ DIALOG --title "$(TEXT "Custom DTS")" \
+ --msgbox "$(TEXT "Currently, only dts format files are supported. Please prepare and click to confirm uploading.\n(saved in /mnt/p3/users/)\n")" 0 0
+ TMP_UP_PATH="${TMP_PATH}/users"
+ rm -rf "${TMP_UP_PATH}"
+ mkdir -p "${TMP_UP_PATH}"
+ (cd "${TMP_UP_PATH}" && rz -be) || true
+ USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
+ DTC_ERRLOG="/tmp/dtc.log"
+ [ -n "${USER_FILE}" ] && dtc -q -I dts -O dtb "${USER_FILE}" >"test.dtb" 2>"${DTC_ERRLOG}"
+ RET=$?
+ if [ -z "${USER_FILE}" ] || [ ${RET} -ne 0 ]; then
MSG="$(printf "%s\n%s:\n%s\n" "$(TEXT "Not a valid dts file, please try again!")" "$(TEXT "Error")" "$(cat "${DTC_ERRLOG}")")"
DIALOG --title "$(TEXT "Custom DTS")" \
--msgbox "${MSG}" 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"
- touch "${PART1_PATH}/.build"
- break
+ [ -d "${USER_UP_PATH}" ] || mkdir -p "${USER_UP_PATH}"
+ cp -f "${USER_FILE}" "${USER_UP_PATH}/model.dts"
+ DIALOG --title "$(TEXT "Custom DTS")" \
+ --msgbox "$(TEXT "A valid dts file, Automatically import at compile time.")" 0 0
fi
- done
- ;;
- e)
- return 0
- ;;
+ rm -f "${DTC_ERRLOG}"
+ rm -rf "${TMP_UP_PATH}"
+ touch "${PART1_PATH}/.build"
+ ;;
+ d)
+ rm -f "${USER_UP_PATH}/model.dts"
+ touch "${PART1_PATH}/.build"
+ ;;
+ i)
+ 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="$(find "${PART2_PATH}" -type f -name "*.dtb" | head -1)"
+ if [ -f "${ODTB}" ]; then
+ dtc -q -I dtb -O dts "${ODTB}" >"${TMP_PATH}/model.dts"
+ else
+ DIALOG --title "$(TEXT "Custom DTS")" \
+ --msgbox "$(TEXT "No dts file to edit. Please upload first!")" 0 0
+ continue
+ fi
+ fi
+ DTC_ERRLOG="/tmp/dtc.log"
+ while true; do
+ DIALOG --title "$(TEXT "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 1
+ dtc -q -I dts -O dtb "${TMP_PATH}/modelEdit.dts" >"test.dtb" 2>"${DTC_ERRLOG}"
+ if [ $? -ne 0 ]; then
+ MSG="$(printf "%s\n%s:\n%s\n" "$(TEXT "Not a valid dts file, please try again!")" "$(TEXT "Error")" "$(cat "${DTC_ERRLOG}")")"
+ DIALOG --title "$(TEXT "Custom DTS")" \
+ --msgbox "${MSG}" 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"
+ touch "${PART1_PATH}/.build"
+ break
+ fi
+ done
+ ;;
+ e)
+ return 0
+ ;;
esac
done
}
@@ -1674,7 +1674,7 @@ function showDisksInfo() {
else
MSG+="$(printf "%02d" "${P}") "
fi
- NUMPORTS=$((${NUMPORTS} + 1))
+ NUMPORTS=$((NUMPORTS + 1))
done
MSG+="\n"
done
@@ -1685,7 +1685,7 @@ function showDisksInfo() {
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(lspci -d ::107 2>/dev/null | wc -l)" -gt 0 ] && MSG+="\nSAS:\n"
for PCI in $(lspci -d ::107 2>/dev/null | awk '{print $1}'); do
@@ -1694,7 +1694,7 @@ function showDisksInfo() {
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(lspci -d ::100 2>/dev/null | wc -l)" -gt 0 ] && MSG+="\nSCSI:\n"
for PCI in $(lspci -d ::100 2>/dev/null | awk '{print $1}'); do
@@ -1702,7 +1702,7 @@ function showDisksInfo() {
PORTNUM=$(ls -l /sys/block/* 2>/dev/null | grep "${PCI}" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(lspci -d ::101 2>/dev/null | wc -l)" -gt 0 ] && MSG+="\nIDE:\n"
for PCI in $(lspci -d ::101 2>/dev/null | awk '{print $1}'); do
@@ -1710,7 +1710,7 @@ function showDisksInfo() {
PORTNUM=$(ls -l /sys/block/* 2>/dev/null | grep "${PCI}" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(ls -l /sys/class/scsi_host 2>/dev/null | grep usb | wc -l)" -gt 0 ] && MSG+="\nUSB:\n"
for PCI in $(lspci -d ::c03 2>/dev/null | awk '{print $1}'); do
@@ -1719,7 +1719,7 @@ function showDisksInfo() {
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(ls -l /sys/block/mmc* 2>/dev/null | wc -l)" -gt 0 ] && MSG+="\nMMC:\n"
for PCI in $(lspci -d ::805 2>/dev/null | awk '{print $1}'); do
@@ -1727,7 +1727,7 @@ function showDisksInfo() {
PORTNUM=$(ls -l /sys/block/mmc* 2>/dev/null | grep "${PCI}" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
[ "$(lspci -d ::108 2>/dev/null | wc -l)" -gt 0 ] && MSG+="\nNVME:\n"
for PCI in $(lspci -d ::108 2>/dev/null | awk '{print $1}'); do
@@ -1736,7 +1736,7 @@ function showDisksInfo() {
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[N:${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
done
if [ "$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep 'vmbus:acpi' | wc -l)" -gt 0 ]; then
MSG+="\nVMBUS:\n"
@@ -1744,7 +1744,7 @@ function showDisksInfo() {
PORTNUM=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep 'vmbus:acpi' | wc -l)
[ ${PORTNUM} -eq 0 ] || {
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
- NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
+ NUMPORTS=$((NUMPORTS + PORTNUM))
}
fi
MSG+="\n"
@@ -1891,9 +1891,9 @@ function allowDSMDowngrade() {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Removing ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(TEXT "Remove VERSION file for DSM system partition(md0) completed.")" ||
- MSG="$(TEXT "Remove VERSION file for DSM system partition(md0) failed.")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(TEXT "Remove VERSION file for DSM system partition(md0) completed.")" \
+ || MSG="$(TEXT "Remove VERSION file for DSM system partition(md0) failed.")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -1988,9 +1988,9 @@ function resetDSMPassword() {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Resetting ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(printf "$(TEXT "Reset password for user '%s' completed.")" "${USER}")" ||
- MSG="$(printf "$(TEXT "Reset password for user '%s' failed.")" "${USER}")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(printf "$(TEXT "Reset password for user '%s' completed.")" "${USER}")" \
+ || MSG="$(printf "$(TEXT "Reset password for user '%s' failed.")" "${USER}")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2033,9 +2033,9 @@ function addNewDSMUser() {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Adding ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(printf "$(TEXT "Add new user '%s' completed.")" "${username}")" ||
- MSG="$(printf "$(TEXT "Add new user '%s' failed.")" "${username}")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(printf "$(TEXT "Add new user '%s' completed.")" "${username}")" \
+ || MSG="$(printf "$(TEXT "Add new user '%s' failed.")" "${username}")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2071,9 +2071,9 @@ function forceEnableDSMTelnetSSH() {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Enabling ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(TEXT "Force enable Telnet&SSH of DSM system completed.")" ||
- MSG="$(TEXT "Force enable Telnet&SSH of DSM system failed.")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(TEXT "Force enable Telnet&SSH of DSM system completed.")" \
+ || MSG="$(TEXT "Force enable Telnet&SSH of DSM system failed.")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2110,9 +2110,9 @@ function removeBlockIPDB {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Removing ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(TEXT "Removing the blocked ip database completed.")" ||
- MSG="$(TEXT "Removing the blocked ip database failed.")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(TEXT "Removing the blocked ip database completed.")" \
+ || MSG="$(TEXT "Removing the blocked ip database failed.")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2145,9 +2145,9 @@ function disablescheduledTasks {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Enabling ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(TEXT "Disable all scheduled tasks of DSM completed.")" ||
- MSG="$(TEXT "Disable all scheduled tasks of DSM failed.")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(TEXT "Disable all scheduled tasks of DSM completed.")" \
+ || MSG="$(TEXT "Disable all scheduled tasks of DSM failed.")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2180,18 +2180,18 @@ function initDSMNetwork {
[ ! -e "${F}" ] && continue
ETHX=$(echo "${F}" | sed -E 's/.*ifcfg-(.*)$/\1/')
case "${ETHX}" in
- ovs_bond*)
- rm -f "${F}"
- ;;
- ovs_eth*)
- ovs-vsctl del-br ${ETHX}
- sed -i "/${ETHX##ovs_}/"d ${TMP_PATH}/mdX/usr/syno/etc/synoovs/ovs_interface.conf
- rm -f "${F}"
- ;;
- eth*)
- echo -e "DEVICE=${ETHX}\nONBOOT=yes\nBOOTPROTO=dhcp\nIPV6INIT=auto_dhcp\nIPV6_ACCEPT_RA=1" >"${F}"
- ;;
- *) ;;
+ ovs_bond*)
+ rm -f "${F}"
+ ;;
+ ovs_eth*)
+ ovs-vsctl del-br ${ETHX}
+ sed -i "/${ETHX##ovs_}/"d ${TMP_PATH}/mdX/usr/syno/etc/synoovs/ovs_interface.conf
+ rm -f "${F}"
+ ;;
+ eth*)
+ echo -e "DEVICE=${ETHX}\nONBOOT=yes\nBOOTPROTO=dhcp\nIPV6INIT=auto_dhcp\nIPV6_ACCEPT_RA=1" >"${F}"
+ ;;
+ *) ;;
esac
done
sed -i 's/_mtu=".*"$/_mtu="1500"/g' ${TMP_PATH}/mdX/etc/synoinfo.conf ${TMP_PATH}/mdX/etc.defaults/synoinfo.conf
@@ -2203,9 +2203,9 @@ function initDSMNetwork {
rm -rf "${TMP_PATH}/mdX"
) 2>&1 | DIALOG --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Recovering ...")" 20 100
- [ -f "${TMP_PATH}/isOk" ] &&
- MSG="$(TEXT "Initialize DSM network settings completed.")" ||
- MSG="$(TEXT "Initialize DSM network settings failed.")"
+ [ -f "${TMP_PATH}/isOk" ] \
+ && MSG="$(TEXT "Initialize DSM network settings completed.")" \
+ || MSG="$(TEXT "Initialize DSM network settings failed.")"
DIALOG --title "$(TEXT "Advanced")" \
--msgbox "${MSG}" 0 0
return 0
@@ -2287,28 +2287,28 @@ function notificationsMenu() {
2>"${TMP_PATH}/resp"
RET=$?
case ${RET} in
- 0)
- # ok-button
- WEBHOOKURL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- # NOTIFYTEXT="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- writeConfigKey "webhookurl" "${WEBHOOKURL}" "${USER_CONFIG_FILE}"
- # writeConfigKey "notifytext" "${NOTIFYTEXT}" "${USER_CONFIG_FILE}"
- break
- ;;
- 3)
- # extra-button
- WEBHOOKURL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- # NOTIFYTEXT="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- sendWebhook "${WEBHOOKURL}"
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
+ 0)
+ # ok-button
+ WEBHOOKURL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ # NOTIFYTEXT="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ writeConfigKey "webhookurl" "${WEBHOOKURL}" "${USER_CONFIG_FILE}"
+ # writeConfigKey "notifytext" "${NOTIFYTEXT}" "${USER_CONFIG_FILE}"
+ break
+ ;;
+ 3)
+ # extra-button
+ WEBHOOKURL="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ # NOTIFYTEXT="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ sendWebhook "${WEBHOOKURL}"
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
esac
done
}
@@ -2399,9 +2399,9 @@ function tryRecoveryDSM() {
PS="$(readConfigEntriesArray "platforms" "${WORK_PATH}/platforms.yml" | sort)"
VS="$(readConfigEntriesArray "platforms.${R_PLATFORM}.productvers" "${WORK_PATH}/platforms.yml" | sort -r)"
- if [ -n "${R_PLATFORM}" ] && arrayExistItem "${R_PLATFORM}" ${PS} &&
- [ -n "${R_PRODUCTVER}" ] && arrayExistItem "${R_PRODUCTVER}" ${VS} &&
- [ -n "${R_BUILDNUM}" ] && [ -n "${R_SMALLNUM}" ]; then
+ if [ -n "${R_PLATFORM}" ] && arrayExistItem "${R_PLATFORM}" ${PS} \
+ && [ -n "${R_PRODUCTVER}" ] && arrayExistItem "${R_PRODUCTVER}" ${VS} \
+ && [ -n "${R_BUILDNUM}" ] && [ -n "${R_SMALLNUM}" ]; then
cp -rf "${TMP_PATH}/mdX/usr/rr/backup/p1/"* "${PART1_PATH}"
if [ -d "${TMP_PATH}/mdX/usr/rr/backup/p3" ]; then
cp -rf "${TMP_PATH}/mdX/usr/rr/backup/p3/"* "${PART3_PATH}"
@@ -2707,14 +2707,14 @@ function savemodrr() {
INITRD_FORMAT=$(file -b --mime-type "${RR_RAMDISK_FILE}")
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMDISK_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *) ;;
esac
if [ -z "$(ls -A "$RDXZ_PATH")" ]; then
@@ -2728,14 +2728,14 @@ function savemodrr() {
RDSIZE=$(du -sb "${RDXZ_PATH}" 2>/dev/null | awk '{print $1}')
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMDISK_FILE}") >/dev/null 2>&1 ;;
+ *) ;;
esac
rm -rf "${RDXZ_PATH}"
@@ -2760,51 +2760,51 @@ function setStaticIP() {
2>"${TMP_PATH}/resp"
RET=$?
case ${RET} in
- 0)
- # ok-button
- address="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- netmask="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- gateway="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null)"
- dnsname="$(sed -n '4p' "${TMP_PATH}/resp" 2>/dev/null)"
- (
- if [ -z "${address}" ]; then
- if [ -n "$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" ]; then
+ 0)
+ # ok-button
+ address="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ netmask="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ gateway="$(sed -n '3p' "${TMP_PATH}/resp" 2>/dev/null)"
+ dnsname="$(sed -n '4p' "${TMP_PATH}/resp" 2>/dev/null)"
+ (
+ if [ -z "${address}" ]; then
+ if [ -n "$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")" ]; then
+ if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
+ ip addr flush dev ${N}
+ fi
+ deleteConfigKey "network.${MACR}" "${USER_CONFIG_FILE}"
+ IP="$(getIP)"
+ sleep 1
+ fi
+ else
if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
ip addr flush dev ${N}
+ ip addr add ${address}/${netmask:-"255.255.255.0"} dev ${N}
+ if [ -n "${gateway}" ]; then
+ ip route add default via ${gateway} dev ${N}
+ fi
+ if [ -n "${dnsname:-${gateway}}" ]; then
+ sed -i "/nameserver ${dnsname:-${gateway}}/d" /etc/resolv.conf
+ echo "nameserver ${dnsname:-${gateway}}" >>/etc/resolv.conf
+ fi
fi
- deleteConfigKey "network.${MACR}" "${USER_CONFIG_FILE}"
+ writeConfigKey "network.${MACR}" "${address}/${netmask}/${gateway}/${dnsname}" "${USER_CONFIG_FILE}"
IP="$(getIP)"
sleep 1
fi
- else
- if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
- ip addr flush dev ${N}
- ip addr add ${address}/${netmask:-"255.255.255.0"} dev ${N}
- if [ -n "${gateway}" ]; then
- ip route add default via ${gateway} dev ${N}
- fi
- if [ -n "${dnsname:-${gateway}}" ]; then
- sed -i "/nameserver ${dnsname:-${gateway}}/d" /etc/resolv.conf
- echo "nameserver ${dnsname:-${gateway}}" >>/etc/resolv.conf
- fi
- fi
- writeConfigKey "network.${MACR}" "${address}/${netmask}/${gateway}/${dnsname}" "${USER_CONFIG_FILE}"
- IP="$(getIP)"
- sleep 1
- fi
- touch "${PART1_PATH}/.build"
- ) 2>&1 | DIALOG --title "$(TEXT "Settings")" \
- --progressbox "$(TEXT "Setting ...")" 20 100
- break
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break 2
- ;;
+ touch "${PART1_PATH}/.build"
+ ) 2>&1 | DIALOG --title "$(TEXT "Settings")" \
+ --progressbox "$(TEXT "Setting ...")" 20 100
+ break
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break 2
+ ;;
esac
done
done
@@ -2827,42 +2827,42 @@ function setWirelessAccount() {
2>"${TMP_PATH}/resp"
RET=$?
case ${RET} in
- 0)
- # ok-button
- SSID="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- PSK="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- (
- ETHX=$(ls /sys/class/net/ 2>/dev/null | grep wlan) || true
- if [ -z "${SSID}" ]; then
- rm -f "${PART1_PATH}/wpa_supplicant.conf"
- for N in ${ETHX}; do
- connectwlanif "${N}" 0 && sleep 1
- done
- else
- echo -e "ctrl_interface=/var/run/wpa_supplicant\nupdate_config=1\nnetwork={\n ssid=\"${SSID}\"\n priority=1\n psk=\"${PSK}\"\n}" >"${PART1_PATH}/wpa_supplicant.conf"
- for N in ${ETHX}; do
- connectwlanif "${N}" 0 && sleep 1
- connectwlanif "${N}" 1 && sleep 1
- MACR="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g')"
- IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
- if [ -n "${IPR}" ]; then
- ip addr add ${IPC}/24 dev ${N}
- sleep 1
- fi
- done
- fi
- ) 2>&1 | DIALOG --title "$(TEXT "Settings")" \
- --progressbox "$(TEXT "Setting ...")" 20 100
- break
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
+ 0)
+ # ok-button
+ SSID="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ PSK="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ (
+ ETHX=$(ls /sys/class/net/ 2>/dev/null | grep wlan) || true
+ if [ -z "${SSID}" ]; then
+ rm -f "${PART1_PATH}/wpa_supplicant.conf"
+ for N in ${ETHX}; do
+ connectwlanif "${N}" 0 && sleep 1
+ done
+ else
+ echo -e "ctrl_interface=/var/run/wpa_supplicant\nupdate_config=1\nnetwork={\n ssid=\"${SSID}\"\n priority=1\n psk=\"${PSK}\"\n}" >"${PART1_PATH}/wpa_supplicant.conf"
+ for N in ${ETHX}; do
+ connectwlanif "${N}" 0 && sleep 1
+ connectwlanif "${N}" 1 && sleep 1
+ MACR="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g')"
+ IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
+ if [ -n "${IPR}" ]; then
+ ip addr add ${IPC}/24 dev ${N}
+ sleep 1
+ fi
+ done
+ fi
+ ) 2>&1 | DIALOG --title "$(TEXT "Settings")" \
+ --progressbox "$(TEXT "Setting ...")" 20 100
+ break
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
esac
done
return 0
@@ -2955,14 +2955,14 @@ function changePassword() {
if [ -f "${RR_RAMUSER_FILE}" ]; then
INITRD_FORMAT=$(file -b --mime-type "${RR_RAMUSER_FILE}")
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *) ;;
esac
else
INITRD_FORMAT="application/zstd"
@@ -2978,14 +2978,14 @@ function changePassword() {
if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then
# local RDSIZE=$(du -sb "${RDXZ_PATH}" 2>/dev/null | awk '{print $1}')
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *) ;;
esac
else
rm -f "${RR_RAMUSER_FILE}"
@@ -3014,99 +3014,99 @@ function changePorts() {
2>"${TMP_PATH}/resp"
RET=$?
case ${RET} in
- 0)
- # ok-button
- function check_port() {
- if [ -z "${1}" ]; then
- return 0
- else
- if echo "${1}" | grep -Eq '^[0-9]+$' && [ "${1}" -ge 0 ] && [ "${1}" -le 65535 ]; then
+ 0)
+ # ok-button
+ function check_port() {
+ if [ -z "${1}" ]; then
return 0
else
- return 1
+ if echo "${1}" | grep -Eq '^[0-9]+$' && [ "${1}" -ge 0 ] && [ "${1}" -le 65535 ]; then
+ return 0
+ else
+ return 1
+ fi
fi
+ }
+ 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)
+ local EP=""
+ for P in "${HTTP}" "${DUFS}" "${TTYD}"; do check_port "${P}" || EP="${EP} ${P}"; done
+ if [ -n "${EP}" ]; then
+ DIALOG --title "$(TEXT "Settings")" \
+ --yesno "$(printf "$(TEXT "Invalid %s port number, retry?")" "${EP}")" 0 0
+ [ $? -eq 0 ] && continue || break
fi
- }
- 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)
- local EP=""
- for P in "${HTTP}" "${DUFS}" "${TTYD}"; do check_port "${P}" || EP="${EP} ${P}"; done
- if [ -n "${EP}" ]; then
DIALOG --title "$(TEXT "Settings")" \
- --yesno "$(printf "$(TEXT "Invalid %s port number, retry?")" "${EP}")" 0 0
- [ $? -eq 0 ] && continue || break
- fi
- DIALOG --title "$(TEXT "Settings")" \
- --infobox "$(TEXT "Setting ...")" 20 100
- # save to rrorg.conf
- rm -f "/etc/rrorg.conf"
- [ ! "${HTTP:-7080}" = "7080" ] && echo "HTTP_PORT=${HTTP}" >>"/etc/rrorg.conf"
- [ ! "${DUFS:-7304}" = "7304" ] && echo "DUFS_PORT=${DUFS}" >>"/etc/rrorg.conf"
- [ ! "${TTYD:-7681}" = "7681" ] && echo "TTYD_PORT=${TTYD}" >>"/etc/rrorg.conf"
- # save to rru
- local RDXZ_PATH="${TMP_PATH}/rdxz_tmp"
- rm -rf "${RDXZ_PATH}"
- mkdir -p "${RDXZ_PATH}"
- local INITRD_FORMAT
- if [ -f "${RR_RAMUSER_FILE}" ]; then
- INITRD_FORMAT=$(file -b --mime-type "${RR_RAMUSER_FILE}")
- case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
- *) ;;
- esac
- else
- INITRD_FORMAT="application/zstd"
- fi
- if [ ! -f "/etc/rrorg.conf" ]; then
- rm -f "${RDXZ_PATH}/etc/rrorg.conf" 2>/dev/null
- else
- mkdir -p "${RDXZ_PATH}/etc"
- cp -pf /etc/rrorg.conf ${RDXZ_PATH}/etc
- fi
- if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then
- # local RDSIZE=$(du -sb "${RDXZ_PATH}" 2>/dev/null | awk '{print $1}')
- case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
- *) ;;
- esac
- else
- rm -f "${RR_RAMUSER_FILE}"
- fi
- rm -rf "${RDXZ_PATH}"
- [ ! -f "/etc/rrorg.conf" ] && MSG="$(TEXT "Ports for TTYD/DUFS/HTTP restored.")" || MSG="$(TEXT "Ports for TTYD/DUFS/HTTP changed.")"
- DIALOG --title "$(TEXT "Settings")" \
- --msgbox "${MSG}" 0 0
- rm -f "${TMP_PATH}/restartS.sh"
- {
- [ ! "${HTTP:-7080}" = "${HTTP_PORT:-7080}" ] && echo "/etc/init.d/S90thttpd restart"
- [ ! "${DUFS:-7304}" = "${DUFS_PORT:-7304}" ] && echo "/etc/init.d/S99dufs restart"
- [ ! "${TTYD:-7681}" = "${TTYD_PORT:-7681}" ] && echo "/etc/init.d/S99ttyd restart"
- } >"${TMP_PATH}/restartS.sh"
- chmod +x "${TMP_PATH}/restartS.sh"
- nohup "${TMP_PATH}/restartS.sh" >/dev/null 2>&1
- break
- ;;
- 1)
- # cancel-button
- break
- ;;
- 255)
- # ESC
- break
- ;;
+ --infobox "$(TEXT "Setting ...")" 20 100
+ # save to rrorg.conf
+ rm -f "/etc/rrorg.conf"
+ [ ! "${HTTP:-7080}" = "7080" ] && echo "HTTP_PORT=${HTTP}" >>"/etc/rrorg.conf"
+ [ ! "${DUFS:-7304}" = "7304" ] && echo "DUFS_PORT=${DUFS}" >>"/etc/rrorg.conf"
+ [ ! "${TTYD:-7681}" = "7681" ] && echo "TTYD_PORT=${TTYD}" >>"/etc/rrorg.conf"
+ # save to rru
+ local RDXZ_PATH="${TMP_PATH}/rdxz_tmp"
+ rm -rf "${RDXZ_PATH}"
+ mkdir -p "${RDXZ_PATH}"
+ local INITRD_FORMAT
+ if [ -f "${RR_RAMUSER_FILE}" ]; then
+ INITRD_FORMAT=$(file -b --mime-type "${RR_RAMUSER_FILE}")
+ case "${INITRD_FORMAT}" in
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && cpio -idm <"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${RR_RAMUSER_FILE}" | cpio -idm) >/dev/null 2>&1 ;;
+ *) ;;
+ esac
+ else
+ INITRD_FORMAT="application/zstd"
+ fi
+ if [ ! -f "/etc/rrorg.conf" ]; then
+ rm -f "${RDXZ_PATH}/etc/rrorg.conf" 2>/dev/null
+ else
+ mkdir -p "${RDXZ_PATH}/etc"
+ cp -pf /etc/rrorg.conf ${RDXZ_PATH}/etc
+ fi
+ if [ -n "$(ls -A "${RDXZ_PATH}" 2>/dev/null)" ] && [ -n "$(ls -A "${RDXZ_PATH}/etc" 2>/dev/null)" ]; then
+ # local RDSIZE=$(du -sb "${RDXZ_PATH}" 2>/dev/null | awk '{print $1}')
+ case "${INITRD_FORMAT}" in
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | lzma -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | bzip2 -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | gzip -9 -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${RR_RAMUSER_FILE}") >/dev/null 2>&1 ;;
+ *) ;;
+ esac
+ else
+ rm -f "${RR_RAMUSER_FILE}"
+ fi
+ rm -rf "${RDXZ_PATH}"
+ [ ! -f "/etc/rrorg.conf" ] && MSG="$(TEXT "Ports for TTYD/DUFS/HTTP restored.")" || MSG="$(TEXT "Ports for TTYD/DUFS/HTTP changed.")"
+ DIALOG --title "$(TEXT "Settings")" \
+ --msgbox "${MSG}" 0 0
+ rm -f "${TMP_PATH}/restartS.sh"
+ {
+ [ ! "${HTTP:-7080}" = "${HTTP_PORT:-7080}" ] && echo "/etc/init.d/S90thttpd restart"
+ [ ! "${DUFS:-7304}" = "${DUFS_PORT:-7304}" ] && echo "/etc/init.d/S99dufs restart"
+ [ ! "${TTYD:-7681}" = "${TTYD_PORT:-7681}" ] && echo "/etc/init.d/S99ttyd restart"
+ } >"${TMP_PATH}/restartS.sh"
+ chmod +x "${TMP_PATH}/restartS.sh"
+ nohup "${TMP_PATH}/restartS.sh" >/dev/null 2>&1
+ break
+ ;;
+ 1)
+ # cancel-button
+ break
+ ;;
+ 255)
+ # ESC
+ break
+ ;;
esac
done
return 0
@@ -3163,214 +3163,214 @@ function advancedMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && break
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- c)
- RD_COMPRESSED=$([ "${RD_COMPRESSED}" = "true" ] && echo 'false' || echo 'true')
- writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- NEXT="c"
- ;;
- l)
- LKM=$([ "${LKM}" = "dev" ] && echo 'prod' || ([ "${LKM}" = "test" ] && echo 'dev' || echo 'test'))
- writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- NEXT="l"
- ;;
- h)
- HDDSORT=$([ "${HDDSORT}" = "true" ] && echo 'false' || echo 'true')
- writeConfigKey "hddsort" "${HDDSORT}" "${USER_CONFIG_FILE}"
- touch "${PART1_PATH}/.build"
- NEXT="h"
- ;;
- p)
- PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
- PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
- MSG="$(TEXT "pat: (editable)")"
- DIALOG --title "$(TEXT "Advanced")" \
- --form "${MSG}" 10 110 2 "URL" 1 1 "${PATURL}" 1 5 100 0 "MD5" 2 1 "${PATSUM}" 2 5 100 0 \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- paturl="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
- patsum="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
- if [ ! "${paturl}" = "${PATURL}" ] || [ ! "${patsum}" = "${PATSUM}" ]; then
- writeConfigKey "paturl" "${paturl}" "${USER_CONFIG_FILE}"
- writeConfigKey "patsum" "${patsum}" "${USER_CONFIG_FILE}"
- rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
+ c)
+ RD_COMPRESSED=$([ "${RD_COMPRESSED}" = "true" ] && echo 'false' || echo 'true')
+ writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}"
touch "${PART1_PATH}/.build"
- fi
- NEXT="e"
- ;;
- m)
- rm -f "${TMP_PATH}/menu"
- {
- echo "1 \"Native SATA Disk(SYNO)\""
- echo "2 \"Fake SATA DOM(Redpill)\""
- } >"${TMP_PATH}/menu"
- DIALOG --title "$(TEXT "Advanced")" \
- --default-item "${SATADOM}" --menu "$(TEXT "Choose a mode(Only supported for kernel version 4)")" 0 0 0 --file "${TMP_PATH}/menu" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- SATADOM="${resp}"
- writeConfigKey "satadom" "${SATADOM}" "${USER_CONFIG_FILE}"
- NEXT="m"
- ;;
- d)
- if [ "true" = "${DT}" ]; then
- customDTS
- else
+ NEXT="c"
+ ;;
+ l)
+ LKM=$([ "${LKM}" = "dev" ] && echo 'prod' || ([ "${LKM}" = "test" ] && echo 'dev' || echo 'test'))
+ writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ NEXT="l"
+ ;;
+ h)
+ HDDSORT=$([ "${HDDSORT}" = "true" ] && echo 'false' || echo 'true')
+ writeConfigKey "hddsort" "${HDDSORT}" "${USER_CONFIG_FILE}"
+ touch "${PART1_PATH}/.build"
+ NEXT="h"
+ ;;
+ p)
+ PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
+ PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
+ MSG="$(TEXT "pat: (editable)")"
DIALOG --title "$(TEXT "Advanced")" \
- --msgbox "$(TEXT "Custom DTS is not supported for current model.")" 0 0
- fi
- NEXT="e"
- ;;
- u)
- if [ "true" = "${DT}" ]; then
- DIALOG --title "$(TEXT "Advanced")" \
- --msgbox "$(TEXT "USB disk as internal disk is not supported for current model.")" 0 0
+ --form "${MSG}" 10 110 2 "URL" 1 1 "${PATURL}" 1 5 100 0 "MD5" 2 1 "${PATSUM}" 2 5 100 0 \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ paturl="$(sed -n '1p' "${TMP_PATH}/resp" 2>/dev/null)"
+ patsum="$(sed -n '2p' "${TMP_PATH}/resp" 2>/dev/null)"
+ if [ ! "${paturl}" = "${PATURL}" ] || [ ! "${patsum}" = "${PATSUM}" ]; then
+ writeConfigKey "paturl" "${paturl}" "${USER_CONFIG_FILE}"
+ writeConfigKey "patsum" "${patsum}" "${USER_CONFIG_FILE}"
+ rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
+ touch "${PART1_PATH}/.build"
+ fi
NEXT="e"
- else
- USBASINTERNAL=$([ "${USBASINTERNAL}" = "true" ] && echo 'false' || echo 'true')
- writeConfigKey "usbasinternal" "${USBASINTERNAL}" "${USER_CONFIG_FILE}"
- NEXT="u"
- fi
- ;;
- j)
- AU=$(readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q "blockupdate" && echo "false" || echo "true")
- if [ "${AU}" = "true" ]; then
- writeConfigKey "addons.\"blockupdate\"" "" "${USER_CONFIG_FILE}"
- else
- deleteConfigKey "addons.\"blockupdate\"" "${USER_CONFIG_FILE}"
- fi
- touch "${PART1_PATH}/.build"
- NEXT="j"
- ;;
- w)
- ITEMS="$(echo -e "1 \n5 \n10 \n30 \n60 \n")"
- DIALOG --title "$(TEXT "Advanced")" \
- --default-item "${BOOTWAIT}" --no-items --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 ${ITEMS} \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- BOOTWAIT="${resp}"
- writeConfigKey "bootwait" "${BOOTWAIT}" "${USER_CONFIG_FILE}"
- NEXT="w"
- ;;
- i)
- ITEMS="$(echo -e "1 \n5 \n10 \n30 \n60 \n")"
- DIALOG --title "$(TEXT "Advanced")" \
- --default-item "${BOOTIPWAIT}" --no-items --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 ${ITEMS} \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- BOOTIPWAIT="${resp}"
- writeConfigKey "bootipwait" "${BOOTIPWAIT}" "${USER_CONFIG_FILE}"
- NEXT="i"
- ;;
- k)
- [ "${KERNELWAY}" = "kexec" ] && KERNELWAY='power' || KERNELWAY='kexec'
- writeConfigKey "kernelway" "${KERNELWAY}" "${USER_CONFIG_FILE}"
- NEXT="k"
- ;;
- # v)
- # DIALOG --title "$(TEXT "Advanced")" \
- # --yesno "$(TEXT "Modifying this item requires a reboot, continue?")" 0 0
- # RET=$?
- # [ ${RET} -ne 0 ] && continue
- # checkCmdline "rr_cmdline" "nomodeset" && delCmdline "rr_cmdline" "nomodeset" || addCmdline "rr_cmdline" "nomodeset"
- # DIALOG --title "$(TEXT "Advanced")" \
- # --infobox "$(TEXT "Reboot to RR")" 0 0
- # rebootTo config
- # exit 0
- # NEXT="v"
- # ;;
- n)
- rm -f "${TMP_PATH}/menu"
- {
- echo "5 \"Reboot after 5 seconds\""
- echo "0 \"No reboot\""
- echo "-1 \"Restart immediately\""
- } >"${TMP_PATH}/menu"
- DIALOG --title "$(TEXT "Advanced")" \
- --default-item "${KERNELPANIC}" --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 --file "${TMP_PATH}/menu" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && continue
- resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
- [ -z "${resp}" ] && continue
- KERNELPANIC="${resp}"
- writeConfigKey "kernelpanic" "${KERNELPANIC}" "${USER_CONFIG_FILE}"
- NEXT="n"
- ;;
- b)
- if [ "${EMMCBOOT}" = "true" ]; then
- EMMCBOOT='false'
- writeConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}"
- deleteConfigKey "cmdline.root" "${USER_CONFIG_FILE}"
- deleteConfigKey "synoinfo.disk_swap" "${USER_CONFIG_FILE}"
- deleteConfigKey "synoinfo.supportraid" "${USER_CONFIG_FILE}"
- deleteConfigKey "synoinfo.support_emmc_boot" "${USER_CONFIG_FILE}"
- deleteConfigKey "synoinfo.support_install_only_dev" "${USER_CONFIG_FILE}"
- else
- EMMCBOOT='true'
- writeConfigKey "emmcboot" "true" "${USER_CONFIG_FILE}"
- writeConfigKey "cmdline.root" "/dev/mmcblk0p1" "${USER_CONFIG_FILE}"
- writeConfigKey "synoinfo.disk_swap" "no" "${USER_CONFIG_FILE}"
- writeConfigKey "synoinfo.supportraid" "no" "${USER_CONFIG_FILE}"
- writeConfigKey "synoinfo.support_emmc_boot" "yes" "${USER_CONFIG_FILE}"
- writeConfigKey "synoinfo.support_install_only_dev" "yes" "${USER_CONFIG_FILE}"
- fi
- touch "${PART1_PATH}/.build"
- NEXT="b"
- ;;
- s)
- showDisksInfo
- NEXT="e"
- ;;
- t)
- MountDSMVolume
- NEXT="e"
- ;;
- f)
- formatDisks
- NEXT="e"
- ;;
- g)
- downloadBackupFiles
- NEXT="e"
- ;;
- a)
- allowDSMDowngrade
- NEXT="e"
- ;;
- x)
- resetDSMPassword
- NEXT="e"
- ;;
- y)
- addNewDSMUser
- NEXT="e"
- ;;
- z)
- forceEnableDSMTelnetSSH
- NEXT="e"
- ;;
- o)
- removeBlockIPDB
- NEXT="e"
- ;;
- q)
- disablescheduledTasks
- NEXT="e"
- ;;
- r)
- initDSMNetwork
- NEXT="e"
- ;;
- e)
- break
- ;;
+ ;;
+ m)
+ rm -f "${TMP_PATH}/menu"
+ {
+ echo '1 "Native SATA Disk(SYNO)"'
+ echo '2 "Fake SATA DOM(Redpill)"'
+ } >"${TMP_PATH}/menu"
+ DIALOG --title "$(TEXT "Advanced")" \
+ --default-item "${SATADOM}" --menu "$(TEXT "Choose a mode(Only supported for kernel version 4)")" 0 0 0 --file "${TMP_PATH}/menu" \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ SATADOM="${resp}"
+ writeConfigKey "satadom" "${SATADOM}" "${USER_CONFIG_FILE}"
+ NEXT="m"
+ ;;
+ d)
+ if [ "true" = "${DT}" ]; then
+ customDTS
+ else
+ DIALOG --title "$(TEXT "Advanced")" \
+ --msgbox "$(TEXT "Custom DTS is not supported for current model.")" 0 0
+ fi
+ NEXT="e"
+ ;;
+ u)
+ if [ "true" = "${DT}" ]; then
+ DIALOG --title "$(TEXT "Advanced")" \
+ --msgbox "$(TEXT "USB disk as internal disk is not supported for current model.")" 0 0
+ NEXT="e"
+ else
+ USBASINTERNAL=$([ "${USBASINTERNAL}" = "true" ] && echo 'false' || echo 'true')
+ writeConfigKey "usbasinternal" "${USBASINTERNAL}" "${USER_CONFIG_FILE}"
+ NEXT="u"
+ fi
+ ;;
+ j)
+ AU=$(readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q "blockupdate" && echo "false" || echo "true")
+ if [ "${AU}" = "true" ]; then
+ writeConfigKey 'addons."blockupdate"' "" "${USER_CONFIG_FILE}"
+ else
+ deleteConfigKey 'addons."blockupdate"' "${USER_CONFIG_FILE}"
+ fi
+ touch "${PART1_PATH}/.build"
+ NEXT="j"
+ ;;
+ w)
+ ITEMS="$(echo -e "1 \n5 \n10 \n30 \n60 \n")"
+ DIALOG --title "$(TEXT "Advanced")" \
+ --default-item "${BOOTWAIT}" --no-items --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 ${ITEMS} \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ BOOTWAIT="${resp}"
+ writeConfigKey "bootwait" "${BOOTWAIT}" "${USER_CONFIG_FILE}"
+ NEXT="w"
+ ;;
+ i)
+ ITEMS="$(echo -e "1 \n5 \n10 \n30 \n60 \n")"
+ DIALOG --title "$(TEXT "Advanced")" \
+ --default-item "${BOOTIPWAIT}" --no-items --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 ${ITEMS} \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ BOOTIPWAIT="${resp}"
+ writeConfigKey "bootipwait" "${BOOTIPWAIT}" "${USER_CONFIG_FILE}"
+ NEXT="i"
+ ;;
+ k)
+ [ "${KERNELWAY}" = "kexec" ] && KERNELWAY='power' || KERNELWAY='kexec'
+ writeConfigKey "kernelway" "${KERNELWAY}" "${USER_CONFIG_FILE}"
+ NEXT="k"
+ ;;
+ # v)
+ # DIALOG --title "$(TEXT "Advanced")" \
+ # --yesno "$(TEXT "Modifying this item requires a reboot, continue?")" 0 0
+ # RET=$?
+ # [ ${RET} -ne 0 ] && continue
+ # checkCmdline "rr_cmdline" "nomodeset" && delCmdline "rr_cmdline" "nomodeset" || addCmdline "rr_cmdline" "nomodeset"
+ # DIALOG --title "$(TEXT "Advanced")" \
+ # --infobox "$(TEXT "Reboot to RR")" 0 0
+ # rebootTo config
+ # exit 0
+ # NEXT="v"
+ # ;;
+ n)
+ rm -f "${TMP_PATH}/menu"
+ {
+ echo '5 "Reboot after 5 seconds"'
+ echo '0 "No reboot"'
+ echo '-1 "Restart immediately"'
+ } >"${TMP_PATH}/menu"
+ DIALOG --title "$(TEXT "Advanced")" \
+ --default-item "${KERNELPANIC}" --menu "$(TEXT "Choose a time(seconds)")" 0 0 0 --file "${TMP_PATH}/menu" \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && continue
+ resp="$(cat "${TMP_PATH}/resp" 2>/dev/null)"
+ [ -z "${resp}" ] && continue
+ KERNELPANIC="${resp}"
+ writeConfigKey "kernelpanic" "${KERNELPANIC}" "${USER_CONFIG_FILE}"
+ NEXT="n"
+ ;;
+ b)
+ if [ "${EMMCBOOT}" = "true" ]; then
+ EMMCBOOT='false'
+ writeConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}"
+ deleteConfigKey "cmdline.root" "${USER_CONFIG_FILE}"
+ deleteConfigKey "synoinfo.disk_swap" "${USER_CONFIG_FILE}"
+ deleteConfigKey "synoinfo.supportraid" "${USER_CONFIG_FILE}"
+ deleteConfigKey "synoinfo.support_emmc_boot" "${USER_CONFIG_FILE}"
+ deleteConfigKey "synoinfo.support_install_only_dev" "${USER_CONFIG_FILE}"
+ else
+ EMMCBOOT='true'
+ writeConfigKey "emmcboot" "true" "${USER_CONFIG_FILE}"
+ writeConfigKey "cmdline.root" "/dev/mmcblk0p1" "${USER_CONFIG_FILE}"
+ writeConfigKey "synoinfo.disk_swap" "no" "${USER_CONFIG_FILE}"
+ writeConfigKey "synoinfo.supportraid" "no" "${USER_CONFIG_FILE}"
+ writeConfigKey "synoinfo.support_emmc_boot" "yes" "${USER_CONFIG_FILE}"
+ writeConfigKey "synoinfo.support_install_only_dev" "yes" "${USER_CONFIG_FILE}"
+ fi
+ touch "${PART1_PATH}/.build"
+ NEXT="b"
+ ;;
+ s)
+ showDisksInfo
+ NEXT="e"
+ ;;
+ t)
+ MountDSMVolume
+ NEXT="e"
+ ;;
+ f)
+ formatDisks
+ NEXT="e"
+ ;;
+ g)
+ downloadBackupFiles
+ NEXT="e"
+ ;;
+ a)
+ allowDSMDowngrade
+ NEXT="e"
+ ;;
+ x)
+ resetDSMPassword
+ NEXT="e"
+ ;;
+ y)
+ addNewDSMUser
+ NEXT="e"
+ ;;
+ z)
+ forceEnableDSMTelnetSSH
+ NEXT="e"
+ ;;
+ o)
+ removeBlockIPDB
+ NEXT="e"
+ ;;
+ q)
+ disablescheduledTasks
+ NEXT="e"
+ ;;
+ r)
+ initDSMNetwork
+ NEXT="e"
+ ;;
+ e)
+ break
+ ;;
esac
done
}
@@ -3413,124 +3413,124 @@ function settingsMenu() {
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && break
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- l)
- languageMenu
- NEXT="l"
- ;;
- t)
- timezoneMenu
- NEXT="t"
- ;;
- k)
- keymapMenu
- NEXT="k"
- ;;
- o)
- [ "${DSMLOGO}" = "true" ] && DSMLOGO='false' || DSMLOGO='true'
- writeConfigKey "dsmlogo" "${DSMLOGO}" "${USER_CONFIG_FILE}"
- NEXT="o"
- ;;
- n)
- notificationsMenu
- NEXT="e"
- ;;
- p)
- MSG=""
- MSG+="$(TEXT "This option provides information about custom patch scripts for the ramdisk.\n")"
- MSG+="\n"
- MSG+="$(TEXT "These scripts are executed before the ramdisk is packaged.\n")"
- MSG+="$(TEXT "You can place your custom scripts in the following location:\n")"
- MSG+="$(TEXT "/mnt/p3/scripts/*.sh\n")"
- DIALOG --title "$(TEXT "Settings")" \
- --msgbox "${MSG}" 0 0
- NEXT="e"
- ;;
- u)
- editUserConfig
- NEXT="e"
- ;;
- g)
- editGrubCfg
- NEXT="e"
- ;;
- r)
- tryRecoveryDSM
- NEXT="e"
- ;;
- c)
- cloneBootloaderDisk
- NEXT="e"
- ;;
- q)
- systemReport
- NEXT="e"
- ;;
- v)
- reportBugs
- NEXT="e"
- ;;
- d)
- InstallDevTools
- NEXT="e"
- ;;
- s)
- savemodrr
- NEXT="e"
- ;;
- i)
- setStaticIP
- NEXT="e"
- ;;
- w)
- setWirelessAccount
- NEXT="e"
- ;;
- 1)
- setProxy "global_proxy"
- NEXT="e"
- ;;
- 2)
- setProxy "github_proxy"
- NEXT="e"
- ;;
- 3)
- UPDMC="$([ -f "${MC_RAMDISK_FILE}" ] && echo "true" || echo "false")"
- if [ "${UPDMC}" = "true" ]; then
- rm -f "${MC_RAMDISK_FILE}"
- else
- createMicrocode
- fi
- NEXT="3"
- ;;
- 4)
- changePassword
- NEXT="e"
- ;;
- 5)
- changePorts
- NEXT="e"
- ;;
+ l)
+ languageMenu
+ NEXT="l"
+ ;;
+ t)
+ timezoneMenu
+ NEXT="t"
+ ;;
+ k)
+ keymapMenu
+ NEXT="k"
+ ;;
+ o)
+ [ "${DSMLOGO}" = "true" ] && DSMLOGO='false' || DSMLOGO='true'
+ writeConfigKey "dsmlogo" "${DSMLOGO}" "${USER_CONFIG_FILE}"
+ NEXT="o"
+ ;;
+ n)
+ notificationsMenu
+ NEXT="e"
+ ;;
+ p)
+ MSG=""
+ MSG+="$(TEXT "This option provides information about custom patch scripts for the ramdisk.\n")"
+ MSG+="\n"
+ MSG+="$(TEXT "These scripts are executed before the ramdisk is packaged.\n")"
+ MSG+="$(TEXT "You can place your custom scripts in the following location:\n")"
+ MSG+="$(TEXT "/mnt/p3/scripts/*.sh\n")"
+ DIALOG --title "$(TEXT "Settings")" \
+ --msgbox "${MSG}" 0 0
+ NEXT="e"
+ ;;
+ u)
+ editUserConfig
+ NEXT="e"
+ ;;
+ g)
+ editGrubCfg
+ NEXT="e"
+ ;;
+ r)
+ tryRecoveryDSM
+ NEXT="e"
+ ;;
+ c)
+ cloneBootloaderDisk
+ NEXT="e"
+ ;;
+ q)
+ systemReport
+ NEXT="e"
+ ;;
+ v)
+ reportBugs
+ NEXT="e"
+ ;;
+ d)
+ InstallDevTools
+ NEXT="e"
+ ;;
+ s)
+ savemodrr
+ NEXT="e"
+ ;;
+ i)
+ setStaticIP
+ NEXT="e"
+ ;;
+ w)
+ setWirelessAccount
+ NEXT="e"
+ ;;
+ 1)
+ setProxy "global_proxy"
+ NEXT="e"
+ ;;
+ 2)
+ setProxy "github_proxy"
+ NEXT="e"
+ ;;
+ 3)
+ UPDMC="$([ -f "${MC_RAMDISK_FILE}" ] && echo "true" || echo "false")"
+ if [ "${UPDMC}" = "true" ]; then
+ rm -f "${MC_RAMDISK_FILE}"
+ else
+ createMicrocode
+ fi
+ NEXT="3"
+ ;;
+ 4)
+ changePassword
+ NEXT="e"
+ ;;
+ 5)
+ changePorts
+ NEXT="e"
+ ;;
- !)
- MSG=""
- MSG+=" \n"
- MSG+=" ██▀███ ██▀███ ▒█████ ██▀███ ▄████ \n"
- MSG+=" ▓██ ▒ ██▒ ▓██ ▒ ██▒ ▒██▒ ██▒ ▓██ ▒ ██▒ ██▒ ▀█▒ \n"
- MSG+=" ▓██ ░▄█ ▒ ▓██ ░▄█ ▒ ▒██░ ██▒ ▓██ ░▄█ ▒▒ ██░▄▄▄░ \n"
- MSG+=" ▒██▀▀█▄ ▒██▀▀█▄ ▒██ ██░ ▒██▀▀█▄ ░ ▓█ ██▓ \n"
- MSG+=" ░██▓ ▒██▒ ░██▓ ▒██▒ ░ ████▓▒░ ░██▓ ▒██▒░ ▒▓███▀▒ \n"
- MSG+=" ░ ▒▓ ░▒▓░ ░ ▒▓ ░▒▓░ ░ ▒░▒░▒░ ░ ▒▓ ░▒▓░ ░▒ ▒ \n"
- MSG+=" ░▒ ░ ▒░ ░▒ ░ ▒░ ░ ▒ ▒░ ░▒ ░ ▒░ ░ ░ \n"
- MSG+=" ░░ ░ ░░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ \n"
- MSG+=" ░ ░ ░ ░ ░ ░ \n"
- MSG+=" \n"
- DIALOG --title "$(TEXT "Settings")" \
- --ascii-lines --msgbox "${MSG}" 15 60
- NEXT="e"
- ;;
- e)
- break
- ;;
+ !)
+ MSG=""
+ MSG+=" \n"
+ MSG+=" ██▀███ ██▀███ ▒█████ ██▀███ ▄████ \n"
+ MSG+=" ▓██ ▒ ██▒ ▓██ ▒ ██▒ ▒██▒ ██▒ ▓██ ▒ ██▒ ██▒ ▀█▒ \n"
+ MSG+=" ▓██ ░▄█ ▒ ▓██ ░▄█ ▒ ▒██░ ██▒ ▓██ ░▄█ ▒▒ ██░▄▄▄░ \n"
+ MSG+=" ▒██▀▀█▄ ▒██▀▀█▄ ▒██ ██░ ▒██▀▀█▄ ░ ▓█ ██▓ \n"
+ MSG+=" ░██▓ ▒██▒ ░██▓ ▒██▒ ░ ████▓▒░ ░██▓ ▒██▒░ ▒▓███▀▒ \n"
+ MSG+=" ░ ▒▓ ░▒▓░ ░ ▒▓ ░▒▓░ ░ ▒░▒░▒░ ░ ▒▓ ░▒▓░ ░▒ ▒ \n"
+ MSG+=" ░▒ ░ ▒░ ░▒ ░ ▒░ ░ ▒ ▒░ ░▒ ░ ▒░ ░ ░ \n"
+ MSG+=" ░░ ░ ░░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ \n"
+ MSG+=" ░ ░ ░ ░ ░ ░ \n"
+ MSG+=" \n"
+ DIALOG --title "$(TEXT "Settings")" \
+ --ascii-lines --msgbox "${MSG}" 15 60
+ NEXT="e"
+ ;;
+ e)
+ break
+ ;;
esac
done
}
@@ -3662,8 +3662,8 @@ function updateRR() {
fi
FSNEW=$(du -sm "${TMP_PATH}/update/${VALUE}" 2>/dev/null | awk '{print $1}')
FSOLD=$(du -sm "/${VALUE}" 2>/dev/null | awk '{print $1}')
- SIZENEW=$((${SIZENEW} + ${FSNEW:-0}))
- SIZEOLD=$((${SIZEOLD} + ${FSOLD:-0}))
+ SIZENEW=$((SIZENEW + ${FSNEW:-0}))
+ SIZEOLD=$((SIZEOLD + ${FSOLD:-0}))
done <<<"$(readConfigMap "replace" "${TMP_PATH}/update/update-list.yml")"
SIZESPL=$(df -m "${PART3_PATH}" 2>/dev/null | awk 'NR==2 {print $4}')
@@ -3915,132 +3915,132 @@ function updateMenu() {
[ $? -ne 0 ] && return 1
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- a)
- F="$(ls ${PART3_PATH}/updateall*.zip ${TMP_PATH}/updateall*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "All")" "${CUR_RR_VER:-None}" "https://github.com/RROrg/rr" "updateall"
- F="$(ls ${TMP_PATH}/updateall*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateRR "${F}" && rm -f ${TMP_PATH}/updateall*.zip
- ;;
- r)
- F="$(ls ${PART3_PATH}/update*.zip ${TMP_PATH}/update*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "RR")" "${CUR_RR_VER:-None}" "https://github.com/RROrg/rr" "update"
- F="$(ls ${TMP_PATH}/update*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateRR "${F}" && rm -f ${TMP_PATH}/update*.zip
- ;;
- d)
- if [ -z "${DEBUG}" ]; then
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "Addons")")" 0 0
- continue
- fi
- F="$(ls ${PART3_PATH}/addons*.zip ${TMP_PATH}/addons*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "Addons")" "${CUR_ADDONS_VER:-None}" "https://github.com/RROrg/rr-addons" "addons"
- F="$(ls ${TMP_PATH}/addons*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateAddons "${F}" && rm -f ${TMP_PATH}/addons*.zip
- ;;
- m)
- if [ -z "${DEBUG}" ]; then
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "Modules")")" 0 0
- continue
- fi
- F="$(ls ${PART3_PATH}/modules*.zip ${TMP_PATH}/modules*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "Modules")" "${CUR_MODULES_VER:-None}" "https://github.com/RROrg/rr-modules" "modules"
- F="$(ls ${TMP_PATH}/modules*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateModules "${F}" && rm -f ${TMP_PATH}/modules*.zip
- ;;
- l)
- if [ -z "${DEBUG}" ]; then
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "LKMs")")" 0 0
- continue
- fi
- F="$(ls ${PART3_PATH}/rp-lkms*.zip ${TMP_PATH}/rp-lkms*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "LKMs")" "${CUR_LKMS_VER:-None}" "https://github.com/RROrg/rr-lkms" "rp-lkms"
- F="$(ls ${TMP_PATH}/rp-lkms*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateLKMs "${F}" && rm -f ${TMP_PATH}/rp-lkms*.zip
- ;;
- c)
- if [ -z "${DEBUG}" ]; then
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "CKs")")" 0 0
- continue
- fi
- F="$(ls ${PART3_PATH}/rr-cks*.zip ${TMP_PATH}/rr-cks*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
- [ -z "${F}" ] && downloadExts "$(TEXT "CKs")" "${CUR_CKS_VER:-None}" "https://github.com/RROrg/rr-cks" "rr-cks"
- F="$(ls ${TMP_PATH}/rr-cks*.zip 2>/dev/null | sort -V | tail -n 1)"
- [ -n "${F}" ] && updateCKs "${F}" && rm -f ${TMP_PATH}/rr-cks*.zip
- ;;
- u)
- if ! tty 2>/dev/null | grep -q "/dev/pts" || [ -z "${SSH_TTY}" ]; then
+ a)
+ F="$(ls ${PART3_PATH}/updateall*.zip ${TMP_PATH}/updateall*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "All")" "${CUR_RR_VER:-None}" "https://github.com/RROrg/rr" "updateall"
+ F="$(ls ${TMP_PATH}/updateall*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateRR "${F}" && rm -f ${TMP_PATH}/updateall*.zip
+ ;;
+ r)
+ F="$(ls ${PART3_PATH}/update*.zip ${TMP_PATH}/update*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "RR")" "${CUR_RR_VER:-None}" "https://github.com/RROrg/rr" "update"
+ F="$(ls ${TMP_PATH}/update*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateRR "${F}" && rm -f ${TMP_PATH}/update*.zip
+ ;;
+ d)
+ if [ -z "${DEBUG}" ]; then
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "Addons")")" 0 0
+ continue
+ fi
+ F="$(ls ${PART3_PATH}/addons*.zip ${TMP_PATH}/addons*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "Addons")" "${CUR_ADDONS_VER:-None}" "https://github.com/RROrg/rr-addons" "addons"
+ F="$(ls ${TMP_PATH}/addons*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateAddons "${F}" && rm -f ${TMP_PATH}/addons*.zip
+ ;;
+ m)
+ if [ -z "${DEBUG}" ]; then
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "Modules")")" 0 0
+ continue
+ fi
+ F="$(ls ${PART3_PATH}/modules*.zip ${TMP_PATH}/modules*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "Modules")" "${CUR_MODULES_VER:-None}" "https://github.com/RROrg/rr-modules" "modules"
+ F="$(ls ${TMP_PATH}/modules*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateModules "${F}" && rm -f ${TMP_PATH}/modules*.zip
+ ;;
+ l)
+ if [ -z "${DEBUG}" ]; then
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "LKMs")")" 0 0
+ continue
+ fi
+ F="$(ls ${PART3_PATH}/rp-lkms*.zip ${TMP_PATH}/rp-lkms*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "LKMs")" "${CUR_LKMS_VER:-None}" "https://github.com/RROrg/rr-lkms" "rp-lkms"
+ F="$(ls ${TMP_PATH}/rp-lkms*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateLKMs "${F}" && rm -f ${TMP_PATH}/rp-lkms*.zip
+ ;;
+ c)
+ if [ -z "${DEBUG}" ]; then
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "$(printf "$(TEXT "No longer supports update %s separately. Please choose to update All/RR")" "$(TEXT "CKs")")" 0 0
+ continue
+ fi
+ F="$(ls ${PART3_PATH}/rr-cks*.zip ${TMP_PATH}/rr-cks*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && [ -f "${F}.downloading" ] && rm -f "${F}" && rm -f "${F}.downloading" && F=""
+ [ -z "${F}" ] && downloadExts "$(TEXT "CKs")" "${CUR_CKS_VER:-None}" "https://github.com/RROrg/rr-cks" "rr-cks"
+ F="$(ls ${TMP_PATH}/rr-cks*.zip 2>/dev/null | sort -V | tail -n 1)"
+ [ -n "${F}" ] && updateCKs "${F}" && rm -f ${TMP_PATH}/rr-cks*.zip
+ ;;
+ u)
+ if ! tty 2>/dev/null | grep -q "/dev/pts" || [ -z "${SSH_TTY}" ]; then
+ MSG=""
+ MSG+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
+ MSG+="$(TEXT "Manually uploading update*.zip,addons*.zip,modules*.zip,rp-lkms*.zip,rr-cks*.zip to /tmp/ will skip the download.\n")"
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "${MSG}" 0 0
+ return 1
+ fi
MSG=""
- MSG+="$(TEXT "This feature is only available when accessed via ssh (Requires a terminal that supports ZModem protocol).\n")"
- MSG+="$(TEXT "Manually uploading update*.zip,addons*.zip,modules*.zip,rp-lkms*.zip,rr-cks*.zip to /tmp/ will skip the download.\n")"
+ MSG+="$(TEXT "Please keep the attachment name consistent with the attachment name on Github.\n")"
+ MSG+="$(TEXT "Upload update*.zip will update RR.\n")"
+ MSG+="$(TEXT "Upload addons*.zip will update Addons.\n")"
+ MSG+="$(TEXT "Upload modules*.zip will update Modules.\n")"
+ MSG+="$(TEXT "Upload rp-lkms*.zip will update LKMs.\n")"
+ MSG+="$(TEXT "Upload rr-cks*.zip will update CKs.\n")"
DIALOG --title "$(TEXT "Update")" \
--msgbox "${MSG}" 0 0
- return 1
- fi
- MSG=""
- MSG+="$(TEXT "Please keep the attachment name consistent with the attachment name on Github.\n")"
- MSG+="$(TEXT "Upload update*.zip will update RR.\n")"
- MSG+="$(TEXT "Upload addons*.zip will update Addons.\n")"
- MSG+="$(TEXT "Upload modules*.zip will update Modules.\n")"
- MSG+="$(TEXT "Upload rp-lkms*.zip will update LKMs.\n")"
- MSG+="$(TEXT "Upload rr-cks*.zip will update CKs.\n")"
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "${MSG}" 0 0
- TMP_UP_PATH="${TMP_PATH}/users"
- rm -rf "${TMP_UP_PATH}"
- mkdir -p "${TMP_UP_PATH}"
- (cd "${TMP_UP_PATH}" && rz -be) || true
- USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
- if [ -z "${USER_FILE}" ]; then
- DIALOG --title "$(TEXT "Update")" \
- --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
- else
- case "${USER_FILE}" in
- *update*.zip)
- rm -f ${TMP_PATH}/update*.zip
- updateRR "${USER_FILE}"
- ;;
- *addons*.zip)
- rm -f ${TMP_PATH}/addons*.zip
- updateAddons "${USER_FILE}"
- ;;
- *modules*.zip)
- rm -f ${TMP_PATH}/modules*.zip
- updateModules "${USER_FILE}"
- ;;
- *rp-lkms*.zip)
- rm -f ${TMP_PATH}/rp-lkms*.zip
- updateLKMs "${USER_FILE}"
- ;;
- *rr-cks*.zip)
- rm -f ${TMP_PATH}/rr-cks*.zip
- updateCKs "${USER_FILE}"
- ;;
- *)
+ TMP_UP_PATH="${TMP_PATH}/users"
+ rm -rf "${TMP_UP_PATH}"
+ mkdir -p "${TMP_UP_PATH}"
+ (cd "${TMP_UP_PATH}" && rz -be) || true
+ USER_FILE="$(find "${TMP_UP_PATH}" -type f | head -1)"
+ if [ -z "${USER_FILE}" ]; then
DIALOG --title "$(TEXT "Update")" \
--msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
- ;;
- esac
- rm -rf "${TMP_UP_PATH}"
- fi
- ;;
- b)
- [ "${PRERELEASE}" = "false" ] && PRERELEASE='true' || PRERELEASE='false'
- writeConfigKey "prerelease" "${PRERELEASE}" "${USER_CONFIG_FILE}"
- NEXT="e"
- ;;
- e)
- return 0
- ;;
+ else
+ case "${USER_FILE}" in
+ *update*.zip)
+ rm -f ${TMP_PATH}/update*.zip
+ updateRR "${USER_FILE}"
+ ;;
+ *addons*.zip)
+ rm -f ${TMP_PATH}/addons*.zip
+ updateAddons "${USER_FILE}"
+ ;;
+ *modules*.zip)
+ rm -f ${TMP_PATH}/modules*.zip
+ updateModules "${USER_FILE}"
+ ;;
+ *rp-lkms*.zip)
+ rm -f ${TMP_PATH}/rp-lkms*.zip
+ updateLKMs "${USER_FILE}"
+ ;;
+ *rr-cks*.zip)
+ rm -f ${TMP_PATH}/rr-cks*.zip
+ updateCKs "${USER_FILE}"
+ ;;
+ *)
+ DIALOG --title "$(TEXT "Update")" \
+ --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
+ ;;
+ esac
+ rm -rf "${TMP_UP_PATH}"
+ fi
+ ;;
+ b)
+ [ "${PRERELEASE}" = "false" ] && PRERELEASE='true' || PRERELEASE='false'
+ writeConfigKey "prerelease" "${PRERELEASE}" "${USER_CONFIG_FILE}"
+ NEXT="e"
+ ;;
+ e)
+ return 0
+ ;;
esac
[ -z "${1}" ] || return 0
done
@@ -4069,7 +4069,7 @@ function notepadMenu() {
###############################################################################
if [ ! "$(basename -- "${0}")" = "$(basename -- "${BASH_SOURCE[0]}")" ] || [ $# -gt 0 ]; then
"$@"
- cleanup_lock
+ cleanup_lock
else
if [ -z "${MODEL}" ] && [ -z "${PRODUCTVER}" ] && [ -n "$(findDSMRoot)" ]; then
DIALOG --title "$(TEXT "Main menu")" \
@@ -4090,8 +4090,8 @@ else
fi
echo "u \"$(TEXT "Parse pat")\""
if [ -n "${PRODUCTVER}" ]; then
- if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] &&
- [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
+ if [ -f "${CKS_PATH}/bzImage-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.gz" ] \
+ && [ -f "${CKS_PATH}/modules-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}.tgz" ]; then
echo "s \"$(TEXT "Kernel:") \Z4${KERNEL}\Zn\""
fi
echo "a \"$(TEXT "Addons menu")\""
@@ -4121,152 +4121,152 @@ else
2>"${TMP_PATH}/resp"
[ $? -ne 0 ] && break
case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- m)
- modelMenu
- NEXT="n"
- ;;
- n)
- productversMenu
- NEXT="d"
- ;;
- u)
- ParsePat
- NEXT="d"
- ;;
- s)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Change ...")" 0 0
- [ ! "${KERNEL}" = "custom" ] && KERNEL='custom' || KERNEL='official'
- writeConfigKey "kernel" "${KERNEL}" "${USER_CONFIG_FILE}"
- if [ "${ODP}" = "true" ]; then
- ODP="false"
- writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
- fi
- if [ -n "${PLATFORM}" ] && [ -n "${KVER}" ]; then
- writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
- mergeConfigModules "$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
- fi
- touch "${PART1_PATH}/.build"
- NEXT="o"
- ;;
- a)
- addonMenu
- NEXT="d"
- ;;
- o)
- moduleMenu
- NEXT="d"
- ;;
- x)
- cmdlineMenu
- NEXT="d"
- ;;
- i)
- synoinfoMenu
- NEXT="d"
- ;;
- v)
- advancedMenu
- NEXT="d"
- ;;
- d)
- make
- NEXT="b"
- ;;
- q)
- DIRECTBOOT="$([ "${DIRECTBOOT}" = "false" ] && echo "true" || echo "false")"
- writeConfigKey "directboot" "${DIRECTBOOT}" "${USER_CONFIG_FILE}"
- NEXT="q"
- ;;
- b)
- boot && exit 0 || sleep 5
- ;;
- h)
- settingsMenu
- NEXT="m"
- ;;
- r)
- cleanup_lock && exec "${WORK_PATH}/helper.sh"
- NEXT="m"
- ;;
- c)
- cleanCache
- NEXT="d"
- ;;
- p)
- updateMenu
- NEXT="d"
- ;;
- t)
- notepadMenu
- NEXT="d"
- ;;
- e)
- NEXT="e"
- while true; do
- rm -f "${TMP_PATH}/menu"
- {
- echo "p \"$(TEXT "Power off")\""
- echo "r \"$(TEXT "Reboot")\""
- echo "x \"$(TEXT "Reboot to RR")\""
- echo "y \"$(TEXT "Reboot to Recovery")\""
- echo "z \"$(TEXT "Reboot to Junior")\""
- if [ -d "/sys/firmware/efi" ]; then
- echo "b \"$(TEXT "Reboot to UEFI")\""
- fi
- echo "s \"$(TEXT "Back to shell")\""
- echo "e \"$(TEXT "Exit")\""
- } >"${TMP_PATH}/menu"
+ m)
+ modelMenu
+ NEXT="n"
+ ;;
+ n)
+ productversMenu
+ NEXT="d"
+ ;;
+ u)
+ ParsePat
+ NEXT="d"
+ ;;
+ s)
DIALOG --title "$(TEXT "Main menu")" \
- --default-item ${NEXT} --menu "$(TEXT "Choose a action")" 0 0 0 --file "${TMP_PATH}/menu" \
- 2>"${TMP_PATH}/resp"
- [ $? -ne 0 ] && break
- case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
- p)
+ --infobox "$(TEXT "Change ...")" 0 0
+ [ ! "${KERNEL}" = "custom" ] && KERNEL='custom' || KERNEL='official'
+ writeConfigKey "kernel" "${KERNEL}" "${USER_CONFIG_FILE}"
+ if [ "${ODP}" = "true" ]; then
+ ODP="false"
+ writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
+ fi
+ if [ -n "${PLATFORM}" ] && [ -n "${KVER}" ]; then
+ writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
+ mergeConfigModules "$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
+ fi
+ touch "${PART1_PATH}/.build"
+ NEXT="o"
+ ;;
+ a)
+ addonMenu
+ NEXT="d"
+ ;;
+ o)
+ moduleMenu
+ NEXT="d"
+ ;;
+ x)
+ cmdlineMenu
+ NEXT="d"
+ ;;
+ i)
+ synoinfoMenu
+ NEXT="d"
+ ;;
+ v)
+ advancedMenu
+ NEXT="d"
+ ;;
+ d)
+ make
+ NEXT="b"
+ ;;
+ q)
+ DIRECTBOOT="$([ "${DIRECTBOOT}" = "false" ] && echo "true" || echo "false")"
+ writeConfigKey "directboot" "${DIRECTBOOT}" "${USER_CONFIG_FILE}"
+ NEXT="q"
+ ;;
+ b)
+ boot && exit 0 || sleep 5
+ ;;
+ h)
+ settingsMenu
+ NEXT="m"
+ ;;
+ r)
+ cleanup_lock && exec "${WORK_PATH}/helper.sh"
+ NEXT="m"
+ ;;
+ c)
+ cleanCache
+ NEXT="d"
+ ;;
+ p)
+ updateMenu
+ NEXT="d"
+ ;;
+ t)
+ notepadMenu
+ NEXT="d"
+ ;;
+ e)
+ NEXT="e"
+ while true; do
+ rm -f "${TMP_PATH}/menu"
+ {
+ echo "p \"$(TEXT "Power off")\""
+ echo "r \"$(TEXT "Reboot")\""
+ echo "x \"$(TEXT "Reboot to RR")\""
+ echo "y \"$(TEXT "Reboot to Recovery")\""
+ echo "z \"$(TEXT "Reboot to Junior")\""
+ if [ -d "/sys/firmware/efi" ]; then
+ echo "b \"$(TEXT "Reboot to UEFI")\""
+ fi
+ echo "s \"$(TEXT "Back to shell")\""
+ echo "e \"$(TEXT "Exit")\""
+ } >"${TMP_PATH}/menu"
DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Power off")" 0 0
- poweroff
- exit 0
- ;;
- r)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Reboot")" 0 0
- reboot
- exit 0
- ;;
- x)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Reboot to RR")" 0 0
- rebootTo config
- exit 0
- ;;
- y)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Reboot to Recovery")" 0 0
- rebootTo recovery
- exit 0
- ;;
- z)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Reboot to Junior")" 0 0
- rebootTo junior
- exit 0
- ;;
- b)
- DIALOG --title "$(TEXT "Main menu")" \
- --infobox "$(TEXT "Reboot to UEFI")" 0 0
- rebootTo uefi
- exit 0
- ;;
- s)
- break 2
- ;;
- e)
- break
- ;;
- esac
- done
- ;;
+ --default-item ${NEXT} --menu "$(TEXT "Choose a action")" 0 0 0 --file "${TMP_PATH}/menu" \
+ 2>"${TMP_PATH}/resp"
+ [ $? -ne 0 ] && break
+ case "$(cat "${TMP_PATH}/resp" 2>/dev/null)" in
+ p)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Power off")" 0 0
+ poweroff
+ exit 0
+ ;;
+ r)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Reboot")" 0 0
+ reboot
+ exit 0
+ ;;
+ x)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Reboot to RR")" 0 0
+ rebootTo config
+ exit 0
+ ;;
+ y)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Reboot to Recovery")" 0 0
+ rebootTo recovery
+ exit 0
+ ;;
+ z)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Reboot to Junior")" 0 0
+ rebootTo junior
+ exit 0
+ ;;
+ b)
+ DIALOG --title "$(TEXT "Main menu")" \
+ --infobox "$(TEXT "Reboot to UEFI")" 0 0
+ rebootTo uefi
+ exit 0
+ ;;
+ s)
+ break 2
+ ;;
+ e)
+ break
+ ;;
+ esac
+ done
+ ;;
esac
done
clear
diff --git a/files/initrd/opt/rr/ramdisk-patch.sh b/files/initrd/opt/rr/ramdisk-patch.sh
index 306d4235..3aff3687 100755
--- a/files/initrd/opt/rr/ramdisk-patch.sh
+++ b/files/initrd/opt/rr/ramdisk-patch.sh
@@ -59,8 +59,8 @@ mkdir -p "${RAMDISK_PATH}"
# Check if DSM buildnumber changed
. "${RAMDISK_PATH}/etc/VERSION"
-if [ -n "${PRODUCTVER}" ] && [ -n "${BUILDNUM}" ] && [ -n "${SMALLNUM}" ] &&
- ([ ! "${PRODUCTVER}" = "${majorversion:-0}.${minorversion:-0}" ] || [ ! "${BUILDNUM}" = "${buildnumber:-0}" ] || [ ! "${SMALLNUM}" = "${smallfixnumber:-0}" ]); then
+if [ -n "${PRODUCTVER}" ] && [ -n "${BUILDNUM}" ] && [ -n "${SMALLNUM}" ] \
+ && ([ ! "${PRODUCTVER}" = "${majorversion:-0}.${minorversion:-0}" ] || [ ! "${BUILDNUM}" = "${buildnumber:-0}" ] || [ ! "${SMALLNUM}" = "${smallfixnumber:-0}" ]); then
OLDVER="${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))"
NEWVER="${majorversion}.${minorversion}(${buildnumber}$([ ${smallfixnumber:-0} -ne 0 ] && echo "u${smallfixnumber}"))"
echo -e "\033[A\n\033[1;32mBuild number changed from \033[1;31m${OLDVER}\033[1;32m to \033[1;31m${NEWVER}\033[0m"
@@ -144,7 +144,7 @@ echo "Create addons.sh" >"${LOG_FILE}"
{
echo "#!/bin/sh"
echo 'echo "addons.sh called with params ${@}"'
- echo "export LOADERLABEL=\"RR\""
+ echo 'export LOADERLABEL="RR"'
echo "export LOADERRELEASE=\"${RR_RELEASE}\""
echo "export LOADERVERSION=\"${RR_VERSION}\""
echo "export PLATFORM=\"${PLATFORM}\""
@@ -213,7 +213,7 @@ echo "Modify files" >"${LOG_FILE}"
# backup current loader configs
mkdir -p "${RAMDISK_PATH}/usr/rr"
{
- echo "LOADERLABEL=\"RR\""
+ echo 'LOADERLABEL="RR"'
echo "LOADERRELEASE=\"${RR_RELEASE}\""
echo "LOADERVERSION=\"${RR_VERSION}\""
} >"${RAMDISK_PATH}/usr/rr/VERSION"
diff --git a/scripts/func.py b/scripts/func.py
index 9d3551f1..96ac9cbb 100644
--- a/scripts/func.py
+++ b/scripts/func.py
@@ -11,6 +11,7 @@ from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # type: ignore
from openpyxl import Workbook
+
@click.group()
def cli():
"""
@@ -21,8 +22,12 @@ def cli():
@cli.command()
@click.option("-w", "--workpath", type=str, required=True, help="The workpath of RR.")
-@click.option("-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile.")
-@click.option("-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile.")
+@click.option(
+ "-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile."
+)
+@click.option(
+ "-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile."
+)
def getmodels(workpath, jsonpath, xlsxpath):
models = {}
platforms_yml = os.path.join(workpath, "opt", "rr", "platforms.yml")
@@ -37,19 +42,25 @@ def getmodels(workpath, jsonpath, xlsxpath):
productvers[V] = f"{kpre}-{kver}" if kpre else kver
models[P] = {"productvers": productvers, "models": []}
- adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
+ adapter = HTTPAdapter(
+ max_retries=Retry(
+ total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]
+ )
+ )
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
-
+
try:
url = "http://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
- #url = "https://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
+ # url = "https://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
req = session.get(url, timeout=10, verify=False)
req.encoding = "utf-8"
- p = re.compile(r"(.*?).*?(.*?)", re.MULTILINE | re.DOTALL)
+ p = re.compile(
+ r"(.*?).*?(.*?)", re.MULTILINE | re.DOTALL
+ )
data = p.findall(req.text)
except Exception as e:
click.echo(f"Error: {e}")
@@ -80,34 +91,44 @@ def getmodels(workpath, jsonpath, xlsxpath):
@cli.command()
@click.option("-w", "--workpath", type=str, required=True, help="The workpath of RR.")
-@click.option("-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile.")
-@click.option("-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile.")
+@click.option(
+ "-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile."
+)
+@click.option(
+ "-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile."
+)
def getpats(workpath, jsonpath, xlsxpath):
def __fullversion(ver):
- arr = ver.split('-')
- a, b, c = (arr[0].split('.') + ['0', '0', '0'])[:3]
- d = arr[1] if len(arr) > 1 else '00000'
- e = arr[2] if len(arr) > 2 else '0'
- return f'{a}.{b}.{c}-{d}-{e}'
+ arr = ver.split("-")
+ a, b, c = (arr[0].split(".") + ["0", "0", "0"])[:3]
+ d = arr[1] if len(arr) > 1 else "00000"
+ e = arr[2] if len(arr) > 2 else "0"
+ return f"{a}.{b}.{c}-{d}-{e}"
platforms_yml = os.path.join(workpath, "opt", "rr", "platforms.yml")
with open(platforms_yml, "r") as f:
data = yaml.safe_load(f)
platforms = data.get("platforms", [])
- adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
+ adapter = HTTPAdapter(
+ max_retries=Retry(
+ total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]
+ )
+ )
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
-
+
try:
url = "http://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
- #url = "https://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
+ # url = "https://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
req = session.get(url, timeout=10, verify=False)
req.encoding = "utf-8"
- p = re.compile(r"(.*?).*?(.*?)", re.MULTILINE | re.DOTALL)
+ p = re.compile(
+ r"(.*?).*?(.*?)", re.MULTILINE | re.DOTALL
+ )
data = p.findall(req.text)
except Exception as e:
click.echo(f"Error: {e}")
@@ -128,62 +149,94 @@ def getpats(workpath, jsonpath, xlsxpath):
pats = {}
for M in models:
pats[M] = {}
- version = '7'
+ version = "7"
urlInfo = "https://www.synology.com/api/support/findDownloadInfo?lang=en-us"
urlSteps = "https://www.synology.com/api/support/findUpgradeSteps?"
- #urlInfo = "https://www.synology.cn/api/support/findDownloadInfo?lang=zh-cn"
- #urlSteps = "https://www.synology.cn/api/support/findUpgradeSteps?"
+ # urlInfo = "https://www.synology.cn/api/support/findDownloadInfo?lang=zh-cn"
+ # urlSteps = "https://www.synology.cn/api/support/findUpgradeSteps?"
- major = f"&major={version.split('.')[0]}" if len(version.split('.')) > 0 else ""
- minor = f"&minor={version.split('.')[1]}" if len(version.split('.')) > 1 else ""
+ major = f"&major={version.split('.')[0]}" if len(version.split(".")) > 0 else ""
+ minor = f"&minor={version.split('.')[1]}" if len(version.split(".")) > 1 else ""
try:
- req = session.get(f"{urlInfo}&product={M.replace('+', '%2B')}{major}{minor}", timeout=10, verify=False)
+ req = session.get(
+ f"{urlInfo}&product={M.replace('+', '%2B')}{major}{minor}",
+ timeout=10,
+ verify=False,
+ )
req.encoding = "utf-8"
data = json.loads(req.text)
except Exception as e:
click.echo(f"Error: {e}")
continue
- build_ver = data['info']['system']['detail'][0]['items'][0]['build_ver']
- build_num = data['info']['system']['detail'][0]['items'][0]['build_num']
- buildnano = data['info']['system']['detail'][0]['items'][0]['nano']
+ build_ver = data["info"]["system"]["detail"][0]["items"][0]["build_ver"]
+ build_num = data["info"]["system"]["detail"][0]["items"][0]["build_num"]
+ buildnano = data["info"]["system"]["detail"][0]["items"][0]["nano"]
V = __fullversion(f"{build_ver}-{build_num}-{buildnano}")
if V not in pats[M]:
pats[M][V] = {
- 'url': data['info']['system']['detail'][0]['items'][0]['files'][0]['url'].split('?')[0],
- 'sum': data['info']['system']['detail'][0]['items'][0]['files'][0].get('checksum', '0' * 32)
+ "url": data["info"]["system"]["detail"][0]["items"][0]["files"][0][
+ "url"
+ ].split("?")[0],
+ "sum": data["info"]["system"]["detail"][0]["items"][0]["files"][0].get(
+ "checksum", "0" * 32
+ ),
}
- from_ver = min(I['build'] for I in data['info']['pubVers'])
+ from_ver = min(I["build"] for I in data["info"]["pubVers"])
- for I in data['info']['productVers']:
- if not I['version'].startswith(version):
+ for I in data["info"]["productVers"]:
+ if not I["version"].startswith(version):
continue
if not major or not minor:
- majorTmp = f"&major={I['version'].split('.')[0]}" if len(I['version'].split('.')) > 0 else ""
- minorTmp = f"&minor={I['version'].split('.')[1]}" if len(I['version'].split('.')) > 1 else ""
+ majorTmp = (
+ f"&major={I['version'].split('.')[0]}"
+ if len(I["version"].split(".")) > 0
+ else ""
+ )
+ minorTmp = (
+ f"&minor={I['version'].split('.')[1]}"
+ if len(I["version"].split(".")) > 1
+ else ""
+ )
try:
- reqTmp = session.get(f"{urlInfo}&product={M.replace('+', '%2B')}{majorTmp}{minorTmp}", timeout=10, verify=False)
+ reqTmp = session.get(
+ f"{urlInfo}&product={M.replace('+', '%2B')}{majorTmp}{minorTmp}",
+ timeout=10,
+ verify=False,
+ )
reqTmp.encoding = "utf-8"
dataTmp = json.loads(reqTmp.text)
except Exception as e:
click.echo(f"Error: {e}")
continue
- build_ver = dataTmp['info']['system']['detail'][0]['items'][0]['build_ver']
- build_num = dataTmp['info']['system']['detail'][0]['items'][0]['build_num']
- buildnano = dataTmp['info']['system']['detail'][0]['items'][0]['nano']
+ build_ver = dataTmp["info"]["system"]["detail"][0]["items"][0][
+ "build_ver"
+ ]
+ build_num = dataTmp["info"]["system"]["detail"][0]["items"][0][
+ "build_num"
+ ]
+ buildnano = dataTmp["info"]["system"]["detail"][0]["items"][0]["nano"]
V = __fullversion(f"{build_ver}-{build_num}-{buildnano}")
if V not in pats[M]:
pats[M][V] = {
- 'url': dataTmp['info']['system']['detail'][0]['items'][0]['files'][0]['url'].split('?')[0],
- 'sum': dataTmp['info']['system']['detail'][0]['items'][0]['files'][0].get('checksum', '0' * 32)
+ "url": dataTmp["info"]["system"]["detail"][0]["items"][0][
+ "files"
+ ][0]["url"].split("?")[0],
+ "sum": dataTmp["info"]["system"]["detail"][0]["items"][0][
+ "files"
+ ][0].get("checksum", "0" * 32),
}
- for J in I['versions']:
- to_ver = J['build']
+ for J in I["versions"]:
+ to_ver = J["build"]
try:
- reqSteps = session.get(f"{urlSteps}&product={M.replace('+', '%2B')}&from_ver={from_ver}&to_ver={to_ver}", timeout=10, verify=False)
+ reqSteps = session.get(
+ f"{urlSteps}&product={M.replace('+', '%2B')}&from_ver={from_ver}&to_ver={to_ver}",
+ timeout=10,
+ verify=False,
+ )
if reqSteps.status_code != 200:
continue
reqSteps.encoding = "utf-8"
@@ -192,17 +245,28 @@ def getpats(workpath, jsonpath, xlsxpath):
click.echo(f"Error: {e}")
continue
- for S in dataSteps['upgrade_steps']:
- if not S.get('full_patch') or not S['build_ver'].startswith(version):
+ for S in dataSteps["upgrade_steps"]:
+ if not S.get("full_patch") or not S["build_ver"].startswith(
+ version
+ ):
continue
V = __fullversion(f"{S['build_ver']}-{S['build_num']}-{S['nano']}")
if V not in pats[M]:
- reqPat = session.head(S['files'][0]['url'].split('?')[0].replace("global.synologydownload.com", "global.download.synology.com"), timeout=10, verify=False)
+ reqPat = session.head(
+ S["files"][0]["url"]
+ .split("?")[0]
+ .replace(
+ "global.synologydownload.com",
+ "global.download.synology.com",
+ ),
+ timeout=10,
+ verify=False,
+ )
if reqPat.status_code == 403:
continue
pats[M][V] = {
- 'url': S['files'][0]['url'].split('?')[0],
- 'sum': S['files'][0].get('checksum', '0' * 32)
+ "url": S["files"][0]["url"].split("?")[0],
+ "sum": S["files"][0].get("checksum", "0" * 32),
}
if jsonpath:
@@ -220,8 +284,12 @@ def getpats(workpath, jsonpath, xlsxpath):
@cli.command()
@click.option("-w", "--workpath", type=str, required=True, help="The workpath of RR.")
-@click.option("-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile.")
-@click.option("-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile.")
+@click.option(
+ "-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile."
+)
+@click.option(
+ "-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile."
+)
def getaddons(workpath, jsonpath, xlsxpath):
AS = glob.glob(os.path.join(workpath, "mnt", "p3", "addons", "*", "manifest.yml"))
AS.sort()
@@ -231,7 +299,9 @@ def getaddons(workpath, jsonpath, xlsxpath):
A_data = yaml.safe_load(file)
A_name = A_data.get("name", "")
A_system = A_data.get("system", False)
- A_description = A_data.get("description", {"en_US": "Unknown", "zh_CN": "Unknown"})
+ A_description = A_data.get(
+ "description", {"en_US": "Unknown", "zh_CN": "Unknown"}
+ )
addons[A_name] = {"system": A_system, "description": A_description}
if jsonpath:
with open(jsonpath, "w") as f:
@@ -241,14 +311,25 @@ def getaddons(workpath, jsonpath, xlsxpath):
ws = wb.active
ws.append(["Name", "system", "en_US", "zh_CN"])
for k1, v1 in addons.items():
- ws.append([k1, v1.get("system", False), v1.get("description").get("en_US", ""), v1.get("description").get("zh_CN", "")])
+ ws.append(
+ [
+ k1,
+ v1.get("system", False),
+ v1.get("description").get("en_US", ""),
+ v1.get("description").get("zh_CN", ""),
+ ]
+ )
wb.save(xlsxpath)
@cli.command()
@click.option("-w", "--workpath", type=str, required=True, help="The workpath of RR.")
-@click.option("-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile.")
-@click.option("-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile.")
+@click.option(
+ "-j", "--jsonpath", type=str, required=True, help="The output path of jsonfile."
+)
+@click.option(
+ "-x", "--xlsxpath", type=str, required=False, help="The output path of xlsxfile."
+)
def getmodules(workpath, jsonpath, xlsxpath):
MS = glob.glob(os.path.join(workpath, "mnt", "p3", "modules", "*.tgz"))
MS.sort()
diff --git a/scripts/func.sh b/scripts/func.sh
index e7811047..186c97b4 100755
--- a/scripts/func.sh
+++ b/scripts/func.sh
@@ -259,14 +259,14 @@ function unpackInitrd() {
INITRD_FORMAT=$(file -b --mime-type "${INITRD_FILE}")
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${OUTPUT_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${OUTPUT_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${OUTPUT_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${OUTPUT_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${OUTPUT_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${OUTPUT_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${OUTPUT_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${OUTPUT_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${OUTPUT_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${OUTPUT_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${OUTPUT_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${OUTPUT_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${OUTPUT_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${OUTPUT_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *) ;;
esac
}
@@ -292,32 +292,117 @@ function repackInitrd() {
INITRD_FORMAT=$(file -b --mime-type "${INITRD_FILE}")
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
+ *) ;;
esac
sudo cp -rf "${PLUGIN_PATH}/"* "${RDXZ_PATH}/"
[ -f "${OUTPUT_PATH}" ] && rm -rf "${OUTPUT_PATH}"
# shellcheck disable=SC2024
case "${INITRD_FORMAT}" in
- *'x-cpio'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'x-xz'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'x-lz4'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'x-lzma'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lzma -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'x-bzip2'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | bzip2 -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'gzip'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | gzip -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *'zstd'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
- *) ;;
+ *'x-cpio'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'x-xz'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'x-lz4'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'x-lzma'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lzma -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'x-bzip2'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | bzip2 -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'gzip'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | gzip -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *'zstd'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
+ *) ;;
esac
sudo rm -rf "${RDXZ_PATH}"
}
+function repackImg() {
+ local INPUT_FILE="${1}"
+ local OUTPUT_FILE="${2}"
+
+ [ -z "${INPUT_FILE}" ] && exit 1
+ [ -z "${OUTPUT_FILE}" ] || [ ! -f "${OUTPUT_FILE}" ] && exit 1
+
+ OUTPUT_FILE="$(realpath "${OUTPUT_FILE}")"
+
+ if [ -d "${INPUT_FILE}" ]; then
+ _umount() {
+ for i in {1..3}; do
+ sudo mount | grep -q "/tmp/mnt/p${i}" || continue
+ sudo umount "/tmp/mnt/p${i}"
+ rm -rf "/tmp/mnt/p${i}"
+ done
+ }
+ LOOPX=$(sudo losetup -f)
+ sudo losetup -P "${LOOPX}" "${OUTPUT_FILE}"
+ for i in {1..3}; do
+ [ ! -d "${INPUT_FILE}/mnt/p${i}" ] && continue
+ rm -rf "/tmp/mnt/p${i}" 2>/dev/null
+ mkdir -p "/tmp/mnt/p${i}"
+ sudo mount "${LOOPX}p${i}" "/tmp/mnt/p${i}" || {
+ echo "Mount failed"
+ _umount
+ break
+ }
+ sudo cp -rf "${INPUT_FILE}/mnt/p${i}/". "/tmp/mnt/p${i}" || {
+ echo "Copy failed"
+ _umount
+ break
+ }
+ sudo sync
+ _umount
+ done
+ sudo losetup --detach "${LOOPX}"
+ elif [ -f "${INPUT_FILE}" ]; then
+ _umount() {
+ for i in {1..3}; do
+ sudo mount | grep -q "/tmp/i/mnt/p${i}" || continue
+ sudo umount "/tmp/i/mnt/p${i}"
+ rm -rf "/tmp/i/mnt/p${i}"
+ done
+ for i in {1..3}; do
+ sudo mount | grep -q "/tmp/x/mnt/p${i}" || continue
+ sudo umount "/tmp/x/mnt/p${i}"
+ rm -rf "/tmp/x/mnt/p${i}"
+ done
+ }
+ LOOPI=$(sudo losetup -f)
+ sudo losetup -P "${LOOPI}" "${INPUT_FILE}"
+ LOOPX=$(sudo losetup -f)
+ sudo losetup -P "${LOOPX}" "${OUTPUT_FILE}"
+
+ for i in {1..3}; do
+ rm -rf "/tmp/i/mnt/p${i}" 2>/dev/null
+ mkdir -p "/tmp/i/mnt/p${i}"
+ rm -rf "/tmp/x/mnt/p${i}" 2>/dev/null
+ mkdir -p "/tmp/x/mnt/p${i}"
+ sudo mount "${LOOPI}p${i}" "/tmp/i/mnt/p${i}" || {
+ echo "Mount failed"
+ _umount
+ break
+ }
+ sudo mount "${LOOPX}p${i}" "/tmp/x/mnt/p${i}" || {
+ echo "Mount failed"
+ _umount
+ break
+ }
+ sudo cp -rf "/tmp/i/mnt/p${i}/". "/tmp/x/mnt/p${i}" || {
+ echo "Copy failed"
+ _umount
+ break
+ }
+ sudo sync
+ _umount
+ done
+ sudo losetup --detach "${LOOPX}"
+ sudo losetup --detach "${LOOPI}"
+ else
+ exit 1
+ fi
+}
+
# resizeimg
# $1 input file
# $2 changsize MB eg: +50M -50M
@@ -365,7 +450,7 @@ function createvmx() {
# Convert raw image to VMDK
rm -rf "VMX_${VMNAME}"
mkdir -p "VMX_${VMNAME}"
- qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicSparse,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk" # 'adapter_type=lsilogic,subformat=streamOptimized,compat6'
+ qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicSparse,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk" # 'adapter_type=lsilogic,subformat=streamOptimized,compat6'
qemu-img create -f vmdk "VMX_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
# Create VM configuration
diff --git a/scripts/pve.sh b/scripts/pve.sh
index 187a2272..8ef11a97 100755
--- a/scripts/pve.sh
+++ b/scripts/pve.sh
@@ -40,53 +40,53 @@ fi
eval set -- "$ARGS"
while true; do
case "$1" in
- --onboot)
- ONBOOT="$2"
- echo "$ONBOOT" | grep -qvE '^(0|1)$' && ONBOOT=1
- shift 2
- ;;
- --efi)
- EFI="$2"
- echo "$EFI" | grep -qvE '^(0|1)$' && EFI=1
- shift 2
- ;;
- --bltype)
- BLTYPE="$2"
- echo "$BLTYPE" | grep -qvE '^(sata|usb|nvme)$' && BLTYPE="sata"
- shift 2
- ;;
- --storage)
- STORAGE="$2"
- [ -n "${STORAGE}" ] && pvesm status -content images | grep -qw "^${STORAGE}" || STORAGE=""
- shift 2
- ;;
- --v9ppath)
- V9PPATH="$2"
- [ -d "${V9PPATH}" ] && V9PPATH="$(realpath "${V9PPATH}")" || V9PPATH=""
- shift 2
- ;;
- --vfsdirid)
- VFSDIRID="$2"
- [ -n "${VFSDIRID}" ] && pvesh ls /cluster/mapping/dir | grep -qw "${VFSDIRID}" || VFSDIRID=""
- shift 2
- ;;
- --tag)
- TAG="$(echo "$2" | sed 's/^[v|V]//g')"
- shift 2
- ;;
- --img)
- IMG="$2"
- [ -f "${IMG}" ] && IMG="$(realpath "${IMG}")" || IMG=""
- shift 2
- ;;
- --)
- shift
- break
- ;;
- *)
- usage
- exit 1
- ;;
+ --onboot)
+ ONBOOT="$2"
+ echo "$ONBOOT" | grep -qvE '^(0|1)$' && ONBOOT=1
+ shift 2
+ ;;
+ --efi)
+ EFI="$2"
+ echo "$EFI" | grep -qvE '^(0|1)$' && EFI=1
+ shift 2
+ ;;
+ --bltype)
+ BLTYPE="$2"
+ echo "$BLTYPE" | grep -qvE '^(sata|usb|nvme)$' && BLTYPE="sata"
+ shift 2
+ ;;
+ --storage)
+ STORAGE="$2"
+ [ -n "${STORAGE}" ] && pvesm status -content images | grep -qw "^${STORAGE}" || STORAGE=""
+ shift 2
+ ;;
+ --v9ppath)
+ V9PPATH="$2"
+ [ -d "${V9PPATH}" ] && V9PPATH="$(realpath "${V9PPATH}")" || V9PPATH=""
+ shift 2
+ ;;
+ --vfsdirid)
+ VFSDIRID="$2"
+ [ -n "${VFSDIRID}" ] && pvesh ls /cluster/mapping/dir | grep -qw "${VFSDIRID}" || VFSDIRID=""
+ shift 2
+ ;;
+ --tag)
+ TAG="$(echo "$2" | sed 's/^[v|V]//g')"
+ shift 2
+ ;;
+ --img)
+ IMG="$2"
+ [ -f "${IMG}" ] && IMG="$(realpath "${IMG}")" || IMG=""
+ shift 2
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
esac
done
@@ -140,7 +140,7 @@ echo "Creating VM with RR ... "
last_vmid=$(qm list | awk 'NR>1{print$1}' | sort -n | tail -1 2>/dev/null)
if [ -z "$last_vmid" ]; then
# 如果 last_vmid 是空字符串,说明没有VM,设置一个起始ID
- VMID=100
+ VMID=100
else
# 否则,在最后一个ID的基础上加1
VMID=$((last_vmid + 1))
@@ -182,20 +182,20 @@ if [ "${STATUS:-0}" -ne 0 ] || [ -z "${BLDISK}" ]; then
fi
[ -n "${IMG}" ] || rm -f "${IMG_PATH}"
case "${BLTYPE}" in
-usb)
- ARGS+="-device nec-usb-xhci,id=usb-bus0,multifunction=on -drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=usb1 -device usb-storage,bus=usb-bus0.0,port=1,drive=usb1,bootindex=999,removable=on "
- ;;
-nvme)
- ARGS+="-drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=nvme1 -device nvme,drive=nvme1,serial=nvme001 "
- ;;
-sata)
- qm set ${VMID} --sata$((SATAIDX++)) "${BLDISK}"
- ;;
-*)
- echo "Setting bootloader disk failed"
- qm destroy ${VMID} --purge
- exit 1
- ;;
+ usb)
+ ARGS+="-device nec-usb-xhci,id=usb-bus0,multifunction=on -drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=usb1 -device usb-storage,bus=usb-bus0.0,port=1,drive=usb1,bootindex=999,removable=on "
+ ;;
+ nvme)
+ ARGS+="-drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=nvme1 -device nvme,drive=nvme1,serial=nvme001 "
+ ;;
+ sata)
+ qm set ${VMID} --sata$((SATAIDX++)) "${BLDISK}"
+ ;;
+ *)
+ echo "Setting bootloader disk failed"
+ qm destroy ${VMID} --purge
+ exit 1
+ ;;
esac
X86_VENDOR=$(awk -F: '/vendor_id/ {gsub(/^[ \t]+/, "", $2); print $2; exit}' /proc/cpuinfo)