RR init 2

This commit is contained in:
Ing 2023-10-28 22:27:51 +08:00
parent a0e446c002
commit ab83c4b696
30 changed files with 2550 additions and 2199 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@ cache
files/initrd/opt/rr/lang/*.mo files/initrd/opt/rr/lang/*.mo
tests tests
/extractor /extractor
/br

View File

@ -1,18 +1,18 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
[ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. /opt/rr/include/functions.sh . ${WORK_PATH}/include/functions.sh
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
# Sanity check # Sanity check
loaderIsConfigured || die "$(TEXT "Loader is not configured!")" loaderIsConfigured || die "$(TEXT "Loader is not configured!")"
# Check if machine has EFI # Check if machine has EFI
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0 [ -d /sys/firmware/efi ] && EFI=1 || EFI=0
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)" BUS=$(getBus "${LOADER_DISK}")
BUS=$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2)
[ "${BUS}" = "ata" ] && BUS="sata"
# Print text centralized # Print text centralized
clear clear
@ -23,20 +23,15 @@ printf "\033[1;44m%*s\033[A\n" ${COLUMNS} ""
printf "\033[1;32m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" printf "\033[1;32m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
printf "\033[1;44m%*s\033[0m\n" ${COLUMNS} "" printf "\033[1;44m%*s\033[0m\n" ${COLUMNS} ""
TITLE="BOOTING:" TITLE="BOOTING:"
[ -d "/sys/firmware/efi" ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]" [ ${EFI} -eq 1 ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]"
[ "${BUS}" = "usb" ] && TITLE+=" [${BUS^^} flashdisk]" || TITLE+=" [${BUS^^} DoM]" [ "${BUS}" = "usb" ] && TITLE+=" [${BUS^^} flashdisk]" || TITLE+=" [${BUS^^} DoM]"
printf "\033[1;33m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" printf "\033[1;33m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
DSMLOGO="$(readConfigKey "dsmlogo" "${USER_CONFIG_FILE}")"
if [ "${DSMLOGO}" = "true" -a -c "/dev/fb0" -a -f "${CACHE_PATH}/logo.png" ]; then
echo | fbv -acuf "${CACHE_PATH}/logo.png" >/dev/null 2>/dev/null || true
fi
# Check if DSM zImage changed, patch it if necessary # Check if DSM zImage changed, patch it if necessary
ZIMAGE_HASH="$(readConfigKey "zimage-hash" "${USER_CONFIG_FILE}")" ZIMAGE_HASH="$(readConfigKey "zimage-hash" "${USER_CONFIG_FILE}")"
if [ "$(sha256sum "${ORI_ZIMAGE_FILE}" | awk '{print$1}')" != "${ZIMAGE_HASH}" ]; then if [ -f ${PART1_PATH}/.build -o "$(sha256sum "${ORI_ZIMAGE_FILE}" | awk '{print$1}')" != "${ZIMAGE_HASH}" ]; then
echo -e "\033[1;43m$(TEXT "DSM zImage changed")\033[0m" echo -e "\033[1;43m$(TEXT "DSM zImage changed")\033[0m"
/opt/rr/zimage-patch.sh ${WORK_PATH}/zimage-patch.sh
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \
--msgbox "$(TEXT "zImage not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 12 70 --msgbox "$(TEXT "zImage not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 12 70
@ -47,9 +42,9 @@ fi
# Check if DSM ramdisk changed, patch it if necessary # Check if DSM ramdisk changed, patch it if necessary
RAMDISK_HASH="$(readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}")" RAMDISK_HASH="$(readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}")"
RAMDISK_HASH_CUR="$(sha256sum "${ORI_RDGZ_FILE}" | awk '{print $1}')" RAMDISK_HASH_CUR="$(sha256sum "${ORI_RDGZ_FILE}" | awk '{print $1}')"
if [ "${RAMDISK_HASH_CUR}" != "${RAMDISK_HASH}" ]; then if [ -f ${PART1_PATH}/.build -o "${RAMDISK_HASH_CUR}" != "${RAMDISK_HASH}" ]; then
echo -e "\033[1;43m$(TEXT "DSM Ramdisk changed")\033[0m" echo -e "\033[1;43m$(TEXT "DSM Ramdisk changed")\033[0m"
/opt/rr/ramdisk-patch.sh ${WORK_PATH}/ramdisk-patch.sh
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \
--msgbox "$(TEXT "Ramdisk not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 12 70 --msgbox "$(TEXT "Ramdisk not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 12 70
@ -58,6 +53,7 @@ if [ "${RAMDISK_HASH_CUR}" != "${RAMDISK_HASH}" ]; then
# Update SHA256 hash # Update SHA256 hash
writeConfigKey "ramdisk-hash" "${RAMDISK_HASH_CUR}" "${USER_CONFIG_FILE}" writeConfigKey "ramdisk-hash" "${RAMDISK_HASH_CUR}" "${USER_CONFIG_FILE}"
fi fi
[ -f ${PART1_PATH}/.build ] && rm -f ${PART1_PATH}/.build
# Load necessary variables # Load necessary variables
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")" MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
@ -77,20 +73,20 @@ echo -e "$(TEXT "DMI: ") \033[1;36m${DMI}\033[0m"
echo -e "$(TEXT "CPU: ") \033[1;36m${CPU}\033[0m" echo -e "$(TEXT "CPU: ") \033[1;36m${CPU}\033[0m"
echo -e "$(TEXT "MEM: ") \033[1;36m${MEM}\033[0m" echo -e "$(TEXT "MEM: ") \033[1;36m${MEM}\033[0m"
if [ ! -f "${MODEL_CONFIG_PATH}/${MODEL}.yml" ] || [ -z "$(readConfigKey "productvers.[${PRODUCTVER}]" "${MODEL_CONFIG_PATH}/${MODEL}.yml")" ]; then if [ ! -f "${WORK_PATH}/model-configs/${MODEL}.yml" ] || [ -z "$(readModelKey ${MODEL} "productvers.[${PRODUCTVER}]")" ]; then
echo -e "\033[1;33m*** $(printf "$(TEXT "The current version of bootloader does not support booting %s-%s, please upgrade and rebuild.")" "${MODEL}" "${PRODUCTVER}") ***\033[0m" echo -e "\033[1;33m*** $(printf "$(TEXT "The current version of bootloader does not support booting %s-%s, please upgrade and rebuild.")" "${MODEL}" "${PRODUCTVER}") ***\033[0m"
exit 1 exit 1
fi fi
HASATA=0 HASATA=0
for D in $(lsblk -dnp -o name); do for D in $(lsblk -dpno NAME); do
[ "${D}" = "${LOADER_DISK}" ] && continue [ "${D}" = "${LOADER_DISK}" ] && continue
if [ "$(udevadm info --query property --name ${D} | grep ID_BUS | cut -d= -f2)" = "ata" ]; then if [ "$(getBus "${D}")" = "sata" -o "$(getBus "${D}")" = "scsi" ]; then
HASATA=1 HASATA=1
break break
fi fi
done done
[ ${HASATA} = "0" ] && echo -e "\033[1;33m*** $(TEXT "Please insert at least one sata disk for system installation, except for the bootloader disk.") ***\033[0m" [ ${HASATA} = "0" ] && echo -e "\033[1;33m*** $(TEXT "Please insert at least one sata/scsi disk for system installation, except for the bootloader disk.") ***\033[0m"
VID="$(readConfigKey "vid" "${USER_CONFIG_FILE}")" VID="$(readConfigKey "vid" "${USER_CONFIG_FILE}")"
PID="$(readConfigKey "pid" "${USER_CONFIG_FILE}")" PID="$(readConfigKey "pid" "${USER_CONFIG_FILE}")"
@ -98,6 +94,8 @@ SN="$(readConfigKey "sn" "${USER_CONFIG_FILE}")"
MAC1="$(readConfigKey "mac1" "${USER_CONFIG_FILE}")" MAC1="$(readConfigKey "mac1" "${USER_CONFIG_FILE}")"
KERNELPANIC="$(readConfigKey "kernelpanic" "${USER_CONFIG_FILE}")" KERNELPANIC="$(readConfigKey "kernelpanic" "${USER_CONFIG_FILE}")"
NETIFNUM=$(ls /sys/class/net/ | grep eth | wc -l); [ ${NETIFNUM} -eq 0 ] && NETIFNUM=1
declare -A CMDLINE declare -A CMDLINE
# Automatic values # Automatic values
@ -108,7 +106,7 @@ CMDLINE['vid']="${VID}"
CMDLINE['pid']="${PID}" CMDLINE['pid']="${PID}"
CMDLINE['sn']="${SN}" CMDLINE['sn']="${SN}"
CMDLINE['mac1']="${MAC1}" CMDLINE['mac1']="${MAC1}"
CMDLINE['netif_num']="1" CMDLINE['netif_num']="${NETIFNUM}"
# set fixed cmdline # set fixed cmdline
if grep -q "force_junior" /proc/cmdline; then if grep -q "force_junior" /proc/cmdline; then
@ -120,8 +118,7 @@ else
CMDLINE['noefi']="" CMDLINE['noefi']=""
fi fi
if [ ! "${BUS}" = "usb" ]; then if [ ! "${BUS}" = "usb" ]; then
LOADER_DEVICE_NAME=$(echo ${LOADER_DISK} | sed 's|/dev/||') SIZE=$(($(cat /sys/block/${LOADER_DISK/\/dev\//}/size) / 2048 + 10))
SIZE=$(($(cat /sys/block/${LOADER_DEVICE_NAME}/size) / 2048 + 10))
# Read SATADoM type # Read SATADoM type
DOM="$(readModelKey "${MODEL}" "dom")" DOM="$(readModelKey "${MODEL}" "dom")"
CMDLINE['synoboot_satadom']="${DOM}" CMDLINE['synoboot_satadom']="${DOM}"
@ -204,7 +201,7 @@ else
break break
fi fi
COUNT=$((${COUNT} + 1)) COUNT=$((${COUNT} + 1))
IP=$(ip route show dev ${ETHX[${N}]} 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') IP="$(getIP ${ETHX[${N}]})"
if [ -n "${IP}" ]; then if [ -n "${IP}" ]; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(printf "$(TEXT "Access \033[1;34mhttp://%s:5000\033[0m to connect the DSM via web.")" "${IP}")\n" echo -en "\r${ETHX[${N}]}(${DRIVER}): $(printf "$(TEXT "Access \033[1;34mhttp://%s:5000\033[0m to connect the DSM via web.")" "${IP}")\n"
break break
@ -234,6 +231,14 @@ else
echo -e "\033[1;37m$(TEXT "Loading DSM kernel...")\033[0m" echo -e "\033[1;37m$(TEXT "Loading DSM kernel...")\033[0m"
DSMLOGO="$(readConfigKey "dsmlogo" "${USER_CONFIG_FILE}")"
if [ "${DSMLOGO}" = "true" -a -c "/dev/fb0" ]; then
IP="$(getIP)"
[ -n "${IP}" ] && URL="http://${IP}:5000" || URL="http://find.synology.com/"
python ${WORK_PATH}/include/functions.py makeqr -d "${URL}" -l "br" -o "${TMP_PATH}/qrcode.png"
[ -f "${TMP_PATH}/qrcode.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode.png" >/dev/null 2>/dev/null || true
fi
# Executes DSM kernel via KEXEC # Executes DSM kernel via KEXEC
KVER=$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver") KVER=$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")
if [ "${KVER:0:1}" = "3" -a ${EFI} -eq 1 ]; then if [ "${KVER:0:1}" = "3" -a ${EFI} -eq 1 ]; then
@ -244,7 +249,7 @@ else
fi fi
echo -e "\033[1;37m$(TEXT "Booting...")\033[0m" echo -e "\033[1;37m$(TEXT "Booting...")\033[0m"
for T in $(w | grep -v "TTY" | awk -F' ' '{print $2}'); do for T in $(w | grep -v "TTY" | awk -F' ' '{print $2}'); do
echo -e "\n\033[1;43m$(TEXT "[This interface will not be operational.\nPlease wait for a few minutes before using the http://find.synology.com/ or Synology Assistant find DSM and connect.]")\033[0m\n" >"/dev/${T}" 2>/dev/null || true echo -e "\n\033[1;43m$(TEXT "[This interface will not be operational. Please wait a few minutes.\nFind DSM via http://find.synology.com/ or Synology Assistant and connect.]")\033[0m\n" >"/dev/${T}" 2>/dev/null || true
done done
KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")" KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")"
[ "${KERNELWAY}" = "kexec" ] && kexec -f -e || poweroff [ "${KERNELWAY}" = "kexec" ] && kexec -f -e || poweroff

View File

@ -53,7 +53,7 @@ function installAddon() {
[ ${HAS_FILES} -ne 1 ] && return 1 [ ${HAS_FILES} -ne 1 ] && return 1
cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}" || dieLog cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}" || dieLog
chmod +x "${RAMDISK_PATH}/addons/${ADDON}.sh" chmod +x "${RAMDISK_PATH}/addons/${ADDON}.sh"
[ -d ${TMP_PATH}/${ADDON}/root ] && (cp -Rf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}" || dieLog) [ -d ${TMP_PATH}/${ADDON}/root ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}" || dieLog)
rm -rf "${TMP_PATH}/${ADDON}" rm -rf "${TMP_PATH}/${ADDON}"
return 0 return 0
} }
@ -72,3 +72,16 @@ function untarAddon() {
mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${ADDON}" mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${ADDON}"
echo "${ADDON}" echo "${ADDON}"
} }
###############################################################################
# Detect if has new local plugins to install/reinstall
function updateAddons() {
for F in $(ls ${PART3_PATH}/*.addon 2>/dev/null); do
ADDON=$(basename "${F}" | sed 's|.addon||')
rm -rf "${ADDONS_PATH}/${ADDON}"
mkdir -p "${ADDONS_PATH}/${ADDON}"
echo "Installing ${F} to ${ADDONS_PATH}/${ADDON}"
tar -xaf "${F}" -C "${ADDONS_PATH}/${ADDON}"
rm -f "${F}"
done
}

View File

@ -25,6 +25,15 @@ function readConfigKey() {
[ "${RESULT}" == "null" ] && echo "" || echo ${RESULT} [ "${RESULT}" == "null" ] && echo "" || echo ${RESULT}
} }
###############################################################################
# Write to yaml config file if key not exists
# 1 - Path of Key
# 2 - Value
# 3 - Path of yaml config file
function initConfigKey() {
[ -z "$(readConfigKey "${1}" "${3}")" ] && writeConfigKey "${1}" "${2}" "${3}" || true
}
############################################################################### ###############################################################################
# Read Entries as map(key=value) from yaml config file # Read Entries as map(key=value) from yaml config file
# 1 - Path of key # 1 - Path of key

View File

@ -1,27 +1,30 @@
RR_VERSION="23.10.4" RR_VERSION="23.10.4"
RR_TITLE="rr v${RR_VERSION}" RR_TITLE="RR v${RR_VERSION}"
# Define paths # Define paths
PART1_PATH="/mnt/p1"
PART2_PATH="/mnt/p2"
PART3_PATH="/mnt/p3"
DSMROOT_PATH="/mnt/dsmroot"
TMP_PATH="/tmp" TMP_PATH="/tmp"
UNTAR_PAT_PATH="${TMP_PATH}/pat" UNTAR_PAT_PATH="${TMP_PATH}/pat"
RAMDISK_PATH="${TMP_PATH}/ramdisk" RAMDISK_PATH="${TMP_PATH}/ramdisk"
LOG_FILE="${TMP_PATH}/log.txt" LOG_FILE="${TMP_PATH}/log.txt"
USER_CONFIG_FILE="${BOOTLOADER_PATH}/user-config.yml" USER_CONFIG_FILE="${PART1_PATH}/user-config.yml"
GRUB_PATH="${BOOTLOADER_PATH}/boot/grub" GRUB_PATH="${PART1_PATH}/boot/grub"
ORI_ZIMAGE_FILE="${SLPART_PATH}/zImage" ORI_ZIMAGE_FILE="${PART2_PATH}/zImage"
ORI_RDGZ_FILE="${SLPART_PATH}/rd.gz" ORI_RDGZ_FILE="${PART2_PATH}/rd.gz"
RR_BZIMAGE_FILE="${CACHE_PATH}/bzImage-rr" RR_BZIMAGE_FILE="${PART3_PATH}/bzImage-rr"
RR_RAMDISK_FILE="${CACHE_PATH}/initrd-rr" RR_RAMDISK_FILE="${PART3_PATH}/initrd-rr"
MOD_ZIMAGE_FILE="${CACHE_PATH}/zImage-dsm" MOD_ZIMAGE_FILE="${PART3_PATH}/zImage-dsm"
MOD_RDGZ_FILE="${CACHE_PATH}/initrd-dsm" MOD_RDGZ_FILE="${PART3_PATH}/initrd-dsm"
ADDONS_PATH="${CACHE_PATH}/addons"
LKM_PATH="${CACHE_PATH}/lkms"
MODULES_PATH="${CACHE_PATH}/modules"
USER_UP_PATH="${CACHE_PATH}/users"
MODEL_CONFIG_PATH="/opt/rr/model-configs" LKM_PATH="${PART3_PATH}/lkms"
INCLUDE_PATH="/opt/rr/include" ADDONS_PATH="${PART3_PATH}/addons"
PATCH_PATH="/opt/rr/patch" MODULES_PATH="${PART3_PATH}/modules"
USER_UP_PATH="${PART3_PATH}/users"

View File

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
import os, click
WORK_PATH = os.path.abspath(os.path.dirname(__file__))
@click.group()
def cli():
"""
The CLI is a commands to arpl.
"""
pass
@cli.command()
@click.option('-d', "--data", type=str, required=True, help="The data of QRCode.")
@click.option('-l', "--location", type=str, required=True, help="The location of QRCode. (tl, tr, bl, br, mid)")
@click.option('-o', "--output", type=str, required=True, help="The output file of QRCode.")
def makeqr(data, location, output):
"""
Generate a QRCode.
"""
import qrcode
from PIL import Image
qr = qrcode.QRCode(version=1, box_size=10, error_correction=qrcode.constants.ERROR_CORRECT_H, border=4)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color="purple", back_color="white")
img = img.convert("RGBA")
pixels = img.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if pixels[i, j] == (255, 255, 255, 255):
pixels[i, j] = (255, 255, 255, 0)
if os.path.exists(os.path.join(WORK_PATH, "logo.png")):
icon = Image.open(os.path.join(WORK_PATH, "logo.png"))
icon = icon.convert("RGBA")
img.paste(icon.resize((int(img.size[0] / 5), int(img.size[1] / 5))), (int((img.size[0] - int(img.size[0] / 5)) / 2), int((img.size[1] - int(img.size[1] / 5)) / 2)))
alpha = Image.new("RGBA", (img.size[0] * 4, img.size[1] * 3), (0, 0, 0, 0))
if location == "tl":
loc = (0, 0)
elif location == "tr":
loc = (alpha.size[0] - img.size[0], 0)
elif location == "bl":
loc = (0, alpha.size[1] - img.size[1])
elif location == "br":
loc = (alpha.size[0] - img.size[0], alpha.size[1] - img.size[1])
else: # elif location == "mid":
loc = (int((alpha.size[0] - img.size[0]) / 2), int((alpha.size[1] - img.size[1]) / 2))
alpha.paste(img, loc)
alpha.save(output)
if __name__ == "__main__":
cli()

View File

@ -1,6 +1,9 @@
. /opt/rr/include/i18n.sh
. /opt/rr/include/consts.sh [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
. /opt/rr/include/configFile.sh
. ${WORK_PATH}/include/consts.sh
. ${WORK_PATH}/include/configFile.sh
. ${WORK_PATH}/include/i18n.sh
############################################################################### ###############################################################################
# Read key value from model config file # Read key value from model config file
@ -8,7 +11,7 @@
# 2 - Key # 2 - Key
# Return Value # Return Value
function readModelKey() { function readModelKey() {
readConfigKey "${2}" "${MODEL_CONFIG_PATH}/${1}.yml" readConfigKey "${2}" "${WORK_PATH}/model-configs/${1}.yml"
} }
############################################################################### ###############################################################################
@ -17,7 +20,7 @@ function readModelKey() {
# 2 - Path of key # 2 - Path of key
# Returns map of values # Returns map of values
function readModelMap() { function readModelMap() {
readConfigMap "${2}" "${MODEL_CONFIG_PATH}/${1}.yml" readConfigMap "${2}" "${WORK_PATH}/model-configs/${1}.yml"
} }
############################################################################### ###############################################################################
@ -26,7 +29,7 @@ function readModelMap() {
# 2 - Path of key # 2 - Path of key
# Returns array/map of values # Returns array/map of values
function readModelArray() { function readModelArray() {
readConfigArray "${2}" "${MODEL_CONFIG_PATH}/${1}.yml" readConfigArray "${2}" "${WORK_PATH}/model-configs/${1}.yml"
} }
############################################################################### ###############################################################################
@ -239,37 +242,81 @@ EOF
fi fi
ETHLIST="$(echo -e "${ETHLIST}" | grep -v '^$')" ETHLIST="$(echo -e "${ETHLIST}" | grep -v '^$')"
echo -e "${ETHLIST}" > /tmp/ethlist echo -e "${ETHLIST}" >${TMP_PATH}/ethlist
# cat /tmp/ethlist # cat ${TMP_PATH}/ethlist
# sort # sort
IDX=0 IDX=0
while true; do while true; do
# cat /tmp/ethlist # cat ${TMP_PATH}/ethlist
[ ${IDX} -ge $(wc -l < /tmp/ethlist) ] && break [ ${IDX} -ge $(wc -l <${TMP_PATH}/ethlist) ] && break
ETH=$(cat /tmp/ethlist | sed -n "$((${IDX} + 1))p" | awk '{print $3}') ETH=$(cat ${TMP_PATH}/ethlist | sed -n "$((${IDX} + 1))p" | awk '{print $3}')
# echo "ETH: ${ETH}" # echo "ETH: ${ETH}"
if [ -n "${ETH}" ] && [ ! "${ETH}" = "eth${IDX}" ]; then if [ -n "${ETH}" ] && [ ! "${ETH}" = "eth${IDX}" ]; then
# echo "change ${ETH} <=> eth${IDX}" # echo "change ${ETH} <=> eth${IDX}"
ip link set dev eth${IDX} down ip link set dev eth${IDX} down
ip link set dev ${ETH} down ip link set dev ${ETH} down
sleep 1 sleep 1
ip link set dev eth${IDX} name tmp ip link set dev eth${IDX} name ethN
ip link set dev ${ETH} name eth${IDX} ip link set dev ${ETH} name eth${IDX}
ip link set dev tmp name ${ETH} ip link set dev ethN name ${ETH}
sleep 1 sleep 1
ip link set dev eth${IDX} up ip link set dev eth${IDX} up
ip link set dev ${ETH} up ip link set dev ${ETH} up
sleep 1 sleep 1
sed -i "s/eth${IDX}/tmp/" /tmp/ethlist sed -i "s/eth${IDX}/ethN/" ${TMP_PATH}/ethlist
sed -i "s/${ETH}/eth${IDX}/" /tmp/ethlist sed -i "s/${ETH}/eth${IDX}/" ${TMP_PATH}/ethlist
sed -i "s/tmp/${ETH}/" /tmp/ethlist sed -i "s/ethN/${ETH}/" ${TMP_PATH}/ethlist
sleep 1 sleep 1
fi fi
IDX=$((${IDX} + 1)) IDX=$((${IDX} + 1))
done done
rm -f /tmp/ethlist rm -f ${TMP_PATH}/ethlist
}
###############################################################################
# get bus of disk
# 1 - device path
function getBus() {
BUS=""
# usb/ata(sata/ide)/scsi
[ -z "${BUS}" ] && BUS=$(udevadm info --query property --name "${1}" 2>/dev/null | grep ID_BUS | cut -d= -f2 | sed 's/ata/sata/')
# usb/sata(sata/ide)/nvme
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,TRAN 2>/dev/null | grep "${1}" | awk '{print $2}')
# usb/scsi(sata/ide)/virtio(scsi/virtio)/nvme
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep "${1}" | awk -F':' '{print $(NF-1)}')
echo "${BUS}"
}
###############################################################################
# get IP
# 1 - ethN
function getIP() {
IP=""
if [ -n "${1}" -a -d "/sys/class/net/${1}" ]; then
IP=$(ip route show dev ${1} 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p')
[ -z "${IP}" ] && IP=$(ip addr show ${1} | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1)
else
IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1)
[ -z "${IP}" ] && IP=$(ip addr show | grep -E "inet .* eth" | awk '{print $2}' | cut -f1 -d'/' | head -1)
fi
echo "${IP}"
}
###############################################################################
# get logo of model
# 1 - model
function getLogo() {
MODEL="${1}"
rm -f "${PART3_PATH}/logo.png"
fastest=$(_get_fastest "www.synology.com" "www.synology.cn")
STATUS=$(curl -skL -w "%{http_code}" "https://${fastest}/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png")
if [ $? -ne 0 -o ${STATUS} -ne 200 -o -f "${PART3_PATH}/logo.png" ]; then
convert -rotate 180 "${PART3_PATH}/logo.png" "${PART3_PATH}/logo.png" 2>/dev/null
magick montage "${PART3_PATH}/logo.png" -background 'none' -tile '3x3' -geometry '350x210' "${PART3_PATH}/logo.png" 2>/dev/null
convert -rotate 180 "${PART3_PATH}/logo.png" "${PART3_PATH}/logo.png" 2>/dev/null
fi
} }
############################################################################### ###############################################################################
@ -277,7 +324,7 @@ EOF
# (based on pocopico's TCRP code) # (based on pocopico's TCRP code)
function findAndMountDSMRoot() { function findAndMountDSMRoot() {
[ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -gt 0 ] && return 0 [ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -gt 0 ] && return 0
dsmrootdisk="$(blkid /dev/sd* | grep -i raid | awk '{print $1 " " $4}' | grep UUID | grep sd[a-z]1 | head -1 | awk -F ":" '{print $1}')" dsmrootdisk="$(blkid | grep -i linux_raid_member | grep /dev/.*1: | head -1)"
[ -z "${dsmrootdisk}" ] && return -1 [ -z "${dsmrootdisk}" ] && return -1
[ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ] && mount -t ext4 "${dsmrootdisk}" "${DSMROOT_PATH}" [ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ] && mount -t ext4 "${dsmrootdisk}" "${DSMROOT_PATH}"
if [ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ]; then if [ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ]; then
@ -286,3 +333,16 @@ function findAndMountDSMRoot() {
fi fi
return 0 return 0
} }
###############################################################################
# Rebooting
# (based on pocopico's TCRP code)
function rebootTo() {
[ "${1}" != "junior" -a "${1}" != "config" ] && exit 1
# echo "Rebooting to ${1} mode"
GRUBPATH="$(dirname $(find ${PART1_PATH}/ -name grub.cfg | head -1))"
ENVFILE="${GRUBPATH}/grubenv"
[ ! -f "${ENVFILE}" ] && grub-editenv ${ENVFILE} create
grub-editenv ${ENVFILE} set next_entry="${1}"
reboot
}

View File

@ -1,6 +1,19 @@
if [ -f ${BOOTLOADER_PATH}/.locale ]; then [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
export LANG="$(cat ${BOOTLOADER_PATH}/.locale)"
fi
alias TEXT='gettext "rr"' if [ -d "/usr/share/locale" ]; then
shopt -s expand_aliases if [ $(ls ${WORK_PATH}/lang/*.mo 2>/dev/null | wc -l) -gt 0 ]; then
for F in $(ls ${WORK_PATH}/lang/*.mo); do
install "${F}" "/usr/share/locale/$(basename "${F}" .mo)/LC_MESSAGES/rr.mo"
done
fi
if [ -f ${PART1_PATH}/.locale ]; then
export LANG="$(cat ${PART1_PATH}/.locale)"
fi
alias TEXT='gettext "rr"'
shopt -s expand_aliases
else
alias TEXT='echo'
shopt -s expand_aliases
fi

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,71 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
[ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. /opt/rr/include/functions.sh . ${WORK_PATH}/include/functions.sh
. ${WORK_PATH}/include/addons.sh
# Wait kernel enumerate the disks [ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
CNT=3
while true; do
[ ${CNT} -eq 0 ] && break
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)"
[ -n "${LOADER_DISK}" ] && break
CNT=$((${CNT} - 1))
sleep 1
done
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader disk not found!")"
NUM_PARTITIONS=$(blkid | grep "${LOADER_DISK}[0-9]\+" | cut -d: -f1 | wc -l)
[ ${NUM_PARTITIONS} -lt 3 ] && die "$(TEXT "Loader disk seems to be damaged!")"
[ ${NUM_PARTITIONS} -gt 3 ] && die "$(TEXT "There are multiple loader disks, please insert only one loader disk!")"
# Check partitions and ignore errors
fsck.vfat -aw ${LOADER_DISK}1 >/dev/null 2>&1 || true
fsck.ext2 -p ${LOADER_DISK}2 >/dev/null 2>&1 || true
fsck.ext4 -p ${LOADER_DISK}3 >/dev/null 2>&1 || true
# Make folders to mount partitions
mkdir -p ${BOOTLOADER_PATH}
mkdir -p ${SLPART_PATH}
mkdir -p ${CACHE_PATH}
mkdir -p ${DSMROOT_PATH}
# Mount the partitions
mount ${LOADER_DISK}1 ${BOOTLOADER_PATH} || die "$(printf "$(TEXT "Can't mount %s")" "${BOOTLOADER_PATH}")"
mount ${LOADER_DISK}2 ${SLPART_PATH} || die "$(printf "$(TEXT "Can't mount %s")" "${SLPART_PATH}")"
mount ${LOADER_DISK}3 ${CACHE_PATH} || die "$(printf "$(TEXT "Can't mount %s")" "${CACHE_PATH}")"
# Although i18n.sh is included in functions.sh, but i18n.sh dependent ${BOOTLOADER_PATH}/${LOADER_DISK}1, so need to call it again.
. /opt/rr/include/i18n.sh
# Shows title # Shows title
clear clear
[ -z "${COLUMNS}" ] && COLUMNS=50
TITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}")" TITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}")"
printf "\033[1;44m%*s\n" ${COLUMNS} "" printf "\033[1;44m%*s\n" ${COLUMNS} ""
printf "\033[1;44m%*s\033[A\n" ${COLUMNS} "" printf "\033[1;44m%*s\033[A\n" ${COLUMNS} ""
printf "\033[1;32m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}" printf "\033[1;32m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
printf "\033[1;44m%*s\033[0m\n" ${COLUMNS} "" printf "\033[1;44m%*s\033[0m\n" ${COLUMNS} ""
# Move/link SSH machine keys to/from cache volume
[ ! -d "${CACHE_PATH}/ssh" ] && cp -R "/etc/ssh" "${CACHE_PATH}/ssh"
rm -rf "/etc/ssh"
ln -s "${CACHE_PATH}/ssh" "/etc/ssh"
# Link bash history to cache volume
rm -rf ~/.bash_history
ln -s ${CACHE_PATH}/.bash_history ~/.bash_history
touch ~/.bash_history
if ! grep -q "menu.sh" ~/.bash_history; then
echo "menu.sh " >>~/.bash_history
fi
# Check if exists directories into P3 partition, if yes remove and link it
if [ -d "${CACHE_PATH}/model-configs" ]; then
rm -rf "${MODEL_CONFIG_PATH}"
ln -s "${CACHE_PATH}/model-configs" "${MODEL_CONFIG_PATH}"
fi
if [ -d "${CACHE_PATH}/patch" ]; then
rm -rf "${PATCH_PATH}"
ln -s "${CACHE_PATH}/patch" "${PATCH_PATH}"
fi
# Get first MAC address # Get first MAC address
ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list
# No network devices # No network devices
@ -74,36 +25,36 @@ ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list
# If user config file not exists, initialize it # If user config file not exists, initialize it
if [ ! -f "${USER_CONFIG_FILE}" ]; then if [ ! -f "${USER_CONFIG_FILE}" ]; then
touch "${USER_CONFIG_FILE}" touch "${USER_CONFIG_FILE}"
writeConfigKey "lkm" "prod" "${USER_CONFIG_FILE}"
writeConfigKey "dsmlogo" "true" "${USER_CONFIG_FILE}"
writeConfigKey "directboot" "false" "${USER_CONFIG_FILE}"
writeConfigKey "prerelease" "false" "${USER_CONFIG_FILE}"
writeConfigKey "bootwait" "10" "${USER_CONFIG_FILE}"
writeConfigKey "bootipwait" "10" "${USER_CONFIG_FILE}"
writeConfigKey "kernelway" "power" "${USER_CONFIG_FILE}"
writeConfigKey "kernelpanic" "5" "${USER_CONFIG_FILE}"
writeConfigKey "odp" "false" "${USER_CONFIG_FILE}"
writeConfigKey "model" "" "${USER_CONFIG_FILE}"
writeConfigKey "productver" "" "${USER_CONFIG_FILE}"
writeConfigKey "buildnum" "" "${USER_CONFIG_FILE}"
writeConfigKey "smallnum" "" "${USER_CONFIG_FILE}"
writeConfigKey "paturl" "" "${USER_CONFIG_FILE}"
writeConfigKey "patsum" "" "${USER_CONFIG_FILE}"
writeConfigKey "sn" "" "${USER_CONFIG_FILE}"
writeConfigKey "mac1" "" "${USER_CONFIG_FILE}"
# writeConfigKey "maxdisks" "" "${USER_CONFIG_FILE}"
writeConfigKey "layout" "qwerty" "${USER_CONFIG_FILE}"
writeConfigKey "keymap" "" "${USER_CONFIG_FILE}"
writeConfigKey "zimage-hash" "" "${USER_CONFIG_FILE}"
writeConfigKey "ramdisk-hash" "" "${USER_CONFIG_FILE}"
writeConfigKey "cmdline" "{}" "${USER_CONFIG_FILE}"
writeConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
writeConfigKey "addons" "{}" "${USER_CONFIG_FILE}"
writeConfigKey "addons.misc" "" "${USER_CONFIG_FILE}"
writeConfigKey "addons.acpid" "" "${USER_CONFIG_FILE}"
writeConfigKey "addons.reboottorr" "" "${USER_CONFIG_FILE}"
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
fi fi
initConfigKey "lkm" "prod" "${USER_CONFIG_FILE}"
initConfigKey "dsmlogo" "true" "${USER_CONFIG_FILE}"
initConfigKey "directboot" "false" "${USER_CONFIG_FILE}"
initConfigKey "prerelease" "false" "${USER_CONFIG_FILE}"
initConfigKey "bootwait" "10" "${USER_CONFIG_FILE}"
initConfigKey "bootipwait" "10" "${USER_CONFIG_FILE}"
initConfigKey "kernelway" "power" "${USER_CONFIG_FILE}"
initConfigKey "kernelpanic" "5" "${USER_CONFIG_FILE}"
initConfigKey "odp" "false" "${USER_CONFIG_FILE}"
initConfigKey "model" "" "${USER_CONFIG_FILE}"
initConfigKey "productver" "" "${USER_CONFIG_FILE}"
initConfigKey "buildnum" "" "${USER_CONFIG_FILE}"
initConfigKey "smallnum" "" "${USER_CONFIG_FILE}"
initConfigKey "paturl" "" "${USER_CONFIG_FILE}"
initConfigKey "patsum" "" "${USER_CONFIG_FILE}"
initConfigKey "sn" "" "${USER_CONFIG_FILE}"
initConfigKey "mac1" "" "${USER_CONFIG_FILE}"
# initConfigKey "maxdisks" "" "${USER_CONFIG_FILE}"
initConfigKey "layout" "qwerty" "${USER_CONFIG_FILE}"
initConfigKey "keymap" "" "${USER_CONFIG_FILE}"
initConfigKey "zimage-hash" "" "${USER_CONFIG_FILE}"
initConfigKey "ramdisk-hash" "" "${USER_CONFIG_FILE}"
initConfigKey "cmdline" "{}" "${USER_CONFIG_FILE}"
initConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
initConfigKey "addons" "{}" "${USER_CONFIG_FILE}"
initConfigKey "addons.misc" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.acpid" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.reboottoloader" "" "${USER_CONFIG_FILE}"
initConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
# _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")" # _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")"
@ -119,14 +70,13 @@ done
# Get the VID/PID if we are in USB # Get the VID/PID if we are in USB
VID="0x46f4" VID="0x46f4"
PID="0x0001" PID="0x0001"
BUS=$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2) BUS=$(getBus "${LOADER_DISK}")
[ "${BUS}" = "ata" ] && BUS="sata"
if [ "${BUS}" = "usb" ]; then if [ "${BUS}" = "usb" ]; then
VID="0x$(udevadm info --query property --name ${LOADER_DISK} | grep ID_VENDOR_ID | cut -d= -f2)" VID="0x$(udevadm info --query property --name ${LOADER_DISK} | grep ID_VENDOR_ID | cut -d= -f2)"
PID="0x$(udevadm info --query property --name ${LOADER_DISK} | grep ID_MODEL_ID | cut -d= -f2)" PID="0x$(udevadm info --query property --name ${LOADER_DISK} | grep ID_MODEL_ID | cut -d= -f2)"
elif [ "${BUS}" != "sata" -a "${BUS}" != "scsi" ]; then elif [ "${BUS}" != "sata" -a "${BUS}" != "scsi" -a "${BUS}" != "nvme" ]; then
die "$(TEXT "Loader disk neither USB or DoM")" die "$(TEXT "Loader disk neither USB or SATA/SCSI/NVME DoM")"
fi fi
# Save variables to user config file # Save variables to user config file
@ -136,16 +86,6 @@ writeConfigKey "pid" ${PID} "${USER_CONFIG_FILE}"
# Inform user # Inform user
echo -e "$(TEXT "Loader disk:") \033[1;32m${LOADER_DISK}\033[0m (\033[1;32m${BUS^^} flashdisk\033[0m)" echo -e "$(TEXT "Loader disk:") \033[1;32m${LOADER_DISK}\033[0m (\033[1;32m${BUS^^} flashdisk\033[0m)"
# Check if partition 3 occupies all free space, resize if needed
LOADER_DEVICE_NAME=$(echo ${LOADER_DISK} | sed 's|/dev/||')
SIZEOFDISK=$(cat /sys/block/${LOADER_DEVICE_NAME}/size)
ENDSECTOR=$(($(fdisk -l ${LOADER_DISK} | awk '/'${LOADER_DEVICE_NAME}3'/{print$3}') + 1))
if [ ${SIZEOFDISK} -ne ${ENDSECTOR} ]; then
echo -e "\033[1;36m$(printf "$(TEXT "Resizing %s")" "${LOADER_DISK}3")\033[0m"
echo -e "d\n\nn\n\n\n\n\nn\nw" | fdisk "${LOADER_DISK}" >"${LOG_FILE}" 2>&1 || dieLog
resize2fs "${LOADER_DISK}3" >"${LOG_FILE}" 2>&1 || dieLog
fi
# Load keymap name # Load keymap name
LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")" LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")"
KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")" KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
@ -210,7 +150,7 @@ for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
break break
fi fi
COUNT=$((${COUNT} + 1)) COUNT=$((${COUNT} + 1))
IP=$(ip route show dev ${ETHX[${N}]} 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p') IP="$(getIP ${ETHX[${N}]})"
if [ -n "${IP}" ]; then if [ -n "${IP}" ]; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(printf "$(TEXT "Access \033[1;34mhttp://%s:7681\033[0m to configure the loader via web terminal.")" "${IP}")\n" echo -en "\r${ETHX[${N}]}(${DRIVER}): $(printf "$(TEXT "Access \033[1;34mhttp://%s:7681\033[0m to configure the loader via web terminal.")" "${IP}")\n"
break break
@ -228,6 +168,14 @@ echo -e "$(TEXT "User config is on") \033[1;32m${USER_CONFIG_FILE}\033[0m"
echo -e "$(TEXT "Default SSH Root password is") \033[1;31mrr\033[0m" echo -e "$(TEXT "Default SSH Root password is") \033[1;31mrr\033[0m"
echo echo
DSMLOGO="$(readConfigKey "dsmlogo" "${USER_CONFIG_FILE}")"
if [ "${DSMLOGO}" = "true" -a -c "/dev/fb0" ]; then
IP="$(getIP)"
[ -n "${IP}" ] && URL="http://${IP}:7681" || URL="http://arpl:7681/"
python ${WORK_PATH}/include/functions.py makeqr -d "${URL}" -l "bl" -o "${TMP_PATH}/qrcode.png"
[ -f "${TMP_PATH}/qrcode.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode.png" >/dev/null 2>/dev/null || true
fi
# Check memory # Check memory
RAM=$(free -m | awk '/Mem:/{print$2}') RAM=$(free -m | awk '/Mem:/{print$2}')
if [ ${RAM} -le 3500 ]; then if [ ${RAM} -le 3500 ]; then
@ -238,4 +186,4 @@ mkdir -p "${ADDONS_PATH}"
mkdir -p "${LKM_PATH}" mkdir -p "${LKM_PATH}"
mkdir -p "${MODULES_PATH}" mkdir -p "${MODULES_PATH}"
install-addons.sh updateAddons

View File

@ -1,15 +0,0 @@
#!/usr/bin/env bash
set -e
. /opt/rr/include/functions.sh
# Detect if has new local plugins to install/reinstall
for F in $(ls ${CACHE_PATH}/*.addon 2>/dev/null); do
ADDON=$(basename "${F}" | sed 's|.addon||')
rm -rf "${ADDONS_PATH}/${ADDON}"
mkdir -p "${ADDONS_PATH}/${ADDON}"
echo "Installing ${F} to ${ADDONS_PATH}/${ADDON}"
tar -xaf "${F}" -C "${ADDONS_PATH}/${ADDON}"
rm -f "${F}"
done

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
. /opt/rr/include/functions.sh [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. /opt/rr/include/addons.sh
. /opt/rr/include/modules.sh . ${WORK_PATH}/include/functions.sh
. ${WORK_PATH}/include/addons.sh
. ${WORK_PATH}/include/modules.sh
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
# Check partition 3 space, if < 2GiB is necessary clean cache folder # Check partition 3 space, if < 2GiB is necessary clean cache folder
CLEARCACHE=0 CLEARCACHE=0
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)" if [ $(cat "/sys/block/${LOADER_DISK/\/dev\//}/${LOADER_DISK_PART3/\/dev\//}/size") -lt 4194304 ]; then
LOADER_DEVICE_NAME=$(echo "${LOADER_DISK}" | sed 's|/dev/||')
if [ $(cat "/sys/block/${LOADER_DEVICE_NAME}/${LOADER_DEVICE_NAME}3/size") -lt 4194304 ]; then
CLEARCACHE=1 CLEARCACHE=1
fi fi
# Get actual IP # Get actual IP
IP=$(ip route 2>/dev/null | sed -n 's/.* via .* dev \(.*\) src \(.*\) metric .*/\1: \2 /p' | head -1) IP="$(getIP)"
# Dirty flag
DIRTY=0
# Debug flag # Debug flag
# DEBUG=0 # DEBUG=0
@ -93,10 +93,11 @@ function modelMenu() {
Y=$(echo ${M} | tr -cd "[0-9]") Y=$(echo ${M} | tr -cd "[0-9]")
Y=${Y:0-2} Y=${Y:0-2}
echo "${M} ${Y}" >>"${TMP_PATH}/modellist" echo "${M} ${Y}" >>"${TMP_PATH}/modellist"
done < <(find "${MODEL_CONFIG_PATH}" -maxdepth 1 -name \*.yml | sed 's/.*\///; s/\.yml//') done < <(find "${WORK_PATH}/model-configs" -maxdepth 1 -name \*.yml | sed 's/.*\///; s/\.yml//')
while true; do while true; do
echo -n "" >"${TMP_PATH}/menu" echo -n "" >"${TMP_PATH}/menu"
echo "c \"\Z1$(TEXT "Compatibility judgment")\Zn\"" >>"${TMP_PATH}/menu"
FLGNEX=0 FLGNEX=0
while read M Y; do while read M Y; do
PLATFORM=$(readModelKey "${M}" "platform") PLATFORM=$(readModelKey "${M}" "platform")
@ -119,21 +120,12 @@ function modelMenu() {
done < <(cat "${TMP_PATH}/modellist" | sort -r -n -k 2) done < <(cat "${TMP_PATH}/modellist" | sort -r -n -k 2)
[ ${FLGNEX} -eq 1 ] && echo "f \"\Z1$(TEXT "Disable flags restriction")\Zn\"" >>"${TMP_PATH}/menu" [ ${FLGNEX} -eq 1 ] && echo "f \"\Z1$(TEXT "Disable flags restriction")\Zn\"" >>"${TMP_PATH}/menu"
[ ${FLGBETA} -eq 0 ] && echo "b \"\Z1$(TEXT "Show all models")\Zn\"" >>"${TMP_PATH}/menu" [ ${FLGBETA} -eq 0 ] && echo "b \"\Z1$(TEXT "Show all models")\Zn\"" >>"${TMP_PATH}/menu"
echo "c \"\Z1$(TEXT "Compatibility judgment")\Zn\"" >>"${TMP_PATH}/menu"
dialog --backtitle "$(backtitle)" --colors \ dialog --backtitle "$(backtitle)" --colors \
--menu "$(TEXT "Choose the model")" 0 0 0 --file "${TMP_PATH}/menu" \ --menu "$(TEXT "Choose the model")" 0 0 0 --file "${TMP_PATH}/menu" \
2>${TMP_PATH}/resp 2>${TMP_PATH}/resp
[ $? -ne 0 ] && return [ $? -ne 0 ] && return
resp=$(<${TMP_PATH}/resp) resp=$(<${TMP_PATH}/resp)
[ -z "${resp}" ] && return [ -z "${resp}" ] && return
if [ "${resp}" = "f" ]; then
RESTRICT=0
continue
fi
if [ "${resp}" = "b" ]; then
FLGBETA=1
continue
fi
if [ "${resp}" = "c" ]; then if [ "${resp}" = "c" ]; then
models=(DS918+ RS1619xs+ DS419+ DS1019+ DS719+ DS1621xs+) models=(DS918+ RS1619xs+ DS419+ DS1019+ DS719+ DS1621xs+)
[ $(lspci -d ::300 | grep 8086 | wc -l) -gt 0 ] && iGPU=1 || iGPU=0 [ $(lspci -d ::300 | grep 8086 | wc -l) -gt 0 ] && iGPU=1 || iGPU=0
@ -175,6 +167,14 @@ function modelMenu() {
--textbox "${TMP_PATH}/opts" 0 0 --textbox "${TMP_PATH}/opts" 0 0
continue continue
fi fi
if [ "${resp}" = "f" ]; then
RESTRICT=0
continue
fi
if [ "${resp}" = "b" ]; then
FLGBETA=1
continue
fi
break break
done done
else else
@ -199,14 +199,14 @@ function modelMenu() {
for I in $(seq 1 ${NETIF_NUM}); do for I in $(seq 1 ${NETIF_NUM}); do
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}" writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}"
done done
DIRTY=1 touch ${PART1_PATH}/.build
fi fi
} }
############################################################################### ###############################################################################
# Shows available buildnumbers from a model to user choose one # Shows available buildnumbers from a model to user choose one
function productversMenu() { function productversMenu() {
ITEMS="$(readConfigEntriesArray "productvers" "${MODEL_CONFIG_PATH}/${MODEL}.yml" | sort -r)" ITEMS="$(readConfigEntriesArray "productvers" "${WORK_PATH}/model-configs/${MODEL}.yml" | sort -r)"
if [ -z "${1}" ]; then if [ -z "${1}" ]; then
dialog --backtitle "$(backtitle)" --colors \ dialog --backtitle "$(backtitle)" --colors \
--no-items --menu "$(TEXT "Choose a product version")" 0 0 0 ${ITEMS} \ --no-items --menu "$(TEXT "Choose a product version")" 0 0 0 ${ITEMS} \
@ -229,15 +229,15 @@ function productversMenu() {
--msgbox "$(TEXT "This version does not support UEFI startup, Please select another version or switch the startup mode.")" 0 0 --msgbox "$(TEXT "This version does not support UEFI startup, Please select another version or switch the startup mode.")" 0 0
return return
fi fi
if [ ! "usb" = "$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2)" -a "${KVER:0:1}" = "5" ]; then # if [ ! "usb" = "$(getBus "${LOADER_DISK}")" -a "${KVER:0:1}" = "5" ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Product Version")" \ # dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Product Version")" \
--msgbox "$(TEXT "This version only support usb startup, Please select another version or switch the startup mode.")" 0 0 # --msgbox "$(TEXT "This version only support usb startup, Please select another version or switch the startup mode.")" 0 0
# return # # return
fi # fi
while true; do while true; do
# get online pat data # get online pat data
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Product Version")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Product Version")" \
--infobox "$(TEXT "Get pat data ..")" 0 0 --infobox "$(TEXT "Get pat data ...")" 0 0
idx=0 idx=0
while [ ${idx} -le 3 ]; do # Loop 3 times, if successful, break while [ ${idx} -le 3 ]; do # Loop 3 times, if successful, break
fastest=$(_get_fastest "www.synology.com" "www.synology.cn") fastest=$(_get_fastest "www.synology.com" "www.synology.cn")
@ -306,7 +306,7 @@ function productversMenu() {
done < <(getAllModules "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}") done < <(getAllModules "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")
# Remove old files # Remove old files
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
} }
############################################################################### ###############################################################################
@ -362,7 +362,7 @@ function addonMenu() {
VALUE="$(<"${TMP_PATH}/resp")" VALUE="$(<"${TMP_PATH}/resp")"
ADDONS[${ADDON}]="${VALUE}" ADDONS[${ADDON}]="${VALUE}"
writeConfigKey "addons.${ADDON}" "${VALUE}" "${USER_CONFIG_FILE}" writeConfigKey "addons.${ADDON}" "${VALUE}" "${USER_CONFIG_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
d) d)
NEXT='d' NEXT='d'
@ -385,7 +385,7 @@ function addonMenu() {
unset ADDONS[${I}] unset ADDONS[${I}]
deleteConfigKey "addons.${I}" "${USER_CONFIG_FILE}" deleteConfigKey "addons.${I}" "${USER_CONFIG_FILE}"
done done
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
s) s)
NEXT='s' NEXT='s'
@ -441,7 +441,7 @@ function addonMenu() {
fi fi
ADDON="$(untarAddon "${TMP_UP_PATH}/${USER_FILE}")" ADDON="$(untarAddon "${TMP_UP_PATH}/${USER_FILE}")"
if [ -n "${ADDON}" ]; then if [ -n "${ADDON}" ]; then
[ -f "${CACHE_PATH}/addons/VERSION" ] && rm -f "${CACHE_PATH}/addons/VERSION" [ -f "${PART3_PATH}/addons/VERSION" ] && rm -f "${PART3_PATH}/addons/VERSION"
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Addons")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Addons")" \
--msgbox "$(printf "$(TEXT "Addon '%s' added to loader, Please enable it in 'Add an addon' menu.")" "${ADDON}")" 0 0 --msgbox "$(printf "$(TEXT "Addon '%s' added to loader, Please enable it in 'Add an addon' menu.")" "${ADDON}")" 0 0
else else
@ -501,7 +501,7 @@ function moduleMenu() {
for ID in ${resp}; do for ID in ${resp}; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done done
DIRTY=1 touch ${PART1_PATH}/.build
break break
;; ;;
3) # extra-button 3) # extra-button
@ -509,11 +509,11 @@ function moduleMenu() {
while read ID DESC; do while read ID DESC; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done <<<${ALLMODULES} done <<<${ALLMODULES}
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
2) # help-button 2) # help-button
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}" writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
1) # cancel-button 1) # cancel-button
break break
@ -536,7 +536,7 @@ function moduleMenu() {
for ID in ${KOLIST[@]}; do for ID in ${KOLIST[@]}; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}" writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done done
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
o) o)
MSG="" MSG=""
@ -563,7 +563,7 @@ function moduleMenu() {
popd popd
if [ -n "${USER_FILE}" -a "${USER_FILE##*.}" = "ko" ]; then if [ -n "${USER_FILE}" -a "${USER_FILE##*.}" = "ko" ]; then
addToModules ${PLATFORM} "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}" "${TMP_UP_PATH}/${USER_FILE}" addToModules ${PLATFORM} "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}" "${TMP_UP_PATH}/${USER_FILE}"
[ -f "${CACHE_PATH}/modules/VERSION" ] && rm -f "${CACHE_PATH}/modules/VERSION" [ -f "${PART3_PATH}/modules/VERSION" ] && rm -f "${PART3_PATH}/modules/VERSION"
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Modules")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Modules")" \
--msgbox "$(printf "$(TEXT "Module '%s' added to %s-%s")" "${USER_FILE}" "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")" 0 0 --msgbox "$(printf "$(TEXT "Module '%s' added to %s-%s")" "${USER_FILE}" "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")" 0 0
rm -f "${TMP_UP_PATH}/${USER_FILE}" rm -f "${TMP_UP_PATH}/${USER_FILE}"
@ -736,7 +736,7 @@ function synoinfoMenu() {
VALUE="$(<"${TMP_PATH}/resp")" VALUE="$(<"${TMP_PATH}/resp")"
SYNOINFO[${NAME}]="${VALUE}" SYNOINFO[${NAME}]="${VALUE}"
writeConfigKey "synoinfo.${NAME}" "${VALUE}" "${USER_CONFIG_FILE}" writeConfigKey "synoinfo.${NAME}" "${VALUE}" "${USER_CONFIG_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
d) d)
if [ ${#SYNOINFO[@]} -eq 0 ]; then if [ ${#SYNOINFO[@]} -eq 0 ]; then
@ -758,7 +758,7 @@ function synoinfoMenu() {
unset SYNOINFO[${I}] unset SYNOINFO[${I}]
deleteConfigKey "synoinfo.${I}" "${USER_CONFIG_FILE}" deleteConfigKey "synoinfo.${I}" "${USER_CONFIG_FILE}"
done done
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
s) s)
ITEMS="" ITEMS=""
@ -779,11 +779,12 @@ function extractDsmFiles() {
PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")" PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")" PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
SPACELEFT=$(df --block-size=1 | awk '/'${LOADER_DEVICE_NAME}'3/{print $4}') # Check disk space left # Check disk space left
SPACELEFT=$(df --block-size=1 | grep ${LOADER_DISK_PART3} | awk '{print $4}')
PAT_FILE="${MODEL}-${PRODUCTVER}.pat" PAT_FILE="${MODEL}-${PRODUCTVER}.pat"
PAT_PATH="${CACHE_PATH}/dl/${PAT_FILE}" PAT_PATH="${PART3_PATH}/dl/${PAT_FILE}"
EXTRACTOR_PATH="${CACHE_PATH}/extractor" EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch" EXTRACTOR_BIN="syno_extract_system_patch"
OLDPATURL="https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat" OLDPATURL="https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat"
@ -793,10 +794,11 @@ function extractDsmFiles() {
# If we have little disk space, clean cache folder # If we have little disk space, clean cache folder
if [ ${CLEARCACHE} -eq 1 ]; then if [ ${CLEARCACHE} -eq 1 ]; then
echo "$(TEXT "Cleaning cache")" echo "$(TEXT "Cleaning cache")"
rm -rf "${CACHE_PATH}/dl" rm -rf "${PART3_PATH}/dl"
fi fi
mkdir -p "${CACHE_PATH}/dl" mkdir -p "${PART3_PATH}/dl"
fastest=$(_get_fastest "global.synologydownload.com" "global.download.synology.com" "cndl.synology.cn") mirrors=("global.synologydownload.com" "global.download.synology.com" "cndl.synology.cn")
fastest=$(_get_fastest ${mirrors[@]})
mirror="$(echo ${PATURL} | sed 's|^http[s]*://\([^/]*\).*|\1|')" mirror="$(echo ${PATURL} | sed 's|^http[s]*://\([^/]*\).*|\1|')"
if echo "${mirrors[@]}" | grep -wq "${mirror}" && [ "${mirror}" != "${fastest}" ]; then if echo "${mirrors[@]}" | grep -wq "${mirror}" && [ "${mirror}" != "${fastest}" ]; then
echo "$(printf "$(TEXT "Based on the current network situation, switch to %s mirror to downloading.")" "${fastest}")" echo "$(printf "$(TEXT "Based on the current network situation, switch to %s mirror to downloading.")" "${fastest}")"
@ -810,7 +812,7 @@ function extractDsmFiles() {
# No disk space to download, change it to RAMDISK # No disk space to download, change it to RAMDISK
PAT_PATH="${TMP_PATH}/${PAT_FILE}" PAT_PATH="${TMP_PATH}/${PAT_FILE}"
fi fi
STATUS=$(curl -k -w "%{http_code}" -L "${PATURL}" -o "${PAT_PATH}" --progress-bar) STATUS=$(curl -k -w "%{http_code}" -L "${PATURL}" -o "${PAT_PATH}")
if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then
rm -f "${PAT_PATH}" rm -f "${PAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")" MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")"
@ -854,7 +856,7 @@ function extractDsmFiles() {
;; ;;
esac esac
SPACELEFT=$(df --block-size=1 | awk '/'${LOADER_DEVICE_NAME}'3/{print$4}') # Check disk space left SPACELEFT=$(df --block-size=1 | grep ${LOADER_DISK_PART3} | awk '{print $4}') # Check disk space left
if [ "${isencrypted}" = "yes" ]; then if [ "${isencrypted}" = "yes" ]; then
# Check existance of extractor # Check existance of extractor
@ -864,7 +866,7 @@ function extractDsmFiles() {
# Extractor not exists, get it. # Extractor not exists, get it.
mkdir -p "${EXTRACTOR_PATH}" mkdir -p "${EXTRACTOR_PATH}"
# Check if old pat already downloaded # Check if old pat already downloaded
OLDPAT_PATH="${CACHE_PATH}/dl/DS3622xs+-42218.pat" OLDPAT_PATH="${PART3_PATH}/dl/DS3622xs+-42218.pat"
if [ ! -f "${OLDPAT_PATH}" ]; then if [ ! -f "${OLDPAT_PATH}" ]; then
echo "$(TEXT "Downloading old pat to extract synology .pat extractor...")" echo "$(TEXT "Downloading old pat to extract synology .pat extractor...")"
# Discover remote file size # Discover remote file size
@ -873,7 +875,7 @@ function extractDsmFiles() {
# No disk space to download, change it to RAMDISK # No disk space to download, change it to RAMDISK
OLDPAT_PATH="${TMP_PATH}/DS3622xs+-42218.pat" OLDPAT_PATH="${TMP_PATH}/DS3622xs+-42218.pat"
fi fi
STATUS=$(curl -k -w "%{http_code}" -L "${OLDPATURL}" -o "${OLDPAT_PATH}" --progress-bar) STATUS=$(curl -k -w "%{http_code}" -L "${OLDPATURL}" -o "${OLDPAT_PATH}")
if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then
rm -f "${OLDPAT_PATH}" rm -f "${OLDPAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")" MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")"
@ -933,38 +935,19 @@ function extractDsmFiles() {
echo "$(TEXT "OK")" echo "$(TEXT "OK")"
echo -n "$(TEXT "Copying files: ")" echo -n "$(TEXT "Copying files: ")"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${BOOTLOADER_PATH}" cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${PART1_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${BOOTLOADER_PATH}" cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${PART1_PATH}"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${SLPART_PATH}" cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${PART2_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${SLPART_PATH}" cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${PART2_PATH}"
cp -f "${UNTAR_PAT_PATH}/zImage" "${ORI_ZIMAGE_FILE}" cp -f "${UNTAR_PAT_PATH}/zImage" "${ORI_ZIMAGE_FILE}"
cp -f "${UNTAR_PAT_PATH}/rd.gz" "${ORI_RDGZ_FILE}" cp -f "${UNTAR_PAT_PATH}/rd.gz" "${ORI_RDGZ_FILE}"
rm -rf "${UNTAR_PAT_PATH}" rm -rf "${UNTAR_PAT_PATH}"
echo "$(TEXT "OK")" echo "$(TEXT "OK")"
} }
# 1 - model
function getLogo() {
rm -f "${CACHE_PATH}/logo.png"
if [ "${DSMLOGO}" = "true" ]; then
fastest=$(_get_fastest "www.synology.com" "www.synology.cn")
STATUS=$(curl -skL -w "%{http_code}" "https://${fastest}/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${CACHE_PATH}/logo.png")
if [ $? -ne 0 -o ${STATUS} -ne 200 -o -f "${CACHE_PATH}/logo.png" ]; then
convert -rotate 180 "${CACHE_PATH}/logo.png" "${CACHE_PATH}/logo.png" 2>/dev/null
magick montage "${CACHE_PATH}/logo.png" -background 'none' -tile '3x3' -geometry '350x210' "${CACHE_PATH}/logo.png" 2>/dev/null
convert -rotate 180 "${CACHE_PATH}/logo.png" "${CACHE_PATH}/logo.png" 2>/dev/null
fi
fi
}
############################################################################### ###############################################################################
# Where the magic happens! # Where the magic happens!
function make() { function make() {
# clear
clear
# get logo.png
getLogo "${MODEL}"
PLATFORM="$(readModelKey "${MODEL}" "platform")" PLATFORM="$(readModelKey "${MODEL}" "platform")"
KVER="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")" KVER="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")"
KPRE="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kpre")" KPRE="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kpre")"
@ -983,19 +966,24 @@ function make() {
[ $? -ne 0 ] && return 1 [ $? -ne 0 ] && return 1
fi fi
/opt/rr/zimage-patch.sh # Check disk space left
SPACELEFT=$(df --block-size=1 | grep ${LOADER_DISK_PART3} | awk '{print $4}')
[ ${SPACELEFT} -le 268435456 ] && rm -rf "${PART3_PATH}/dl"
${WORK_PATH}/zimage-patch.sh
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \
--msgbox "$(TEXT "zImage not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 0 0 --msgbox "$(TEXT "zImage not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 0 0
return 1 return 1
fi fi
/opt/rr/ramdisk-patch.sh ${WORK_PATH}/ramdisk-patch.sh
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Error")" \
--msgbox "$(TEXT "Ramdisk not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 0 0 --msgbox "$(TEXT "Ramdisk not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")" 0 0
return 1 return 1
fi fi
rm -f ${PART1_PATH}/.build
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")" BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")"
SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")" SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")"
@ -1003,7 +991,6 @@ function make() {
rm -rf "${UNTAR_PAT_PATH}" rm -rf "${UNTAR_PAT_PATH}"
echo "$(TEXT "Ready!")" echo "$(TEXT "Ready!")"
sleep 3 sleep 3
DIRTY=0
return 0 return 0
} }
@ -1045,7 +1032,7 @@ function advancedMenu() {
echo "r \"$(TEXT "Restore bootloader disk # test")\"" >>"${TMP_PATH}/menu" echo "r \"$(TEXT "Restore bootloader disk # test")\"" >>"${TMP_PATH}/menu"
fi fi
echo "o \"$(TEXT "Install development tools")\"" >>"${TMP_PATH}/menu" echo "o \"$(TEXT "Install development tools")\"" >>"${TMP_PATH}/menu"
echo "g \"$(TEXT "Show dsm logo:") \Z4${DSMLOGO}\Zn\"" >>"${TMP_PATH}/menu" echo "g \"$(TEXT "Show QR logo:") \Z4${DSMLOGO}\Zn\"" >>"${TMP_PATH}/menu"
echo "e \"$(TEXT "Exit")\"" >>"${TMP_PATH}/menu" echo "e \"$(TEXT "Exit")\"" >>"${TMP_PATH}/menu"
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
@ -1056,7 +1043,7 @@ function advancedMenu() {
l) l)
LKM=$([ "${LKM}" = "dev" ] && echo 'prod' || ([ "${LKM}" = "test" ] && echo 'dev' || echo 'test')) LKM=$([ "${LKM}" = "dev" ] && echo 'prod' || ([ "${LKM}" = "test" ] && echo 'dev' || echo 'test'))
writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}" writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
NEXT="l" NEXT="l"
;; ;;
q) q)
@ -1144,7 +1131,7 @@ function advancedMenu() {
IDX=$((${IDX} + 1)) IDX=$((${IDX} + 1))
done done
sleep 1 sleep 1
IP=$(ip route 2>/dev/null | sed -n 's/.* via .* dev \(.*\) src \(.*\) metric .*/\1: \2 /p' | head -1) IP="$(getIP)"
) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ ) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--progressbox "$(TEXT "Setting IP ...")" 20 100 --progressbox "$(TEXT "Setting IP ...")" 20 100
NEXT="e" NEXT="e"
@ -1226,7 +1213,7 @@ function advancedMenu() {
writeConfigKey "paturl" "${paturl}" "${USER_CONFIG_FILE}" writeConfigKey "paturl" "${paturl}" "${USER_CONFIG_FILE}"
writeConfigKey "patsum" "${patsum}" "${USER_CONFIG_FILE}" writeConfigKey "patsum" "${patsum}" "${USER_CONFIG_FILE}"
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
DIRTY=1 touch ${PART1_PATH}/.build
fi fi
;; ;;
a) a)
@ -1239,7 +1226,7 @@ function advancedMenu() {
[ $? -ne 0 ] && return [ $? -ne 0 ] && return
( (
mkdir -p "${TMP_PATH}/sdX1" mkdir -p "${TMP_PATH}/sdX1"
for I in $(ls /dev/sd*1 2>/dev/null | grep -v "${LOADER_DISK}1"); do for I in $(ls /dev/sd.*1 2>/dev/null | grep -v "${LOADER_DISK_PART1}"); do
mount "${I}" "${TMP_PATH}/sdX1" mount "${I}" "${TMP_PATH}/sdX1"
[ -f "${TMP_PATH}/sdX1/etc/VERSION" ] && rm -f "${TMP_PATH}/sdX1/etc/VERSION" [ -f "${TMP_PATH}/sdX1/etc/VERSION" ] && rm -f "${TMP_PATH}/sdX1/etc/VERSION"
[ -f "${TMP_PATH}/sdX1/etc.defaults/VERSION" ] && rm -f "${TMP_PATH}/sdX1/etc.defaults/VERSION" [ -f "${TMP_PATH}/sdX1/etc.defaults/VERSION" ] && rm -f "${TMP_PATH}/sdX1/etc.defaults/VERSION"
@ -1257,7 +1244,7 @@ function advancedMenu() {
rm -f "${TMP_PATH}/opts" rm -f "${TMP_PATH}/opts"
while read POSITION NAME; do while read POSITION NAME; do
[ -z "${POSITION}" -o -z "${NAME}" ] && continue [ -z "${POSITION}" -o -z "${NAME}" ] && continue
echo "${POSITION}" | grep -q "${LOADER_DEVICE_NAME}" && continue echo "${POSITION}" | grep -q "${LOADER_DISK}" && continue
echo "\"${POSITION}\" \"${NAME}\" \"off\"" >>"${TMP_PATH}/opts" echo "\"${POSITION}\" \"${NAME}\" \"off\"" >>"${TMP_PATH}/opts"
done < <(ls -l /dev/disk/by-id/ | sed 's|../..|/dev|g' | grep -E "/dev/sd|/dev/nvme" | awk -F' ' '{print $NF" "$(NF-2)}' | sort -uk 1,1) done < <(ls -l /dev/disk/by-id/ | sed 's|../..|/dev|g' | grep -E "/dev/sd|/dev/nvme" | awk -F' ' '{print $NF" "$(NF-2)}' | sort -uk 1,1)
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
@ -1289,7 +1276,7 @@ function advancedMenu() {
x) x)
SHADOW_FILE="" SHADOW_FILE=""
mkdir -p "${TMP_PATH}/sdX1" mkdir -p "${TMP_PATH}/sdX1"
for I in $(ls /dev/sd*1 2>/dev/null | grep -v "${LOADER_DISK}1"); do for I in $(ls /dev/sd*1 2>/dev/null | grep -v "${LOADER_DISK_PART1}"); do
mount ${I} "${TMP_PATH}/sdX1" mount ${I} "${TMP_PATH}/sdX1"
if [ -f "${TMP_PATH}/sdX1/etc/shadow" ]; then if [ -f "${TMP_PATH}/sdX1/etc/shadow" ]; then
cp -f "${TMP_PATH}/sdX1/etc/shadow" "${TMP_PATH}/shadow_bak" cp -f "${TMP_PATH}/sdX1/etc/shadow" "${TMP_PATH}/shadow_bak"
@ -1325,7 +1312,7 @@ function advancedMenu() {
NEWPASSWD="$(python -c "import crypt,getpass;pw=\"${VALUE}\";print(crypt.crypt(pw))")" NEWPASSWD="$(python -c "import crypt,getpass;pw=\"${VALUE}\";print(crypt.crypt(pw))")"
( (
mkdir -p "${TMP_PATH}/sdX1" mkdir -p "${TMP_PATH}/sdX1"
for I in $(ls /dev/sd*1 2>/dev/null | grep -v ${LOADER_DISK}1); do for I in $(ls /dev/sd.*1 2>/dev/null | grep -v ${LOADER_DISK_PART1}); do
mount "${I}" "${TMP_PATH}/sdX1" mount "${I}" "${TMP_PATH}/sdX1"
sed -i "s|${OLDPASSWD}|${NEWPASSWD}|g" "${TMP_PATH}/sdX1/etc/shadow" sed -i "s|${OLDPASSWD}|${NEWPASSWD}|g" "${TMP_PATH}/sdX1/etc/shadow"
sync sync
@ -1391,7 +1378,7 @@ function advancedMenu() {
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--msgbox "$(TEXT "A valid dts file, Automatically import at compile time.")" 0 0 --msgbox "$(TEXT "A valid dts file, Automatically import at compile time.")" 0 0
fi fi
DIRTY=1 touch ${PART1_PATH}/.build
;; ;;
b) b)
if ! tty | grep -q "/dev/pts"; then if ! tty | grep -q "/dev/pts"; then
@ -1412,7 +1399,7 @@ function advancedMenu() {
return return
fi fi
if [ -z "${SSH_TTY}" ]; then # web if [ -z "${SSH_TTY}" ]; then # web
IP_HEAD="$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1)" IP_HEAD="$(getIP)"
echo "http://${IP_HEAD}/backup.img.gz" >${TMP_PATH}/resp echo "http://${IP_HEAD}/backup.img.gz" >${TMP_PATH}/resp
echo " ↑ " >>${TMP_PATH}/resp echo " ↑ " >>${TMP_PATH}/resp
echo "$(TEXT "Click on the address above to download.")" >>${TMP_PATH}/resp echo "$(TEXT "Click on the address above to download.")" >>${TMP_PATH}/resp
@ -1448,19 +1435,19 @@ function advancedMenu() {
break break
done done
popd popd
if [ -z "${IFTOOL}" -o -z "${TMP_UP_PATH}/${USER_FILE}" ]; then if [ -z "${IFTOOL}" -o ! -f "${TMP_UP_PATH}/${USER_FILE}" ]; then
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--msgbox "$(printf "$(TEXT "Not a valid .zip/.img.gz file, please try again!")" "${USER_FILE}")" 0 0 --msgbox "$(printf "$(TEXT "Not a valid .zip/.img.gz file, please try again!")" "${USER_FILE}")" 0 0
else else
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--yesno "$(TEXT "Warning:\nDo not terminate midway, otherwise it may cause damage to the RR. Do you want to continue?")" 0 0 --yesno "$(TEXT "Warning:\nDo not terminate midway, otherwise it may cause damage to the RR. Do you want to continue?")" 0 0
[ $? -ne 0 ] && ( [ $? -ne 0 ] && (
rm -f "${LOADER_DISK}" rm -f "${TMP_UP_PATH}/${USER_FILE}"
return return
) )
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--infobox "$(TEXT "Writing...")" 0 0 --infobox "$(TEXT "Writing...")" 0 0
umount "${BOOTLOADER_PATH}" "${SLPART_PATH}" "${CACHE_PATH}" umount "${PART1_PATH}" "${PART2_PATH}" "${PART3_PATH}"
if [ "${IFTOOL}" = "zip" ]; then if [ "${IFTOOL}" = "zip" ]; then
unzip -p "${TMP_UP_PATH}/${USER_FILE}" | dd of="${LOADER_DISK}" bs=1M conv=fsync unzip -p "${TMP_UP_PATH}/${USER_FILE}" | dd of="${LOADER_DISK}" bs=1M conv=fsync
elif [ "${IFTOOL}" = "gzip" ]; then elif [ "${IFTOOL}" = "gzip" ]; then
@ -1520,12 +1507,12 @@ function tryRecoveryDSM() {
[ "${unique}" = "${UNIQUE}" ] || continue [ "${unique}" = "${UNIQUE}" ] || continue
# Found # Found
modelMenu "${M}" modelMenu "${M}"
done < <(find "${MODEL_CONFIG_PATH}" -maxdepth 1 -name \*.yml | sort) done < <(find "${WORK_PATH}/model-configs" -maxdepth 1 -name \*.yml | sort)
if [ -n "${MODEL}" ]; then if [ -n "${MODEL}" ]; then
productversMenu "${majorversion}.${minorversion}" productversMenu "${majorversion}.${minorversion}"
if [ -n "${PRODUCTVER}" ]; then if [ -n "${PRODUCTVER}" ]; then
cp -f "${DSMROOT_PATH}/.syno/patch/zImage" "${SLPART_PATH}" cp -f "${DSMROOT_PATH}/.syno/patch/zImage" "${PART2_PATH}"
cp -f "${DSMROOT_PATH}/.syno/patch/rd.gz" "${SLPART_PATH}" cp -f "${DSMROOT_PATH}/.syno/patch/rd.gz" "${PART2_PATH}"
MSG="$(printf "$(TEXT "Found a installation:\nModel: %s\nProductversion: %s")" "${MODEL}" "${PRODUCTVER}")" MSG="$(printf "$(TEXT "Found a installation:\nModel: %s\nProductversion: %s")" "${MODEL}" "${PRODUCTVER}")"
SN=$(_get_conf_kv SN "${DSMROOT_PATH}/etc/synoinfo.conf") SN=$(_get_conf_kv SN "${DSMROOT_PATH}/etc/synoinfo.conf")
if [ -n "${SN}" ]; then if [ -n "${SN}" ]; then
@ -1574,7 +1561,7 @@ function editUserConfig() {
rm -f "${MOD_ZIMAGE_FILE}" rm -f "${MOD_ZIMAGE_FILE}"
rm -f "${MOD_RDGZ_FILE}" rm -f "${MOD_RDGZ_FILE}"
fi fi
DIRTY=1 touch ${PART1_PATH}/.build
} }
############################################################################### ###############################################################################
@ -1592,12 +1579,13 @@ function editGrubCfg() {
############################################################################### ###############################################################################
# Calls boot.sh to boot into DSM kernel/ramdisk # Calls boot.sh to boot into DSM kernel/ramdisk
function boot() { function boot() {
[ ${DIRTY} -eq 1 ] && dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Alert")" \ [ -f ${PART1_PATH}/.build ] && dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Alert")" \
--yesno "$(TEXT "Config changed, would you like to rebuild the loader?")" 0 0 --yesno "$(TEXT "Config changed, would you like to rebuild the loader?")" 0 0
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
make || return make 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Main menu")" --cr-wrap --no-collapse \
--progressbox "$(TEXT "Making ...")" 20 100 || return
fi fi
boot.sh ${WORK_PATH}/boot.sh
} }
############################################################################### ###############################################################################
@ -1610,7 +1598,7 @@ function languageMenu() {
resp=$(cat ${TMP_PATH}/resp 2>/dev/null) resp=$(cat ${TMP_PATH}/resp 2>/dev/null)
[ -z "${resp}" ] && return [ -z "${resp}" ] && return
LANGUAGE=${resp} LANGUAGE=${resp}
echo "${LANGUAGE}.UTF-8" >${BOOTLOADER_PATH}/.locale echo "${LANGUAGE}.UTF-8" >${PART1_PATH}/.locale
export LANG="${LANGUAGE}.UTF-8" export LANG="${LANGUAGE}.UTF-8"
} }
@ -1684,10 +1672,11 @@ function downloadExts() {
[ $? -ne 0 ] && return 1 [ $? -ne 0 ] && return 1
fi fi
fi fi
dialog --backtitle "$(backtitle)" --colors --title "${T}" \ (
--infobox "$(TEXT "Downloading last version")" 0 0 rm -f "${TMP_PATH}/${4}.zip"
rm -f "${TMP_PATH}/${4}.zip" STATUS=$(curl -kL -w "%{http_code}" "${PROXY}${3}/releases/download/${TAG}/${4}.zip" -o "${TMP_PATH}/${4}.zip")
STATUS=$(curl -kL -w "%{http_code}" "${PROXY}${3}/releases/download/${TAG}/${4}.zip" -o "${TMP_PATH}/${4}.zip") ) 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--progressbox "$(TEXT "Downloading ...")" 20 100
if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then if [ $? -ne 0 -o ${STATUS} -ne 200 ]; then
if [ ! "${5}" = "0" ]; then if [ ! "${5}" = "0" ]; then
dialog --backtitle "$(backtitle)" --colors --title "${T}" \ dialog --backtitle "$(backtitle)" --colors --title "${T}" \
@ -1748,7 +1737,7 @@ function updateRR() {
done < <(readConfigMap "replace" "${TMP_PATH}/update-list.yml") done < <(readConfigMap "replace" "${TMP_PATH}/update-list.yml")
dialog --backtitle "$(backtitle)" --colors --title "${T}" \ dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--msgbox "$(printf "$(TEXT "RR updated with success to %s!\nReboot?")" "${TAG}")" 0 0 --msgbox "$(printf "$(TEXT "RR updated with success to %s!\nReboot?")" "${TAG}")" 0 0
rr-reboot.sh config rebootTo config
} }
# 1 - ext name # 1 - ext name
@ -1788,7 +1777,7 @@ function updateExts() {
rm -rf "${LKM_PATH}/"* rm -rf "${LKM_PATH}/"*
unzip "${TMP_PATH}/rp-lkms.zip" -d "${LKM_PATH}" >/dev/null 2>&1 unzip "${TMP_PATH}/rp-lkms.zip" -d "${LKM_PATH}" >/dev/null 2>&1
fi fi
DIRTY=1 touch ${PART1_PATH}/.build
if [ ! "${2}" = "0" ]; then if [ ! "${2}" = "0" ]; then
dialog --backtitle "$(backtitle)" --colors --title "${T}" \ dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--infobox "$(printf "$(TEXT "%s updated with success!")" "${1}")" 0 0 --infobox "$(printf "$(TEXT "%s updated with success!")" "${1}")" 0 0
@ -1802,9 +1791,9 @@ function updateExts() {
function updateMenu() { function updateMenu() {
while true; do while true; do
CUR_RR_VER="${RR_VERSION:-0}" CUR_RR_VER="${RR_VERSION:-0}"
CUR_ADDONS_VER="$(cat "${CACHE_PATH}/addons/VERSION" 2>/dev/null)" CUR_ADDONS_VER="$(cat "${PART3_PATH}/addons/VERSION" 2>/dev/null)"
CUR_MODULES_VER="$(cat "${CACHE_PATH}/modules/VERSION" 2>/dev/null)" CUR_MODULES_VER="$(cat "${PART3_PATH}/modules/VERSION" 2>/dev/null)"
CUR_LKMS_VER="$(cat "${CACHE_PATH}/lkms/VERSION" 2>/dev/null)" CUR_LKMS_VER="$(cat "${PART3_PATH}/lkms/VERSION" 2>/dev/null)"
PROXY="$(readConfigKey "proxy" "${USER_CONFIG_FILE}")" PROXY="$(readConfigKey "proxy" "${USER_CONFIG_FILE}")"
[ -n "${PROXY}" ] && [[ "${PROXY: -1}" != "/" ]] && PROXY="${PROXY}/" [ -n "${PROXY}" ] && [[ "${PROXY: -1}" != "/" ]] && PROXY="${PROXY}/"
rm -f "${TMP_PATH}/menu" rm -f "${TMP_PATH}/menu"
@ -1963,7 +1952,7 @@ function notepadMenu() {
############################################################################### ###############################################################################
if [ "x$1" = "xb" -a -n "${MODEL}" -a -n "${PRODUCTVER}" -a loaderIsConfigured ]; then if [ "x$1" = "xb" -a -n "${MODEL}" -a -n "${PRODUCTVER}" -a loaderIsConfigured ]; then
install-addons.sh updateAddons
make make
boot && exit 0 || sleep 5 boot && exit 0 || sleep 5
fi fi
@ -1991,7 +1980,7 @@ while true; do
fi fi
echo "l \"$(TEXT "Choose a language")\"" >>"${TMP_PATH}/menu" echo "l \"$(TEXT "Choose a language")\"" >>"${TMP_PATH}/menu"
echo "k \"$(TEXT "Choose a keymap")\"" >>"${TMP_PATH}/menu" echo "k \"$(TEXT "Choose a keymap")\"" >>"${TMP_PATH}/menu"
if [ ${CLEARCACHE} -eq 1 -a -d "${CACHE_PATH}/dl" ]; then if [ ${CLEARCACHE} -eq 1 -a -d "${PART3_PATH}/dl" ]; then
echo "c \"$(TEXT "Clean disk cache")\"" >>"${TMP_PATH}/menu" echo "c \"$(TEXT "Clean disk cache")\"" >>"${TMP_PATH}/menu"
fi fi
echo "p \"$(TEXT "Update menu")\"" >>"${TMP_PATH}/menu" echo "p \"$(TEXT "Update menu")\"" >>"${TMP_PATH}/menu"
@ -2032,7 +2021,8 @@ while true; do
NEXT="d" NEXT="d"
;; ;;
d) d)
make make 2>&1 | dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Main menu")" --cr-wrap --no-collapse \
--progressbox "$(TEXT "Making ...")" 20 100
NEXT="b" NEXT="b"
;; ;;
b) b)
@ -2048,7 +2038,7 @@ while true; do
;; ;;
c) c)
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Cleaning")" \ dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Cleaning")" \
--prgbox "rm -rfv \"${CACHE_PATH}/dl\"" 0 0 --prgbox "rm -rfv \"${PART3_PATH}/dl\"" 0 0
NEXT="d" NEXT="d"
;; ;;
p) p)
@ -2079,7 +2069,7 @@ while true; do
reboot reboot
;; ;;
c) c)
rr-reboot.sh config rebootTo config
;; ;;
s) s)
break 2 break 2

