修复 更新RR后 无网络编译失败

This commit is contained in:
Ing 2025-03-05 17:01:06 +08:00
parent fdbd438efc
commit e67ce76a88

View File

@ -121,80 +121,87 @@ function backtitle() {
############################################################################### ###############################################################################
# Shows available models to user choose one # Shows available models to user choose one
function modelMenu() { function modelMenu() {
if [ -z "${1}" ]; then if [ -z "${1}" ] || [ -z "${2}" ]; then
DIALOG --title "$(TEXT "Model")" \ DIALOG --title "$(TEXT "Model")" \
--infobox "$(TEXT "Getting models ...")" 0 0 --infobox "$(TEXT "Getting models ...")" 0 0
fi
PS="$(readConfigEntriesArray "platforms" "${WORK_PATH}/platforms.yml" | sort)" rm -f "${TMP_PATH}/modellist"
MJ="$(python3 ${WORK_PATH}/include/functions.py getmodels -p "${PS[*]}")" PS="$(readConfigEntriesArray "platforms" "${WORK_PATH}/platforms.yml" | sort)"
MJ="$(python3 ${WORK_PATH}/include/functions.py getmodels -p "${PS[*]}")"
if [ "${MJ:-"[]"}" = "[]" ]; then if [ "${MJ:-"[]"}" = "[]" ]; then
DIALOG --title "$(TEXT "Model")" \
--msgbox "$(TEXT "Unable to connect to Synology website, Please check the network and try again, or use 'Parse Pat'!")" 0 0
return 1
fi
echo "${MJ}" | jq -r '.[] | "\(.name) \(.arch)"' >"${TMP_PATH}/modellist"
if [ -z "${1}" ]; then
RESTRICT=1
while true; do
rm -f "${TMP_PATH}/menu"
FLGNEX=0
IGPUPS=(apollolake geminilake)
IGPUID="$(lspci -nd ::300 2>/dev/null | grep "8086" | cut -d' ' -f3 | sed 's/://g')"
NVMEMS=(DS918+ RS1619xs+ DS419+ DS1019+ DS719+ DS1621xs+)
NVMEMD=$(find /sys/devices -type d -name nvme | awk -F'/' '{print NF}' | sort -n | tail -n1)
if [ -n "${IGPUID}" ]; then grep -iq "${IGPUID}" ${WORK_PATH}/i915ids && hasiGPU=1 || hasiGPU=2; else hasiGPU=0; fi
if [ ${NVMEMD:-0} -lt 6 ]; then hasNVME=0; elif [ ${NVMEMD:-0} -eq 6 ]; then hasNVME=1; else hasNVME=2; fi
[ $(lspci -d ::104 2>/dev/null | wc -l) -gt 0 -o $(lspci -d ::107 2>/dev/null | wc -l) -gt 0 ] && hasHBA=1 || hasHBA=0
while read -r M A; do
COMPATIBLE=1
if [ ${RESTRICT} -eq 1 ]; then
for F in $(readConfigArray "platforms.${A}.flags" "${WORK_PATH}/platforms.yml"); do
if ! grep -q "^flags.*${F}.*" /proc/cpuinfo; then
COMPATIBLE=0
FLGNEX=1
break
fi
done
fi
unset DT G N H
[ "$(readConfigKey "platforms.${A}.dt" "${WORK_PATH}/platforms.yml")" = "true" ] && DT="DT" || DT=""
[ -z "${G}" ] && [ ${hasiGPU} -eq 1 ] && echo "${IGPUPS[@]}" | grep -wq "${A}" && G="G"
[ -z "${G}" ] && [ ${hasiGPU} -eq 2 ] && echo "epyc7002" | grep -wq "${A}" && G="G"
[ -z "${N}" ] && [ ${hasNVME} -ne 0 ] && [ "${DT}" = "DT" ] && N="N"
[ -z "${N}" ] && [ ${hasNVME} -eq 2 ] && echo "${NVMEMS[@]}" | grep -wq "${M}" && N="N"
[ -z "${H}" ] && [ ${hasHBA} -eq 1 ] && [ ! "${DT}" = "DT" ] && H="H"
[ -z "${H}" ] && [ ${hasHBA} -eq 1 ] && echo "epyc7002" | grep -wq "${A}" && H="H"
[ ${COMPATIBLE} -eq 1 ] && printf "%s \"\Zb%-14s %-2s %-3s\Zn\" " "${M}" "${A}" "${DT}" "${G}${N}${H}" >>"${TMP_PATH}/menu"
done <"${TMP_PATH}/modellist"
[ ${FLGNEX} -eq 1 ] && echo "f \"\Z1$(TEXT "Disable flags restriction")\Zn\"" >>"${TMP_PATH}/menu"
MSG="$(TEXT "Choose the model")"
MSG+="\n\Z1$(TEXT "DT: Disk identification method is device tree")\Zn"
MSG+="\n\Z1$(TEXT "G: Support iGPU; N: Support NVMe; H: Support HBA")\Zn"
DIALOG --title "$(TEXT "Model")" \ DIALOG --title "$(TEXT "Model")" \
--menu "${MSG}" 0 0 20 --file "${TMP_PATH}/menu" \ --msgbox "$(TEXT "Unable to connect to Synology website, Please check the network and try again, or use 'Parse Pat'!")" 0 0
2>${TMP_PATH}/resp return 1
[ $? -ne 0 ] && return 0 fi
resp=$(cat ${TMP_PATH}/resp)
[ -z "${resp}" ] && return 1 echo "${MJ}" | jq -r '.[] | "\(.name) \(.arch)"' >"${TMP_PATH}/modellist"
if [ "${resp}" = "f" ]; then
RESTRICT=0 if [ -z "${1}" ]; then
continue RESTRICT=1
fi while true; do
break rm -f "${TMP_PATH}/menu"
done FLGNEX=0
IGPUPS=(apollolake geminilake)
IGPUID="$(lspci -nd ::300 2>/dev/null | grep "8086" | cut -d' ' -f3 | sed 's/://g')"
NVMEMS=(DS918+ RS1619xs+ DS419+ DS1019+ DS719+ DS1621xs+)
NVMEMD=$(find /sys/devices -type d -name nvme | awk -F'/' '{print NF}' | sort -n | tail -n1)
if [ -n "${IGPUID}" ]; then grep -iq "${IGPUID}" ${WORK_PATH}/i915ids && hasiGPU=1 || hasiGPU=2; else hasiGPU=0; fi
if [ ${NVMEMD:-0} -lt 6 ]; then hasNVME=0; elif [ ${NVMEMD:-0} -eq 6 ]; then hasNVME=1; else hasNVME=2; fi
[ "$(lspci -d ::104 2>/dev/null | wc -l)" -gt 0 -o "$(lspci -d ::107 2>/dev/null | wc -l)" -gt 0 ] && hasHBA=1 || hasHBA=0
while read -r M A; do
COMPATIBLE=1
if [ ${RESTRICT} -eq 1 ]; then
for F in $(readConfigArray "platforms.${A}.flags" "${WORK_PATH}/platforms.yml"); do
if ! grep -q "^flags.*${F}.*" /proc/cpuinfo; then
COMPATIBLE=0
FLGNEX=1
break
fi
done
fi
unset DT G N H
[ "$(readConfigKey "platforms.${A}.dt" "${WORK_PATH}/platforms.yml")" = "true" ] && DT="DT" || DT=""
[ -z "${G}" ] && [ ${hasiGPU} -eq 1 ] && echo "${IGPUPS[@]}" | grep -wq "${A}" && G="G"
[ -z "${G}" ] && [ ${hasiGPU} -eq 2 ] && echo "epyc7002" | grep -wq "${A}" && G="G"
[ -z "${N}" ] && [ ${hasNVME} -ne 0 ] && [ "${DT}" = "DT" ] && N="N"
[ -z "${N}" ] && [ ${hasNVME} -eq 2 ] && echo "${NVMEMS[@]}" | grep -wq "${M}" && N="N"
[ -z "${H}" ] && [ ${hasHBA} -eq 1 ] && [ ! "${DT}" = "DT" ] && H="H"
[ -z "${H}" ] && [ ${hasHBA} -eq 1 ] && echo "epyc7002" | grep -wq "${A}" && H="H"
[ ${COMPATIBLE} -eq 1 ] && printf "%s \"\Zb%-14s %-2s %-3s\Zn\" " "${M}" "${A}" "${DT}" "${G}${N}${H}" >>"${TMP_PATH}/menu"
done <"${TMP_PATH}/modellist"
[ ${FLGNEX} -eq 1 ] && echo "f \"\Z1$(TEXT "Disable flags restriction")\Zn\"" >>"${TMP_PATH}/menu"
MSG="$(TEXT "Choose the model")"
MSG+="\n\Z1$(TEXT "DT: Disk identification method is device tree")\Zn"
MSG+="\n\Z1$(TEXT "G: Support iGPU; N: Support NVMe; H: Support HBA")\Zn"
DIALOG --title "$(TEXT "Model")" \
--menu "${MSG}" 0 0 20 --file "${TMP_PATH}/menu" \
2>${TMP_PATH}/resp
[ $? -ne 0 ] && return 0
respM=$(cat ${TMP_PATH}/resp)
[ -z "${resp}" ] && return 1
if [ "${resp}" = "f" ]; then
RESTRICT=0
continue
fi
break
done
else
respM="${1}"
fi
respP="$(grep -w "${respM}" "${TMP_PATH}/modellist" 2>/dev/null | awk '{print $2}' | head -1)"
[ -z "${respP}" ] && return 1
else else
grep -wq "${1}" "${TMP_PATH}/modellist" || return 1 respM="${1}"
resp="${1}" respP="${2}"
fi fi
local BASEMODEL="${MODEL}" local BASEMODEL="${MODEL}"
MODEL="${resp}" local BASEPLATFORM="${PLATFORM}"
MODEL="${respM}"
writeConfigKey "model" "${MODEL}" "${USER_CONFIG_FILE}" writeConfigKey "model" "${MODEL}" "${USER_CONFIG_FILE}"
PLATFORM="$(grep -w "${MODEL}" "${TMP_PATH}/modellist" | awk '{print $2}' | head -1)" PLATFORM="${respP}"
writeConfigKey "platform" "${PLATFORM}" "${USER_CONFIG_FILE}" writeConfigKey "platform" "${PLATFORM}" "${USER_CONFIG_FILE}"
if [ "${MODEL}" != "${BASEMODEL}" ]; then if [ "${MODEL}" != "${BASEMODEL}" ]; then
@ -211,10 +218,10 @@ function modelMenu() {
SN="$(generateSerial "${MODEL}")" SN="$(generateSerial "${MODEL}")"
writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}" writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
NETIF_NUM=2 NETIF_NUM=2
MACS=($(generateMacAddress "${MODEL}" ${NETIF_NUM})) MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
for I in $(seq 1 ${NETIF_NUM}); do for I in $(seq 1 ${NETIF_NUM}); do
eval MAC${I}="${MACS[$((${I} - 1))]}" eval MAC${I}="$(echo ${MACS} | cut -d' ' -f${I})"
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}" writeConfigKey "mac${I}" "$(echo ${MACS} | cut -d' ' -f${I})" "${USER_CONFIG_FILE}"
done done
writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}" writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
@ -229,10 +236,10 @@ function modelMenu() {
fi fi
if [ -z "${MAC1}" ]; then if [ -z "${MAC1}" ]; then
NETIF_NUM=2 NETIF_NUM=2
MACS=($(generateMacAddress "${MODEL}" ${NETIF_NUM})) MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
for I in $(seq 1 ${NETIF_NUM}); do for I in $(seq 1 ${NETIF_NUM}); do
eval MAC${I}="${MACS[$((${I} - 1))]}" eval MAC${I}="$(echo ${MACS} | cut -d' ' -f${I})"
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}" writeConfigKey "mac${I}" "$(echo ${MACS} | cut -d' ' -f${I})" "${USER_CONFIG_FILE}"
done done
fi fi
fi fi
@ -439,10 +446,10 @@ function setConfigFromDSM() {
SN="$(generateSerial "${MODEL}")" SN="$(generateSerial "${MODEL}")"
writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}" writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
NETIF_NUM=2 NETIF_NUM=2
MACS=($(generateMacAddress "${MODEL}" ${NETIF_NUM})) MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
for I in $(seq 1 ${NETIF_NUM}); do for I in $(seq 1 ${NETIF_NUM}); do
eval MAC${I}="${MACS[$((${I} - 1))]}" eval MAC${I}="$(echo ${MACS} | cut -d' ' -f${I})"
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}" writeConfigKey "mac${I}" "$(echo ${MACS} | cut -d' ' -f${I})" "${USER_CONFIG_FILE}"
done done
writeConfigKey "productver" "${PRODUCTVER}" "${USER_CONFIG_FILE}" writeConfigKey "productver" "${PRODUCTVER}" "${USER_CONFIG_FILE}"
@ -1068,9 +1075,10 @@ function cmdlineMenu() {
# extra-button # extra-button
sn=$(generateSerial "${MODEL}") sn=$(generateSerial "${MODEL}")
NETIF_NUM=2 NETIF_NUM=2
MACS=($(generateMacAddress "${MODEL}" ${NETIF_NUM})) MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
mac1=${MACS[0]} for I in $(seq 1 ${NETIF_NUM}); do
mac2=${MACS[1]} eval mac${I}="$(echo ${MACS} | cut -d' ' -f${I})"
done
;; ;;
1) 1)
# cancel-button # cancel-button
@ -1434,7 +1442,7 @@ function make() {
echo "$(TEXT "Reconfigure after upgrade ...")" echo "$(TEXT "Reconfigure after upgrade ...")"
PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")" PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")" PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
modelMenu "${MODEL}" modelMenu "${MODEL}" "${PLATFORM}"
productversMenu "${PRODUCTVER}" "${PATURL}" "${PATSUM}" productversMenu "${PRODUCTVER}" "${PATURL}" "${PATSUM}"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo -e "$(TEXT "Reconfiguration failed!")" >"${LOG_FILE}" echo -e "$(TEXT "Reconfiguration failed!")" >"${LOG_FILE}"
@ -2346,7 +2354,7 @@ function cloneBootloaderDisk() {
--yesno "${MSG}" 0 0 --yesno "${MSG}" 0 0
[ $? -ne 0 ] && return [ $? -ne 0 ] && return
( while true; do
rm -f "${LOG_FILE}" rm -f "${LOG_FILE}"
rm -rf "${PART3_PATH}/dl" rm -rf "${PART3_PATH}/dl"
CLEARCACHE=0 CLEARCACHE=0
@ -2405,7 +2413,7 @@ function cloneBootloaderDisk() {
MSG="$(TEXT "Cloning failed due to insufficient remaining disk space on the selected hard drive.")" MSG="$(TEXT "Cloning failed due to insufficient remaining disk space on the selected hard drive.")"
echo "${MSG}" >"${LOG_FILE}" echo "${MSG}" >"${LOG_FILE}"
__umountNewBlDisk __umountNewBlDisk
break break 1
fi fi
for i in {1..3}; do for i in {1..3}; do
PART_NAME="$(eval "echo \${PART${i}_PATH}")" PART_NAME="$(eval "echo \${PART${i}_PATH}")"
@ -2419,7 +2427,8 @@ function cloneBootloaderDisk() {
sync sync
__umountNewBlDisk __umountNewBlDisk
sleep 3 sleep 3
) 2>&1 | DIALOG --title "$(TEXT "Settings")" \ break
done 2>&1 | DIALOG --title "$(TEXT "Settings")" \
--progressbox "$(TEXT "Cloning ...")" 20 100 --progressbox "$(TEXT "Cloning ...")" 20 100
if [ -f "${LOG_FILE}" ]; then if [ -f "${LOG_FILE}" ]; then
@ -2461,7 +2470,7 @@ function systemReport() {
function reportBugs() { function reportBugs() {
rm -rf "${TMP_PATH}/logs" "${TMP_PATH}/logs.tar.gz" rm -rf "${TMP_PATH}/logs" "${TMP_PATH}/logs.tar.gz"
MSG="" MSG=""
SYSLOG=0 FLAG_SYSLOG=0
DSMROOTS="$(findDSMRoot)" DSMROOTS="$(findDSMRoot)"
if [ -n "${DSMROOTS}" ]; then if [ -n "${DSMROOTS}" ]; then
mkdir -p "${TMP_PATH}/mdX" mkdir -p "${TMP_PATH}/mdX"
@ -2472,29 +2481,29 @@ function reportBugs() {
mkdir -p "${TMP_PATH}/logs/md0/log" mkdir -p "${TMP_PATH}/logs/md0/log"
cp -rf ${TMP_PATH}/mdX/.log.junior "${TMP_PATH}/logs/md0" 2>/dev/null cp -rf ${TMP_PATH}/mdX/.log.junior "${TMP_PATH}/logs/md0" 2>/dev/null
cp -rf ${TMP_PATH}/mdX/var/log/messages ${TMP_PATH}/mdX/var/log/*.log "${TMP_PATH}/logs/md0/log" 2>/dev/null cp -rf ${TMP_PATH}/mdX/var/log/messages ${TMP_PATH}/mdX/var/log/*.log "${TMP_PATH}/logs/md0/log" 2>/dev/null
SYSLOG=1 FLAG_SYSLOG=1
umount "${TMP_PATH}/mdX" umount "${TMP_PATH}/mdX"
done done
rm -rf "${TMP_PATH}/mdX" rm -rf "${TMP_PATH}/mdX"
fi fi
MSG+=$([ ${SYSLOG} -eq 1 ] && echo "$(TEXT "Find the system logs!\n")" || echo "$(TEXT "Not Find system logs!\n")") MSG+=$([ ${FLAG_SYSLOG} -eq 1 ] && echo "$(TEXT "Find the system logs!\n")" || echo "$(TEXT "Not Find system logs!\n")")
PSTORE=0 FLAG_PSTORE=0
if [ -n "$(ls /sys/fs/pstore 2>/dev/null)" ]; then if [ -n "$(ls /sys/fs/pstore 2>/dev/null)" ]; then
mkdir -p "${TMP_PATH}/logs/pstore" mkdir -p "${TMP_PATH}/logs/pstore"
cp -rf /sys/fs/pstore/* "${TMP_PATH}/logs/pstore" 2>/dev/null cp -rf /sys/fs/pstore/* "${TMP_PATH}/logs/pstore" 2>/dev/null
[ -n "$(ls /sys/fs/pstore/*.z 2>/dev/null)" ] && zlib-flate -uncompress </sys/fs/pstore/*.z >"${TMP_PATH}/logs/pstore/ps.log" 2>/dev/null [ -n "$(ls /sys/fs/pstore/*.z 2>/dev/null)" ] && zlib-flate -uncompress </sys/fs/pstore/*.z >"${TMP_PATH}/logs/pstore/ps.log" 2>/dev/null
PSTORE=1 FLAG_PSTORE=1
fi fi
MSG+=$([ ${PSTORE} -eq 1 ] && echo "$(TEXT "Find the pstore logs!\n")" || echo "$(TEXT "Not Find pstore logs!\n")") MSG+=$([ ${FLAG_PSTORE} -eq 1 ] && echo "$(TEXT "Find the pstore logs!\n")" || echo "$(TEXT "Not Find pstore logs!\n")")
ADDONS=0 FLAG_ADDONS=0
if [ -d "${PART1_PATH}/logs" ]; then if [ -d "${PART1_PATH}/logs" ]; then
mkdir -p "${TMP_PATH}/logs/addons" mkdir -p "${TMP_PATH}/logs/addons"
cp -rf "${PART1_PATH}/logs"/* "${TMP_PATH}/logs/addons" 2>/dev/null cp -rf "${PART1_PATH}/logs"/* "${TMP_PATH}/logs/addons" 2>/dev/null
ADDONS=1 FLAG_ADDONS=1
fi fi
if [ ${ADDONS} -eq 1 ]; then if [ ${FLAG_ADDONS} -eq 1 ]; then
MSG+="$(TEXT "Find the addons logs!\n")" MSG+="$(TEXT "Find the addons logs!\n")"
else else
MSG+="$(TEXT "Not Find addons logs!\n")" MSG+="$(TEXT "Not Find addons logs!\n")"
@ -2672,7 +2681,6 @@ function setStaticIP() {
function setWirelessAccount() { function setWirelessAccount() {
DIALOG --title "$(TEXT "Settings")" \ DIALOG --title "$(TEXT "Settings")" \
--infobox "$(TEXT "Scanning ...")" 0 0 --infobox "$(TEXT "Scanning ...")" 0 0
ITEM=$(iw wlan0 scan 2>/dev/null | grep SSID: | awk '{print $2}')
MSG="" MSG=""
MSG+="$(TEXT "Scanned SSIDs:\n")" MSG+="$(TEXT "Scanned SSIDs:\n")"
for I in $(iw wlan0 scan 2>/dev/null | grep SSID: | awk '{print $2}'); do MSG+="${I}\n"; done for I in $(iw wlan0 scan 2>/dev/null | grep SSID: | awk '{print $2}'); do MSG+="${I}\n"; done
@ -3602,6 +3610,7 @@ function updateRR() {
while IFS=': ' read -r KEY VALUE; do while IFS=': ' read -r KEY VALUE; do
VALUE="${VALUE#/}" # Remove leading slash VALUE="${VALUE#/}" # Remove leading slash
VALUE="${VALUE%/}" # Remove trailing slash VALUE="${VALUE%/}" # Remove trailing slash
[ -z "${VALUE}" ] && continue
if [ "${KEY: -1}" = "/" ]; then if [ "${KEY: -1}" = "/" ]; then
rm -rf "/${VALUE}/"* rm -rf "/${VALUE}/"*
mkdir -p "/${VALUE}/" mkdir -p "/${VALUE}/"
@ -3995,7 +4004,7 @@ function updateMenu() {
USER_FILE="" USER_FILE=""
rm -rf "${TMP_UP_PATH}" rm -rf "${TMP_UP_PATH}"
mkdir -p "${TMP_UP_PATH}" mkdir -p "${TMP_UP_PATH}"
pushd "${TMP_UP_PATH}" pushd "${TMP_UP_PATH}" 2>/dev/null || return
rz -be rz -be
for F in $(ls -A 2>/dev/null); do for F in $(ls -A 2>/dev/null); do
for I in ${EXTS[@]}; do for I in ${EXTS[@]}; do
@ -4003,7 +4012,7 @@ function updateMenu() {
done done
break break
done done
popd popd 2>/dev/null || return
if [ -z "${USER_FILE}" ]; then if [ -z "${USER_FILE}" ]; then
DIALOG --title "$(TEXT "Update")" \ DIALOG --title "$(TEXT "Update")" \
--msgbox "$(TEXT "Not a valid file, please try again!")" 0 0 --msgbox "$(TEXT "Not a valid file, please try again!")" 0 0
@ -4075,7 +4084,7 @@ function notepadMenu() {
############################################################################### ###############################################################################
############################################################################### ###############################################################################
if [ $# -ge 1 ]; then if [ $# -ge 1 ]; then
$@ "$@"
else else
if [ -z "${MODEL}" ] && [ -z "${PRODUCTVER}" ] && [ -n "$(findDSMRoot)" ]; then if [ -z "${MODEL}" ] && [ -z "${PRODUCTVER}" ] && [ -n "$(findDSMRoot)" ]; then
DIALOG --title "$(TEXT "Main menu")" \ DIALOG --title "$(TEXT "Main menu")" \