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
tests
/extractor
/br

View File

@ -1,18 +1,18 @@
#!/usr/bin/env bash
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
loaderIsConfigured || die "$(TEXT "Loader is not configured!")"
# Check if machine has EFI
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)"
BUS=$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2)
[ "${BUS}" = "ata" ] && BUS="sata"
BUS=$(getBus "${LOADER_DISK}")
# Print text centralized
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;44m%*s\033[0m\n" ${COLUMNS} ""
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]"
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
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"
/opt/rr/zimage-patch.sh
${WORK_PATH}/zimage-patch.sh
if [ $? -ne 0 ]; then
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
@ -47,9 +42,9 @@ fi
# Check if DSM ramdisk changed, patch it if necessary
RAMDISK_HASH="$(readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}")"
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"
/opt/rr/ramdisk-patch.sh
${WORK_PATH}/ramdisk-patch.sh
if [ $? -ne 0 ]; then
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
@ -58,6 +53,7 @@ if [ "${RAMDISK_HASH_CUR}" != "${RAMDISK_HASH}" ]; then
# Update SHA256 hash
writeConfigKey "ramdisk-hash" "${RAMDISK_HASH_CUR}" "${USER_CONFIG_FILE}"
fi
[ -f ${PART1_PATH}/.build ] && rm -f ${PART1_PATH}/.build
# Load necessary variables
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 "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"
exit 1
fi
HASATA=0
for D in $(lsblk -dnp -o name); do
for D in $(lsblk -dpno NAME); do
[ "${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
break
fi
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}")"
PID="$(readConfigKey "pid" "${USER_CONFIG_FILE}")"
@ -98,6 +94,8 @@ SN="$(readConfigKey "sn" "${USER_CONFIG_FILE}")"
MAC1="$(readConfigKey "mac1" "${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
# Automatic values
@ -108,7 +106,7 @@ CMDLINE['vid']="${VID}"
CMDLINE['pid']="${PID}"
CMDLINE['sn']="${SN}"
CMDLINE['mac1']="${MAC1}"
CMDLINE['netif_num']="1"
CMDLINE['netif_num']="${NETIFNUM}"
# set fixed cmdline
if grep -q "force_junior" /proc/cmdline; then
@ -120,8 +118,7 @@ else
CMDLINE['noefi']=""
fi
if [ ! "${BUS}" = "usb" ]; then
LOADER_DEVICE_NAME=$(echo ${LOADER_DISK} | sed 's|/dev/||')
SIZE=$(($(cat /sys/block/${LOADER_DEVICE_NAME}/size) / 2048 + 10))
SIZE=$(($(cat /sys/block/${LOADER_DISK/\/dev\//}/size) / 2048 + 10))
# Read SATADoM type
DOM="$(readModelKey "${MODEL}" "dom")"
CMDLINE['synoboot_satadom']="${DOM}"
@ -204,7 +201,7 @@ else
break
fi
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
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
@ -234,6 +231,14 @@ else
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
KVER=$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")
if [ "${KVER:0:1}" = "3" -a ${EFI} -eq 1 ]; then
@ -244,7 +249,7 @@ else
fi
echo -e "\033[1;37m$(TEXT "Booting...")\033[0m"
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
KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")"
[ "${KERNELWAY}" = "kexec" ] && kexec -f -e || poweroff

View File

@ -53,7 +53,7 @@ function installAddon() {
[ ${HAS_FILES} -ne 1 ] && return 1
cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}" || dieLog
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}"
return 0
}
@ -72,3 +72,16 @@ function untarAddon() {
mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${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}
}
###############################################################################
# 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
# 1 - Path of key

View File

@ -1,27 +1,30 @@
RR_VERSION="23.10.4"
RR_TITLE="rr v${RR_VERSION}"
RR_TITLE="RR v${RR_VERSION}"
# Define paths
PART1_PATH="/mnt/p1"
PART2_PATH="/mnt/p2"
PART3_PATH="/mnt/p3"
DSMROOT_PATH="/mnt/dsmroot"
TMP_PATH="/tmp"
UNTAR_PAT_PATH="${TMP_PATH}/pat"
RAMDISK_PATH="${TMP_PATH}/ramdisk"
LOG_FILE="${TMP_PATH}/log.txt"
USER_CONFIG_FILE="${BOOTLOADER_PATH}/user-config.yml"
GRUB_PATH="${BOOTLOADER_PATH}/boot/grub"
USER_CONFIG_FILE="${PART1_PATH}/user-config.yml"
GRUB_PATH="${PART1_PATH}/boot/grub"
ORI_ZIMAGE_FILE="${SLPART_PATH}/zImage"
ORI_RDGZ_FILE="${SLPART_PATH}/rd.gz"
ORI_ZIMAGE_FILE="${PART2_PATH}/zImage"
ORI_RDGZ_FILE="${PART2_PATH}/rd.gz"
RR_BZIMAGE_FILE="${CACHE_PATH}/bzImage-rr"
RR_RAMDISK_FILE="${CACHE_PATH}/initrd-rr"
MOD_ZIMAGE_FILE="${CACHE_PATH}/zImage-dsm"
MOD_RDGZ_FILE="${CACHE_PATH}/initrd-dsm"
ADDONS_PATH="${CACHE_PATH}/addons"
LKM_PATH="${CACHE_PATH}/lkms"
MODULES_PATH="${CACHE_PATH}/modules"
USER_UP_PATH="${CACHE_PATH}/users"
RR_BZIMAGE_FILE="${PART3_PATH}/bzImage-rr"
RR_RAMDISK_FILE="${PART3_PATH}/initrd-rr"
MOD_ZIMAGE_FILE="${PART3_PATH}/zImage-dsm"
MOD_RDGZ_FILE="${PART3_PATH}/initrd-dsm"
MODEL_CONFIG_PATH="/opt/rr/model-configs"
INCLUDE_PATH="/opt/rr/include"
PATCH_PATH="/opt/rr/patch"
LKM_PATH="${PART3_PATH}/lkms"
ADDONS_PATH="${PART3_PATH}/addons"
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
. /opt/rr/include/configFile.sh
[ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
. ${WORK_PATH}/include/consts.sh
. ${WORK_PATH}/include/configFile.sh
. ${WORK_PATH}/include/i18n.sh
###############################################################################
# Read key value from model config file
@ -8,7 +11,7 @@
# 2 - Key
# Return Value
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
# Returns map of values
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
# Returns array/map of values
function readModelArray() {
readConfigArray "${2}" "${MODEL_CONFIG_PATH}/${1}.yml"
readConfigArray "${2}" "${WORK_PATH}/model-configs/${1}.yml"
}
###############################################################################
@ -239,37 +242,81 @@ EOF
fi
ETHLIST="$(echo -e "${ETHLIST}" | grep -v '^$')"
echo -e "${ETHLIST}" > /tmp/ethlist
# cat /tmp/ethlist
echo -e "${ETHLIST}" >${TMP_PATH}/ethlist
# cat ${TMP_PATH}/ethlist
# sort
IDX=0
while true; do
# cat /tmp/ethlist
[ ${IDX} -ge $(wc -l < /tmp/ethlist) ] && break
ETH=$(cat /tmp/ethlist | sed -n "$((${IDX} + 1))p" | awk '{print $3}')
# cat ${TMP_PATH}/ethlist
[ ${IDX} -ge $(wc -l <${TMP_PATH}/ethlist) ] && break
ETH=$(cat ${TMP_PATH}/ethlist | sed -n "$((${IDX} + 1))p" | awk '{print $3}')
# echo "ETH: ${ETH}"
if [ -n "${ETH}" ] && [ ! "${ETH}" = "eth${IDX}" ]; then
# echo "change ${ETH} <=> eth${IDX}"
ip link set dev eth${IDX} down
ip link set dev ${ETH} down
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 tmp name ${ETH}
ip link set dev ethN name ${ETH}
sleep 1
ip link set dev eth${IDX} up
ip link set dev ${ETH} up
sleep 1
sed -i "s/eth${IDX}/tmp/" /tmp/ethlist
sed -i "s/${ETH}/eth${IDX}/" /tmp/ethlist
sed -i "s/tmp/${ETH}/" /tmp/ethlist
sed -i "s/eth${IDX}/ethN/" ${TMP_PATH}/ethlist
sed -i "s/${ETH}/eth${IDX}/" ${TMP_PATH}/ethlist
sed -i "s/ethN/${ETH}/" ${TMP_PATH}/ethlist
sleep 1
fi
IDX=$((${IDX} + 1))
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)
function findAndMountDSMRoot() {
[ $(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
[ $(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
@ -286,3 +333,16 @@ function findAndMountDSMRoot() {
fi
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
export LANG="$(cat ${BOOTLOADER_PATH}/.locale)"
fi
[ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
alias TEXT='gettext "rr"'
shopt -s expand_aliases
if [ -d "/usr/share/locale" ]; then
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
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
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
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
# Shows title
clear
[ -z "${COLUMNS}" ] && COLUMNS=50
TITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}")"
printf "\033[1;44m%*s\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;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
ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list
# 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 [ ! -f "${USER_CONFIG_FILE}" ]; then
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
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}")"
@ -119,14 +70,13 @@ done
# Get the VID/PID if we are in USB
VID="0x46f4"
PID="0x0001"
BUS=$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2)
[ "${BUS}" = "ata" ] && BUS="sata"
BUS=$(getBus "${LOADER_DISK}")
if [ "${BUS}" = "usb" ]; then
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)"
elif [ "${BUS}" != "sata" -a "${BUS}" != "scsi" ]; then
die "$(TEXT "Loader disk neither USB or DoM")"
elif [ "${BUS}" != "sata" -a "${BUS}" != "scsi" -a "${BUS}" != "nvme" ]; then
die "$(TEXT "Loader disk neither USB or SATA/SCSI/NVME DoM")"
fi
# Save variables to user config file
@ -136,16 +86,6 @@ writeConfigKey "pid" ${PID} "${USER_CONFIG_FILE}"
# Inform user
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
LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")"
KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
@ -210,7 +150,7 @@ for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
break
fi
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
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
@ -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
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
RAM=$(free -m | awk '/Mem:/{print$2}')
if [ ${RAM} -le 3500 ]; then
@ -238,4 +186,4 @@ mkdir -p "${ADDONS_PATH}"
mkdir -p "${LKM_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
. /opt/rr/include/functions.sh
. /opt/rr/include/addons.sh
. /opt/rr/include/modules.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
. ${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
CLEARCACHE=0
LOADER_DISK="$(blkid | grep 'LABEL="RR3"' | cut -d3 -f1)"
LOADER_DEVICE_NAME=$(echo "${LOADER_DISK}" | sed 's|/dev/||')
if [ $(cat "/sys/block/${LOADER_DEVICE_NAME}/${LOADER_DEVICE_NAME}3/size") -lt 4194304 ]; then
if [ $(cat "/sys/block/${LOADER_DISK/\/dev\//}/${LOADER_DISK_PART3/\/dev\//}/size") -lt 4194304 ]; then
CLEARCACHE=1
fi
# 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=0
@ -93,10 +93,11 @@ function modelMenu() {
Y=$(echo ${M} | tr -cd "[0-9]")
Y=${Y:0-2}
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
echo -n "" >"${TMP_PATH}/menu"
echo "c \"\Z1$(TEXT "Compatibility judgment")\Zn\"" >>"${TMP_PATH}/menu"
FLGNEX=0
while read M Y; do
PLATFORM=$(readModelKey "${M}" "platform")
@ -119,21 +120,12 @@ function modelMenu() {
done < <(cat "${TMP_PATH}/modellist" | sort -r -n -k 2)
[ ${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"
echo "c \"\Z1$(TEXT "Compatibility judgment")\Zn\"" >>"${TMP_PATH}/menu"
dialog --backtitle "$(backtitle)" --colors \
--menu "$(TEXT "Choose the model")" 0 0 0 --file "${TMP_PATH}/menu" \
2>${TMP_PATH}/resp
[ $? -ne 0 ] && return
resp=$(<${TMP_PATH}/resp)
[ -z "${resp}" ] && return
if [ "${resp}" = "f" ]; then
RESTRICT=0
continue
fi
if [ "${resp}" = "b" ]; then
FLGBETA=1
continue
fi
if [ "${resp}" = "c" ]; then
models=(DS918+ RS1619xs+ DS419+ DS1019+ DS719+ DS1621xs+)
[ $(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
continue
fi
if [ "${resp}" = "f" ]; then
RESTRICT=0
continue
fi
if [ "${resp}" = "b" ]; then
FLGBETA=1
continue
fi
break
done
else
@ -199,14 +199,14 @@ function modelMenu() {
for I in $(seq 1 ${NETIF_NUM}); do
writeConfigKey "mac${I}" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}"
done
DIRTY=1
touch ${PART1_PATH}/.build
fi
}
###############################################################################
# Shows available buildnumbers from a model to user choose one
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
dialog --backtitle "$(backtitle)" --colors \
--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
return
fi
if [ ! "usb" = "$(udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2)" -a "${KVER:0:1}" = "5" ]; then
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
# return
fi
# if [ ! "usb" = "$(getBus "${LOADER_DISK}")" -a "${KVER:0:1}" = "5" ]; then
# 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
# # return
# fi
while true; do
# get online pat data
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Product Version")" \
--infobox "$(TEXT "Get pat data ..")" 0 0
--infobox "$(TEXT "Get pat data ...")" 0 0
idx=0
while [ ${idx} -le 3 ]; do # Loop 3 times, if successful, break
fastest=$(_get_fastest "www.synology.com" "www.synology.cn")
@ -306,7 +306,7 @@ function productversMenu() {
done < <(getAllModules "${PLATFORM}" "$([ -n "${KPRE}" ] && echo "${KPRE}-")${KVER}")
# Remove old files
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")"
ADDONS[${ADDON}]="${VALUE}"
writeConfigKey "addons.${ADDON}" "${VALUE}" "${USER_CONFIG_FILE}"
DIRTY=1
touch ${PART1_PATH}/.build
;;
d)
NEXT='d'
@ -385,7 +385,7 @@ function addonMenu() {
unset ADDONS[${I}]
deleteConfigKey "addons.${I}" "${USER_CONFIG_FILE}"
done
DIRTY=1
touch ${PART1_PATH}/.build
;;
s)
NEXT='s'
@ -441,7 +441,7 @@ function addonMenu() {
fi
ADDON="$(untarAddon "${TMP_UP_PATH}/${USER_FILE}")"
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")" \
--msgbox "$(printf "$(TEXT "Addon '%s' added to loader, Please enable it in 'Add an addon' menu.")" "${ADDON}")" 0 0
else
@ -501,7 +501,7 @@ function moduleMenu() {
for ID in ${resp}; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done
DIRTY=1
touch ${PART1_PATH}/.build
break
;;
3) # extra-button
@ -509,11 +509,11 @@ function moduleMenu() {
while read ID DESC; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done <<<${ALLMODULES}
DIRTY=1
touch ${PART1_PATH}/.build
;;
2) # help-button
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
DIRTY=1
touch ${PART1_PATH}/.build
;;
1) # cancel-button
break
@ -536,7 +536,7 @@ function moduleMenu() {
for ID in ${KOLIST[@]}; do
writeConfigKey "modules.${ID}" "" "${USER_CONFIG_FILE}"
done
DIRTY=1
touch ${PART1_PATH}/.build
;;
o)
MSG=""
@ -563,7 +563,7 @@ function moduleMenu() {
popd
if [ -n "${USER_FILE}" -a "${USER_FILE##*.}" = "ko" ]; then
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")" \
--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}"
@ -736,7 +736,7 @@ function synoinfoMenu() {
VALUE="$(<"${TMP_PATH}/resp")"
SYNOINFO[${NAME}]="${VALUE}"
writeConfigKey "synoinfo.${NAME}" "${VALUE}" "${USER_CONFIG_FILE}"
DIRTY=1
touch ${PART1_PATH}/.build
;;
d)
if [ ${#SYNOINFO[@]} -eq 0 ]; then
@ -758,7 +758,7 @@ function synoinfoMenu() {
unset SYNOINFO[${I}]
deleteConfigKey "synoinfo.${I}" "${USER_CONFIG_FILE}"
done
DIRTY=1
touch ${PART1_PATH}/.build
;;
s)
ITEMS=""
@ -779,11 +779,12 @@ function extractDsmFiles() {
PATURL="$(readConfigKey "paturl" "${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_PATH="${CACHE_PATH}/dl/${PAT_FILE}"
EXTRACTOR_PATH="${CACHE_PATH}/extractor"
PAT_PATH="${PART3_PATH}/dl/${PAT_FILE}"
EXTRACTOR_PATH="${PART3_PATH}/extractor"
EXTRACTOR_BIN="syno_extract_system_patch"
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 [ ${CLEARCACHE} -eq 1 ]; then
echo "$(TEXT "Cleaning cache")"
rm -rf "${CACHE_PATH}/dl"
rm -rf "${PART3_PATH}/dl"
fi
mkdir -p "${CACHE_PATH}/dl"
fastest=$(_get_fastest "global.synologydownload.com" "global.download.synology.com" "cndl.synology.cn")
mkdir -p "${PART3_PATH}/dl"
mirrors=("global.synologydownload.com" "global.download.synology.com" "cndl.synology.cn")
fastest=$(_get_fastest ${mirrors[@]})
mirror="$(echo ${PATURL} | sed 's|^http[s]*://\([^/]*\).*|\1|')"
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}")"
@ -810,7 +812,7 @@ function extractDsmFiles() {
# No disk space to download, change it to RAMDISK
PAT_PATH="${TMP_PATH}/${PAT_FILE}"
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
rm -f "${PAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")"
@ -854,7 +856,7 @@ function extractDsmFiles() {
;;
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
# Check existance of extractor
@ -864,7 +866,7 @@ function extractDsmFiles() {
# Extractor not exists, get it.
mkdir -p "${EXTRACTOR_PATH}"
# 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
echo "$(TEXT "Downloading old pat to extract synology .pat extractor...")"
# Discover remote file size
@ -873,7 +875,7 @@ function extractDsmFiles() {
# No disk space to download, change it to RAMDISK
OLDPAT_PATH="${TMP_PATH}/DS3622xs+-42218.pat"
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
rm -f "${OLDPAT_PATH}"
MSG="$(printf "$(TEXT "Check internet or cache disk space.\nError: %d")" "${STATUS}")"
@ -933,38 +935,19 @@ function extractDsmFiles() {
echo "$(TEXT "OK")"
echo -n "$(TEXT "Copying files: ")"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${BOOTLOADER_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${BOOTLOADER_PATH}"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${SLPART_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${SLPART_PATH}"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${PART1_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${PART1_PATH}"
cp -f "${UNTAR_PAT_PATH}/grub_cksum.syno" "${PART2_PATH}"
cp -f "${UNTAR_PAT_PATH}/GRUB_VER" "${PART2_PATH}"
cp -f "${UNTAR_PAT_PATH}/zImage" "${ORI_ZIMAGE_FILE}"
cp -f "${UNTAR_PAT_PATH}/rd.gz" "${ORI_RDGZ_FILE}"
rm -rf "${UNTAR_PAT_PATH}"
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!
function make() {
# clear
clear
# get logo.png
getLogo "${MODEL}"
PLATFORM="$(readModelKey "${MODEL}" "platform")"
KVER="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")"
KPRE="$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kpre")"
@ -983,19 +966,24 @@ function make() {
[ $? -ne 0 ] && return 1
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
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
return 1
fi
/opt/rr/ramdisk-patch.sh
${WORK_PATH}/ramdisk-patch.sh
if [ $? -ne 0 ]; then
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
return 1
fi
rm -f ${PART1_PATH}/.build
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")"
SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")"
@ -1003,7 +991,6 @@ function make() {
rm -rf "${UNTAR_PAT_PATH}"
echo "$(TEXT "Ready!")"
sleep 3
DIRTY=0
return 0
}
@ -1045,7 +1032,7 @@ function advancedMenu() {
echo "r \"$(TEXT "Restore bootloader disk # test")\"" >>"${TMP_PATH}/menu"
fi
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"
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
@ -1056,7 +1043,7 @@ function advancedMenu() {
l)
LKM=$([ "${LKM}" = "dev" ] && echo 'prod' || ([ "${LKM}" = "test" ] && echo 'dev' || echo 'test'))
writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}"
DIRTY=1
touch ${PART1_PATH}/.build
NEXT="l"
;;
q)
@ -1144,7 +1131,7 @@ function advancedMenu() {
IDX=$((${IDX} + 1))
done
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")" \
--progressbox "$(TEXT "Setting IP ...")" 20 100
NEXT="e"
@ -1226,7 +1213,7 @@ function advancedMenu() {
writeConfigKey "paturl" "${paturl}" "${USER_CONFIG_FILE}"
writeConfigKey "patsum" "${patsum}" "${USER_CONFIG_FILE}"
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}" "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}"
DIRTY=1
touch ${PART1_PATH}/.build
fi
;;
a)
@ -1239,7 +1226,7 @@ function advancedMenu() {
[ $? -ne 0 ] && return
(
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"
[ -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"
@ -1257,7 +1244,7 @@ function advancedMenu() {
rm -f "${TMP_PATH}/opts"
while read POSITION NAME; do
[ -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"
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")" \
@ -1289,7 +1276,7 @@ function advancedMenu() {
x)
SHADOW_FILE=""
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"
if [ -f "${TMP_PATH}/sdX1/etc/shadow" ]; then
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))")"
(
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"
sed -i "s|${OLDPASSWD}|${NEWPASSWD}|g" "${TMP_PATH}/sdX1/etc/shadow"
sync
@ -1391,7 +1378,7 @@ function advancedMenu() {
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--msgbox "$(TEXT "A valid dts file, Automatically import at compile time.")" 0 0
fi
DIRTY=1
touch ${PART1_PATH}/.build
;;
b)
if ! tty | grep -q "/dev/pts"; then
@ -1412,7 +1399,7 @@ function advancedMenu() {
return
fi
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 " ↑ " >>${TMP_PATH}/resp
echo "$(TEXT "Click on the address above to download.")" >>${TMP_PATH}/resp
@ -1448,19 +1435,19 @@ function advancedMenu() {
break
done
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")" \
--msgbox "$(printf "$(TEXT "Not a valid .zip/.img.gz file, please try again!")" "${USER_FILE}")" 0 0
else
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
[ $? -ne 0 ] && (
rm -f "${LOADER_DISK}"
rm -f "${TMP_UP_PATH}/${USER_FILE}"
return
)
dialog --backtitle "$(backtitle)" --colors --title "$(TEXT "Advanced")" \
--infobox "$(TEXT "Writing...")" 0 0
umount "${BOOTLOADER_PATH}" "${SLPART_PATH}" "${CACHE_PATH}"
umount "${PART1_PATH}" "${PART2_PATH}" "${PART3_PATH}"
if [ "${IFTOOL}" = "zip" ]; then
unzip -p "${TMP_UP_PATH}/${USER_FILE}" | dd of="${LOADER_DISK}" bs=1M conv=fsync
elif [ "${IFTOOL}" = "gzip" ]; then
@ -1520,12 +1507,12 @@ function tryRecoveryDSM() {
[ "${unique}" = "${UNIQUE}" ] || continue
# Found
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
productversMenu "${majorversion}.${minorversion}"
if [ -n "${PRODUCTVER}" ]; then
cp -f "${DSMROOT_PATH}/.syno/patch/zImage" "${SLPART_PATH}"
cp -f "${DSMROOT_PATH}/.syno/patch/rd.gz" "${SLPART_PATH}"
cp -f "${DSMROOT_PATH}/.syno/patch/zImage" "${PART2_PATH}"
cp -f "${DSMROOT_PATH}/.syno/patch/rd.gz" "${PART2_PATH}"
MSG="$(printf "$(TEXT "Found a installation:\nModel: %s\nProductversion: %s")" "${MODEL}" "${PRODUCTVER}")"
SN=$(_get_conf_kv SN "${DSMROOT_PATH}/etc/synoinfo.conf")
if [ -n "${SN}" ]; then
@ -1574,7 +1561,7 @@ function editUserConfig() {
rm -f "${MOD_ZIMAGE_FILE}"
rm -f "${MOD_RDGZ_FILE}"
fi
DIRTY=1
touch ${PART1_PATH}/.build
}
###############################################################################
@ -1592,12 +1579,13 @@ function editGrubCfg() {
###############################################################################
# Calls boot.sh to boot into DSM kernel/ramdisk
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
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
boot.sh
${WORK_PATH}/boot.sh
}
###############################################################################
@ -1610,7 +1598,7 @@ function languageMenu() {
resp=$(cat ${TMP_PATH}/resp 2>/dev/null)
[ -z "${resp}" ] && return
LANGUAGE=${resp}
echo "${LANGUAGE}.UTF-8" >${BOOTLOADER_PATH}/.locale
echo "${LANGUAGE}.UTF-8" >${PART1_PATH}/.locale
export LANG="${LANGUAGE}.UTF-8"
}
@ -1684,10 +1672,11 @@ function downloadExts() {
[ $? -ne 0 ] && return 1
fi
fi
dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--infobox "$(TEXT "Downloading last version")" 0 0
(
rm -f "${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 [ ! "${5}" = "0" ]; then
dialog --backtitle "$(backtitle)" --colors --title "${T}" \
@ -1748,7 +1737,7 @@ function updateRR() {
done < <(readConfigMap "replace" "${TMP_PATH}/update-list.yml")
dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--msgbox "$(printf "$(TEXT "RR updated with success to %s!\nReboot?")" "${TAG}")" 0 0
rr-reboot.sh config
rebootTo config
}
# 1 - ext name
@ -1788,7 +1777,7 @@ function updateExts() {
rm -rf "${LKM_PATH}/"*
unzip "${TMP_PATH}/rp-lkms.zip" -d "${LKM_PATH}" >/dev/null 2>&1
fi
DIRTY=1
touch ${PART1_PATH}/.build
if [ ! "${2}" = "0" ]; then
dialog --backtitle "$(backtitle)" --colors --title "${T}" \
--infobox "$(printf "$(TEXT "%s updated with success!")" "${1}")" 0 0
@ -1802,9 +1791,9 @@ function updateExts() {
function updateMenu() {
while true; do
CUR_RR_VER="${RR_VERSION:-0}"
CUR_ADDONS_VER="$(cat "${CACHE_PATH}/addons/VERSION" 2>/dev/null)"
CUR_MODULES_VER="$(cat "${CACHE_PATH}/modules/VERSION" 2>/dev/null)"
CUR_LKMS_VER="$(cat "${CACHE_PATH}/lkms/VERSION" 2>/dev/null)"
CUR_ADDONS_VER="$(cat "${PART3_PATH}/addons/VERSION" 2>/dev/null)"
CUR_MODULES_VER="$(cat "${PART3_PATH}/modules/VERSION" 2>/dev/null)"
CUR_LKMS_VER="$(cat "${PART3_PATH}/lkms/VERSION" 2>/dev/null)"
PROXY="$(readConfigKey "proxy" "${USER_CONFIG_FILE}")"
[ -n "${PROXY}" ] && [[ "${PROXY: -1}" != "/" ]] && PROXY="${PROXY}/"
rm -f "${TMP_PATH}/menu"
@ -1963,7 +1952,7 @@ function notepadMenu() {
###############################################################################
if [ "x$1" = "xb" -a -n "${MODEL}" -a -n "${PRODUCTVER}" -a loaderIsConfigured ]; then
install-addons.sh
updateAddons
make
boot && exit 0 || sleep 5
fi
@ -1991,7 +1980,7 @@ while true; do
fi
echo "l \"$(TEXT "Choose a language")\"" >>"${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"
fi
echo "p \"$(TEXT "Update menu")\"" >>"${TMP_PATH}/menu"
@ -2032,7 +2021,8 @@ while true; do
NEXT="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"
;;
b)
@ -2048,7 +2038,7 @@ while true; do
;;
c)
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"
;;
p)
@ -2079,7 +2069,7 @@ while true; do
reboot
;;
c)
rr-reboot.sh config
rebootTo config
;;
s)
break 2

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,9 @@
#!/usr/bin/env bash
. /opt/rr/include/functions.sh
. /opt/rr/include/addons.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
. ${WORK_PATH}/include/addons.sh
set -o pipefail # Get exit code from process piped
@ -13,12 +15,6 @@ echo -n "Patching Ramdisk"
# Remove old rd.gz patched
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
echo -n "."
rm -rf "${RAMDISK_PATH}" # Force clean
@ -93,7 +89,7 @@ done < <(readConfigMap "modules" "${USER_CONFIG_FILE}")
while read PE; do
RET=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 "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
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"
rm -f "${TMP_PATH}/rp.txt"
touch "${TMP_PATH}/rp.txt"
@ -150,7 +146,7 @@ rm -rf "${TMP_PATH}/modules"
echo -n "."
# 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
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"
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
installAddon eudev
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")
# 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
for N in $(seq 0 7); do

View File

@ -1,7 +1,9 @@
#!/usr/bin/env bash
# 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}")"
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"

View File

@ -1,6 +1,8 @@
#!/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
@ -12,13 +14,13 @@ echo -n "Patching zImage"
rm -f "${MOD_ZIMAGE_FILE}"
echo -n "."
# 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 "."
# 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 "."
# 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 "."
# Update HASH of new DSM zImage
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
* 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 # 查看已加载驱动
ls -ld /sys/class/net/*/device/driver # 查看已加载网卡和对应驱动
@ -128,6 +137,7 @@
# 服务相关
systemctl # 查看服务
netstat -tunlp # 查看端口
systemctl disable cpufreq.service # 禁用 CPU 频率调节器
# 日志相关
dmesg # 内核日志

View File

@ -4,13 +4,8 @@ set -e
. scripts/func.sh
# Convert po2mo, Get extractor, LKM, addons and Modules
# Convert po2mo
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"
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
echo "Repack initrd"
cp -f "br/bzImage-rr" "files/p3/bzImage-rr"
repackInitrd "br/initrd-rr" "files/initrd" "files/p3/initrd-rr"
cp -f "br/bzImage-rr" "/tmp/p3/bzImage-rr"
repackInitrd "br/initrd-rr" "files/initrd" "/tmp/p3/initrd-rr"
echo "Copying files"
sudo cp -Rf "files/p1/"* "/tmp/p1"
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
echo "Unmount image file"

View File

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

View File

@ -1,40 +1,6 @@
#!/usr/bin/env bash
# 23.5.0
[ ! -f /mnt/p1/boot/grub/grub.cfg ] && 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}"
# rr
[ ! "rr" = "$(hostname)" ] && exit 1
exit 0