View File

@ -7,6 +7,8 @@ synoinfo: &synoinfo
supportadt7490: "no" supportadt7490: "no"
support_syno_hybrid_raid: support_syno_hybrid_raid:
supportraidgroup: supportraidgroup:
supportsas: "no"
supportsas_v2: "yes"
maxlanport: "8" maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7" netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff" buzzeroffen: "0xffff"
@ -17,6 +19,7 @@ cmdline: &cmdline
syno_ttyS0: "serial,0x3f8" syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8" syno_ttyS1: "serial,0x2f8"
elevator: elevator elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch patch: &patch
- "ramdisk-etc-rc-*.patch" - "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch" - "ramdisk-init-script-v4-*.patch"

View File

@ -5,6 +5,8 @@ synoinfo: &synoinfo
support_led_brightness_adjustment: "no" support_led_brightness_adjustment: "no"
support_syno_hybrid_raid: support_syno_hybrid_raid:
supportraidgroup: supportraidgroup:
supportsas: "no"
supportsas_v2: "yes"
maxlanport: "8" maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7" netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff" buzzeroffen: "0xffff"
@ -15,6 +17,7 @@ cmdline: &cmdline
syno_ttyS0: "serial,0x3f8" syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8" syno_ttyS1: "serial,0x2f8"
elevator: elevator elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch patch: &patch
- "ramdisk-etc-rc-*.patch" - "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch" - "ramdisk-init-script-v4-*.patch"

