mirror of
https://github.com/RROrg/rr.git
synced 2025-06-21 05:51:05 +08:00
RR init 2
This commit is contained in:
parent
a0e446c002
commit
ab83c4b696
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ cache
|
||||
files/initrd/opt/rr/lang/*.mo
|
||||
tests
|
||||
/extractor
|
||||
/br
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
63
files/initrd/opt/rr/include/functions.py
Normal file
63
files/initrd/opt/rr/include/functions.py
Normal 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()
|
@ -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
|
||||
}
|
||||
|
@ -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
|
BIN
files/initrd/opt/rr/include/logo.png
Normal file
BIN
files/initrd/opt/rr/include/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
@ -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
|
||||
|
@ -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
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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}")"
|
||||
|
@ -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}')"
|
||||
|
@ -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
|
10
guide.md
10
guide.md
@ -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 # 内核日志
|
||||
|
19
img-gen.sh
19
img-gen.sh
@ -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"
|
||||
|
@ -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}"
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user