View File

@ -3,9 +3,6 @@ synoinfo: &synoinfo
support_disk_compatibility: "no" support_disk_compatibility: "no"
support_memory_compatibility: "no" support_memory_compatibility: "no"
support_led_brightness_adjustment: "no" support_led_brightness_adjustment: "no"
support_leds_atmega1608: "no"
support_leds_lp3943: "no"
supportadt7490: "no"
support_syno_hybrid_raid: support_syno_hybrid_raid:
supportraidgroup: supportraidgroup:
maxlanport: "8" maxlanport: "8"

View File

@ -7,6 +7,7 @@ synoinfo: &synoinfo
support_syno_hybrid_raid: support_syno_hybrid_raid:
supportraidgroup: supportraidgroup:
supportsas: "no" supportsas: "no"
supportsas_v2: "yes"
maxlanport: "8" maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7" netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline cmdline: &cmdline
@ -17,6 +18,7 @@ cmdline: &cmdline
SMBusHddDynamicPower: 1 SMBusHddDynamicPower: 1
vender_format_version: 2 vender_format_version: 2
elevator: elevator elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch patch: &patch
- "ramdisk-etc-rc-*.patch" - "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch" - "ramdisk-init-script-v4-*.patch"

View File

@ -8,6 +8,7 @@ synoinfo: &synoinfo
support_syno_hybrid_raid: support_syno_hybrid_raid:
supportraidgroup: supportraidgroup:
supportsas: "no" supportsas: "no"
supportsas_v2: "yes"
maxlanport: "8" maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7" netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline cmdline: &cmdline
@ -16,6 +17,7 @@ cmdline: &cmdline
syno_hdd_powerup_seq: 0 syno_hdd_powerup_seq: 0
vender_format_version: 2 vender_format_version: 2
elevator: elevator elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch patch: &patch
- "ramdisk-etc-rc-*.patch" - "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch" - "ramdisk-init-script-v4-*.patch"

View File

@ -1,7 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
. /opt/rr/include/functions.sh [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. /opt/rr/include/addons.sh
. ${WORK_PATH}/include/functions.sh
. ${WORK_PATH}/include/addons.sh
set -o pipefail # Get exit code from process piped set -o pipefail # Get exit code from process piped
@ -13,12 +15,6 @@ echo -n "Patching Ramdisk"
# Remove old rd.gz patched # Remove old rd.gz patched
rm -f "${MOD_RDGZ_FILE}" rm -f "${MOD_RDGZ_FILE}"
# Check disk space left
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)"
LOADER_DEVICE_NAME=$(echo ${LOADER_DISK} | sed 's|/dev/||')
SPACELEFT=$(df --block-size=1 | awk '/'${LOADER_DEVICE_NAME}'3/{print$4}')
[ ${SPACELEFT} -le 268435456 ] && rm -rf "${CACHE_PATH}/dl"
# Unzipping ramdisk # Unzipping ramdisk
echo -n "." echo -n "."
rm -rf "${RAMDISK_PATH}" # Force clean rm -rf "${RAMDISK_PATH}" # Force clean
@ -93,7 +89,7 @@ done < <(readConfigMap "modules" "${USER_CONFIG_FILE}")
while read PE; do while read PE; do
RET=1 RET=1
echo "Patching with ${PE}" >"${LOG_FILE}" 2>&1 echo "Patching with ${PE}" >"${LOG_FILE}" 2>&1
for PF in $(ls ${PATCH_PATH}/${PE}); do for PF in $(ls ${WORK_PATH}/patch/${PE}); do
echo -n "." echo -n "."
echo "Patching with ${PF}" >>"${LOG_FILE}" 2>&1 echo "Patching with ${PF}" >>"${LOG_FILE}" 2>&1
( (
@ -116,7 +112,7 @@ _set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >"${LOG_FILE}" 2>&
# Patch /sbin/init.post # Patch /sbin/init.post
echo -n "." echo -n "."
grep -v -e '^[\t ]*#' -e '^$' "${PATCH_PATH}/config-manipulators.sh" >"${TMP_PATH}/rp.txt" grep -v -e '^[\t ]*#' -e '^$' "${WORK_PATH}/patch/config-manipulators.sh" >"${TMP_PATH}/rp.txt"
sed -e "/@@@CONFIG-MANIPULATORS-TOOLS@@@/ {" -e "r ${TMP_PATH}/rp.txt" -e 'd' -e '}' -i "${RAMDISK_PATH}/sbin/init.post" sed -e "/@@@CONFIG-MANIPULATORS-TOOLS@@@/ {" -e "r ${TMP_PATH}/rp.txt" -e 'd' -e '}' -i "${RAMDISK_PATH}/sbin/init.post"
rm -f "${TMP_PATH}/rp.txt" rm -f "${TMP_PATH}/rp.txt"
touch "${TMP_PATH}/rp.txt" touch "${TMP_PATH}/rp.txt"
@ -150,7 +146,7 @@ rm -rf "${TMP_PATH}/modules"
echo -n "." echo -n "."
# Copying fake modprobe # Copying fake modprobe
cp -f "${PATCH_PATH}/iosched-trampoline.sh" "${RAMDISK_PATH}/usr/sbin/modprobe" cp -f "${WORK_PATH}/patch/iosched-trampoline.sh" "${RAMDISK_PATH}/usr/sbin/modprobe"
# Copying LKM to /usr/lib/modules # Copying LKM to /usr/lib/modules
gzip -dc "${LKM_PATH}/rp-${PLATFORM}-$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko" gzip -dc "${LKM_PATH}/rp-${PLATFORM}-$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko"
@ -171,6 +167,10 @@ echo "export LAYOUT=${LAYOUT}" >>"${RAMDISK_PATH}/addons/addons.sh"
echo "export KEYMAP=${KEYMAP}" >>"${RAMDISK_PATH}/addons/addons.sh" echo "export KEYMAP=${KEYMAP}" >>"${RAMDISK_PATH}/addons/addons.sh"
chmod +x "${RAMDISK_PATH}/addons/addons.sh" chmod +x "${RAMDISK_PATH}/addons/addons.sh"
# Required addons: restore
installAddon revert
echo "/addons/revert.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog
# Required addons: eudev, disks, localrss, wol # Required addons: eudev, disks, localrss, wol
installAddon eudev installAddon eudev
echo "/addons/eudev.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog echo "/addons/eudev.sh \${1} " >>"${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog
@ -198,7 +198,7 @@ echo "inetd" >>"${RAMDISK_PATH}/addons/addons.sh"
[ "2" = "${BUILDNUM:0:1}" ] && sed -i 's/function //g' $(find "${RAMDISK_PATH}/addons/" -type f -name "*.sh") [ "2" = "${BUILDNUM:0:1}" ] && sed -i 's/function //g' $(find "${RAMDISK_PATH}/addons/" -type f -name "*.sh")
# Build modules dependencies # Build modules dependencies
/opt/rr/depmod -a -b ${RAMDISK_PATH} 2>/dev/null ${WORK_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null
# Network card configuration file # Network card configuration file
for N in $(seq 0 7); do for N in $(seq 0 7); do

View File

@ -1,7 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Based on code and ideas from @jumkey # Based on code and ideas from @jumkey
. /opt/rr/include/functions.sh [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. ${WORK_PATH}/include/functions.sh
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")" MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")" PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"

View File

@ -1,6 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
. /opt/rr/include/functions.sh [ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. ${WORK_PATH}/include/functions.sh
set -o pipefail # Get exit code from process piped set -o pipefail # Get exit code from process piped
@ -12,13 +14,13 @@ echo -n "Patching zImage"
rm -f "${MOD_ZIMAGE_FILE}" rm -f "${MOD_ZIMAGE_FILE}"
echo -n "." echo -n "."
# Extract vmlinux # Extract vmlinux
/opt/rr/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog ${WORK_PATH}/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog
echo -n "." echo -n "."
# Patch boot params and ramdisk check # Patch boot params and ramdisk check
/opt/rr/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog ${WORK_PATH}/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog
echo -n "." echo -n "."
# rebuild zImage # rebuild zImage
/opt/rr/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog ${WORK_PATH}/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog
echo -n "." echo -n "."
# Update HASH of new DSM zImage # Update HASH of new DSM zImage
HASH="$(sha256sum ${ORI_ZIMAGE_FILE} | awk '{print$1}')" HASH="$(sha256sum ${ORI_ZIMAGE_FILE} | awk '{print$1}')"

View File

@ -1,19 +0,0 @@
serial --unit=1 --speed=115200
terminal serial
default 1
timeout 3
verbose
hiddenmenu
fallback 0
title SYNOLOGY_1
root (hd0,0)
kernel /zImage root=/dev/md0
initrd /rd.gz
title SYNOLOGY_2
root (hd0,1)
cksum /grub_cksum.syno
vender /vender show
kernel /zImage root=/dev/md0
initrd /rd.gz

View File

@ -107,6 +107,15 @@
## DEBUG ## DEBUG
* log: * log:
``` ```
# 内核相关
sysctl -n kernel.syno_serial # 查看当前鉴权的SN
cat /proc/sys/kernel/syno_serial # 查看当前鉴权的SN
sysctl -n kernel.syno_mac_address1 # 查看当前鉴权的mcac1 (kernel.syno_mac_addresses)
cat /proc/sys/kernel/syno_mac_address1 # 查看当前鉴权的mcac1 (/proc/sys/kernel/syno_mac_addresses)
sysctl -n kernel.syno_internal_netif_num # 查看当前鉴权的网卡数量
cat /proc/sys/kernel/syno_internal_netif_num # 查看当前鉴权的网卡数量
nproc # 查看当前线程数
# 驱动相关 # 驱动相关
lsmod # 查看已加载驱动 lsmod # 查看已加载驱动
ls -ld /sys/class/net/*/device/driver # 查看已加载网卡和对应驱动 ls -ld /sys/class/net/*/device/driver # 查看已加载网卡和对应驱动
@ -128,6 +137,7 @@
# 服务相关 # 服务相关
systemctl # 查看服务 systemctl # 查看服务
netstat -tunlp # 查看端口 netstat -tunlp # 查看端口
systemctl disable cpufreq.service # 禁用 CPU 频率调节器
# 日志相关 # 日志相关
dmesg # 内核日志 dmesg # 内核日志

View File

@ -4,13 +4,8 @@ set -e
. scripts/func.sh . scripts/func.sh
# Convert po2mo, Get extractor, LKM, addons and Modules # Convert po2mo
convertpo2mo "files/initrd/opt/rr/lang" convertpo2mo "files/initrd/opt/rr/lang"
getExtractor "files/p3/extractor"
getLKMs "files/p3/lkms" true
getAddons "files/p3/addons" true
getModules "files/p3/modules" true
IMAGE_FILE="rr.img" IMAGE_FILE="rr.img"
gzip -dc "files/grub.img.gz" >"${IMAGE_FILE}" gzip -dc "files/grub.img.gz" >"${IMAGE_FILE}"
@ -30,12 +25,20 @@ getBuildroot "2023.02.x" "br"
[ ! -f "br/bzImage-rr" -o ! -f "br/initrd-rr" ] && return 1 [ ! -f "br/bzImage-rr" -o ! -f "br/initrd-rr" ] && return 1
echo "Repack initrd" echo "Repack initrd"
cp -f "br/bzImage-rr" "files/p3/bzImage-rr" cp -f "br/bzImage-rr" "/tmp/p3/bzImage-rr"
repackInitrd "br/initrd-rr" "files/initrd" "files/p3/initrd-rr" repackInitrd "br/initrd-rr" "files/initrd" "/tmp/p3/initrd-rr"
echo "Copying files" echo "Copying files"
sudo cp -Rf "files/p1/"* "/tmp/p1" sudo cp -Rf "files/p1/"* "/tmp/p1"
sudo cp -Rf "files/p3/"* "/tmp/p3" sudo cp -Rf "files/p3/"* "/tmp/p3"
# Get extractor, LKM, addons and Modules
getLKMs "/tmp/p3/lkms" true
getAddons "/tmp/p3/addons" true
getModules "/tmp/p3/modules" true
getExtractor "/tmp/p3/extractor"
read -p "Press enter to continue"
sync sync
echo "Unmount image file" echo "Unmount image file"

View File

@ -176,7 +176,7 @@ function getModules() {
# repack initrd # repack initrd
# $1 initrd file # $1 initrd file
# $2 plugin path # $2 plugin path
# $3 output path # $3 output file
function repackInitrd() { function repackInitrd() {
INITRD_FILE="${1}" INITRD_FILE="${1}"
PLUGIN_PATH="${2}" PLUGIN_PATH="${2}"

View File

@ -1,40 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# 23.5.0 # rr
[ ! -f /mnt/p1/boot/grub/grub.cfg ] && exit 1 [ ! "rr" = "$(hostname)" ] && exit 1
# 23.7.0
. /opt/rr/include/functions.sh
if loaderIsConfigured; then
if [ -f "${ORI_RDGZ_FILE}" ]; then
rm -rf "${RAMDISK_PATH}"
mkdir -p "${RAMDISK_PATH}"
(
cd "${RAMDISK_PATH}"
xz -dc <"${ORI_RDGZ_FILE}" | cpio -idm
) >/dev/null 2>&1
. "${RAMDISK_PATH}/etc/VERSION"
[ -n "$(readConfigKey "build" "${USER_CONFIG_FILE}")" ] && deleteConfigKey "build" "${USER_CONFIG_FILE}"
[ -n "$(readConfigKey "smallfixnumber" "${USER_CONFIG_FILE}")" ] && deleteConfigKey "smallfixnumber" "${USER_CONFIG_FILE}"
[ -z "$(readConfigKey "paturl" "${USER_CONFIG_FILE}")" ] && writeConfigKey "paturl" "" "${USER_CONFIG_FILE}"
[ -z "$(readConfigKey "patsum" "${USER_CONFIG_FILE}")" ] && writeConfigKey "patsum" "" "${USER_CONFIG_FILE}"
[ -z "$(readConfigKey "productver" "${USER_CONFIG_FILE}")" ] && writeConfigKey "productver" "${majorversion}.${minorversion}" "${USER_CONFIG_FILE}"
[ -z "$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")" ] && writeConfigKey "buildnum" "${buildnumber}" "${USER_CONFIG_FILE}"
[ -z "$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")" ] && writeConfigKey "smallnum" "${smallfixnumber}" "${USER_CONFIG_FILE}"
fi
fi
# 23.9.7
MAC1="$(readConfigKey "cmdline.mac1" "${USER_CONFIG_FILE}")"
deleteConfigKey "notsetmacs" "${USER_CONFIG_FILE}"
for N in $(1 8); do
deleteConfigKey "cmdline.mac${N}" "${USER_CONFIG_FILE}"
deleteConfigKey "original-mac${N}" "${USER_CONFIG_FILE}"
done
deleteConfigKey "cmdline.netif_num" "${USER_CONFIG_FILE}"
[ -n "${MAC1}" ] && writeConfigKey "mac1" "${MAC1}" "${USER_CONFIG_FILE}"
MAC1="$(readConfigKey "mac1" "${USER_CONFIG_FILE}")"
[ -z "${MAC1}" ] && writeConfigKey "mac1" "001132$(printf '%02x%02x%02x' $((${RANDOM} % 256)) $((${RANDOM} % 256)) $((${RANDOM} % 256)))" "${USER_CONFIG_FILE}"
exit 0 exit 0