Compare commits

..

No commits in common. "main" and "23.11.1" have entirely different histories.

156 changed files with 11043 additions and 82529 deletions

6
.gitattributes vendored
View File

@ -1,5 +1 @@
* text=auto eol=lf
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.sh eol=lf

View File

@ -7,13 +7,10 @@ assignees: ''
---
请填写以下信息.
Please fill in the following information.
Install ENV: (You can find it in the boot interface.)
* DMI:
* CPU:
* NIC: (pid & vid)
* NIC:
RR version: (You can find it in the update menu.)
* RR:
@ -29,14 +26,6 @@ Issue:
logs:
(## 因为 log中存在 SN/MAC 等一些敏感信息, 当提供完整文件时请自行抹除他们, 当然你也可以发送到我的邮箱. ##)
(## Because the log contains some sensitive information such as SN/MAC, please delete them when providing the complete file. Of course, you can also send it to my email. ##)
...
(请先看一下#173#175#226 的内容)
(Plz review the content of #173, #175, #226 first)
...
(如果你只是说 XXX 不能用, 什么详细信息也不提供, 我也只能说感谢你的反馈.)
(If you just say XXX doesn't work without providing any details, I can only say thank you for your feedback.)
...

View File

@ -1,112 +0,0 @@
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
name: Data
on:
release:
types:
- created
workflow_dispatch:
inputs:
push:
description: "push"
default: false
type: boolean
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@main
with:
ref: main
- name: Init Env
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
sudo timedatectl set-timezone "Asia/Shanghai"
- name: Get Data
run: |
REPO="${{ github.server_url }}/${{ github.repository }}"
PRERELEASE="true"
TAG=""
for i in {1..3}; do
if [ "${PRERELEASE}" = "true" ]; then
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1 | sed 's/^[v|V]//g')"
else
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
fi
rm -f rr-${TAG}.img.zip
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
if [ $? -eq 0 ] && [ ${STATUS:-0} -eq 200 ]; then
break
else
echo "Download failed, retry $i/3"
sleep 60
fi
done
if [ ! -f "rr-${TAG}.img.zip" ] || [ ${STATUS:-0} -ne 200 ]; then
echo "Download failed after 3 attempts"
exit 1
fi
unzip rr-${TAG}.img.zip -d rr rr.img
sudo apt update
sudo apt install -y locales busybox dialog gettext sed gawk jq curl
sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils cpio xz-utils lz4 lzma bzip2 gzip zstd
sudo apt install -y build-essential libtool pkgconf libzstd-dev liblzma-dev libssl-dev # kmodule dependencies
# Backup the original python3 executable.
sudo mv -f "$(realpath $(which python3))/EXTERNALLY-MANAGED" "$(realpath $(which python3))/EXTERNALLY-MANAGED.bak" 2>/dev/null || true
sudo pip3 install -U -r scripts/requirements.txt
. scripts/func.sh "${{ secrets.RRORG }}"
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "rr/rr.img"
rm -rf "/tmp/mnt/p3"
mkdir -p "/tmp/mnt/p3"
sudo mount "${LOOPX}p3" "/tmp/mnt/p3"
unpackInitrd /tmp/mnt/p3/initrd-rr "rr/initrd"
python3 scripts/func.py getmodels -w "rr/initrd" -j "docs/models.json" -x "docs/models.xlsx"
python3 scripts/func.py getpats -w "rr/initrd" -j "docs/pats.json" -x "docs/pats.xlsx"
python3 scripts/func.py getaddons -w "/tmp" -j "docs/addons.json" -x "docs/addons.xlsx"
python3 scripts/func.py getmodules -w "/tmp" -j "docs/modules.json" -x "docs/modules.xlsx"
sudo umount "/tmp/mnt/p3"
sudo losetup -d "${LOOPX}"
rm -rf "/tmp/mnt/p3"
- name: Upload to Artifacts
if: success()
uses: actions/upload-artifact@v4
with:
name: docs
path: |
docs/*.json
docs/*.xlsx
retention-days: 5
- name: Check and Push
if: success() && (inputs.push == true || github.event.action == 'created')
run: |
echo "Git push ..."
# git checkout main
git pull
status=$(git status -s | grep -E "docs" | awk '{printf " %s", $2}')
if [ -n "${status}" ]; then
git add ${status}
git commit -m "update $(date +%Y-%m-%d" "%H:%M:%S)"
git push -f
fi

61
.github/workflows/grub.yml vendored Normal file
View File

@ -0,0 +1,61 @@
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
name: Grub
on:
workflow_dispatch:
inputs:
push:
description: "push"
default: false
type: boolean
jobs:
grub:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@main
- name: Initialization environment
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
sudo timedatectl set-timezone "Asia/Shanghai"
sudo apt update
sudo apt install -y build-essential bison flex dosfstools
- name: Make Grub
run: |
. scripts/grub.sh "grub-2.06" "i386-pc i386-efi x86_64-efi" "RR"
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: grub
path: |
grub.img.gz
- name: Check and Push
if: success() && inputs.push == true
run: |
if [ -f "grub.img.gz" ]; then
echo "Copy img ..."
mv -f grub.img.gz files/grub.img.gz
echo "Git push ..."
git pull
status=$(git status -s | grep -E 'grub.img.gz' | awk '{printf " %s", $2}')
if [ -n "${status}" ]; then
git add ${status}
git commit -m "update $(date +%Y-%m-%d" "%H:%M:%S)"
git push -f
fi
else
echo "No change ..."
fi

View File

@ -5,7 +5,7 @@
# See /LICENSE for more information.
#
name: Issues
name: Auto Comment
on:
issues:
types: [opened, reopened]
@ -14,9 +14,6 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@main
- name: Init Env
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
@ -24,59 +21,15 @@ jobs:
sudo timedatectl set-timezone "Asia/Shanghai"
- name: Check Issues
shell: python
run: |
# -*- coding: utf-8 -*-
import json
import os
import subprocess
if echo "${{ github.event.issue.body }}" | grep -q "ENV"; then
echo "FALG=true" >> $GITHUB_ENV
else
echo "FALG=false" >> $GITHUB_ENV
fi
def set_env(name, value):
subprocess.call(f'echo "{name}<<EOF" >> $GITHUB_ENV', shell=True)
subprocess.call(f'echo "{value}" >> $GITHUB_ENV', shell=True)
subprocess.call(f'echo "EOF" >> $GITHUB_ENV', shell=True)
issuetitle = """${{ github.event.issue.title }}"""
issuebody = """${{ github.event.issue.body }}"""
iscustom = 'false'
warinfo = 'false'
fields = {
"format": "",
"size": "",
"template": "",
"language": "",
"sn": "",
"macs": "",
"tips": "",
"model": "",
"version": "",
"kernel": "",
"addons": "",
"modules": ""
}
try:
if issuetitle.strip().lower().startswith('custom'):
jsonbody = json.loads(issuebody)
iscustom = 'true'
for k in fields:
fields[k] = jsonbody.get(k, "")
except Exception:
pass
if iscustom == 'false':
if not any(x in issuebody for x in ['DMI', 'CPU', 'NIC']):
warinfo = 'true'
set_env("iscustom", iscustom)
set_env("warinfo", warinfo)
for k, v in fields.items():
set_env(k, v)
- name: Update Comment Warinfo
if: env.warinfo == 'true'
- name: Create Issues comment
if: env.FALG == 'false'
uses: actions-cool/issues-helper@v3
with:
actions: "create-comment"
@ -85,13 +38,12 @@ jobs:
body: |
<img src="https://user-images.githubusercontent.com/5615843/235939097-6798da58-24fd-44cc-9970-c8d2f9609704.jpg" width="400">
请填写以下信息.
Please fill in the following information.
Please fill in the following information.
Install ENV: (You can find it in the boot interface.)
* DMI:
* CPU:
* NIC: (pid & vid)
* NIC:
RR version: (You can find it in the update menu.)
* RR:
@ -107,243 +59,7 @@ jobs:
logs:
(## 因为 log中存在 SN/MAC 等一些敏感信息, 当提供完整文件时请自行抹除他们, 当然你也可以发送到我的邮箱. ##)
(## Because the log contains some sensitive information such as SN/MAC, please delete them when providing the complete file. Of course, you can also send it to my email. ##)
...
(请先看一下#173、#175、#226 的内容)
(Plz review the content of #173, #175, #226 first)
...
(如果你只是说 XXX 不能用, 什么详细信息也不提供, 我也只能说感谢你的反馈.)
(If you just say XXX doesn't work without providing any details, I can only say thank you for your feedback.)
...
emoji: heart
- name: Update Comment Labels
if: env.iscustom == 'true'
uses: actions-cool/issues-helper@v3
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'custom,${{ env.model }}'
- name: Update Comment Building
if: env.iscustom == 'true'
id: comment
uses: actions-cool/issues-helper@v3
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hi @${{ github.event.issue.user.login }}.
RR-${{ env.model }} building (Usually about 5 minutes) ...
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
----
emoji: heart
- name: Run Build
if: env.iscustom == 'true'
run: |
# 累了, 毁灭吧!
sudo apt update
sudo apt install -y locales busybox dialog gettext sed gawk jq curl
sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils dosfstools cpio xz-utils lz4 lzma bzip2 gzip zstd
. scripts/func.sh "${{ secrets.RRORG }}"
REPO="${{ github.server_url }}/${{ github.repository }}"
PRERELEASE="true"
TAG=""
if [ "${PRERELEASE}" = "true" ]; then
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1 | sed 's/^[v|V]//g')"
else
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
fi
rm -f rr-${TAG}.img.zip
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
if [ $? -ne 0 ] || [ ${STATUS:-0} -ne 200 ]; then
echo "Download failed"
exit 1
fi
unzip rr-${TAG}.img.zip -d rr rr.img
echo "TAG=${TAG}" >> $GITHUB_ENV
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" rr/rr.img
echo "Building..."
{
echo ". menu.sh"
[ -n "${{ env.language }}" ] && echo "echo \"${{ env.language }}.UTF-8\" >/mnt/p1/.locale"
[ -n "${{ env.tips }}" ] && echo "echo -e \"${{ env.tips }}\" >/mnt/p3/AddTips"
[ -n "${{ env.kernel }}" ] && echo "writeConfigKey \"kernel\" \"${{ env.kernel }}\" \"\${USER_CONFIG_FILE}\""
echo "menu.sh modelMenu \"${{ env.model }}\""
echo "menu.sh productversMenu \"${{ env.version }}\""
[ -n "${{ env.addons }}" ] && {
echo "writeConfigKey \"addons\" \"{}\" \"\${USER_CONFIG_FILE}\""
IFS=',' read -ra ADDON_ARR <<< "${{ env.addons }}"
for A in "${ADDON_ARR[@]}"; do
if echo "${A}" | grep -qE '^[^:]+:[^:]+$'; then
KEY="$(echo "${A}" | cut -d':' -f1 | xargs)"
VAL="$(echo "${A}" | cut -d':' -f2 | xargs)"
else
KEY="${A}"
VAL=""
fi
echo "writeConfigKey \"addons.\\\"${KEY}\\\"\" \"${VAL}\" \"\${USER_CONFIG_FILE}\""
done
}
[ ! "custom" = "${{ env.kernel }}" ] && [ -n "${{ env.modules }}" ] && {
echo "writeConfigKey \"modules\" \"{}\" \"\${USER_CONFIG_FILE}\""
echo "mergeConfigModules \"$(echo "${{ env.modules }}" | tr ',' '\n')\" \"\${USER_CONFIG_FILE}\""
}
echo "menu.sh make"
echo "menu.sh cleanCache"
[ -n "${{ env.sn }}" ] && echo "writeConfigKey \"sn\" \"${{ env.sn }}\" \"\${USER_CONFIG_FILE}\""
[ -n "${{ env.macs }}" ] && {
MACS=($(echo "${{ env.macs }}" | sed 's/[:-]//g' | sed 's/.*/\U&/' | sed 's/[;,]/ /g'))
[ -n "${MACS[0]}" ] && echo "writeConfigKey \"mac1\" \"${MACS[0]}\" \"\${USER_CONFIG_FILE}\""
[ -n "${MACS[1]}" ] && echo "writeConfigKey \"mac2\" \"${MACS[1]}\" \"\${USER_CONFIG_FILE}\""
}
[ "true" = "${{ env.template }}" ] && {
echo "writeConfigKey \"sn\" \"\" \"\${USER_CONFIG_FILE}\""
echo "writeConfigKey \"mac1\" \"\" \"\${USER_CONFIG_FILE}\""
echo "writeConfigKey \"mac2\" \"\" \"\${USER_CONFIG_FILE}\""
}
} > build.sh
chmod +x build.sh
docker pull wjz304/rr:${TAG}
docker run --rm --privileged -p 7681:7681 -p 7304:7304 -p 7080:7080 -p 7022:22 -v ${PWD}/build.sh:/opt/rr/build.sh wjz304/rr:${TAG} bash build.sh
sudo losetup --detach "${LOOPX}"
ls rr -al
{
echo "RR: "
echo " VERSION: ${TAG}"
echo " CUSTOM: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo
echo "After the image is written to the disk, it will boot directly into DSM without the need to compile again."
echo "Of course, you can also modify the settings yourself."
} >README.txt
case "${{ env.size }}" in
2GB)
echo "2GB"
gzip -dc "files/initrd/opt/rr/grub.img.gz" > rr/rr_2GB.img
repackImg rr/rr.img rr/rr_2GB.img
rm -f rr/rr.img
mv -f rr/rr_2GB.img rr/rr.img
;;
4GB)
echo "4GB"
;;
8GB)
echo "8GB"
resizeImg rr/rr.img +4096M
;;
*)
echo "unknown size"
;;
esac
case "${{ env.format }}" in
ova)
echo "OVA"
convertova "rr/rr.img" "rr/rr.ova"
(cd rr && sha256sum rr.ova >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.ova.zip" -j rr/rr.ova sha256sum README.txt
;;
vmx)
echo "VMX"
convertvmx "rr/rr.img" "rr.vmx" # rr.vmx is a directory
(cd rr.vmx && sha256sum * >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmx.zip" -r rr.vmx sha256sum README.txt
;;
vmdk)
echo "VMDK"
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicSparse,compat6' rr/rr.vmdk
(cd rr && sha256sum rr.vmdk >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk sha256sum README.txt
;;
flat)
echo "FLAT"
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicFlat,compat6' rr/rr.vmdk
(cd rr && sha256sum rr*.vmdk >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.flat.zip" -j rr/rr*.vmdk sha256sum README.txt
;;
vhd)
echo "VHD"
qemu-img convert rr/rr.img -O vpc rr/rr.vhd
createvmc "rr/rr.vhd" "rr/rr.vmc"
(cd rr && sha256sum rr.vhd >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vhd.zip" -j rr/rr.vmc rr/rr.vhd sha256sum README.txt
;;
vhdx)
echo "VHDX"
qemu-img convert rr/rr.img -O vhdx -o subformat=dynamic rr/rr.vhdx
(cd rr && sha256sum rr.vhdx >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vhdx.zip" -j rr/rr.vhdx sha256sum README.txt
;;
*)
echo "IMG"
(cd rr && sha256sum rr.img >../sha256sum)
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.img.zip" -j rr/rr.img sha256sum README.txt
esac
- name: Upload to Artifacts
if: env.iscustom == 'true' && success()
uses: actions/upload-artifact@v4
with:
name: rr-${{ env.model }}-${{ env.TAG }}
path: |
rr-${{ env.model }}-${{ env.TAG }}*.zip
retention-days: 5
- name: Update Comment Success
if: env.iscustom == 'true' && success()
uses: actions-cool/issues-helper@v3
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.comment.outputs.comment-id }}
update-mode: replace
body: |
Hi @${{ github.event.issue.user.login }}.
RR-${{ env.model }}-${{ env.TAG }} build success, please download the attachment from the below link (Attachments are only kept for 5 days).
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
----
emoji: hooray
- name: Update Comment Fail
if: env.iscustom == 'true' && failure()
uses: actions-cool/issues-helper@v3
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.comment.outputs.comment-id }}
update-mode: replace
body: |
Hi @${{ github.event.issue.user.login }}.
RR-${{ env.model }}-${{ env.TAG }} build failed, please try again.
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
----
emoji: confused
- name: Close Issues
if: env.iscustom == 'true'
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}

206
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,206 @@
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
name: Build RR
on:
push:
branches:
- main
tags:
- v*
release:
types: [published]
workflow_dispatch:
inputs:
version:
description: "format %y.%-m.$i or auto"
required: false
type: string
prerelease:
description: "pre release"
default: false
type: boolean
br_version:
description: "buildroot version"
default: "2023.02.x"
type: string
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@main
with:
lfs: 'true'
# Install dependencies
- name: Install dependencies
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
sudo apt update
sudo apt install -y jq cpio gettext
# calculates the version number and push
- name: Calculate version
run: |
# Calculate version
VERSION=""
if [[ "${{ github.event_name }}" =~ ^(push|release)$ && "${{ github.ref_type }}" == 'tag' ]]; then
VERSION="${{ github.ref_name }}"
elif [ -n "${{ inputs.version }}" ]; then
if [ "`echo ${{ inputs.version }} | cut -d '.' -f 1,2`" = "`date +'%y.%-m'`" ]; then
VERSION="${{ inputs.version }}"
else
LATEST_TAG="`curl -skL "https://api.github.com/repos/${{ github.repository }}/releases" | jq -r ".[0].tag_name" 2>/dev/null`"
if [ -n "${LATEST_TAG}" -a "`echo ${LATEST_TAG} | cut -d '.' -f 1,2`" = "`date +'%y.%-m'`" ]; then # format %y.%-m.$i
VERSION="`echo ${LATEST_TAG} | awk -F '.' '{$3=$3+1}1' OFS='.'`"
else
VERSION="`date +'%y.%-m'`.0"
fi
fi
else
VERSION=""
fi
echo "VERSION: ${VERSION}"
echo "VERSION=${VERSION}" >> $GITHUB_ENV
if [ -n "${VERSION}" ]; then
# Modify Source File
echo "${VERSION}" > VERSION
echo "${VERSION}" > files/p1/RR_VERSION
sed 's/^RR_VERSION=.*/RR_VERSION="'${VERSION}'"/' -i files/initrd/opt/rr/include/consts.sh
git checkout main
git pull
status=$(git status -s | awk '{printf " %s", $2}')
if [ -n "${status}" ]; then
git add ${status}
git commit -m "update $(date +%Y-%m-%d" "%H:%M:%S)"
git push -f
fi
fi
# Convert po2mo, Get extractor, LKMs, addons and Modules
- name: Convert po2mo, Get extractor, LKMs, addons and Modules
run: |
. scripts/func.sh
convertpo2mo "files/initrd/opt/rr/lang"
getExtractor "files/p3/extractor"
getLKMs "files/p3/lkms" ${{ inputs.prerelease }}
getAddons "files/p3/addons" ${{ inputs.prerelease }}
getModules "files/p3/modules" ${{ inputs.prerelease }}
echo "OK"
# Build incremental
- name: Build image
run: |
. scripts/func.sh
echo "Create RR image"
gzip -dc "files/grub.img.gz" >"rr.img"
fdisk -l "rr.img"
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "rr.img"
echo "Mounting image file"
mkdir -p "/tmp/p1"
mkdir -p "/tmp/p3"
sudo mount ${LOOPX}p1 "/tmp/p1"
sudo mount ${LOOPX}p3 "/tmp/p3"
echo "Get Buildroot"
br_version="${{ inputs.br_version }}"
[ -z "${br_version}" ] && br_version="2023.02.x"
getBuildroot "${br_version}" "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"
echo "Copying files"
sudo cp -Rf "files/p1/"* "/tmp/p1"
sudo cp -Rf "files/p3/"* "/tmp/p3"
sync
echo "Unmount image file"
sudo umount "/tmp/p1"
sudo umount "/tmp/p3"
rmdir "/tmp/p1"
rmdir "/tmp/p3"
sudo losetup --detach ${LOOPX}
echo "Create RR_4GB image"
resizeImg "rr.img" "+3072M" "rr_4GB.img"
# echo "Image Converter"
# qemu-img convert -O vmdk rr.img rr-dyn.vmdk
# qemu-img convert -O vmdk -o adapter_type=lsilogic rr.img -o subformat=monolithicFlat rr.vmdk
# Zip image and generate checksum
- name: Pack
run: |
if [ -n "${{ env.VERSION }}" ]; then
zip -9 "rr-${{ env.VERSION }}.img.zip" rr.img
zip -9 "rr_4GB-${{ env.VERSION }}.img.zip" rr_4GB.img
# zip -9 "rr-${{ env.VERSION }}.vmdk-dyn.zip" rr-dyn.vmdk
# zip -9 "rr-${{ env.VERSION }}.vmdk-flat.zip" rr.vmdk rr-flat.vmdk
else
zip -9 "rr.img.zip" rr.img
zip -9 "rr_4GB.img.zip" rr_4GB.img
fi
sha256sum update-list.yml update-check.sh > sha256sum
zip -9j update.zip update-list.yml update-check.sh
while read F; do
if [ -d "${F}" ]; then
FTGZ="`basename "${F}"`.tgz"
tar -czf "${FTGZ}" -C "${F}" .
sha256sum "${FTGZ}" >> sha256sum
zip -9j update.zip "${FTGZ}"
rm "${FTGZ}"
else
(cd `dirname ${F}` && sha256sum `basename ${F}`) >> sha256sum
zip -9j update.zip "${F}"
fi
done < <(yq '.replace | explode(.) | to_entries | map([.key])[] | .[]' update-list.yml)
zip -9j update.zip sha256sum
# Upload artifact
- name: Upload
uses: actions/upload-artifact@v3
with:
name: Images
path: |
rr.img.zip
rr_4GB.img.zip
update.zip
retention-days: 5
# Publish a release if is a tag
- name: Release
uses: softprops/action-gh-release@v1
if: env.VERSION != ''
with:
tag_name: ${{ env.VERSION }}
prerelease: ${{ inputs.prerelease }}
files: |
rr-${{ env.VERSION }}.img.zip
rr_4GB-${{ env.VERSION }}.img.zip
# rr-${{ env.VERSION }}.vmdk-dyn.zip
# rr-${{ env.VERSION }}.vmdk-flat.zip
update.zip

26
.gitignore vendored
View File

@ -1,28 +1,14 @@
!.gitkeep
.vscode
/rr
/rr.env
rr*.img
rr*.vmdk
*.zip
.buildroot
test*.sh
cache
*.bak
*.o
**.po~
**.mo
downloads.md
files/initrd/opt/rr/lang/*.mo
tests
Changelog*
sha256sum
ovftool*
OVA*
**.ova
files/mnt/p1/.locale
files/mnt/p1/grub_cksum.syno
files/mnt/p1/GRUB_VER
files/mnt/p1/user-config.yml
files/mnt/p2
files/mnt/p3
files/tmp
/extractor
/br

228
README.md
View File

@ -1,174 +1,78 @@
<img src="https://avatars.githubusercontent.com/u/151816514?s=200&v=4" alt="logo" width="140" height="140" align="left" />
# Redpill Recovery (arpl-i18n)
<h1>RR: <small>redpills preinstallation and recovery environment</small></h1>
This project is a system for redpills preinstallation and recovery environment.
[![GitHub Release](https://img.shields.io/github/v/release/rrorg/rr?logo=github&style=flat-square)](https://github.com/rrorg/rr/releases/latest)
[![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rrorg/rr/total?logo=github&style=flat-square)](https://github.com/rrorg/rr/releases)
[![GitHub Issues or Pull Requests by label](https://img.shields.io/github/issues-closed-raw/rrorg/rr/custom?logo=github&style=flat-square&label=custom)](https://rrorg.github.io/rr/)
### 组件:
<b>https://github.com/wjz304/rr</b>
* addons: https://github.com/wjz304/rr-addons
* modules: https://github.com/wjz304/rr-modules
* rp-lkms: https://github.com/wjz304/rr-lkms
> The ultimate solution to self-centralized Synology DSM OS on any local machine with any x86/x64 CPU architecture via a single flash of bootload pre-installation process in addition within recovery environment.
### About GPU:
* iGPU: https://jim.plus/
* vGPU: https://blog.kkk.rs/
### 1: Disclaimer
## 说明 - Instructions
* [GUIDE](./guide.md)
* [About get logs](https://github.com/wjz304/rr/issues/173)
* [About not find DSM after "boot the loader"](https://github.com/wjz304/rr/issues/175)
* [About DT(Device Tree) and *portcfg/maxdisks](https://github.com/wjz304/rr/issues/226)
* 硬盘有价,数据无价,任何对引导的修改都是有风险的,本人/组织不承担数据丢失的责任。本工具仅用作学习交流,严禁用于商业用途。
## 翻译 - Translation
* 其他语言的翻译 - Language translation work:
```shell
# If it does not involve adding or deleting, the following process is not required.
sudo apt install gettext
git clone https://github.com/wjz304/rr.git
cd files/initrd/opt/rr
xgettext -L Shell --keyword=TEXT *.sh -o lang/rr.pot
sed -i 's/charset=CHARSET/charset=UTF-8/' lang/rr.pot
# You need to replace the language you need and translate the po file.
msginit -i lang/rr.pot -l zh_CN.UTF-8 -o lang/zh_CN.po
# This process will be automatically processed during packaging.
msgfmt lang/zh_CN.po -o lang/zh_CN.mo
```
* I am not proficient in language, and even my English is very poor.
Developers who are familiar with various languages are welcome to submit PR.
* Translation maintenance personnel:
* zh_CN: @wjz304
* zh_TW: @豪客幫
## 教程 - Usage
* English: https://www.youtube.com/watch?v=VB67_FG5y-E
##### `(From: @NETVN82)`
* Español: https://www.youtube.com/watch?v=KC6oCcAyoV4
##### `(From: @Jay tech 2023)`
* 한국어: https://www.youtube.com/watch?v=4O7EfU6MT60
##### `(From: @pageinnet)`
* ภาษาไทย: https://www.youtube.com/watch?v=4sGrMMEQQ6I
##### `(From: @stnology)`
* 中文繁體: https://www.youtube.com/watch?v=cW2eRCjtAEs
##### `(From: @豪客幫)`
* 中文简体: https://www.bilibili.com/video/BV1jk4y1Y7B7
##### `(From: http://mi-d.cn)`
## 免责声明 - Disclaimer
* 硬盘有价,数据无价,任何对引导的修改都是有风险的,本人不承担数据丢失的责任。
* 本工具仅用作学习交流,严禁用于商业用途。
----
* Hardware/hard-drives are priced whilst data are priceless, any user-specific custom modification of the tested & prebuilt bootloader images could potentially cause irreversible data destruction towards your local machine. Us, as (RROrg) are not responsibly liable for damage nor personal loss of any types. The project with its affiliation is released for educational and learning purpose only, commercial application of the software is strictly prohibited.
* The hard drive has a price, but the data is priceless. Any modification to the bootloader is risky. I will not be responsible for data loss.
* This tool is only for learning and communication, and commercial use is strictly prohibited.
### 2: Documentation & FAQ
### 鸣谢 - Credits
arpl: https://github.com/fbelavenuto/arpl
redpill: https://github.com/RedPill-TTG
Framework: https://github.com/buildroot/buildroot
- [RRManager](https://github.com/T-REX-XP/RRManager)
- [rr-tools](https://github.com/RROrg/rr-tools)
- [blog](https://rrorg.cn)
- [docs](https://rrorg.github.io/rr-docs)
- [📣](https://github.com/orgs/RROrg/discussions)
## 打赏一下
* > ### 作者: Ing
* > QQ群1: 21609194 [点击链接加入QQ群](https://qm.qq.com/cgi-bin/qm/qr?k=z5O89os88QEKXCbz-0gwtEz1AeQiCwk3)
* > QQ群2: 73119176 [点击链接加入QQ群](https://qm.qq.com/cgi-bin/qm/qr?k=6GFSrSYX2LTd9PD0r0hl_YJZsfLp53Oh)
* > QQ频道: redpill2syno [点击链接加入QQ频道](https://pd.qq.com/s/5nmli9qgn)
* > TG频道: redpill2syno [点击链接加入TG频道](https://t.me/redpill2syno)
* <img src="https://raw.githubusercontent.com/wjz304/wjz304/master/my/20220908134226.jpg" width="400">
### 3: Components
- During the compilation process, you need to connect to the Internet to obtain model and version information and download the corresponding ROM.
If you cannot connect to the Internet, please build a pre-compiled bootloader through [RR-CUSTOM](https://rrorg.github.io/rr/).
- Models: [models](https://github.com/RROrg/rr/raw/main/docs/models.xlsx)
- PATs: [pats](https://github.com/RROrg/rr/raw/main/docs/pats.xlsx)
- Addons: [addons](https://github.com/RROrg/rr/raw/main/docs/addons.xlsx)
- Modules: [modules](https://github.com/RROrg/rr/raw/main/docs/modules.xlsx)
- Proxmox VE One Click Install:
```
curl -fsSL https://github.com/RROrg/rr/raw/refs/heads/main/scripts/pve.sh | bash -s -- --bltype usb
# Optional Parameters:
--onboot <0|1> Enable VM on boot, default 1 (enable)
--efi <0|1> Enable UEFI boot, default 1 (enable)
--bltype <sata|usb|nvme> Bootloader disk type, default sata
--9ppath <path> Set to /path/to/9p to mount 9p share
--tag <tag> Image tag, download latest release if not set
--img <path> Local image path, use local image if set
```
- Docker Compose:
```yml
# 请从最新版本中下载 rr.img 文件。
# 并将 <path_to_rr.img> 替换为你的 rr.img 文件的实际路径.
# Please download the rr.img file from the latest release.
# And replace <path_to_rr.img> with the actual path to your rr.img file.
version: "3.9"
services:
rr:
image: qemux/qemu:latest
container_name: rr
environment:
BOOT: ""
RAM_SIZE: "4G" # >= 4G recommended for DSM
CPU_CORES: "2"
DISK_FMT: "qcow2"
DISK_TYPE: "sata"
DISK_SIZE: "32G" # data disk size
ARGUMENTS: "-device nec-usb-xhci,id=usb0,multifunction=on -drive file=/rr.img,media=disk,format=raw,if=none,id=udisk1 -device usb-storage,bus=usb0.0,port=1,drive=udisk1,bootindex=999,removable=on"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 5000:5000 # For DSM management
- 5001:5001 # For DSM management
- 7681:7681 # For RR management
- 7304:7304 # For RR management
- 7080:7080 # For RR management
- 8006:8006 # For QEMU management
volumes:
- ./rr.img:/rr.img # <path_to_rr.img>:/rr.img
- ./data:/storage
restart: always
stop_grace_period: 2m
```
### 4: GPU:
- vGPU:
- [蔚然小站](https://blog.kkk.rs/)
- [syno_nvidia_gpu_driver](https://github.com/pdbear/syno_nvidia_gpu_driver/)
- iGPU:
- [Jim's Blog](https://jim.plus/)
- iGPU:
- [intel-gpu-i915-backports](https://github.com/MoetaYuko/intel-gpu-i915-backports)
## 5: Contributing
* The following is a roughly truncated guide to involve in project localization for internationalization.
```shell
# If deletion nor addition proces of code hunk is not required, comply with the following process
sudo apt install gettext
git clone https://github.com/rrorg/rr.git
cd files/initrd/opt/rr
xgettext -L Shell --keyword=TEXT *.sh -o lang/rr.pot
sed -i 's/charset=CHARSET/charset=UTF-8/' lang/rr.pot
# If you have to replace certain language string of the project, please suggest and modify translation changes within each correlated PO file
mkdir -p lang/zh_CN/LC_MESSAGES
msginit -i lang/rr.pot -l zh_CN.UTF-8 -o lang/zh_CN/LC_MESSAGES/rr.po
# Update translation files
for I in $(find lang -path *rr.po); do msgmerge --width=256 -U ${I} lang/rr.pot; done
# This formatting process will be automatically conducted during packaging.
for I in $(find lang -path *rr.po); do msgfmt ${I} -o ${I/.po/.mo}; done
```
- PRs of new language translations towards the project is welcomed with appreciation.
- Community maintainers of each supporting list of languages are accredited below.
- `de_DE`: `@Tim Krämer`: [Tim Krämer](https://tim-kraemer.de)
- `en_US`: `@rrorg`
- `ja_JP`: `@andatoshiki` & `@toshikidev`
- `ko_KR`: `@EXP` : jeong1986
- `ru_RU`: `@Alex`: TG
- `tr_TR`: `@miraç bahadır öztürk`: miracozturk
- `vi_VN`: `@Ngọc Anh Trần`: mr.ngocanhtran
- `zh_CN`: `@rrorg`
- `zh_HK`: `@rrorg`
- `zh_TW`: `@March Fun`: [豪客幫](<https://cyber.suma.tw/>)
### 6: Acknowledgment & Credits
- [ARPL](https://github.com/fbelavenuto/arpl): `@fbelavenuto`
- Redpill: `@RedPill-TTG` `@pocopico` `@jim3ma` `@fbelavenuto` `@MoetaYuko`
- [RedPill-TTG](https://github.com/RedPill-TTG)
- [redpill-lkm5](https://github.com/XPEnology-Community/redpill-lkm5)
- [linux_dsm_epyc7002](https://github.com/MoetaYuko/linux_dsm_epyc7002)
- Framework:
- [Buildroot](https://github.com/buildroot/buildroot)
- [Eudev](https://github.com/eudev-project/eudev)
- [Grub](https://git.savannah.gnu.org/git/grub)
- Addons: `@xbl3&@wirgen` `@007revad` `@PeterSuh-Q3` `@jim3ma` `@jinlife`
- [synocodectool-patch](https://github.com/xbl3/synocodectool-patch)
- [Synology_HDD_db](https://github.com/007revad/Synology_HDD_db)
- [nvme-cache](https://github.com/PeterSuh-Q3/tcrp-addons/tree/main/nvme-cache)
- [Synology_enable_M2_volume](https://github.com/007revad/Synology_enable_M2_volume)
- [synology-installation-with-nvme-disks-only](https://jim.plus/blog/post/jim/synology-installation-with-nvme-disks-only)
- [Synology_Photos_Face_Patch](https://github.com/jinlife/Synology_Photos_Face_Patch)
- Modules:`@jim3ma` `@MoetaYuko`
- [synology-igc](https://github.com/jim3ma/synology-igc)
- [intel-gpu-i915-backports](https://github.com/MoetaYuko/intel-gpu-i915-backports)
### 7: Links & Community
#### 7.1: Group
- `QQ群1: 21609194` [`点击加入QQ群`](https://qm.qq.com/q/YTPvSXfeU0)
- `QQ群2: 73119176` [`点击加入QQ群`](https://qm.qq.com/q/YV1B0NFvWK)
- `QQ群3: 51929774` [`点击加入QQ群`](https://qm.qq.com/q/aVjM3Wb6KY)
- `QQ群4: 49756829` [`点击加入QQ群`](https://qm.qq.com/q/9PHzmZDkqI)
- `QQ群5: 30267817` [`点击加入QQ群`](https://qm.qq.com/q/6RgVDfOSXe)
- `QQ群6: 68640297` [`点击加入QQ群`](https://qm.qq.com/q/PU71eSXAic)
- `QQ Channel: RROrg` [`点击加入QQ频道`](https://pd.qq.com/s/aklqb0uij)
- `Telegram Channel: RROrg` [`Click to join`](https://t.me/RR_Org)
### 7: Sponsoring
- <img src="https://raw.githubusercontent.com/wjz304/wjz304/master/my/buymeacoffee.png" width="700">
### 8: License
- [GPL-V3](https://github.com/RROrg/rr/blob/main/LICENSE)

19
Taskfile.yaml Normal file
View File

@ -0,0 +1,19 @@
# https://taskfile.dev
version: "3"
tasks:
build-img:
cmds:
- ./img-gen.sh
build-docker-img:
dir: docker
cmds:
- ./build.sh
compile-kpatch:
dir: kpatch
cmds:
- make clean all
- mv kpatch ../files/initrd/opt/rr/

View File

@ -1 +1 @@
25.12.0
23.11.1

View File

@ -1,882 +0,0 @@
{
"acpid": {
"system": false,
"description": {
"en_US": "ACPI Daemon that handles power button events, fixing power button not shutting down in some environments.",
"ar_SA": "برنامج ACPI Daemon الذي يتعامل مع أحداث زر الطاقة، ويصلح عدم إغلاق زر الطاقة في بعض البيئات.",
"de_DE": "ACPI Daemon, der die Power-Button-Ereignisse behandelt, um das Problem zu beheben, dass der Power-Button in einigen Umgebungen nicht herunterfährt.",
"es_ES": "Demonio ACPI que maneja los eventos del botón de encendido, solucionando el problema de que el botón de encendido no apague en algunos entornos.",
"fr_FR": "Démon ACPI qui gère les événements du bouton d'alimentation, corrigeant le problème du bouton d'alimentation qui ne s'éteint pas dans certains environnements.",
"ja_JP": "電源ボタンのイベントを処理するACPIデーモンで、一部の環境で電源ボタンがシャットダウンしない問題を修正します.",
"ko_KR": "전원 버튼 이벤트를 처리하는 ACPI 데몬, 일부 환경에서 전원 버튼이 종료되지 않는 문제를 해결합니다.",
"ru_RU": "Демон ACPI, обрабатывающий события кнопки питания, исправляющий проблему, когда кнопка питания не выключает в некоторых средах.",
"th_TH": "ACPI Daemon ที่จัดการกับเหตุการณ์ปุ่มเปิดเครื่อง, แก้ปัญหาปุ่มเปิดเครื่องไม่ปิดเครื่องในบางสภาพแวดล้อม",
"tr_TR": "Güç düğmesi olaylarını ele alan ACPI Daemon, bazı ortamlarda güç düğmesinin kapanmamasını düzeltir.",
"uk_UA": "Демон ACPI, який обробляє події кнопки живлення, виправляючи проблему, коли кнопка живлення не вимикає в деяких середовищах.",
"vi_VN": "ACPI Daemon xử lý các sự kiện nút nguồn, sửa lỗi nút nguồn không tắt máy trong một số môi trường.",
"zh_CN": "处理电源按钮事件的 ACPI 守护程序, 解决部分环境下电源按钮无法正常关机的问题.",
"zh_HK": "處理電源按鈕事件的 ACPI 守护程序, 解决部分環境下電源按鈕無法正常關機的問題.",
"zh_TW": "處理電源按鈕事件的 ACPI 守护程序, 解决部分環境下電源按鈕無法正常關機的問題."
}
},
"addincards": {
"system": false,
"description": {
"en_US": "Remove model restrictions from official Addin cards(M2D20, E10G30-T2, ...).",
"ar_SA": "قم بإزالة القيود على النموذج من بعض البطاقات الرسمية (M2D20، E10G30-T2، ...).",
"de_DE": "Entfernen Sie Modellbeschränkungen von offiziellen Addin-Karten (M2D20, E10G30-T2, ...).",
"es_ES": "Elimine las restricciones de modelo de las tarjetas Addin oficiales (M2D20, E10G30-T2, ...).",
"fr_FR": "Supprimez les restrictions de modèle des cartes Addin officielles (M2D20, E10G30-T2, ...).",
"ja_JP": "公式の Addin カード(M2D20、E10G30-T2、...)のモデル制限を解除します.",
"ko_KR": "공식 Addin 카드(M2D20, E10G30-T2, ...)의 모델 제한을 제거합니다.",
"ru_RU": "Удалите ограничения модели официальных карт Addin (M2D20, E10G30-T2, ...).",
"th_TH": "ลบข้อจำกัดของโมเดลจากการ์ด Addin ทางการ (M2D20, E10G30-T2, ...)",
"tr_TR": "Resmi Addin kartlarından model kısıtlamalarını kaldırın (M2D20, E10G30-T2, ...).",
"uk_UA": "Видаліть обмеження моделі офіційних карток Addin (M2D20, E10G30-T2, ...).",
"vi_VN": "Xóa các hạn chế mô hình từ các thẻ Addin chính thức (M2D20, E10G30-T2, ...).",
"zh_CN": "移除官方 Addin 卡(M2D20, E10G30-T2, ...)对 DSM 型号限制.",
"zh_HK": "移除官方 Addin 卡(M2D20, E10G30-T2, ...)对 DSM 型號限制.",
"zh_TW": "移除官方 Addin 卡(M2D20, E10G30-T2, ...)对 DSM 型號限制."
}
},
"apppatch": {
"system": false,
"description": {
"en_US": "Fix Synology Photos unable to delete photos under non-genuine SN, close local_display to prevent generating a large number of BrowserMetrics files.",
"ar_SA": "إصلاح Synology Photos غير قادر على حذف الصور تحت رقم SN غير الأصلي، إغلاق local_display لمنع إنشاء عدد كبير من ملفات BrowserMetrics.",
"de_DE": "Beheben Sie, dass Synology Photos unter einer nicht originalen SN keine Fotos löschen kann, schließen Sie local_display, um zu verhindern, dass eine große Anzahl von BrowserMetrics-Dateien generiert wird.",
"es_ES": "Arreglar Synology Photos que no puede eliminar fotos bajo un SN no genuino, cerrar local_display para evitar generar una gran cantidad de archivos BrowserMetrics.",
"fr_FR": "Corrigez Synology Photos qui ne peut pas supprimer de photos sous un SN non authentique, fermez local_display pour éviter de générer un grand nombre de fichiers BrowserMetrics.",
"ja_JP": "Synology Photos が非正規 SN の下で写真を削除できない問題を修正し、local_display を閉じて大量の BrowserMetrics ファイルが生成されるのを防ぎます。",
"ko_KR": "비정품 SN에서 사진을 삭제할 수 없는 Synology Photos를 수정하고 local_display를 닫아 많은 BrowserMetrics 파일이 생성되는 것을 방지합니다.",
"ru_RU": "Исправление Synology Photos, который не может удалить фотографии под ненастоящим SN, закройте local_display, чтобы предотвратить создание большого количества файлов BrowserMetrics.",
"th_TH": "แก้ไข Synology Photos ไม่สามารถลบภาพถ่ายได้เมื่อใช้ SN ไม่จริง และปิด local_display เพื่อป้องกันการสร้างไฟล์ BrowserMetrics เกินจำนวนมาก",
"tr_TR": "Synology Photos'ın non-orijinal SN altında fotoğrafı silme yeteneğini düzeltin, local_display'i kapatın ve çok fazla BrowserMetrics dosyası oluşturmaması için.",
"uk_UA": "Виправлення Synology Photos, який не може видаляти фотографії під неоригінальним SN, закрийте local_display, щоб уникнути створення великої кількості файлів BrowserMetrics.",
"vi_VN": "Sửa lỗi Synology Photos không thể xóa hình ảnh dưới SN không chính xác, đóng local_display để ngăn chặn việc tạo nhiều tệp BrowserMetrics.",
"zh_CN": "修复 Synology Photos 在非正版SN下无法删除照片的问题、关闭 local_display 防止生成大量 BrowserMetrics文件。",
"zh_HK": "修復 Synology Photos 在非正版SN下無法刪除照片的問題、關閉 local_display 防止生成大量 BrowserMetrics文件。",
"zh_TW": "修復 Synology Photos 在非正版SN下無法刪除照片的問題、關閉 local_display 防止生成大量 BrowserMetrics文件。"
}
},
"beep": {
"system": false,
"description": {
"en_US": "Beep at startup and shutdown (requires motherboard with buzzer) Parameters: -m: Mario at startup and AxelF at shutdown",
"ar_SA": "صد الصوت عند بدء التشغيل والإغلاق (يتطلب لوحة أم تحتوي على جرس) المعلمات: -m: ماريو عند بدء التشغيل و AxelF عند الإغلاق",
"de_DE": "Beim Starten und Herunterfahren piepen (erfordert Mainboard mit Summer) Parameter: -m: Mario beim Starten und AxelF beim Herunterfahren",
"es_ES": "Pitido al inicio y apagado (requiere placa base con zumbador) Parámetros: -m: Mario al inicio y AxelF al apagado",
"fr_FR": "Bip au démarrage et à l'arrêt (nécessite une carte mère avec buzzer) Paramètres: -m: Mario au démarrage et AxelF à l'arrêt",
"ja_JP": "起動時にブザーを鳴らす(ブザーを備えたマザーボードが必要) パラメータ: -m: 起動時にマリオ、シャットダウン時にAxelF",
"ko_KR": "시작 및 종료시 소리 울리기(부저가 있는 메인보드 필요) 매개변수: -m: 시작시 Mario 및 종료시 AxelF",
"ru_RU": "при запуске и выключении пищать (требуется материнская плата с зуммером) Параметры: -m: Mario при запуске и AxelF при выключении",
"th_TH": "เสียงเบี๊ยวเมื่อเริ่มต้นและปิดเครื่อง (ต้องใช้เมนบอร์ดที่มีเสียงเบี๊ยว) พารามิเตอร์: -m: Mario เมื่อเริ่มต้นและ AxelF เมื่อปิดเครื่อง",
"tr_TR": "Başlangıç ve kapanışta bip sesi çal (ana kartta hoparlör gerektirir) Parametreler: -m: Başlangıçta Mario ve kapanışta AxelF",
"uk_UA": "при запуску та вимкненні пищати (потрібна материнська плата з динаміком) Параметри: -m: Mario при запуску та AxelF при вимкненні",
"vi_VN": "Phát ra tiếng bíp khi khởi động và tắt máy (yêu cầu bo mạch chủ có loa) Tham số: -m: Mario khi khởi động và AxelF khi tắt máy",
"zh_CN": "在启动和关机时发出哔声(需要主板有蜂鸣器) 参数: -m: 开机 Mario 和 关机 AxelF",
"zh_HK": "在啟動和關機時發出哔聲(需要主機有蜂鳴器) 參數: -m: 開機 Mario 和 關機 AxelF",
"zh_TW": "在啟動和關機時發出哔聲(需要主機有蜂鳴器) 參數: -m: 開機 Mario 和 關機 AxelF"
}
},
"blockupdate": {
"system": true,
"description": {
"en_US": "Block DSM automatic system update.",
"ar_SA": "قفل التحديثات التلقائية منDSM.",
"de_DE": "Bloquer les mises à jour automatiques du système DSM.",
"es_ES": "Bloquear las actualizaciones automáticas del sistema DSM.",
"fr_FR": "Bloquer les mises à jour automatiques du système DSM.",
"ja_JP": "DSMの自動更新をブロックします。",
"ko_KR": "DSM 자동 업데이트를 차단합니다.",
"ru_RU": "Заблокировать автоматические обновления системы DSM.",
"th_TH": "บล็อกอัตโนมัติอัปเดตจากDSM",
"tr_TR": "DSM otomatik güncellemeleri engelle.",
"uk_UA": "Блокувати автоматичні оновлення системи DSM.",
"vi_VN": "Khóa tự động cập nhật hệ thống DSM.",
"zh_CN": "阻止 DSM 自动系统更新。",
"zh_HK": "阻止 DSM 自动系统更新。",
"zh_TW": "阻止 DSM 自动系统更新。"
}
},
"bootwait": {
"system": true,
"description": {
"en_US": "This script ensures that the boot process waits for the boot disk (/dev/synoboot) to be available before starting other processes.",
"ar_SA": "يضمن هذا البرنامج أن عملية التمهيد تنتظر حتى يصبح القرص المحمل (/dev/synoboot) متاحًا قبل بدء العمليات الأخرى.",
"de_DE": "Diese Skript stellt sicher, dass der Startprozess auf das Boot-Laufwerk (/dev/synoboot) wartet, bevorandere Prozesse gestartet werden.",
"es_ES": "Este programa garantiza que el proceso de arranque espere hasta que el disco cargado (/dev/synoboot) esté disponible antes de iniciar otros procesos.",
"fr_FR": "Le script de démarrage assure que le processus de démarrage attend que le disque de démarrage (/dev/synoboot) soit disponible avant de commencer d'autres processus.",
"ja_JP": "ブートディスク (/dev/synoboot) が利用可能になるまでブートプロセスが待機するようにします.",
"ko_KR": "이 스크립트는 부팅 프로세스가 부팅 디스크 (/dev/synoboot)가 사용 가능할 때까지 기다리도록 합니다.",
"ru_RU": "Этот скрипт гарантирует, что процесс загрузки будет ждать, пока загрузочный диск (/dev/synoboot) не станет доступным, прежде чем запустить другие процессы.",
"th_TH": "โปรแกรมนี้จะช่วยให้แน่ใจว่ากระบวนการบูตจะรอจนกว่าดิสก์ที่โหลด (/dev/synoboot) จะพร้อมใช้งานก่อนที่จะเริ่มกระบวนการอื่น",
"tr_TR": "Bu program, önyükleme işleminin diğer işlemleri başlatmadan önce yüklenen diskin (/dev/synoboot) kullanılabilir olmasını beklemesini sağlar.",
"uk_UA": "Ця програма гарантує, що процес завантаження очікує, поки завантажений диск (/dev/synoboot) стане доступним, перш ніж запускати інші процеси.",
"vi_VN": "Chương trình này đảm bảo rằng quá trình khởi động sẽ đợi cho đến khi đĩa được tải (/dev/synoboot) khả dụng trước khi bắt đầu các quá trình khác.",
"zh_CN": "此脚本确保启动过程等待引导盘磁盘 (/dev/synoboot) 可用之后再启动其他进程.",
"zh_HK": "此腳本確保啟動過程等待引导盤磁碟 (/dev/synoboot) 可用之後再啟動其他進程.",
"zh_TW": "此腳本確保啟動過程等待引导盤磁碟 (/dev/synoboot) 可用之後再啟動其他進程."
}
},
"console": {
"system": false,
"description": {
"en_US": "Provides screen console (bash) functionality via framebuffer (fb) to allow debugging on the screen, only supported on models with a graphics driver.",
"ar_SA": "يوفر وظيفة وحدة التحكم في الشاشة (bash) عبر framebuffer (fb) للسماح بالتصحيح على الشاشة، مدعوم فقط على النماذج التي تحتوي على برنامج تشغيل الرسومات.",
"de_DE": "Bietet Bildschirmkonsolen (bash)-Funktionalität über Framebuffer (fb), um das Debuggen auf dem Bildschirm zu ermöglichen, wird nur auf Modellen mit einem Grafiktreiber unterstützt.",
"es_ES": "Proporciona la funcionalidad de la consola (bash) de pantalla a través del framebuffer (fb) para permitir la depuración en la pantalla, solo se admite en los modelos con un controlador gráfico.",
"fr_FR": "Fournit une fonctionnalité de console d'écran (bash) via framebuffer (fb) pour permettre le débogage sur l'écran, pris en charge uniquement sur les modèles avec un pilote graphique.",
"ja_JP": "グラフィックスドライバを搭載したモデルでのみサポートされる、フレームバッファ (fb) を介した画面コンソール (bash) 機能を提供し、画面上でのデバッグを可能にします.",
"ko_KR": "프레임버퍼(fb)를 통해 화면 콘솔(bash) 기능을 제공하여 화면에서 디버깅을 허용하며, 그래픽 드라이버가 있는 모델에서만 지원됩니다.",
"ru_RU": "Предоставляет функциональность консоли экрана (bash) через framebuffer (fb) для разрешения отладки на экране, поддерживается только на моделях с графическим драйвером.",
"th_TH": "ให้ความสามารถของหน้าจอคอนโซล (bash) ผ่าน framebuffer (fb) เพื่ออนุญาตให้ทำการแก้บั๊กบนหน้าจอ รองรับเฉพาะบนโมเดลที่มีไดรเวอร์กราฟิก",
"tr_TR": "Ekran üzerinde hata ayıklamaya izin vermek için framebuffer (fb) aracılığıyla ekran konsolu (bash) işlevselliği sağlar, yalnızca grafik sürücüsü olan modellerde desteklenir.",
"uk_UA": "Надає функціональність консолі екрану (bash) через буфер кадру (fb) для дозволу налагодження на екрані, підтримується лише на моделях з графічним драйвером.",
"vi_VN": "Cung cấp chức năng màn hình (bash) qua framebuffer (fb) để cho phép kiểm tra trên màn hình, chỉ được hỗ trợ trên các mô hình có trình điều khiển hình ảnh.",
"zh_CN": "通过帧缓冲区 (fb) 提供屏幕控制台 (bash) 功能, 以允许在屏幕上进行调试, 仅支持具有显卡驱动程序的型号.",
"zh_HK": "透過幀緩衝區 (fb) 提供屏幕控制台 (bash) 功能, 以允許在屏幕上進行調試, 僅支持具有顯卡驅動程序的型號.",
"zh_TW": "透過幀緩衝區 (fb) 提供屏幕控制台 (bash) 功能, 以允許在屏幕上進行調試, 僅支持具有顯卡驅動程序的型號."
}
},
"cpuinfo": {
"system": false,
"description": {
"en_US": "Display CPU/GPU/Temperature information in the control panel. (Option -s shows static information)",
"ar_SA": "عرض معلومات وحدة المعالجة المركزية / وحدة معالجة الرسومات / درجة الحرارة في لوحة التحكم. (خيار -s يظهر معلومات ثابتة)",
"de_DE": "Zeigt CPU/GPU/Temperaturinformationen im Bedienfeld an. (Option -s zeigt statische Informationen)",
"es_ES": "Mostrar información de CPU/GPU/Temperatura en el panel de control. (L'option -s affiche des informations statiques))",
"fr_FR": "Afficher les informations CPU/GPU/Température dans le panneau de configuration. (L'option -s affiche des informations statiques)))",
"ja_JP": "コントロールパネルにCPU/GPU/温度情報を表示します。 (パラメータ -s は静的な情報を表示します)",
"ko_KR": "제어판에 CPU/GPU/온도 정보를 표시합니다. (옵션 -s는 정적 정보를 표시합니다)",
"ru_RU": "Показать информацию о процессоре/GPU/температуре в панели управления. (Опция -s показывает статическую информацию)",
"th_TH": "แสดงข้อมูล CPU/GPU/อุณหภูมิในแผงควบคุม. (ตัวเลือก -s แสดงข้อมูลที่ไม่เปลี่ยนแปลง)",
"tr_TR": "Kontrol panelinde CPU/GPU/Sıcaklık bilgilerini görüntüler. (Seçenek -s statik bilgileri gösterir)",
"uk_UA": "Показати інформацію про процесор/GPU/температуру в панелі керування. (Опция -s показывает статическую информацию)",
"vi_VN": "Hiển thị thông tin CPU/GPU/Nhiệt độ trong bảng điều khiển. (Tùy chọn -s hiển thị thông tin tĩnh)",
"zh_CN": "只让控制面板显示正确的CPU/GPU/温度等信息. (参数 -s 显示静态信息)",
"zh_HK": "只讓控制面板顯示正確的CPU/GPU/溫度等信息. (参数 -s 顯示靜態信息)",
"zh_TW": "只讓控制面板顯示正確的CPU/GPU/温度等信息. (参数 -s 顯示靜態信息)"
}
},
"dbgutils": {
"system": false,
"description": {
"en_US": "Debug utilities, automatically capture all stage boot logs to <loader disk>/p1/logs/.",
"ar_SA": "أدوات التصحيح، التقاط جميع سجلات تمهيد المرحلة تلقائيًا إلى <قرص التحميل>/p1/logs/.",
"de_DE": "Debug-Dienstprogramme, erfassen Sie automatisch alle Stufenstartprotokolle auf <Loader-Disk>/p1/logs/.",
"es_ES": "Utilidades de depuración, captura automáticamente todos los registros de arranque de etapa a <disco de carga>/p1/logs/.",
"fr_FR": "Utilitaires de débogage, capture automatiquement tous les journaux de démarrage de la scène à <disque de chargement>/p1/logs/.",
"ja_JP": "デバッグユーティリティ、すべてのステージブートログを <ローダーディスク>/p1/logs/ に自動的にキャプチャします.",
"ko_KR": "디버그 유틸리티, 모든 스테이지 부팅 로그를 <로더 디스크>/p1/logs/에 자동으로 캡처합니다.",
"ru_RU": "Утилиты отладки, автоматически захватывают все журналы загрузки этапа на <загрузочный диск>/p1/logs/.",
"th_TH": "เครื่องมือการแก้บั๊ก, จับบันทึกการบูตของขั้นตอนทั้งหมดไปยัง <ดิสก์โหลด>/p1/logs/ โดยอัตโนมัติ",
"tr_TR": "Hata ayıklama araçları, tüm aşama başlangıç günlüklerini <yükleme diski>/p1/logs/ dizinine otomatik olarak yakalar.",
"uk_UA": "Утиліти відлагодження, автоматично захоплюють всі журнали завантаження етапу на <завантажувальний диск>/p1/logs/.",
"vi_VN": "Công cụ gỡ lỗi, tự động chụp tất cả các bản ghi khởi động giai đoạn đến <ổ đĩa tải trọng>/p1/logs/.",
"zh_CN": "调试工具, 自动捕获所有阶段启动日志到 <加载器磁盘>/p1/logs/.",
"zh_HK": "調試工具, 自動捕獲所有階段啟動日誌到 <加載器磁盤>/p1/logs/.",
"zh_TW": "調試工具, 自動捕獲所有階段啟動日誌到 <加載器磁盤>/p1/logs/."
}
},
"disks": {
"system": true,
"description": {
"en_US": "Config disks related setting.",
"ar_SA": "قم بتكوين إعدادات القرص.",
"de_DE": "Konfiguriere Einstellungen für Festplatten.",
"es_ES": "Configurar la configuración relacionada con los discos.",
"fr_FR": "Configurer les paramètres relatifs aux disques.",
"ja_JP": "ディスク関連の設定を構成します.",
"ko_KR": "디스크 관련 설정 구성.",
"ru_RU": "Настройка параметров дисков.",
"th_TH": "กำหนดค่าที่เกี่ยวข้องกับดิสก์",
"tr_TR": "Disklerle ilgili ayarları yapılandırın.",
"uk_UA": "Налаштування параметрів дисків.",
"vi_VN": "Cấu hình các thiết lập liên quan đến đĩa.",
"zh_CN": "配置与磁盘相关的设置.",
"zh_HK": "配置與磁碟相關的設定.",
"zh_TW": "配置與磁碟相關的設定."
}
},
"eudev": {
"system": true,
"description": {
"en_US": "eudev + kmod automatically loaded modules.",
"ar_SA": "eudev + kmod الوحدات المحملة تلقائيًا.",
"de_DE": "eudev + kmod automatisch geladene Module.",
"es_ES": "eudev + kmod módulos cargados automáticamente.",
"fr_FR": "eudev + kmod modules chargés automatiquement.",
"ja_JP": "eudev + kmod 自動的にロードされるモジュール.",
"ko_KR": "eudev + kmod 자동으로 로드된 모듈.",
"ru_RU": "eudev + kmod автоматически загружаемые модули.",
"th_TH": "eudev + kmod โมดูลที่โหลดโดยอัตโนมัติ",
"tr_TR": "eudev + kmod otomatik olarak yüklenen modüller.",
"uk_UA": "eudev + kmod автоматично завантажені модулі.",
"vi_VN": "eudev + kmod môdules tải tự động.",
"zh_CN": "eudev + kmod 自动加载模块.",
"zh_HK": "eudev + kmod 自動加載模塊.",
"zh_TW": "eudev + kmod 自動加載模塊."
}
},
"expands": {
"system": false,
"description": {
"en_US": "Expanded miscellaneous, updated usb.map, ca-certificates.crt, etc.",
"ar_SA": "متنوعات موسعة، usb.map محدث، ca-certificates.crt، إلخ.",
"de_DE": "Erweiterte Diverses, aktualisierte usb.map, ca-certificates.crt, etc.",
"es_ES": "Misceláneos ampliados, usb.map actualizado, ca-certificates.crt, etc.",
"fr_FR": "Diverses étendues, usb.map mise à jour, ca-certificates.crt, etc.",
"ja_JP": "拡張その他、更新された usb.map、ca-certificates.crt など",
"ko_KR": "기타 확장, 업데이트 된 usb.map, ca-certificates.crt 등",
"ru_RU": "Расширенные разные, обновленная usb.map, ca-certificates.crt и т. Д.",
"th_TH": "ขยายหลากหลาย, อัปเดต usb.map, ca-certificates.crt, เป็นต้น",
"tr_TR": "Genişletilmiş çeşitli, güncellenmiş usb.map, ca-certificates.crt, vb.",
"uk_UA": "Розширені різні, оновлена usb.map, ca-certificates.crt тощо.",
"vi_VN": "Mở rộng các loại khác nhau, usb.map được cập nhật, ca-certificates.crt, v.v.",
"zh_CN": "扩展杂项, 更新 usb.map, ca-certificates.crt 等.",
"zh_HK": "擴展雜項, 更新 usb.map, ca-certificates.crt 等.",
"zh_TW": "擴展雜項, 更新 usb.map, ca-certificates.crt 等."
}
},
"hdddb": {
"system": false,
"description": {
"en_US": "Author: 007revad. Add HDD/SSD drives to the DSM database to solve the problem of firmware version not recognized by the disk.",
"ar_SA": "المؤلف: (007revad). قم بإضافة بيانات محرك الأقراص الصلبة/SSD إلى قاعدة بيانات DSM لحل مشكلة إصدار البرنامج الثابت لمحرك الأقراص الثابتة غير المعروف.",
"de_DE": "Autor: 007revad. Fügen Sie HDD/SSD-Laufwerke zur DSM-Datenbank hinzu, um das Problem zu lösen, dass die Firmware-Version von der Festplatte nicht erkannt wird.",
"es_ES": "Autor: 007revad. Agrega discos duros y SSD a la base de datos de DSM para solucionar el problema de que la versión del firmware no sea reconocida por el disco.",
"fr_FR": "Auteur: 007revad. Ajoutez des disques durs et SSD à la base de données DSM pour résoudre le problème de reconnaissance de la version du firmware par le disque.",
"ja_JP": "作者: 007revad. ディスクのファームウェアバージョンが認識されない問題を解決するために、HDD/SSDドライブをDSMデータベースに追加します.",
"ko_KR": "저자: 007revad. 디스크의 펌웨어 버전이 인식되지 않는 문제를 해결하기 위해 HDD/SSD 드라이브를 DSM 데이터베이스에 추가합니다.",
"ru_RU": "Автор: 007revad. Добавьте данные жесткого диска/SSD в базу данных DSM, чтобы решить проблему нераспознанной версии прошивки жесткого диска.",
"th_TH": "ผู้เขียน: 007revad. เพิ่มฮาร์ดดิสก์และ SSD ลงในฐานข้อมูล DSM เพื่อแก้ปัญหาเวอร์ชันฟิวเวอร์ไม่ได้รับการรับรู้โดยดิสก์",
"tr_TR": "Yazar: 007revad. Disk tarafından tanınmayan firmware sürümü sorununu çözmek için HDD/SSD sürücüleri DSM veritabanına ekleyin.",
"uk_UA": "Автор: 007revad. Додайте дані диска HDD/SSD до бази даних DSM, щоб вирішити проблему нерозпізнаної версії мікропрограми жорсткого диска.",
"vi_VN": "Tác giả: 007revad. Thêm ổ cứng và ổ SSD vào cơ sở dữ liệu DSM để giải quyết vấn đề không nhận diện được phiên bản firmware của ổ cứng.",
"zh_CN": "作者: 007revad. 将HDD/SSD驱动器数据添加到DSM数据库中, 以解决硬盘固件版本无法识别的问题.",
"zh_HK": "作者: 007revad. 將HDD/SSD驱动器數據添加到DSM數據庫中, 以解決硬碟固件版本無法識別的問題.",
"zh_TW": "作者: 007revad. 將HDD/SSD驅動器數據添加到DSM數據庫中, 以解決硬碟固件版本無法識別的問題."
}
},
"i915le10th": {
"system": false,
"description": {
"en_US": "Automatically replace the device ID of i915.ko(apollolake, geminilake), only supporting less 10th. (Parameter VID:PID)",
"ar_SA": "استبدل تلقائيًا معرف الجهاز لـ i915.ko (apollolake، geminilake)، والذي يدعم فقط أقل من 10. (معلمة VID:PID)",
"de_DE": "Ersetzen Sie automatisch die Geräte-ID von i915.ko (apollolake, geminilake), die nur weniger als 10. unterstützt. (Parameter VID:PID)",
"es_ES": "Reemplace automáticamente el ID de dispositivo de i915.ko (apollolake, geminilake), que solo admite menos de 10. (Parámetro VID:PID)",
"fr_FR": "Remplacez automatiquement l'ID de périphérique de i915.ko (apollolake, geminilake), ne prenant en charge que moins de 10. (Paramètre VID:PID)",
"ja_JP": "i915.ko (apollolake, geminilake) のデバイスIDを自動的に置き換え, 10未満のみをサポートします. (パラメータVID:PID) ",
"ko_KR": "i915.ko (apollolake, geminilake) 의 장치 ID를 자동으로 교체하며, 10세 미만만 지원합니다. (파라미터 VID:PID)",
"ru_RU": "Автоматическая замена идентификатора устройства i915.ko (apollolake, geminilake), поддерживающего только менее 10. (Параметр VID:PID)",
"th_TH": "แทนที่ ID อุปกรณ์ของ i915.ko (apollolake, geminilake) โดยอัตโนมัติ รองรับเฉพาะต่ำกว่า 10 (พารามิเตอร์ VID:PID)",
"tr_TR": "i915.ko (apollolake, geminilake) cihaz kimliğini otomatik olarak değiştirir, yalnızca 10. sürümü destekler. (Parametre VID:PID)",
"uk_UA": "Автоматично замінює ідентифікатор пристрою i915.ko (apollolake, geminilake), підтримує лише менше 10. (Параметр VID:PID)",
"vi_VN": "Tự động thay thế ID thiết bị của i915.ko (apollolake, geminilake), chỉ hỗ trợ ít hơn 10. (Tham số VID:PID)",
"zh_CN": "自动替换 i915.ko (apollolake, geminilake) 的设备 ID, 仅支持 10 代以下. (参数VID:PID) ",
"zh_HK": "自動替換 i915.ko (apollolake, geminilake) 的設備 ID, 僅支持 10 代以下. (參數VID:PID) ",
"zh_TW": "自動替換 i915.ko (apollolake, geminilake) 的設備 ID, 僅支持 10 代以下. (參數VID:PID) "
}
},
"localrss": {
"system": true,
"description": {
"en_US": "Implant RSS into the bootloader so that it can be installed online.",
"ar_SA": "زرع RSS في البرنامج الثابت ليمكن تثبيته عبر الإنترنت.",
"de_DE": "RSS in den Bootloader einpflanzen, damit er online installiert werden kann.",
"es_ES": "Implantar RSS en el cargador de arranque para que se pueda instalar en línea.",
"fr_FR": "Implanter RSS dans le chargeur de démarrage pour qu'il puisse être installé en ligne.",
"ja_JP": "RSS をブートローダーに埋め込んでオンラインでインストールできるようにします.",
"ko_KR": "부트로더에 RSS를 심어 온라인으로 설치할 수 있습니다.",
"ru_RU": "Внедрить RSS в загрузчик, чтобы его можно было установить онлайн.",
"th_TH": "ฝัง RSS ในโปรแกรมเริ่มต้นเพื่อให้สามารถติดตั้งออนไลน์ได้",
"tr_TR": "RSS'i önyükleyiciye yerleştirerek çevrimiçi olarak yükleyebilirsiniz.",
"uk_UA": "Внести RSS в завантажувач, щоб його можна було встановити онлайн.",
"vi_VN": "Cấy RSS vào trình khởi động để có thể cài đặt trực tuyến.",
"zh_CN": "将 RSS 植入到引导加载程序中, 以便可以在线安装.",
"zh_HK": "將 RSS 植入到引導加載程序中, 以便可以在線安裝.",
"zh_TW": "將 RSS 植入到引導載入程式中, 以便可以在線安裝."
}
},
"lsiutil": {
"system": false,
"description": {
"en_US": "A tool for working with some LSI RAID controllers.",
"ar_SA": "أداة للعمل مع بعض تحكمات RAID LSI.",
"de_DE": "Ein Werkzeug zum Arbeiten mit einigen LSI RAID Controllern.",
"es_ES": "Una herramienta para trabajar con algunos controladores RAID LSI.",
"fr_FR": "Un outil pour travailler avec certains contrôleurs RAID LSI.",
"ja_JP": "一部の LSI RAID コントローラーと一緒に作業するためのツールです.",
"ko_KR": "LSI RAID 컨트롤러와 함께 작업하는 도구입니다.",
"ru_RU": "Инструмент для работы с некоторыми контроллерами RAID LSI.",
"th_TH": "เครื่องมือสำหรับทำงานกับบางคอนโทรลเลอร์ RAID LSI",
"tr_TR": "Bazı LSI RAID denetleyicileriyle çalışmak için bir araç.",
"uk_UA": "Інструмент для роботи з деякими контролерами RAID LSI.",
"vi_VN": "Một công cụ để làm việc với một số bộ điều khiển RAID LSI.",
"zh_CN": "用于处理某些 LSI RAID 控制器的工具.",
"zh_HK": "用於處理某些 LSI RAID 控制器的工具.",
"zh_TW": "用於處理某些 LSI RAID 控制器的工具."
}
},
"maiyunda": {
"system": false,
"description": {
"en_US": "Control Maiyunda M1S machine RESET button event, press and hold for 3s (release after hearing beeping) reset admin password to maiyunda.com and reset network, press and hold for 9s (release after hearing 3 beeps) reset system (all data will be erased).",
"ar_SA": "التحكم في حدث زر إعادة تعيين آلة Maiyunda M1S، اضغط مع الاستمرار لمدة 3 ثوانٍ (افرج بعد سماع صفير) إعادة تعيين كلمة مرور المسؤول إلى maiyunda.com وإعادة تعيين الشبكة، اضغط مع الاستمرار لمدة 9 ثوانٍ (افرج بعد سماع 3 صفير) إعادة تعيين النظام (سيتم مسح جميع البيانات).",
"de_DE": "Steuerung des RESET-Tastenereignisses der Maiyunda M1S-Maschine. Bitte ändern Sie den Inhalt der Aufgaben Net-Button-3s, Net-Button-9s, Copy-Button-3s und Copy-Button-9s im Zeitplan.",
"es_ES": "Control del evento del botón RESET de la máquina Maiyunda M1S, mantenga presionado durante 3 segundos (suéltelo después de escuchar el pitido) restablezca la contraseña de administrador a maiyunda.com y restablezca la red, mantenga presionado durante 9 segundos (suéltelo después de escuchar 3 pitidos) restablezca el sistema (se borrarán todos los datos).",
"fr_FR": "Contrôle de l'événement du bouton RESET de la machine Maiyunda M1S, maintenez enfoncé pendant 3 secondes (relâchez après avoir entendu le bip) réinitialisez le mot de passe administrateur à maiyunda.com et réinitialisez le réseau, maintenez enfoncé pendant 9 secondes (relâchez après avoir entendu 3 bips) réinitialisez le système (toutes les données seront effacées).",
"ja_JP": "Maiyunda M1S マシンの RESET ボタン イベントを制御します。3 秒間押し続けて (ビープ音を聞いた後に放す) 管理者パスワードを maiyunda.com にリセットし、ネットワークをリセットします。9 秒間押し続けて (3 回のビープ音を聞いた後に放す) システムをリセットします (すべてのデータが消去されます)。",
"ko_KR": "Maiyunda M1S 기계의 RESET 버튼 이벤트를 제어합니다. 3초 동안 누르고 (삐 소리를 들은 후 놓음) 관리자의 비밀번호를 maiyunda.com으로 재설정하고 네트워크를 재설정합니다. 9초 동안 누르고 (3번의 삐 소리를 들은 후 놓음) 시스템을 재설정합니다 (모든 데이터가 지워짐).",
"ru_RU": "Управление событием кнопки RESET машины Maiyunda M1S, удерживайте 3 секунды (отпустите после звукового сигнала) сбросьте пароль администратора на maiyunda.com и сбросьте сеть, удерживайте 9 секунд (отпустите после 3 звуковых сигналов) сбросьте систему (все данные будут стерты).",
"th_TH": "ควบคุมเหตุการณ์ปุ่ม RESET ของเครื่อง Maiyunda M1S กดค้างไว้ 3 วินาที (ปล่อยหลังจากได้ยินเสียงบี๊บ) รีเซ็ตพาสเวิร์ดผู้ดูแลระบบเป็น maiyunda.com และรีเซ็ตเครือข่าย กดค้างไว้ 9 วินาที (ปล่อยหลังจากได้ยินเสียงบี๊บ 3 ครั้ง) รีเซ็ตระบบ (ข้อมูลทั้งหมดจะถูกลบออก).",
"tr_TR": "Maiyunda M1S makinesinin RESET düğmesi olayını kontrol edin, 3 saniye basılı tutun (bip sesi duyduktan sonra bırakın) admin şifresini maiyunda.com olarak sıfırlayın ve ağı sıfırlayın, 9 saniye basılı tutun (3 bip sesi duyduktan sonra bırakın) sistemi sıfırlayın (tüm veriler silinecektir).",
"uk_UA": "Контроль події кнопки RESET машини Maiyunda M1S, натискайте та утримуйте 3 секунди (відпустіть після звуку) скинути пароль адміністратора на maiyunda.com і скинути мережу, натискайте та утримуйте 9 секунд (відпустіть після 3 звуків) скинути систему (всі дані будуть стерті).",
"vi_VN": "Điều khiển sự kiện nút RESET của máy Maiyunda M1S, nhấn và giữ trong 3 giây (thả ra sau khi nghe tiếng bíp) đặt lại mật khẩu quản trị viên thành maiyunda.com và đặt lại mạng, nhấn và giữ trong 9 giây (thả ra sau khi nghe 3 tiếng bíp) đặt lại hệ thống (tất cả dữ liệu sẽ bị xóa).",
"zh_CN": "用于控制 迈云达M1S 机器的 RESET 按钮事件, 按住 3s (听到哔哔哔后松手) 重置 admin 密码为 maiyunda.com 并重置网络, 按住 9s (听到 3次 哔哔哔后松手) 重置系统 (会清空全部数据).",
"zh_HK": "用於控制 迈云达M1S 机器的 RESET 按钮事件, 按住 3s (听到哔哔哔后松手) 重置 admin 密码为 maiyunda.com 并重置网络, 按住 9s (听到 3次 哔哔哔后松手) 重置系统 (会清空全部数据).",
"zh_TW": "用於控制 迈云达M1S 机器的 RESET 按钮事件, 按住 3s (听到哔哔哔后松手) 重置 admin 密码为 maiyunda.com 并重置网络, 按住 9s (听到 3次 哔哔哔后松手) 重置系统 (会清空全部数据)."
}
},
"misc": {
"system": true,
"description": {
"en_US": "Miscellaneous functions. (A collection of some necessary modifications.)",
"ar_SA": "وظائف متنوعة. (مجموعة من بعض التعديلات الضرورية.)",
"de_DE": "Verschiedene Funktionen. (Eine Sammlung einiger notwendiger Änderungen.)",
"es_ES": "Funciones variadas. (Una colección de algunas modificaciones necesarias.)",
"fr_FR": "Fonctions diverses. (Une collection de certaines modifications nécessaires.)",
"ja_JP": "その他の機能. (いくつかの必要な変更の集まり.)",
"ko_KR": "기타 기능. (일부 필요한 수정의 집합.)",
"ru_RU": "Различные функции. (Набор некоторых необходимых изменений.)",
"th_TH": "ฟังก์ชันเบ็ดเสร็จ. (ชุดของการปรับเปลี่ยนบางอย่างที่จำเป็น.)",
"tr_TR": "Çeşitli iş levler. (Bazı gereksiz değişikliklerin bir koleksiyonu.)",
"uk_UA": "Різноманітні функції. (Колекція деяких необхідних модифікацій.)",
"vi_VN": "Các chức năng khác nhau. (Một bộ sửa đổi cần thiết.)",
"zh_CN": "杂项功能. (一些必要的修改的集合.)",
"zh_HK": "雜項功能. (一些必要的修改的集合.)",
"zh_TW": "雜項功能. (一些必要的修改的集合.)"
}
},
"monitor": {
"system": false,
"description": {
"en_US": "Monitor Power Management (Only supports graphics card drivers).",
"ar_SA": "إدارة الطاقة للمراقبة(يدعم فقط برامج تشغيل بطاقة الرسومات).",
"de_DE": "Überwachung der Energieverwaltung (nur unterstützt Graphikkartendrivers).",
"es_ES": "Monitoreo de la gestión de energía (solo admite controladores de tarjeta gráfica).",
"fr_FR": "Surveillance de la gestion de l'alimentation (seulement les pilotes de carte graphique sont pris en charge).",
"ja_JP": "電源管理の監視 (グラフィックスカードドライバーのみサポート)。",
"ko_KR": "모니터 전원 관리 (그래픽 카드 드라이버만 지원)。",
"ru_RU": "Мониторинг управления питанием (только поддерживает драйверы графических карт).",
"th_TH": "การตรวจสอบการบริหารจัดการพลังงาน (แค่สนับสนุนไดรเวอร์การทำงานของการ์ดราฟิก).",
"tr_TR": "Monitör Güç Yönetimi (grafik kart sürücüsü destekliyor).",
"uk_UA": "Моніторинг управління живленням (тільки підтримує драйвери графічних карток).",
"vi_VN": "Quản lý nguồn điện (chỉ hỗ trợ các driver của card đồ họa).",
"zh_CN": "显示器电源管理 (仅支持显卡已驱动的环境)。",
"zh_HK": "顯示器電源管理 (僅支持显卡已驅動的环境)。",
"zh_TW": "顯示器電源管理 (僅支持显卡已驅動的环境)。"
}
},
"mountloader": {
"system": false,
"description": {
"en_US": "Mount boot disk and upgrade boot script under DSM system, for rr-manager application.",
"ar_SA": "تثبيت قرص التمهيد وترقية البرنامج النصي للتمهيد تحت نظام DSM، لتطبيق rr-manager.",
"de_DE": "Mounten Sie das Startlaufwerk und aktualisieren Sie das Startskript unter dem DSM-System für die rr-manager-Anwendung.",
"es_ES": "Montar el disco de arranque y actualizar el script de arranque en el sistema DSM, para la aplicación rr-manager.",
"fr_FR": "Monter le disque de démarrage et mettre à jour le script de démarrage sous le système DSM, pour l'application rr-manager.",
"ja_JP": "DSM システムでブート ディスクをマウントし、rr-manager アプリケーション用のブート スクリプトをアップグレードします。",
"ko_KR": "DSM 시스템에서 부팅 디스크를 마운트하고 rr-manager 응용 프로그램을 위한 부팅 스크립트를 업그레이드합니다.",
"ru_RU": "Подключите загрузочный диск и обновите загрузочный скрипт в системе DSM для приложения rr-manager.",
"th_TH": "ในระบบ DSM เมานต์ดิสก์บูตและอัปเกรดสคริปต์บูตสำหรับแอปพลิเคชัน rr-manager",
"tr_TR": "DSM sisteminde başlangıç diskini bağlayın ve rr-manager uygulamasında başlangıç betiğini güncelleyin.",
"uk_UA": "З'єднати стартовий диск та оновити стартовий скрипт в системі DSM для додатку rr-manager.",
"vi_VN": "Đồng bộ hóa đĩa khởi động và cập nhật script khởi động trong hệ thống DSM, cho ứng dụng rr-manager.",
"zh_CN": "在 DSM 系统下挂载引导磁盘和升级引导的脚本, 供 rr-manager 应用程序使用.",
"zh_HK": "在 DSM 系統下掛載引導磁碟和升級引導的腳本, 供 rr-manager 應用程序使用.",
"zh_TW": "在 DSM 系統下掛載引導磁碟和升級引導的腳本, 供 rr-manager 應用程序使用."
}
},
"netfix": {
"system": true,
"description": {
"en_US": "Fix network interface mac.",
"ar_SA": "إصلاح عنوان MAC لواجهة الشبكة.",
"de_DE": "Netzwerkschnittstellen-MAC beheben.",
"es_ES": "Corregir la dirección MAC de la interfaz de red.",
"fr_FR": "Corriger l'adresse MAC de l'interface réseau.",
"ja_JP": "ネットワークインターフェースのMACアドレスを修正します.",
"ko_KR": "네트워크 인터페이스의 MAC 주소를 수정합니다.",
"ru_RU": "Исправить MAC-адрес сетевой интерфейса.",
"th_TH": "แก้ไขที่อยู่ MAC ของช่องทางเครือข่าย.",
"tr_TR": "Netzwerkschnittstellen-MAC beheben.",
"uk_UA": "Виправте MAC-адресу сетевого інтерфейсу.",
"vi_VN": "Sửa địa chỉ MAC của giao diện mạng.",
"zh_CN": "修复网络接口mac地址.",
"zh_HK": "修复网络接口mac地址.",
"zh_TW": "修复网络接口mac地址."
}
},
"notify": {
"system": true,
"description": {
"en_US": "Add rr notify.",
"ar_SA": "إضافة rr notify.",
"de_DE": "Füge rr notify hinzu.",
"es_ES": "Añadir rr notify.",
"fr_FR": "Ajouter rr notify.",
"ja_JP": "rr notify を追加します.",
"ko_KR": "rr notify 를 추가합니다.",
"ru_RU": "Добавить rr notify.",
"th_TH": "เพิ่ม rr notify",
"tr_TR": "rr notify ekleyin.",
"uk_UA": "Додати rr notify.",
"vi_VN": "Thêm rr notify.",
"zh_CN": "添加 rr notify.",
"zh_HK": "添加 rr notify.",
"zh_TW": "新增 rr notify."
}
},
"nvmecache": {
"system": false,
"description": {
"en_US": "Author: PeterSuh-Q3. Enable NVME disk support for DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"ar_SA": "المؤلف: PeterSuh-Q3. تمكين دعم القرص NVME لـ DS918+، DS1019+، DS1621xs+، RS1619xs+.",
"de_DE": "Autor: PeterSuh-Q3. Aktivieren Sie die Unterstützung für NVME-Laufwerke für DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"es_ES": "Autor: PeterSuh-Q3. Habilita el soporte de discos NVME para DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"fr_FR": "Auteur: PeterSuh-Q3. Activer la prise en charge des disques NVME pour DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"ja_JP": "作者: PeterSuh-Q3. DS918+、DS1019+、DS1621xs+、RS1619xs+ で NVME ディスクのサポートを有効にします.",
"ko_KR": "작성자: PeterSuh-Q3. DS918+, DS1019+, DS1621xs+, RS1619xs+에서 NVME 디스크 지원 활성화.",
"ru_RU": "Автор: PeterSuh-Q3. Включите поддержку дисков NVME для DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"th_TH": "ผู้เขียน: PeterSuh-Q3. เปิดใช้งานการสนับสนุนดิสก์ NVME สำหรับ DS918+, DS1019+, DS1621xs+, RS1619xs+",
"tr_TR": "Yazar: PeterSuh-Q3. DS918+, DS1019+, DS1621xs+, RS1619xs+ için NVME disk desteğini etkinleştirin.",
"uk_UA": "Автор: PeterSuh-Q3. Увімкніть підтримку дисків NVME для DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"vi_VN": "Tác giả: PeterSuh-Q3. Bật hỗ trợ đĩa NVME cho DS918+, DS1019+, DS1621xs+, RS1619xs+.",
"zh_CN": "作者: PeterSuh-Q3. 启用 DS918+、DS1019+、DS1621xs+、RS1619xs+ 的 NVME 硬盘支持.",
"zh_HK": "作者: PeterSuh-Q3. 啟用 DS918+、DS1019+、DS1621xs+、RS1619xs+ 的 NVME 硬碟支援.",
"zh_TW": "作者: PeterSuh-Q3. 啟用 DS918+、DS1019+、DS1621xs+、RS1619xs+ 的 NVME 硬碟支援."
}
},
"nvmesystem": {
"system": false,
"description": {
"en_US": "Author: jim3ma. Install system on NVME disk (can't contain any SATA disk during installation, only supports DT mdoels).",
"ar_SA": "المؤلف: jim3ma. تثبيت نظام على القرص NVME (لا يمكن أن يحتوي على أي قرص SATA أثناء التثبيت ، يدعم فقط DT).",
"de_DE": "Autor: jim3ma. Installieren Sie das System auf einem NVME-Disk (kann keine SATA-Disk während der Installation enthalten, unterstützt nur DT-Modell).",
"es_ES": "Autor: jim3ma. Instalar el sistema en un disco NVME (no puede contener ninguna unidad SATA durante la instalación, solo admite modelos DT).",
"fr_FR": "Auteur: jim3ma. Installez le système sur un disque NVME (ne peut contenir aucune unité SATA pendant l'installation, ne prend que les modèles DT).",
"ja_JP": "著者: jim3ma. NVME ディスクにシステムをインストール (インストール中に SATA ディスクを含めることはできません、DT モデルのみをサポートします).",
"ko_KR": "저자: jim3ma. NVME 디스크에 시스템을 설치 (설치 중에 SATA 디스크를 포함할 수 없으며, DT 모델만 지원합니다).",
"ru_RU": "Автор: jim3ma. Установить систему на диск NVME (не может содержать SATA-диск во время установки, поддерживает только модели DT).",
"th_TH": "ผู้เขียน: jim3ma. ติดตั้งระบบบนแผง NVME (ไม่สามารถมีหน่วย SATA ในระหว่างการติดตั้งได้ และเฉพาะโมเดล DT เท่านั้น).",
"tr_TR": "Yazar: jim3ma. NVME disk üzerine sistem yükleyin (kurulum sırasında herhangi bir SATA disk içeremez, yalnızca DT modellerini destekler).",
"uk_UA": "Автор: jim3ma. Установить систему на диск NVME (не может содержать SATA-диск во время установки, поддерживает только модели DT).",
"vi_VN": "Người tạo: jim3ma. Cài đặt hệ thống trên NVME (không thể chứa đĩa SATA trong quá trình cài đặt, chỉ hỗ trợ mô hình DT).",
"zh_CN": "作者: jim3ma. 在 NVME 盘上安装系统 (在安装过程中不能包含 SATA 盘,仅支持 DT 型号).",
"zh_HK": "作者: jim3ma. 在 NVME 盤上安裝系統 (在安裝過程中不能包含 SATA 盤,僅支持 DT 模型).",
"zh_TW": "作者: jim3ma. 在 NVME 盤上安裝系統 (在安裝過程中不能包含 SATA 盤,僅支持 DT 模型)."
}
},
"nvmevolume": {
"system": false,
"description": {
"en_US": "Author: 007revad & PeterSuh-Q3. Allow creation of storage pools and volumes from Storage Manager through NVME disks.",
"ar_SA": "المؤلف: (007revad) وPeterSuh-Q3. تمكين إنشاء مجموعات تخزين ومساحات تخزين من مネージャ التخزين من خلال قرص NVME.",
"de_DE": "Autor: 007revad & PeterSuh-Q3. Erlaubt die Erstellung von Speicherpools und Volumen über den Speicher-Manager über NVME-Disks.",
"es_ES": "Autor: 007revad & PeterSuh-Q3. Permite la creación de grupos de almacenamiento y volúmenes a través del Administrador de almacenamiento a través de discos NVME.",
"fr_FR": "Auteur: 007revad & PeterSuh-Q3. Permet la création de pools de stockage et de volumes à partir du gestionnaire de stockage à travers les disques NVME.",
"ja_JP": "作者: 007revad & PeterSuh-Q3. Storage Manager から NVME ディスクからストレージ プールとボリュームを作成できるようにします.",
"ko_KR": "작성자: 007revad & PeterSuh-Q3. Storage Manager의 NVME 디스크에서 스토리지 풀 및 볼륨을 생성할 수 있습니다.",
"ru_RU": "Автор: 007revad & PeterSuh-Q3. Позволяет создавать пулы носителей и тома из дисков NVME из Storage Manager.",
"th_TH": "ผู้เขียน: 007revad & PeterSuh-Q3 สร้างกลุ่มจัดเก็บและพื้นที่จัดเก็บจาก Storage Manager ผ่านดิสก์ NVME",
"tr_TR": "Yazar: 007revad ve PeterSuh-Q3. Storage Manager'dan NVME disklerden depolama havuzları ve birimleri oluşturulmasına olanak tanır.",
"uk_UA": "Автор: 007revad & PeterSuh-Q3. Дозволяє створювати пули зберігання та томи з дисків NVME за допомогою Storage Manager.",
"vi_VN": "tác giả: 007revad & PeterSuh-Q3. Cho phép tạo khối lưu trữ và khối từ Quản lý lưu trữ thông qua đĩa NVME.",
"zh_CN": "作者: 007revad & PeterSuh-Q3. 允许从存储管理器中通过 NVME 磁盘创建存储池和卷.",
"zh_HK": "作者: 007revad & PeterSuh-Q3. 允許從儲存管理器中透過 NVME 磁碟建立儲存池和磁碟區.",
"zh_TW": "作者: 007revad & PeterSuh-Q3. 允許從儲存管理器中透過 NVME 磁碟建立儲存池和磁碟區."
}
},
"powersched": {
"system": false,
"description": {
"en_US": "A program to configure the RTC according to the DSM power plan, so that the RTC (scheduled power on/off) can work properly.",
"ar_SA": "برنامج لتكوين RTC وفقًا لخطة الطاقة DSM، بحيث يمكن لـ RTC (تشغيل/إيقاف الطاقة المجدول) العمل بشكل صحيح.",
"de_DE": "Ein Programm zum Konfigurieren des RTC gemäß dem DSM-Energieplan, damit der RTC (geplantes Ein-/Ausschalten) ordnungsgemäß funktionieren kann.",
"es_ES": "Un programa para configurar el RTC de acuerdo con el plan de energía de DSM, de modo que el RTC (programado encendido/apagado) pueda funcionar correctamente.",
"fr_FR": "Un programme pour configurer le RTC selon le plan d'alimentation DSM, de sorte que le RTC (mise sous tension/arrêt programmée) puisse fonctionner correctement.",
"ja_JP": "DSM 電源計画に従って RTC を構成するプログラムです. これにより RTC (予約電源オン/オフ) が正常に動作します.",
"ko_KR": "DSM 전원 계획에 따라 RTC를 구성하여 RTC(예약 전원/전원 끄기)이 정상적으로 작동하도록합니다.",
"ru_RU": "Программа для настройки RTC в соответствии с планом питания DSM, чтобы RTC (запланированное включение/выключение) могло работать правильно.",
"th_TH": "โปรแกรมสำหรับกำหนดค่า RTC ตามแผนไฟ DSM โดย RTC (เปิด/ปิดไฟตามกำหนดเวลา) สามารถทำงานได้อย่างถูกต้อง",
"tr_TR": "DSM güç planına göre RTC'yi yapılandırmak için bir program, böylece RTC (zamanlanmış güç açma/kapama) düzgün çalışabilir.",
"uk_UA": "Програма для налаштування RTC відповідно до плану живлення DSM, щоб RTC (заплановане ввімкнення/вимкнення) працювало належним чином.",
"vi_VN": "Chương trình để cấu hình RTC theo kế hoạch nguồn DSM, để RTC (bật/tắt theo lịch trình) có thể hoạt động đúng cách.",
"zh_CN": "根据 DSM 电源计划配置 RTC 的程序, 使 RTC(定时开关机) 可以正常工作.",
"zh_HK": "根據 DSM 電源計劃配置 RTC 的程式, 使 RTC(定時開關機) 可以正常工作.",
"zh_TW": "根據 DSM 電源計劃配置 RTC 的程式, 使 RTC(定時開關機) 可以正常工作."
}
},
"reboottoloader": {
"system": false,
"description": {
"en_US": "Add a script to restart to RR in the DSM scheduled task, making it easy to access RR with not have a screen and keyboard.",
"ar_SA": "أضف سكريبت لإعادة التشغيل إلى RR في المهمة المجدولة DSM، مما يجعل من السهل الوصول إلى RR بدون وجود شاشة ولوحة مفاتيح.",
"de_DE": "Fügt einen Skript zum Neustart zu RR in der DSM geplanten Aufgabe, so dass es einfach, RR mit nicht haben einen Bildschirm und Tastatur zugreifen.",
"es_ES": "Agregue un script para reiniciar a RR en la tarea programada de DSM, lo que facilita el acceso a RR sin tener una pantalla y un teclado.",
"fr_FR": "Ajoutez un script pour redémarrer à RR dans la tâche planifiée DSM, ce qui rend facile d'accéder à RR avec ne pas avoir un écran et un clavier.",
"ja_JP": "DSM のスケジュールされたタスクで RR に再起動するスクリプトを追加し、画面とキーボードがない RR に簡単にアクセスできるようにします.",
"ko_KR": "DSM 예약 된 작업에서 RR로 재시작하는 스크립트를 추가하여 화면과 키보드가없는 RR에 쉽게 액세스 할 수 있습니다.",
"ru_RU": "Добавьте сценарий для перезапуска в RR в запланированной задаче DSM, что облегчает доступ к RR без наличия экрана и клавиатуры.",
"th_TH": "เพิ่มสคริปต์เพื่อรีสตาร์ทไปยัง RR ในงานที่ตั้งเวลา DSM ทำให้สามารถเข้าถึง RR ได้อย่างง่ายโดยไม่มีหน้าจอและคีย์บอร์ด",
"tr_TR": "DSM planlanmış görevinde RR'ye yeniden başlatmak için bir betik ekleyerek, ekrana ve klavyeye sahip olmadan RR'ye erişmeyi kolaylaştırır.",
"uk_UA": "Додайте сценарій для перезапуску в RR в запланованому завданні DSM, що полегшує доступ до RR без наявності екрана та клавіатури.",
"vi_VN": "Thêm một tập lệnh để khởi động lại RR trong nhiệm vụ được lên lịch DSM, làm cho nó dễ dàng truy cập RR với không có màn hình và bàn phím.",
"zh_CN": "在 DSM 计划任务中添加一个脚本以重新启动到 RR, 这使得很容易访问 RR 而不需要屏幕和键盘.",
"zh_HK": "在 DSM 計劃任務中添加一個腳本以重新啟動到 RR, 這使得很容易訪問 RR 而不需要屏幕和鍵盤.",
"zh_TW": "在 DSM 計劃任務中添加一個腳本以重新啟動到 RR, 這使得很容易訪問 RR 而不需要屏幕和鍵盤."
}
},
"redpill": {
"system": true,
"description": {
"en_US": "Delay redpill.",
"ar_SA": "تأخير redpill.",
"de_DE": "Verzögere redpill.",
"es_ES": "Retrasar redpill.",
"fr_FR": "Retarder redpill.",
"ja_JP": "ディレイredpill.",
"ko_KR": "지연 redpill.",
"ru_RU": "Задержка redpill.",
"th_TH": "เลื่อน redpill.",
"tr_TR": "Redpill'i geciktir.",
"uk_UA": "Затримка redpill.",
"vi_VN": "Trì hoãn redpill.",
"zh_CN": "延迟 redpill.",
"zh_HK": "延遲 redpill.",
"zh_TW": "延遲 redpill."
}
},
"remotefs": {
"system": false,
"description": {
"en_US": "Author: jinlife. This patch will allow remote NFS/CIFS shared folder be used in VideoStation, AudioStation and Photos etc.",
"ar_SA": "المؤلف: jinlife. سيسمح هذا التصحيح باستخدام مجلد مشترك بروتوكول NFS/CIFS عن بُعد في VideoStation و AudioStation و Photos وما إلى ذلك.",
"de_DE": "Autor: jinlife. Dieser Patch ermöglicht es, dass ein entfernter NFS/CIFS-Freigabeordner in VideoStation, AudioStation und Photos usw. verwendet wird.",
"es_ES": "Autor: jinlife. Este parche permitirá que la carpeta compartida remota NFS/CIFS se utilice en VideoStation, AudioStation y Photos, etc.",
"fr_FR": "Auteur: jinlife. Ce correctif permettra à un dossier partagé NFS/CIFS distant d'être utilisé dans VideoStation, AudioStation et Photos, etc.",
"ja_JP": "作者: jinlife. このパッチにより、リモート NFS/CIFS 共有フォルダを VideoStation、AudioStation、Photos などで使用できます.",
"ko_KR": "작성자: jinlife. 이 패치를 사용하면 VideoStation, AudioStation 및 사진 등에서 원격 NFS/CIFS 공유 폴더를 사용할 수 있습니다.",
"ru_RU": "Автор: jinlife. Этот патч позволит использовать удаленную общую папку NFS/CIFS в VideoStation, AudioStation и Photos и т. д.",
"th_TH": "ผู้เขียน: jinlife. แพตช์นี้จะทำให้โฟลเดอร์ที่แชร์ระยะไกลแบบ NFS/CIFS ใช้ได้ใน VideoStation, AudioStation และ Photos เป็นต้น",
"tr_TR": "Yazar: jinlife. Bu yama, VideoStation, AudioStation ve Fotoğraflar vb. gibi yerlerde uzak NFS/CIFS paylaşılan klasörün kullanılmasına izin verecektir.",
"uk_UA": "Автор: jinlife. Цей патч дозволить використовувати віддалену спільну папку NFS/CIFS в VideoStation, AudioStation та Photos тощо.",
"vi_VN": "Tác giả: jinlife. Bản vá này sẽ cho phép thư mục chia sẻ NFS/CIFS từ xa được sử dụng trong VideoStation, AudioStation và Photos v.v..",
"zh_CN": "作者: jinlife. 此补丁将允许在 VideoStation、AudioStation 和 Photos 等应用中使用远程 NFS/CIFS 共享文件夹.",
"zh_HK": "作者: jinlife. 此補丁將允許在 VideoStation、AudioStation 和 Photos 等應用中使用遠程 NFS/CIFS 共享文件夾.",
"zh_TW": "作者: jinlife. 此補丁將允許在 VideoStation、AudioStation 和 Photos 等應用中使用遠程 NFS/CIFS 共享文件夾."
}
},
"revert": {
"system": true,
"description": {
"en_US": "Revert addons modifications.",
"ar_SA": "تراجع عن تعديلات الإضافات.",
"de_DE": "Addons-Modifikationen rückgängig machen.",
"es_ES": "Deshacer las modificaciones de los addons.",
"fr_FR": "Annuler les modifications des addons.",
"ja_JP": "アドオンの変更を元に戻します.",
"ko_KR": "애드온 수정 사항을 되돌립니다.",
"ru_RU": "Отменить изменения аддонов.",
"th_TH": "ย้อนกลับการปรับแต่งของส่วนเสริม",
"tr_TR": "Eklentilerin değişikliklerini geri alın.",
"uk_UA": "Скасувати зміни додатків.",
"vi_VN": "Hoàn tác các thay đổi của các tiện ích.",
"zh_CN": "撤销插件修改.",
"zh_HK": "還原插件修改.",
"zh_TW": "還原插件修改."
}
},
"sensors": {
"system": false,
"description": {
"en_US": "This script installs the sensors and fancontrol tools for CPU monitoring and fan control, which can be adjusted through the Fancontrol in the scheduled task.",
"ar_SA": "هذا البرنامج النصي يقوم بتثبيت أدوات sensors و fancontrol لمراقبة وحدة المعالجة المركزية والتحكم في المروحة، والتي يمكن ضبطها من خلال Fancontrol في المهمة المجدولة.",
"de_DE": "Dieses Skript installiert die Werkzeuge sensors und fancontrol zur CPU-Überwachung und Lüftersteuerung, die über Fancontrol in der geplanten Aufgabe angepasst werden können.",
"es_ES": "Este script instala las herramientas sensors y fancontrol para la monitorización de la CPU y el control del ventilador, que se pueden ajustar mediante Fancontrol en la tarea programada.",
"fr_FR": "Ce script installe les outils sensors et fancontrol pour la surveillance du processeur et le contrôle du ventilateur, qui peuvent être ajustés via Fancontrol dans la tâche planifiée.",
"ja_JP": "このスクリプトは、CPU監視とファン制御のためのsensorsおよびfancontrolツールをインストールします。これは、スケジュールされたタスクのFancontrolを介して調整できます。",
"ko_KR": "이 스크립트는 CPU 모니터링 및 팬 제어를 위한 sensors 및 fancontrol 도구를 설치합니다. 이는 예약된 작업의 Fancontrol을 통해 조정할 수 있습니다.",
"ru_RU": "Этот скрипт устанавливает инструменты sensors и fancontrol для мониторинга ЦП и управления вентилятором, которые можно настроить через Fancontrol в запланированной задаче.",
"th_TH": "สคริปต์นี้ติดตั้งเครื่องมือ sensors และ fancontrol สำหรับการตรวจสอบ CPU และการควบคุมพัดลมซึ่งสามารถปรับได้ผ่าน Fancontrol ในงานที่กำหนดเวลา",
"tr_TR": "Bu betik, CPU izleme ve fan kontrolü için sensors ve fancontrol araçlarını yük합니다. Bu, planlı görevdeki Fancontrol을 통해 조정할 수 있습니다.",
"uk_UA": "Цей скрипт встановлює інструменти sensors і fancontrol для моніторингу ЦП і керування вентилятором, які можна налаштувати через Fancontrol у запланованій задачі.",
"vi_VN": "Đoạn mã này cài đặt các công cụ sensors và fancontrol để giám sát CPU và điều khiển quạt, có thể điều chỉnh thông qua Fancontrol trong tác vụ đã lên lịch.",
"zh_CN": "此脚本安装 sensors 和 fancontrol 工具, 用于监视 CPU 和风扇控制, 可通过计划任务中 Fancontrol 调整风扇具体参数.",
"zh_HK": "此腳本安裝 sensors 和 fancontrol 套件, 用於監視 CPU 和风扇控制, 可通過計劃任務中 Fancontrol 調整風扇具體參數.",
"zh_TW": "此腳本安裝 sensors 和 fancontrol 套件, 用於監視 CPU 和风扇控制, 可通過計劃任務中 Fancontrol 調整風扇具體參數."
}
},
"setrootpw": {
"system": false,
"description": {
"en_US": "Set root password and enable ssh/sftp. Please modify PW='' to the desired password in DSM Task Scheduler and run the task.",
"ar_SA": "قم بتعيين كلمة مرور root وتمكين ssh/sftp. يرجى تعديل PW='' إلى كلمة المرور المطلوبة في جدول المهام DSM وتشغيل المهمة.",
"de_DE": "Legen Sie das Root-Passwort fest und aktivieren Sie ssh/sftp. Bitte ändern Sie PW='' in der DSM-Aufgabenplanung in das gewünschte Passwort und führen Sie die Aufgabe aus.",
"es_ES": "Establece la contraseña de root y habilita ssh/sftp. Por favor, modifique PW='' a la contraseña deseada en el Programador de Tareas de DSM y ejecute la tarea.",
"fr_FR": "Définissez le mot de passe root et activez ssh/sftp. Veuillez modifier PW='' en le mot de passe souhaité dans le planificateur de tâches DSM et exécutez la tâche.",
"ja_JP": "ルートパスワードを設定し、ssh/sftpを有効にします. DSM タスクスケジューラで PW='' を希望のパスワードに変更してタスクを実行してください.",
"ko_KR": "루트 암호를 설정하고 ssh/sftp를 활성화합니다. DSM 작업 스케줄러에서 PW=''를 원하는 암호로 수정하고 작업을 실행하십시오.",
"ru_RU": "Установите пароль root и включите ssh/sftp. Пожалуйста, измените PW='' на желаемый пароль в планировщике задач DSM и запустите задачу.",
"th_TH": "ตั้งรหัสผ่าน root และเปิดใช้งาน ssh/sftp โปรดแก้ไข PW='' เป็นรหัสผ่านที่ต้องการในตัวจัดการงาน DSM และเริ่มการทำงาน",
"tr_TR": "Kök parolasını ayarlayın ve ssh/sftp'yi etkinleştirin. Lütfen DSM Görev Zamanlayıcısında PW='''yi istenen parola olarak değiştirin ve görevi çalıştırın.",
"uk_UA": "Встановіть пароль root та увімкніть ssh/sftp. Будь ласка, змініть PW='' на бажаний пароль в планувальнику завдань DSM та запустіть завдання.",
"vi_VN": "Đặt mật khẩu root và kích hoạt ssh/sftp. Vui lòng sửa đổi PW='' thành mật khẩu mong muốn trong Lịch trình nhiệm vụ DSM và chạy nhiệm vụ.",
"zh_CN": "设置 root 密码并启用 ssh/sftp. 请在 DSM 计划任务中将 PW='' 修改为所需的密码并运行该任务.",
"zh_HK": "設置 root 密碼並啟用 ssh/sftp. 請在 DSM 計劃任務中將 PW='' 修改為所需的密碼並運行該任務.",
"zh_TW": "設置 root 密碼並啟用 ssh/sftp. 請在 DSM 計劃任務中將 PW='' 修改為所需的密碼並執行該任務."
}
},
"smartctl": {
"system": false,
"description": {
"en_US": "Author: Phachd. Fix SMART information on disks on HBA devices.",
"ar_SA": "المؤلف: Phachd. إصلاح معلومات SMART على الأقراص على أجهزة HBA.",
"de_DE": "Autor: Phachd. Beheben Sie SMART-Informationen auf Festplatten auf HBA-Geräten.",
"es_ES": "Autor: Phachd. Corregir la información SMART en discos en dispositivos HBA.",
"fr_FR": "Auteur: Phachd. Corriger les informations SMART sur les disques sur les périphériques HBA.",
"ja_JP": "作者: Phachd. HBA デバイス上のディスクの SMART 情報を修正します.",
"ko_KR": "저자: Phachd. HBA 장치의 디스크에서 SMART 정보를 수정합니다.",
"ru_RU": "Автор: Phachd. Исправление информации SMART на дисках на устройствах HBA.",
"th_TH": "ผู้เขียน: Phachd. แก้ไขข้อมูล SMART บนดิสก์บนอุปกรณ์ HBA เท่านั้น",
"tr_TR": "Yazar: Phachd. HBA cihazlarındaki disklerde SMART bilgilerini düzeltin.",
"uk_UA": "Автор: Phachd. Виправлення інформації SMART на дисках на пристроях HBA.",
"vi_VN": "Tác giả: Phachd. Sửa thông tin SMART trên ổ đĩa trên các thiết bị HBA.",
"zh_CN": "作者: Phachd. 修复 HBA 设备上磁盘的 SMART 信息.",
"zh_HK": "作者: Phachd. 修复 HBA 设备上磁盘的 SMART 信息.",
"zh_TW": "作者: Phachd. 修复 HBA 设备上磁盘的 SMART 信息."
}
},
"sortnetif": {
"system": false,
"description": {
"en_US": "Sort network interface name.(parameters: empty: sorted by busid; mac1,mac2,...: sorted by macs sequence).",
"ar_SA": "فرز اسم واجهة الشبكة.(المعلمات: فارغ: مرتبة حسب busid؛ mac1،mac2،...: مرتبة حسب تسلسل macs).",
"de_DE": "Sortiere Netzwerk-Schnittstellen-Namen.(Parameter: leer: sortiert nach Bus-ID; mac1,mac2,...: sortiert nach MACs-Sequenz).",
"es_ES": "Ordenar nombre de interfaz de red.(parámetros: vacío: ordenado por busid; mac1,mac2,...: ordenado por secuencia de macs).",
"fr_FR": "Trier le nom de l'interface réseau.(paramètres: vide: trié par busid; mac1,mac2,...: trié par séquence de macs).",
"ja_JP": "ネットワークインターフェイス名をソートします. (パラメータ: 空: busid でソート; mac1,mac2,...: macs シーケンスでソート).",
"ko_KR": "네트워크 인터페이스 이름을 정렬합니다.(매개 변수: 비어 있음: 버스 ID로 정렬; mac1,mac2,...: macs 시퀀스로 정렬).",
"ru_RU": "Сортировать имя сетевого интерфейса.(параметры: пусто: сортировка по busid; mac1,mac2,...: сортировка по последовательности macs).",
"th_TH": "เรียงลำดับชื่ออินเตอร์เฟซเครือข่าย.(พารามิเตอร์: ว่าง: เรียงลำดับตาม busid; mac1,mac2,...: เรียงลำดับตามลำดับ macs).",
"tr_TR": "Ağ arayüz adını sırala.(parametreler: boş: busid'ye göre sıralanmış; mac1,mac2,...: macs sırasına göre sıralanmış).",
"uk_UA": "Сортувати ім'я мережевого інтерфейсу.(параметри: порожній: впорядковано за busid; mac1,mac2,...: впорядковано за послідовністю macs).",
"vi_VN": "Sắp xếp tên giao diện mạng.(tham số: trống: sắp xếp theo busid; mac1,mac2,...: sắp xếp theo chuỗi macs).",
"zh_CN": "对网络接口名称进行排序. (参数: 空: 按 busid 排序; mac1,mac2,...: 按 macs 序列排序).",
"zh_HK": "對網絡接口名稱進行排序. (參數: 空: 按 busid 排序; mac1,mac2,...: 按 macs 序列排序).",
"zh_TW": "對網路介面名稱進行排序. (參數: 空: 按 busid 排序; mac1,mac2,...: 按 macs 序列排序)."
}
},
"storagepanel": {
"system": false,
"description": {
"en_US": "Change the storage panel disk display (The default is automatic, please see the documentation or '/usr/bin/storagepanel.sh -h' for parameters).",
"ar_SA": "تغيير عرض القرص للوحة التخزين (الافتراضي هو التلقائي، يرجى الرجوع إلى الوثائق أو '/usr/bin/storagepanel.sh -h' للحصول على المعلمات).",
"de_DE": "Ändern Sie die Speicherplattenanzeige (Standardmäßig ist dies automatisch, bitte lesen Sie die Dokumentation oder '/usr/bin/storagepanel.sh -h' für Parameter).",
"es_ES": "Cambie la visualización del disco del panel de almacenamiento (El valor predeterminado es automático, consulte la documentación o '/usr/bin/storagepanel.sh -h' para ver los parámetros).",
"fr_FR": "Modifiez l'affichage du disque du panneau de stockage (La valeur par défaut est automatique, veuillez consulter la documentation ou '/usr/bin/storagepanel.sh -h' pour les paramètres).",
"ja_JP": "ストレージパネルのディスク表示を変更します (デフォルトは自動です. パラメータについては、ドキュメントまたは '/usr/bin/storagepanel.sh -h' を参照してください).",
"ko_KR": "스토리지 패널 디스크 표시를 변경합니다 (기본값은 자동입니다. 매개 변수에 대해서는 문서 또는 '/usr/bin/storagepanel.sh -h'를 참조하십시오).",
"ru_RU": "Измените отображение диска панели хранения (По умолчанию это автоматический режим, пожалуйста, ознакомьтесь с документацией или '/usr/bin/storagepanel.sh -h' для параметров).",
"th_TH": "เปลี่ยนการแสดงผลของดิสก์ในแผงจัดเก็บ (ค่าเริ่มต้นคืออัตโนมัติ โปรดดูเอกสารหรือ '/usr/bin/storagepanel.sh -h' เพื่อดูพารามิเตอร์)",
"tr_TR": "Depolama paneli diski görüntüsünü değiştirin (Varsayılan olarak otomatik, lütfen parametreler için belgeleri veya '/usr/bin/storagepanel.sh -h' bakın).",
"uk_UA": "Змініть відображення диска панелі зберігання (За замовчуванням це автоматичний режим, будь ласка, ознайомтеся з документацією або '/usr/bin/storagepanel.sh -h' для параметрів).",
"vi_VN": "Thay đổi hiển thị ổ đĩa của bảng lưu trữ (Mặc định là tự động, vui lòng xem tài liệu hoặc '/usr/bin/storagepanel.sh -h' để biết thông số).",
"zh_CN": "更改存储面板磁盘显示 (默认为自动, 请参阅文档或 '/usr/bin/storagepanel.sh -h' 了解参数).",
"zh_HK": "更改存儲面板磁盤顯示 (默認為自動, 請參閱文檔或 '/usr/bin/storagepanel.sh -h' 了解參數).",
"zh_TW": "更改存儲面板磁盤顯示 (默認為自動, 請參閱文檔或 '/usr/bin/storagepanel.sh -h' 了解參數)."
}
},
"synoconfbkp": {
"system": false,
"description": {
"en_US": "Automatically backup system config settings to the bootloader disk(<loader disk>/p1/scbk/) at bootup and shutdown. Parameters: $1 - number of saves, default 7; $2 - file name prefix, default 'bkp'.",
"ar_SA": "قم بنسخ احتياطي تلقائيًا لإعدادات تكوين النظام إلى قرص البدء (<قرص البدء>/p1/scbk/) عند التشغيل والإيقاف. المعلمات: $1 - عدد الحفظ، الافتراضي 7؛ $2 - بادئة اسم الملف، الافتراضي 'bkp'.",
"de_DE": "Sichert automatisch die Systemkonfigurationseinstellungen auf der Bootloader-Festplatte (<Bootloader-Festplatte>/p1/scbk/) beim Booten und Herunterfahren. Parameter: $1 - Anzahl der Sicherungen, Standard 7; $2 - Dateiname-Präfix, Standard 'bkp'.",
"es_ES": "Realiza automáticamente una copia de seguridad de la configuración del sistema en el disco de arranque (<disco de arranque>/p1/scbk/) al arrancar y apagar. Parámetros: $1 - número de copias, por defecto 7; $2 - prefijo del nombre del archivo, por defecto 'bkp'.",
"fr_FR": "Sauvegarde automatiquement les paramètres de configuration du système sur le disque de démarrage (<disque de démarrage>/p1/scbk/) au démarrage et à l'arrêt. Paramètres : $1 - nombre de sauvegardes, par défaut 7 ; $2 - préfixe du nom de fichier, par défaut 'bkp'.",
"ja_JP": "システム構成設定をブートローダーディスク (<ブートローダーディスク>/p1/scbk/) に自動的にバックアップします. 起動時とシャットダウン時に実行されます. パラメータ: $1 - 保存回数、デフォルト 7; $2 - ファイル名のプレフィックス、デフォルト 'bkp'.",
"ko_KR": "시스템 구성 설정을 부트로더 디스크(<부트로더 디스크>/p1/scbk/)에 부팅 및 종료시 자동으로 백업합니다. 매개변수: $1 - 저장 횟수, 기본값 7; $2 - 파일 이름 접두사, 기본값 'bkp'.",
"ru_RU": "Автоматическое резервное копирование настроек конфигурации системы на диске загрузчика (<диск загрузчика>/p1/scbk/) при загрузке и выключении. Параметры: $1 - количество сохранений, по умолчанию 7; $2 - префикс имени файла, по умолчанию 'bkp'.",
"th_TH": "สำรองข้อมูลการตั้งค่าระบบโดยอัตโนมัติไปยังดิสก์โหลด (<ดิสก์โหลด>/p1/scbk/) ขณะเปิดเครื่องและปิดเครื่อง พารามิเตอร์: $1 - จำนวนการบันทึก, ค่าเริ่มต้น 7; $2 - คำนำหน้าชื่อไฟล์, ค่าเริ่มต้น 'bkp'.",
"tr_TR": "Sistem yapılandırma ayarlarını başlatma ve kapatma sırasında önyükleme diski (<önyükleme diski>/p1/scbk/) üzerine otomatik olarak yedekleyin. Parametreler: $1 - kayıt sayısı, varsayılan 7; $2 - dosya adı öneki, varsayılan 'bkp'.",
"uk_UA": "Автоматичне резервне копіювання налаштувань конфігурації системи на диску завантажувача (<диск завантажувача>/p1/scbk/) під час завантаження та вимкнення. Параметри: $1 - кількість збережень, за замовчуванням 7; $2 - префікс імені файлу, за замовчуванням 'bkp'.",
"vi_VN": "Sao lưu tự động cài đặt cấu hình hệ thống vào ổ đĩa bootloader (<ổ đĩa bootloader>/p1/scbk/) khi khởi động và tắt máy. Tham số: $1 - số lần lưu, mặc định 7; $2 - tiền tố tên tệp, mặc định 'bkp'.",
"zh_CN": "在启动和关机时自动备份系统配置设置到引导加载器磁盘 (<引导加载器磁盘>/p1/scbk/). 参数: $1 - 保存次数, 默认 7; $2 - 文件名前缀, 默认 'bkp'.",
"zh_HK": "在啟動和關機時自動備份系統設定到引導載入器磁碟 (<引導載入器磁碟>/p1/scbk/). 參數: $1 - 保存次數, 預設 7; $2 - 檔案名稱前綴, 預設 'bkp'.",
"zh_TW": "在開機和關機時自動備份系統設定到引導載入器磁碟 (<引導載入器磁碟>/p1/scbk/). 參數: $1 - 保存次數, 預設 7; $2 - 檔案名稱前綴, 預設 'bkp'."
}
},
"tad6s4n10g": {
"system": false,
"description": {
"en_US": "Control TANK TAD6S4N10G machine DTS generation and button events, please modify the content of the Net-Button-3s Net-Button-9s Copy-Button-3s Copy-Button-9s tasks in the scheduled tasks.",
"ar_SA": "التحكم في توليد DTS لجهاز TANK TAD6S4N10G وأحداث الأزرار، يرجى تعديل محتوى المهام المجدولة Net-Button-3s Net-Button-9s Copy-Button-3s Copy-Button-9s.",
"de_DE": "Steuerung der DTS-Generierung und der Tastenereignisse der TANK TAD6S4N10G-Maschine. Bitte ändern Sie den Inhalt der Aufgaben Net-Button-3s, Net-Button-9s, Copy-Button-3s und Copy-Button-9s im Zeitplan.",
"es_ES": "Control de la generación de DTS de la máquina TANK TAD6S4N10G y eventos de botones, por favor modifique el contenido de las tareas programadas Net-Button-3s, Net-Button-9s, Copy-Button-3s y Copy-Button-9s.",
"fr_FR": "Contrôle de la génération DTS de la machine TANK TAD6S4N10G et des événements de boutons, veuillez modifier le contenu des tâches planifiées Net-Button-3s, Net-Button-9s, Copy-Button-3s et Copy-Button-9s.",
"ja_JP": "Tank TAD6S4N10G マシンの DTS 生成とボタン イベントを制御します。スケジュールされたタスクの Net-Button-3s、Net-Button-9s、Copy-Button-3s、および Copy-Button-9s の内容を変更してください。",
"ko_KR": "TANK TAD6S4N10G 기계의 DTS 생성 및 버튼 이벤트를 제어합니다. 예약된 작업의 Net-Button-3s, Net-Button-9s, Copy-Button-3s 및 Copy-Button-9s의 내용을 수정하십시오.",
"ru_RU": "Управление генерацией DTS и событиями кнопок машины TANK TAD6S4N10G, пожалуйста, измените содержимое задач Net-Button-3s, Net-Button-9s, Copy-Button-3s и Copy-Button-9s в планировщике.",
"th_TH": "ควบคุมการสร้าง DTS ของเครื่อง TANK TAD6S4N10G และเหตุการณ์ปุ่มโปรดแก้ไขเนื้อหาของงานที่กำหนดเวลา Net-Button-3s, Net-Button-9s, Copy-Button-3s และ Copy-Button-9s",
"tr_TR": "TANK TAD6S4N10G makinesinin DTS üretimini ve düğme olaylarını kontrol edin, lütfen planlı görevlerdeki Net-Button-3s, Net-Button-9s, Copy-Button-3s ve Copy-Button-9s görevlerinin içeriğini değiştirin.",
"uk_UA": "Контроль генерації DTS машини TANK TAD6S4N10G та подій кнопок, будь ласка, змініть вміст запланованих завдань Net-Button-3s, Net-Button-9s, Copy-Button-3s та Copy-Button-9s.",
"vi_VN": "Điều khiển việc tạo DTS của máy TANK TAD6S4N10G và sự kiện nút, vui lòng sửa đổi nội dung của các tác vụ đã lên lịch Net-Button-3s, Net-Button-9s, Copy-Button-3s và Copy-Button-9s.",
"zh_CN": "用于控制TANK TAD6S4N10G 机器的 DTS 生成 和 按钮事件, 事件内容请自行修改 计划任务中 Net-Button-3s Net-Button-9s Copy-Button-3s Copy-Button-9s 几个任务的内容.",
"zh_HK": "用於控制TANK TAD6S4N10G 機器的 DTS 生成 和 按鈕事件, 事件內容請自行修改 計劃任務中 Net-Button-3s Net-Button-9s Copy-Button-3s Copy-Button-9s 幾個任務的內容.",
"zh_TW": "用於控制TANK TAD6S4N10G 機器的 DTS 生成 和 按鈕事件, 事件內容請自行修改 計劃任務中 Net-Button-3s Net-Button-9s Copy-Button-3s Copy-Button-9s 幾個任務的內容."
}
},
"trivial": {
"system": false,
"description": {
"en_US": "Miscellaneous functions. (A collection of some unnecessary modifications.)",
"ar_SA": "وظائف متنوعة. (مجموعة من بعض التعديلات غير الضرورية.)",
"de_DE": "Verschiedene Funktionen. (Eine Sammlung einiger unbedeutender Änderungen.)",
"es_ES": "Funciones variadas. (Una colección de algunas modificaciones innecesarias.)",
"fr_FR": "Fonctions diverses. (Une collection de certaines modifications inutiles.)",
"ja_JP": "その他の機能. (いくつかの不要な変更の集まり.)",
"ko_KR": "기타 기능. (일부 불필요한 수정의 집합.)",
"ru_RU": "Различные функции. (Набор некоторых ненужных изменений.)",
"th_TH": "ฟังก์ชันเบ็ดเสรจ. (ชุดของการปรับเปลี่ยนบางอย่างที่ไม่จำเป็น.)",
"tr_TR": "Çeşitli iş levler. (Birkaç gereksiz değişiklik.)",
"uk_UA": "Різноманітні функції. (Колекція деяких невимажних модифікацій.)",
"vi_VN": "Các chức năng khác nhau. (Một bộ sửa đổi không cần thiết.)",
"zh_CN": "杂项功能. (一些不太必要的修改的集合.)",
"zh_HK": "雜項功能. (一些不太必要的修改的集合.)",
"zh_TW": "雜項功能. (一些不太必要的修改的集合.)"
}
},
"updatenotify": {
"system": false,
"description": {
"en_US": "RR update notification.",
"ar_SA": "إشعار تحديث RR.",
"de_DE": "RR-Update-Benachrichtigung.",
"es_ES": "Notificación de actualización de RR.",
"fr_FR": "Notification de mise à jour de RR.",
"ja_JP": "RR アップデート通知.",
"ko_KR": "RR 업데이트 알림.",
"ru_RU": "Уведомление об обновлении RR.",
"th_TH": "การแจ้งเตือนการอัปเดต RR",
"tr_TR": "RR güncelleme bildirimi.",
"uk_UA": "Сповіщення про оновлення RR.",
"vi_VN": "Thông báo cập nhật RR.",
"zh_CN": "RR 更新通知.",
"zh_HK": "RR 更新通知.",
"zh_TW": "RR 更新通知."
}
},
"ups": {
"system": false,
"description": {
"en_US": "Author: GXNAS. Force the standby mode to shutdown when UPS power supply. Parameters: -f - Trigger shutdown task before shutdown; -e - Trigger shutdown task before standby mode (not change to shutdown).",
"ar_SA": "لمؤلف: GXNAS. فرض إيقاف تشغيل وضع الاستعداد عند انقطاع مصدر طاقة UPS. المعلمات: -f - تشغيل مهمة إيقاف التشغيل قبل إيقاف التشغيل؛ -e - تشغيل مهمة إيقاف التشغيل قبل وضع-e - تشغيل مهمة إيقاف التشغيل قبل وضع الاستعداد (لا يتم التغيير إلى إيقاف التشغيل).",
"de_DE": "Autor: GXNAS. Erzwingt das Herunterfahren in den Standby-Modus, wenn die USV-Stromversorgung eingeschaltet ist. Parameter: -f Herunterfahraufgabe vor dem Herunterfahren auslösen; -e Herunterfahraufgabe vor dem Standby-Modus auslösen (nicht zum Herunterfahren wechseln).",
"es_ES": "Autor: GXNAS. Fuerza el modo de espera para apagar cuando la fuente de alimentación de la UPS. Parámetros: -f - Activar tarea de apagado antes de apagar; -e - Activar tarea de apagado antes del modo de espera (no cambiar a apagado).",
"fr_FR": "Auteur: GXNAS. Force le mode veille à s'éteindre lorsque l'alimentation de secours UPS. Paramètres : -f - Déclencher la tâche d'arrêt avant l'arrêt ; -e - Déclencher la tâche d'arrêt avant le mode veille (ne pas passer en mode arrêt).",
"ja_JP": "作者: GXNAS. UPS 電源供給時にスタンバイモードをシャットダウンするように強制します. パラメータ: -f - シャットダウン前にシャットダウンタスクをトリガーする; -e - スタンバイモード前にシャットダウンタスクをトリガーする (シャットダウンに変更しない).",
"ko_KR": "작성자: GXNAS. UPS 전원 공급 시 대기 모드를 종료하도록 강제합니다. 매개 변수: -f - 종료 전 종료 작업 트리거; -e - 대기 모드 전 종료 작업 트리거 (종료로 변경하지 않음).",
"ru_RU": "Автор: GXNAS. Принудительно измените режим ожидания на выключение при включении ИБП. Параметры: -f — запускать задачу завершения работы перед выключением; -e — запускать задачу завершения работы перед переходом в режим ожидания (не изменено на завершение работы).",
"th_TH": "ผู้เขียน: GXNAS บังคับให้โหมดสแตนดบายปิดเมื่อมีการจ่ายไฟจาก UPS พารามิเตอร์: -f - เรียกใช้งานงานปิดก่อนปิด; -e - เรียกใช้งานงานปิดก่อนโหมดสแตนดบาย (ไม่เปลี่ยนเป็นปิด)",
"tr_TR": "Yazar: GXNAS. UPS'e güç verildiğinde bekleme modunu zorla kapanmaya değiştirin. Parametreler: -f - Kapatmadan önce kapatma görevini tetikle; -e - Bekleme modundan önce kapatma görevini tetikle (kapatma olarak değiştirilmemiştir).",
"uk_UA": "Автор: GXNAS. Примусово змінити режим очікування на вимкнення, коли ДБЖ подається живлення. Параметри: -f - запускати завдання завершення роботи перед завершенням роботи;",
"vi_VN": "Tác giả: GXNAS. Buộc chế độ chờ tắt khi cấp nguồn UPS. Tham số: -f - Kích hoạt tác vụ tắt máy trước khi tắt máy; -e - Kích hoạt tác vụ tắt máy trước khi chế độ chờ (không chuyển sang tắt máy).",
"zh_CN": "作者: GXNAS. 强制将 UPS 供电时的待机模式修改为关机. 參數: -f - 关机前触发关机任务; -e - 待机模式前发关机任务(不修改为关机).",
"zh_HK": "作者: GXNAS. 強制將 UPS 供電時的待機模式修改為關機. 參數: -f - 關機前觸發關機任務; -e - 待機模式前發關機任務(不修改為關機).",
"zh_TW": "作者: GXNAS. 強制將 UPS 供電時的待機模式修改為關機. 參數: -f - 關機前觸發關機任務; -e - 待機模式前發關機任務(不修改為關機)."
}
},
"virtiofs": {
"system": false,
"description": {
"en_US": "Auto mount virtio9p and virtiofs file systems (effective after rebooting the system after creating the storage space for the first time since it is mounted to the first storage space by default).",
"ar_SA": "تلقائيا تركيب أنظمة ملفات virtio9p و virtiofs (تدخل حيز التنفيذ بعد إعادة تشغيل النظام بعد إنشاء مساحة التخزين لأول مرة حيث يتم تركيبها في مساحة التخزين الأولى بشكل افتراضي).",
"de_DE": "Installiert virtio9p und virtiofs automatisch (da sie standardmäßig im ersten Speicherplatz gemountet werden, werden sie wirksam, nachdem das System zum ersten Mal installiert und der Speicherplatz erstellt und neu gestartet wurde).",
"es_ES": "Installs virtio9p and virtiofs automatically (effective after rebooting the system after creating the storage space for the first time since it is mounted to the first storage space by default).",
"fr_FR": "Monte automatiquement les systèmes de fichiers virtio9p et virtiofs (efficace après le redémarrage du système après la création de l'espace de stockage pour la première fois car il est monté sur le premier espace de stockage par défaut).",
"ja_JP": "virtio9pおよびvirtiofsファイルシステムを自動的にマウントしますデフォルトで最初のストレージスペースにマウントされるため、システムを再起動して最初にストレージスペースを作成した後に有効になります。",
"ko_KR": "virtio9p 및 virtiofs 파일 시스템을 자동으로 마운트합니다(기본적으로 첫 번째 스토리지 공간에 마운트되므로 시스템을 재부팅한 후 처음으로 스토리지 공간을 만든 후에 적용됨).",
"ru_RU": "Автоматически монтирует файловые системы virtio9p и virtiofs (вступает в силу после перезагрузки системы после создания хранилища в первый раз, так как по умолчанию оно монтируется в первое хранилище).",
"th_TH": "ติดตั้งระบบไฟล์ virtio9p และ virtiofs โดยอัตโนมัติ (มีผลหลังจากรีบูตระบบหลังจากสร้างพื้นที่จัดเก็บข้อมูลเป็นครั้งแรกเนื่องจากจะถูกเมานต์ไปยังพื้นที่จัดเก็บข้อมูลแรกโดยค่าเริ่มต้น)",
"tr_TR": "virtio9p ve virtiofs dosya sistemlerini otomatik olarak bağlar (varsayılan olarak ilk depolama alanına bağlandığından, depolama alanı ilk kez oluşturulduktan sonra sistemi yeniden başlattıktan sonra geçerlidir).",
"uk_UA": "Автоматично монтує файлові системи virtio9p та virtiofs (вступає в силу після перезавантаження системи після створення сховища у перший раз, оскільки за замовчуванням воно монтується у перший сховище).",
"vi_VN": "Tự động gắn hệ thống tệp virtio9p và virtiofs (có hiệu lực sau khi khởi động lại hệ thống sau khi tạo không gian lưu trữ lần đầu tiên vì nó được gắn vào không gian lưu trữ đầu tiên theo mặc định).",
"zh_CN": "自动挂载 virtio9p 和 virtiofs 文件系统(由于默认挂载到第一个存储空间,所以首次安装系统创建存储空间后重启生效).",
"zh_HK": "自動掛載 virtio9p 和 virtiofs 文件系統(由於默認掛載到第一個存儲空間,所以首次安裝系統創建存儲空間後重启生效).",
"zh_TW": "自動掛載 virtio9p 和 virtiofs 檔案系統(由於預設掛載到第一個儲存空間,所以首次安裝系統建立儲存空間後重新啟動生效)."
}
},
"vmtools": {
"system": false,
"description": {
"en_US": "Automatically install qemu-ga or open-vm-tools according to the environment. (Physical machines are not enabled by default, no need to cancel)",
"ar_SA": "تثبيت qemu-ga أو open-vm-tools تلقائيًا وفقًا للبيئة. (لا يتم تمكين الأجهزة المادية بشكل افتراضي، ولا حاجة للإلغاء)",
"de_DE": "Installieren Sie qemu-ga oder open-vm-tools automatisch entsprechend der Umgebung. (Physische Maschinen sind standardmäßig nicht aktiviert, keine Notwendigkeit zum Abbrechen)",
"es_ES": "Instalar qemu-ga o open-vm-tools automáticamente según la entorno. (Las máquinas físicas no están activadas de forma predeterminada, no es necesario cancelar)",
"fr_FR": "Installer automatiquement qemu-ga ou open-vm-tools en fonction de l'environnement. (Les machines physiques ne sont pas activées par défaut, pas besoin d'annuler)",
"ja_JP": "環境に応じて qemu-ga または open-vm-tools を自動的にインストールします。 (物理マシンはデフォルトで有効になっていないため、キャンセルする必要はありません)",
"ko_KR": "환경에 따라 qemu-ga 또는 open-vm-tools를 자동으로 설치합니다. (물리적 머신은 기본적으로 활성화되지 않으므로 취소할 필요가 없습니다)",
"ru_RU": "Автоматическая установка qemu-ga или open-vm-tools в зависимости от окружения. (Физические машины по умолчанию не включены, отменять не нужно)",
"th_TH": "ติดตั้ง qemu-ga หรือ open-vm-tools โดยอัตโนมัติตามสภาพแวดล้อม (เครื่องจริงจะไม่เปิดใช้งานตามค่าเริ่มต้น ไม่จำเป็นต้องยกเลิก)",
"tr_TR": "Ortamına göre qemu-ga veya open-vm-tools'u otomatik olarak yükleyin. (Fiziksel makineler varsayılan olarak etkinleştirilmez, iptal etmeye gerek yok)",
"uk_UA": "Автоматична установка qemu-ga або open-vm-tools відповідно до середовища. (Фізичні машини за замовчуванням не активовані, скасовувати не потрібно)",
"vi_VN": " Tự động cài đặt qemu-ga hoặc open-vm-tools theo môi trường. (Máy vật lý không được kích hoạt theo mặc định, không cần hủy bỏ)",
"zh_CN": "根据环境自动安装 qemu-ga 或者 open-vm-tools. (物理机默认不会启用, 不需要取消)",
"zh_HK": "根据环境自动安装 qemu-ga 或者 open-vm-tools. (物理机默认不会启用, 不需要取消)",
"zh_TW": "根據環境自動安裝 qemu-ga 或者 open-vm-tools. (物理機默認不會啟用, 不需要取消)"
}
},
"wireless": {
"system": false,
"description": {
"en_US": "Connect WiFi. Please modify 'IFNAME' 'SSID' 'PASSWD' to the required password in the DSM scheduled task and execute it.",
"ar_SA": "قم بتوصيل WiFi. يرجى تعديل 'IFNAME' 'SSID' 'PASSWD' إلى كلمة المرور المطلوبة في مهمة DSM المجدولة وتنفيذها.",
"de_DE": "Verbinden Sie WiFi. Bitte ändern Sie 'IFNAME' 'SSID' 'PASSWD' auf das erforderliche Passwort in der DSM geplanten Aufgabe und führen Sie es aus.",
"es_ES": "Conecte WiFi. Modifique 'IFNAME' 'SSID' 'PASSWD' a la contraseña requerida en la tarea programada DSM y ejecútela.",
"fr_FR": "Connectez-vous au WiFi. Veuillez modifier 'IFNAME' 'SSID' 'PASSWD' au mot de passe requis dans la tâche planifiée DSM et exécutez-la.",
"ja_JP": "WiFiに接続してください.DSMの予約タスクで必要なパスワードに 'IFNAME' 'SSID' 'PASSWD' を変更して実行してください.",
"ko_KR": "WiFi에 연결하십시오. DSM 예약 작업에서 필요한 암호로 'IFNAME' 'SSID' 'PASSWD'를 수정하고 실행하십시오.",
"ru_RU": "Подключитесь к WiFi. Пожалуйста, измените 'IFNAME' 'SSID' 'PASSWD' на требуемый пароль в запланированной задаче DSM и выполните ее.",
"th_TH": "เชื่อมต่อ WiFi โปรดแก้ไข 'IFNAME' 'SSID' 'PASSWD' เป็นรหัสผ่านที่ต้องการในงานที่ตั้งเวลา DSM และเริ่มการทำงาน",
"tr_TR": "WiFi'ye bağlanın. Lütfen DSM planlanmış görevinde 'IFNAME' 'SSID' 'PASSWD' 'yi gerekli parola için değiştirin ve çalıştırın.",
"uk_UA": "Підключіться до WiFi. Будь ласка, змініть 'IFNAME' 'SSID' 'PASSWD' на потрібний пароль у запланованому завданні DSM та виконайте його.",
"vi_VN": "Kết nối WiFi. Vui lòng sửa đổi 'IFNAME' 'SSID' 'PASSWD' thành mật khẩu yêu cầu trong tác vụ được lên lịch DSM và thực hiện nó.",
"zh_CN": "连接 WiFi. 请在 DSM 计划任务中将 'IFNAME' 'SSID' 'PASSWD' 修改为所需密码并执行它.",
"zh_HK": "連接 WiFi. 請在 DSM 計劃任務中將 'IFNAME' 'SSID' 'PASSWD' 修改為所需密碼並執行它.",
"zh_TW": "連接 WiFi. 請在 DSM 計劃任務中將 'IFNAME' 'SSID' 'PASSWD' 修改為所需密碼並執行它."
}
},
"wol": {
"system": true,
"description": {
"en_US": "Force enable Wake-on-lan for network devices.",
"ar_SA": "قم بتمكين Wake-on-lan بقوة لأجهزة الشبكة.",
"de_DE": "Erzwingen Sie Wake-on-lan für Netzwerkgeräte.",
"es_ES": "Forzar el Wake-on-lan para dispositivos de red.",
"fr_FR": "Forcer l'activation de Wake-on-lan pour les périphériques réseau.",
"ja_JP": "ネットワークデバイスの Wake-on-lan を強制的に有効にします.",
"ko_KR": "네트워크 장치의 Wake-on-lan을 강제로 활성화합니다.",
"ru_RU": "Принудительное включение Wake-on-lan для сетевых устройств.",
"th_TH": "บังคับให้ Wake-on-lan ใช้งานสำหรับอุปกรณ์เครือข่าย",
"tr_TR": "Ağ cihazları için Wake-on-lan'ı zorla etkinleştirin.",
"uk_UA": "Примусове включення Wake-on-lan для мережевих пристроїв.",
"vi_VN": "Có;puxáy awake-on-lan cho thiết bị mạng.",
"zh_CN": "强制启用网络设备的 Wake-on-lan.",
"zh_HK": "強制啟用網絡設備的 Wake-on-lan.",
"zh_TW": "強制啟用網路設備的 Wake-on-lan."
}
}
}

Binary file not shown.

View File

@ -1,76 +0,0 @@
<!DOCTYPE html>
<html lang="zh-Hans-CN" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
data-a11y-animated-images="system">
<head>
<meta charset="utf-8" />
<link rel="dns-prefetch" href="https://github.githubassets.com" />
<link rel="dns-prefetch" href="https://avatars.githubusercontent.com" />
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com" />
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/" />
<link rel="preconnect" href="https://github.githubassets.com" crossorigin />
<link rel="preconnect" href="https://avatars.githubusercontent.com" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/light-0eace2597ca3.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/dark-a167e256da9c.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/primer-711f412bb361.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/global-78704364aaba.css" />
<style>
select,
.input-style {
width: 100%;
}
.textarea-style {
width: 100%;
}
.loading-message {
text-align: center;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
async function fetchChangelog() {
let page = 1;
const changelogContainer = document.getElementById('changelog');
const loadingMessage = document.createElement('p');
loadingMessage.textContent = 'Loading...';
loadingMessage.className = 'loading-message';
changelogContainer.appendChild(loadingMessage);
while (true) {
const response = await fetch(`https://api.github.com/repos/RROrg/rr/releases?page=${page}&per_page=100`);
const releases = await response.json();
if ((!response.ok) || (releases.length === 0)) {
const errorMessage = document.createElement('p');
errorMessage.textContent = releases.message;
errorMessage.className = 'error-message';
changelogContainer.appendChild(errorMessage);
break;
}
releases.forEach(release => {
const releaseElement = document.createElement('div');
releaseElement.innerHTML = `<h2><a href="${release.html_url}" target="_blank">${release.name}</a></h2>${marked.parse(release.body)}`;
changelogContainer.appendChild(releaseElement);
});
page++;
}
changelogContainer.removeChild(loadingMessage);
}
document.addEventListener('DOMContentLoaded', fetchChangelog);
</script>
</head>
<body>
<div id="changelog"></div>
</body>
</html>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html lang="zh-Hans-CN">
<head>
<script language="javascript"> location.replace("./issues.html")</script>
<script language="javascript"> location.replace("./disks.html")</script>
</head>
</html>

View File

@ -1,522 +0,0 @@
<!DOCTYPE html>
<html lang="zh-Hans-CN" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
data-a11y-animated-images="system">
<head>
<meta charset="utf-8" />
<link rel="dns-prefetch" href="https://github.githubassets.com" />
<link rel="dns-prefetch" href="https://avatars.githubusercontent.com" />
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com" />
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/" />
<link rel="preconnect" href="https://github.githubassets.com" crossorigin />
<link rel="preconnect" href="https://avatars.githubusercontent.com" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/light-0eace2597ca3.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/dark-a167e256da9c.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/primer-711f412bb361.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet"
href="https://github.githubassets.com/assets/global-78704364aaba.css" />
<style>
select,
.input-style {
width: 100%;
}
.textarea-style {
width: 100%;
}
#logo {
text-align: center;
margin: 20px auto !important;
}
#labels {
text-align: center;
margin: 20px auto !important;
height: auto !important;
}
#products {
text-align: center;
margin: 20px auto !important;
height: auto !important;
}
</style>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://polyfill.io/v3/polyfill.min.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> -->
<script type="application/javascript">
var repo = "RROrg/rr"
var debug = getUrlParam("debug");
var _models = {};
var _pats = {};
var _addons = {};
var _modules = {};
function getUrlParam(paraName) {
var url = document.location.toString();
var arrObj = url.split("?");
if (arrObj.length > 1) {
var arrPara = arrObj[1].split("&");
var arr;
for (var i = 0; i < arrPara.length; i++) {
arr = arrPara[i].split("=");
if (arr != null && arr[0] == paraName) {
return arr[1];
}
}
}
return "";
}
function httpGetAsync(theUrl, callback) {
let xmlHttpReq = new XMLHttpRequest();
xmlHttpReq.onreadystatechange = function () {
if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200)
callback(xmlHttpReq.responseText);
};
xmlHttpReq.open("GET", theUrl, true); // true for asynchronous
xmlHttpReq.send(null);
}
window.onload = function () {
init();
}
function init() {
httpGetAsync("https://raw.githubusercontent.com/RROrg/rr/main/docs/models.json", function (result) {
_models = JSON.parse(result);
httpGetAsync("https://raw.githubusercontent.com/RROrg/rr/main/docs/pats.json", function (result) {
_pats = JSON.parse(result);
httpGetAsync("https://raw.githubusercontent.com/RROrg/rr/main/docs/addons.json", function (result) {
_addons = JSON.parse(result);
httpGetAsync("https://raw.githubusercontent.com/RROrg/rr/main/docs/modules.json", function (result) {
_modules = JSON.parse(result);
$("#model").on("change", changeModel);
$("#version").on("change", changeVersion);
$("#language").on("change", changeVersion);
$("#kernel").on("change", chanageKernel);
$('#addons').val("acpid,mountloader,powersched,reboottoloader,trivial,vmtools");
if (debug) {
$('#sn_item').show();
$('#macs_item').show();
$('#tips_item').show();
} else {
$('#sn_item').hide();
$('#macs_item').hide();
$('#tips_item').hide();
}
setModels();
});
});
});
});
}
function setModels() {
var models = [];
for (var P in _models) {
models = models.concat(_models[P]["models"]);
}
$("#model")[0].options.length = 0;
for (var i = 0; i < models.length; i++) {
var model = models[i];
$("#model").append(`<option value="${model}">${model}</option>`);
}
changeModel();
}
function changeModel() {
model = $("#model").val();
var versions = [];
if (model in _pats) {
versions = Object.keys(_pats[model]);
versions.sort((a, b) => b.localeCompare(a));
}
$("#version")[0].options.length = 0;
for (var i = 0; i < versions.length; i++) {
var version = versions[i];
$("#version").append(`<option value="${version}">${version}</option>`);
}
changeproductsimage();
changeVersion();
}
function changeproductsimage() {
//var model = $("#model").val().replace("#","").replace("+","plus");
//$('#products').html(`<img src="https://www.synology.cn/img/products/detail/${model}/heading.png" width="20%">`);
var model = $("#model").val().replace("#", "").replace("+", "%2B");
$('#products').html(`<img src="https://www.synology.com/api/products/getPhoto?product=${model}&type=img_s&sort=0" width="20%">`);
}
function changeVersion() {
createAddonsBtn();
createModulesBtn();
chanageKernel();
}
function createAddonsBtn() {
var language = $("#language").val();
var extstr = $('#addons').val().split(",");
var idx = 1;
var html = `<div class="form-group-body" id="addons_btns">`;
for (var ext in _addons) {
var dispar = "";
if (_addons[ext]["system"] == true) {
dispar = "disabled";
}
var par = "";
if (extstr.includes(ext)) {
par = "btn-danger";
}
html += `<button type="button" class="btn btn-primary btn-sm mt-2 ${par}" id="btn_${ext}" ${par} ${dispar} onclick="return onclickextAddon('${ext}')" autofocus="" title="${_addons[ext]["description"][language]}">${ext}</button>&nbsp;`;
//if (idx++ % 10 == 0) html += "<br />";
}
html += `</div>`;
$('#addons_btns').html(html);
}
function createModulesBtn() {
var model = $("#model").val();
var version = $("#version").val().split(".").slice(0, 2).join(".");
var platform = "";
for (var P in _models) {
if (_models[P]["models"].includes(model)) {
platform = P + "-" + _models[P]["productvers"][version];
break;
}
}
var extstr = [];
var idx = 1;
var html = `<div class="form-group-body" id="modules_btns">`;
for (var ext in _modules[platform]) {
extstr.push(ext);
var par = "btn-danger";
html += `<button type="button" class="btn btn-primary btn-sm mt-2 ${par}" id="btn_${ext}" ${par} onclick="return onclickextModule('${ext}')" autofocus="" title="${_modules[platform][ext]["description"]}">${ext}</button>&nbsp;`;
//if (idx++ % 10 == 0) html += "<br />";
}
html += `</div>`;
$('#modules_btns').html(html);
if (extstr.length > 0) {
$('#modules').val(extstr.join(","));
}
}
function chanageKernel() {
var model = $("#model").val();
var version = $("#version").val().split(".").slice(0, 2).join(".");
var kernel = $("#kernel").val();
if (model == "SA6400" && version == "7.2") {
$("#kernel_item").show();
if (kernel == "custom") {
$('#modules_item').hide();
} else {
$('#modules_item').show();
}
} else {
$('#modules_item').show();
$("#kernel_item").hide();
}
}
function onclickextAddon(ext) {
var btnobj = $("#btn_" + ext);
var extstr = $('#addons').val().split(",");
if (btnobj.hasClass("btn-danger")) {
extstr.map((val, i) => {
if (val.split(':')[0] === ext) {
extstr.splice(i, 1);
}
});
btnobj.removeClass("btn-danger");
} else {
btnobj.addClass("btn-danger");
var param = window.prompt("Please enter parameters (optional):", "");
if (param !== null && param.trim() !== "") {
extstr.push(ext + ":" + param.trim());
} else {
extstr.push(ext);
}
}
extstr.map((val, i) => {
if (val === "") {
extstr.splice(i, 1);
}
});
$('#addons').val(extstr.join(","));
}
function onclickextModule(ext) {
var btnobj = $("#btn_" + ext);
var extstr = $('#modules').val().split(",");
if (btnobj.hasClass("btn-danger")) {
extstr.map((val, i) => {
if (val === ext) {
extstr.splice(i, 1);
}
});
btnobj.removeClass("btn-danger");
} else {
btnobj.addClass("btn-danger");
extstr.push(ext);
}
extstr.map((val, i) => {
if (val === "") {
extstr.splice(i, 1);
}
});
$('#modules').val(extstr.join(","));
}
function createIssues() {
var form = document.getElementById("inputs");
let formData = new FormData(form);
var title = "custom";
var body = {};
var _parameters = ["title", "format", "size", "template", "language", "model", "version", "kernel", "addons", "modules"];
if (debug) {
_parameters.push("sn", "macs", "tips");
}
for (var key in _parameters) {
var name = _parameters[key];
if ($("#" + name).is(":hidden")) { continue; }
if (name == "title") {
if ($("#" + name).val()) {
title += " " + $("#" + name).val();
} else {
title += " " + new Date().toISOString().substr(0, 10);
}
continue;
}
if ($("#" + name).val()) {
body[name] = $("#" + name).val();
}
}
body = JSON.stringify(body).replace(/\+/g, "%2b");
window.location.href = `https://github.com/${repo}/issues/new?title=${title}&body=${body}`;
}
</script>
<title>RR-CUSTOM</title>
<link rel="icon" href="https://avatars.githubusercontent.com/u/151816514?s=200&v=4">
</head>
<body class="logged-in env-production page-responsive" style="word-wrap: break-word">
<div class="application-main left-0 text-left p-3 mx-auto container-xl px-3 px-md-4 px-lg-5 mt-4">
<pre id="logo" style="
display: block;
font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas,
Liberation Mono, monospace !important;
font-size: 12px !important;
line-height: 12px !important;
margin: 15px 10px;
color: red;
">
██████╗ ██████╗ ██████╗██╗ ██╗███████╗████████╗ ██████╗ ███╗ ███╗
██╔══██╗██╔══██╗ ██╔════╝██║ ██║██╔════╝╚══██╔══╝██╔═══██╗████╗ ████║
██████╔╝██████╔╝█████╗██║ ██║ ██║███████╗ ██║ ██║ ██║██╔████╔██║
██╔══██╗██╔══██╗╚════╝██║ ██║ ██║╚════██║ ██║ ██║ ██║██║╚██╔╝██║
██║ ██║██║ ██║ ╚██████╗╚██████╔╝███████║ ██║ ╚██████╔╝██║ ╚═╝ ██║
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
</pre>
<div class="shields" id="labels">
<a id="titleA" href="https://github.com/RROrg/rr">
<img alt="GitHub Release"
src="https://img.shields.io/github/v/release/rrorg/rr?include_prereleases&style=flat-square&label=current">
</a>
<a id="titleA" href="https://github.com/RROrg/rr">
<img alt="GitHub Issues"
src="https://img.shields.io/github/issues-closed-raw/rrorg/rr/custom?style=flat-square&label=custom">
</a>
<a id="titleB" href="./changelogs.html">
<img alt="GitHub Release" src="https://img.shields.io/badge/Changelogs-8A2BE2&style=flat">
</a>
</div>
<div class="image" id="products">
<img src="https://www.synology.cn/img/products/detail/SA6400/heading.png" width="20%">
</div>
<div class="form-group mt-1 mb-2" id="title_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Title: (Please do not delete the "custom " in the title of
the issue creation page.)</label>
</div>
<div class="form-group-body">
<input class="form-control input-contrast input-sm" type="text" id="title" name="inputs[title]" value="" />
</div>
</div>
<div class="form-group mt-1 mb-2" id="format_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Format:</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="format" name="inputs[format]" value="">
<option selected="selected" value="img">img</option>
<option value="ova">ova</option>
<option value="vmx">vmx</option>
<option value="vmdk">vmdk</option>
<option value="flat">flat</option>
<option value="vhd">vhd</option>
<option value="vhdx">vhdx</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="size_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Size:</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="size" name="inputs[size]" value="">
<option value="2GB">2GB</option>
<option selected="selected" value="4GB">4GB</option>
<option value="8GB">8GB</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="template_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Template:</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="template" name="inputs[template]"
value="">
<option value="true">true</option>
<option selected="selected" value="false">false</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="language_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Language:</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="language" name="inputs[language]"
value="">
<option value="ar_SA">ar_SA</option>
<option value="de_DE">de_DE</option>
<option selected="selected" value="en_US">en_US</option>
<option value="es_ES">es_ES</option>
<option value="fr_FR">fr_FR</option>
<option value="ja_JP">ja_JP</option>
<option value="ko_KR">ko_KR</option>
<option value="ru_RU">ru_RU</option>
<option value="th_TH">th_TH</option>
<option value="tr_TR">tr_TR</option>
<option value="uk_UA">uk_UA</option>
<option value="vi_VN">vi_VN</option>
<option value="zh_CN">zh_CN</option>
<option value="zh_HK">zh_HK</option>
<option value="zh_TW">zh_TW</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="sn_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">SN:</label>
</div>
<div class="form-group-body">
<input class="form-control input-contrast input-sm" type="text" id="sn" name="inputs[sn]" value=""></input>
</div>
</div>
<div class="form-group mt-1 mb-2" id="macs_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">MACs: (Please separate multiple with ','.)</label>
</div>
<div class="form-group-body">
<input class="form-control input-contrast input-sm" type="text" id="macs" name="inputs[macs]" value=""></input>
</div>
</div>
<div class="form-group mt-1 mb-2" id="tips_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Tips:</label>
</div>
<div class="form-group-body">
<input class="form-control input-contrast input-sm" type="text" id="tips" name="inputs[tips]" value=""></input>
</div>
</div>
<div class="form-group mt-1 mb-2" id="model_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Model:</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="model" name="inputs[model]" value="">
<option selected="selected" value="SA6400">SA6400</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="version_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Version:</label>
<a href="https://github.com/RROrg/rr/raw/main/docs/pats.xlsx"> Details</a>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="version" name="inputs[version]" value="">
<option selected="selected" value="7.2">7.2</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="kernel_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Kernel: (only "custom" supports Hyper-V, Xen.)</label>
</div>
<div class="form-group-body">
<select class="form-select form-control select-sm input-contrast" id="kernel" name="inputs[kernel]" value="">
<option selected="selected" value="official">official</option>
<option value="custom">custom</option>
</select>
</div>
</div>
<div class="form-group mt-1 mb-2" id="addons_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Addons:</label>
<a href="https://github.com/RROrg/rr/raw/main/docs/addons.xlsx"> Details</a>
</div>
<div class="form-group-body">
<textarea class="textarea-style input-contrast input-sm" type="text" id="addons" name="inputs[addons]"
disabled></textarea>
<div class="form-group-body" id="addons_btns">
</div>
</div>
</div>
<div class="form-group mt-1 mb-2" id="modules_item">
<div class="form-group-header">
<label class="color-fg-default text-mono f6">Modules:</label>
<a href="https://github.com/RROrg/rr/raw/main/docs/modules.xlsx"> Details</a>
</div>
<div class="form-group-body">
<textarea class="textarea-style input-contrast input-sm" type="text" id="modules" name="inputs[modules]"
disabled></textarea>
<div class="form-group-body" id="modules_btns">
</div>
</div>
</div>
<div data-replace-remote-form-target="" class="workflow-dispatch">
<form id="inputs">
<button type="button" class="btn State--merged" onclick="return createIssues()" autofocus="">
Create
</button>
</form>
</div>
</div>
<footer class="footer width-full container-xl mt-3 text-center color-fg-muted">
<a aria-label="RROrg" title="GitHub" class="footer-octicon mr-2" href="https://github.com/RROrg">
<img class="avatar rounded-2 avatar-user" src="https://avatars.githubusercontent.com/u/151816514?s=88&amp;v=4"
width="40" height="40" alt="@RROrg" />
</a>
<a aria-label="RROrg" title="GitHub" class="footer-octicon mr-2" href="https://github.com/wjz304">
<img class="avatar rounded-2 avatar-user" src="https://avatars.githubusercontent.com/u/5615843?s=88&amp;v=4"
width="40" height="40" alt="@wjz304" />
</a>
<span> © 2022 RROrg, Ing, Inc. </span>
</footer>
</body>
</html>

View File

@ -1,216 +0,0 @@
{
"apollolake": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1019+",
"DS620slim",
"DS218+",
"DS418play",
"DS718+",
"DS918+"
]
},
"broadwell": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"FS3400",
"RS3618xs",
"DS3617xs",
"DS3617xsII",
"FS2017",
"RS18017xs+",
"RS3617RPxs",
"RS3617xs+",
"RS4017xs+"
]
},
"broadwellnk": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1621xs+",
"DS3622xs+",
"FS3600",
"RS1619xs+",
"RS3621RPxs",
"RS3621xs+",
"RS4021xs+",
"SA3400",
"SA3600",
"DS3018xs",
"FS1018"
]
},
"broadwellnkv2": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"FS3410",
"SA3410",
"SA3610"
]
},
"broadwellntbap": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"SA3200D",
"SA3400D"
]
},
"denverton": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1819+",
"DS2419+",
"DS2419+II",
"DVA3219",
"DVA3221",
"RS820+",
"RS820RP+",
"DS1618+",
"RS2418+",
"RS2418RP+",
"RS2818RP+"
]
},
"geminilake": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1520+",
"DS220+",
"DS224+",
"DS420+",
"DS423+",
"DS720+",
"DS920+",
"DVA1622"
]
},
"purley": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"HD6500",
"FS6400"
]
},
"r1000": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1522+",
"DS723+",
"DS923+",
"RS422+"
]
},
"v1000": {
"productvers": {
"7.0": "4.4.180",
"7.1": "4.4.180",
"7.2": "4.4.302",
"7.3": "4.4.302"
},
"models": [
"DS1621+",
"DS1821+",
"DS1823xs+",
"DS2422+",
"FS2500",
"RS1221+",
"RS1221RP+",
"RS2421+",
"RS2421RP+",
"RS2423+",
"RS2423RP+",
"RS2821RP+",
"RS822+",
"RS822RP+"
]
},
"epyc7002": {
"productvers": {
"7.1": "7.1-5.10.55",
"7.2": "7.2-5.10.55",
"7.3": "7.3-5.10.55"
},
"models": [
"SA6400"
]
},
"geminilakenk": {
"productvers": {
"7.1": "7.1-5.10.55",
"7.2": "7.2-5.10.55",
"7.3": "7.3-5.10.55"
},
"models": [
"DS225+",
"DS425+"
]
},
"r1000nk": {
"productvers": {
"7.1": "7.1-5.10.55",
"7.2": "7.2-5.10.55",
"7.3": "7.3-5.10.55"
},
"models": [
"DS725+"
]
},
"v1000nk": {
"productvers": {
"7.1": "7.1-5.10.55",
"7.2": "7.2-5.10.55",
"7.3": "7.3-5.10.55"
},
"models": [
"DS1525+",
"DS1825+",
"DS925+",
"RS2825RP+"
]
}
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

BIN
files/grub.img.gz Normal file

Binary file not shown.

View File

@ -1,124 +1,90 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# shellcheck disable=SC2034
set -e
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
[ -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/functions.sh"
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
# Sanity check
loaderIsConfigured || die "$(TEXT "Loader is not configured!")"
# Clear logs for dbgutils addons
rm -rf "${PART1_PATH}/logs" /sys/fs/pstore/* >/dev/null 2>&1 || true
# Check if machine has EFI
EFI=$([ -d /sys/firmware/efi ] && echo 1 || echo 0)
FBI=$(cat /sys/class/graphics/fb*/name 2>/dev/null | head -1)
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0
BUS=$(getBus "${LOADER_DISK}")
# Print text centralized
clear
COLUMNS=$(ttysize 2>/dev/null | awk '{print $1}')
COLUMNS=${COLUMNS:-80}
WTITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}${RR_RELEASE:+(${RR_RELEASE})}")"
DATE="$(date)"
printf "\033[1;44m%*s\n" "${COLUMNS}" ""
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;31m%*s\033[0m\n" "$(((${#WTITLE} + COLUMNS) / 2))" "${WTITLE}"
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;32m%*s\033[0m\n" "${COLUMNS}" "${DATE}"
[ -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} ""
TITLE="BOOTING:"
[ ${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}"
BTITLE="Boot Type:"
BTITLE+="$([ ${EFI} -eq 1 ] && echo " [UEFI]" || echo " [BIOS]")"
BTITLE+="$([ "${BUS}" = "usb" ] && echo " [${BUS^^} flashdisk]" || echo " [${BUS^^} DoM]")"
printf "\033[1;33m%*s\033[0m\n" $(((${#BTITLE} + COLUMNS) / 2)) "${BTITLE}"
if [ -f "${PART1_PATH}/.upgraded" ]; then
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
if [ -n "${MODEL}" ] && [ -n "${PLATFORM}" ]; then
printf "\033[1;43m%s\033[0m\n" "$(TEXT "Reconfigure after upgrade ...")"
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
PATURL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
PATSUM="$(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
./menu.sh reconfiguringM "${MODEL}" "${PLATFORM}" || {
echo -e "$(TEXT "Reconfiguration failed!")"
exit 1
}
if [ -n "${PRODUCTVER}" ] && [ -n "${PATURL}" ]; then
./menu.sh reconfiguringV "${PRODUCTVER}" "${PATURL}" "${PATSUM}" || {
echo -e "$(TEXT "Reconfiguration failed!")"
exit 1
}
fi
fi
rm -f "${PART1_PATH}/.upgraded"
fi
# Check if DSM zImage changed, patch it if necessary
ZIMAGE_HASH="$(readConfigKey "zimage-hash" "${USER_CONFIG_FILE}")"
if [ -f "${PART1_PATH}/.build" ] || [ "$(sha256sum "${ORI_ZIMAGE_FILE}" | awk '{print $1}')" != "${ZIMAGE_HASH}" ]; then
printf "\033[1;43m%s\033[0m\n" "$(TEXT "DSM zImage changed")"
${WORK_PATH}/zimage-patch.sh || {
printf "\033[1;43m%s\n%s\n%s:\n%s\033[0m\n" "$(TEXT "DSM zImage not patched")" "$(TEXT "Please upgrade the bootloader version and try again.")" "$(TEXT "Error")" "$(cat "${LOG_FILE}")"
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"
${WORK_PATH}/zimage-patch.sh
if [ $? -ne 0 ]; then
echo -e "\033[1;43m$(TEXT "zImage not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")\033[0m"
exit 1
}
fi
fi
# Check if DSM ramdisk changed, patch it if necessary
RAMDISK_HASH="$(readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}")"
if [ -f "${PART1_PATH}/.build" ] || [ "$(sha256sum "${ORI_RDGZ_FILE}" | awk '{print $1}')" != "${RAMDISK_HASH}" ]; then
printf "\033[1;43m%s\033[0m\n" "$(TEXT "DSM ramdisk changed")"
${WORK_PATH}/ramdisk-patch.sh || {
printf "\033[1;43m%s\n%s\n%s:\n%s\033[0m\n" "$(TEXT "DSM ramdisk not patched")" "$(TEXT "Please upgrade the bootloader version and try again.")" "$(TEXT "Error")" "$(cat "${LOG_FILE}")"
RAMDISK_HASH_CUR="$(sha256sum "${ORI_RDGZ_FILE}" | awk '{print $1}')"
if [ -f ${PART1_PATH}/.build -o "${RAMDISK_HASH_CUR}" != "${RAMDISK_HASH}" ]; then
echo -e "\033[1;43m$(TEXT "DSM Ramdisk changed")\033[0m"
${WORK_PATH}/ramdisk-patch.sh
if [ $? -ne 0 ]; then
echo -e "\033[1;43m$(TEXT "Ramdisk not patched,\nPlease upgrade the bootloader version and try again.\nPatch error:\n")$(<"${LOG_FILE}")\033[0m"
exit 1
}
fi
# Update SHA256 hash
writeConfigKey "ramdisk-hash" "${RAMDISK_HASH_CUR}" "${USER_CONFIG_FILE}"
fi
[ -f "${PART1_PATH}/.build" ] && rm -f "${PART1_PATH}/.build"
[ -f ${PART1_PATH}/.build ] && rm -f ${PART1_PATH}/.build
# Load necessary variables
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
MODELID="$(readConfigKey "modelid" "${USER_CONFIG_FILE}")"
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")"
SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")"
DT="$(readConfigKey "dt" "${USER_CONFIG_FILE}")"
KVER="$(readConfigKey "kver" "${USER_CONFIG_FILE}")"
KPRE="$(readConfigKey "kpre" "${USER_CONFIG_FILE}")"
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
LKM="$(readConfigKey "lkm" "${USER_CONFIG_FILE}")"
MEV="$(virt-what 2>/dev/null | head -1)"
DMI="$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i')"
CPU="$(awk -F': ' '/model name/ {print $2}' /proc/cpuinfo | uniq)"
MEM="$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo) MB"
DMI="$(dmesg | grep -i "DMI:" | sed 's/\[.*\] DMI: //i')"
CPU="$(echo $(cat /proc/cpuinfo | grep 'model name' | uniq | awk -F':' '{print $2}'))"
MEM="$(free -m | grep -i mem | awk '{print$2}') MB"
printf "%s \033[1;36m%s(%s)\033[0m\n" "$(TEXT "Model: ")" "${MODEL}" "${PLATFORM}"
printf "%s \033[1;36m%s(%s%s)\033[0m\n" "$(TEXT "Version: ")" "${PRODUCTVER}" "${BUILDNUM}" "$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}")"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "Kernel: ")" "${KERNEL}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "LKM: ")" "${LKM}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEV: ")" "${MEV:-physical}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "DMI: ")" "${DMI}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "CPU: ")" "${CPU}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEM: ")" "${MEM}"
echo -e "$(TEXT "Model:") \033[1;36m${MODEL}\033[0m"
echo -e "$(TEXT "Build:") \033[1;36m${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))\033[0m"
echo -e "$(TEXT "LKM: ") \033[1;36m${LKM}\033[0m"
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 readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then
[ -z "$(ls /dev/nvme* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one m.2 disk for system installation.")"
else
[ -z "$(ls /dev/sd* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one sata disk for system installation.")"
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
if checkBIOS_VT_d && [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please disable Intel(VT-d)/AMD(AMD-Vi) in BIOS/UEFI settings if you encounter a boot failure.")"
fi
HASATA=0
for D in $(lsblk -dpno NAME); do
[ "${D}" = "${LOADER_DISK}" ] && continue
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/scsi disk for system installation, except for the bootloader disk.") ***\033[0m"
VID="$(readConfigKey "vid" "${USER_CONFIG_FILE}")"
PID="$(readConfigKey "pid" "${USER_CONFIG_FILE}")"
@ -126,362 +92,166 @@ SN="$(readConfigKey "sn" "${USER_CONFIG_FILE}")"
MAC1="$(readConfigKey "mac1" "${USER_CONFIG_FILE}")"
MAC2="$(readConfigKey "mac2" "${USER_CONFIG_FILE}")"
KERNELPANIC="$(readConfigKey "kernelpanic" "${USER_CONFIG_FILE}")"
HDDSORT="$(readConfigKey "hddsort" "${USER_CONFIG_FILE}")"
USBASINTERNAL="$(readConfigKey "usbasinternal" "${USER_CONFIG_FILE}")"
EMMCBOOT="$(readConfigKey "emmcboot" "${USER_CONFIG_FILE}")"
MODBLACKLIST="$(readConfigKey "modblacklist" "${USER_CONFIG_FILE}")"
NETIFNUM=$(ls /sys/class/net/ | grep eth | wc -l); [ ${NETIFNUM} -lt 2 ] && NETIFNUM=2
declare -A CMDLINE
# Automatic values
CMDLINE['syno_hw_version']="${MODELID:-${MODEL}}"
CMDLINE['vid']="${VID:-"0x46f4"}" # Sanity check
CMDLINE['pid']="${PID:-"0x0001"}" # Sanity check
if [ -z "${SN}" ]; then
SN="$(generateSerial "${MODEL}")"
writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
fi
CMDLINE['syno_hw_version']="${MODEL}"
[ -z "${VID}" ] && VID="0x46f4" # Sanity check
[ -z "${PID}" ] && PID="0x0001" # Sanity check
CMDLINE['vid']="${VID}"
CMDLINE['pid']="${PID}"
CMDLINE['sn']="${SN}"
if [ -z "${MAC1}" ]; then
if [ -n "${MAC2}" ]; then
MAC1=${MAC2}
MAC2=""
writeConfigKey "mac1" "${MAC1}" "${USER_CONFIG_FILE}"
writeConfigKey "mac2" "${MAC2}" "${USER_CONFIG_FILE}"
else
NETIF_NUM=2
MACS="$(generateMacAddress "${MODEL}" ${NETIF_NUM})"
for I in $(seq 1 ${NETIF_NUM}); do
eval MAC${I}="$(echo ${MACS} | cut -d' ' -f${I})"
writeConfigKey "mac${I}" "$(echo ${MACS} | cut -d' ' -f${I})" "${USER_CONFIG_FILE}"
done
fi
fi
[ -n "${MAC1}" ] && CMDLINE['mac1']="${MAC1}" && CMDLINE['netif_num']="1"
[ -n "${MAC2}" ] && CMDLINE['mac2']="${MAC2}" && CMDLINE['netif_num']="2"
CMDLINE['skip_vender_mac_interfaces']="$(seq -s, 0 $((${CMDLINE['netif_num']:-1} - 1)))"
ETHX="$(find /sys/class/net/ -mindepth 1 -maxdepth 1 ! -name lo -exec basename {} \; | sort)"
for N in ${ETHX}; do
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
BUS="$(ethtool -i "${N}" 2>/dev/null | grep "bus-info" | cut -d' ' -f2)" || BUS="0000:00:00.0"
if [ ! "${MAC}" = "00:00:00:00:00:00" ] && [ ! "${BUS}" = "0000:00:00.0" ]; then
CMDLINE["R${BUS}"]="${MAC}"
fi
done
[ -n "${MAC1}" ] && CMDLINE['mac1']="${MAC1}"
[ -n "${MAC2}" ] && CMDLINE['mac2']="${MAC2}"
CMDLINE['netif_num']="${NETIFNUM}"
# set fixed cmdline
if grep -q "force_junior" /proc/cmdline; then
CMDLINE['force_junior']=""
fi
if grep -q "recovery" /proc/cmdline; then
CMDLINE['force_junior']=""
CMDLINE['recovery']=""
fi
if [ ${EFI} -eq 1 ]; then
CMDLINE['withefi']=""
else
CMDLINE['noefi']=""
fi
if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
if [ ! "${BUS}" = "usb" ]; then
SZ=$(blockdev --getsz "${LOADER_DISK}" 2>/dev/null) # SZ=$(cat /sys/block/${LOADER_DISK/\/dev\//}/size)
SS=$(blockdev --getss "${LOADER_DISK}" 2>/dev/null) # SS=$(cat /sys/block/${LOADER_DISK/\/dev\//}/queue/hw_sector_size)
SIZE=$((${SZ:-0} * ${SS:-0} / 1024 / 1024 + 10))
# Read SATADoM type
SATADOM="$(readConfigKey "satadom" "${USER_CONFIG_FILE}")"
CMDLINE['synoboot_satadom']="${SATADOM:-2}"
CMDLINE['dom_szmax']="${SIZE}"
fi
CMDLINE["elevator"]="elevator"
else
CMDLINE["split_lock_detect"]="off"
# CMDLINE['module.sig_enforce']="0"
# CMDLINE['loadpin.enforce']="0"
if [ ! "${BUS}" = "usb" ]; then
SIZE=$(($(cat /sys/block/${LOADER_DISK/\/dev\//}/size) / 2048 + 10))
# Read SATADoM type
DOM="$(readModelKey "${MODEL}" "dom")"
CMDLINE['synoboot_satadom']="${DOM}"
CMDLINE['dom_szmax']="${SIZE}"
fi
if [ "${DT}" = "true" ]; then
CMDLINE["syno_ttyS0"]="serial,0x3f8"
CMDLINE["syno_ttyS1"]="serial,0x2f8"
else
CMDLINE["SMBusHddDynamicPower"]="1"
CMDLINE["syno_hdd_detect"]="0"
CMDLINE["syno_hdd_powerup_seq"]="0"
fi
CMDLINE["HddHotplug"]="1"
CMDLINE["vender_format_version"]="2"
CMDLINE['panic']="${KERNELPANIC:-0}"
CMDLINE['console']="ttyS0,115200n8"
CMDLINE['earlyprintk']=""
CMDLINE['earlycon']="uart8250,io,0x3f8,115200n8"
CMDLINE['console']="ttyS0,115200n8"
CMDLINE['consoleblank']="600"
# CMDLINE['no_console_suspend']="1"
CMDLINE['root']="/dev/md0"
CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7"
CMDLINE['loglevel']="15"
CMDLINE['log_buf_len']="32M"
CMDLINE['rootwait']=""
CMDLINE['panic']="${KERNELPANIC:-0}"
# CMDLINE['intremap']="off" # no need
# CMDLINE['amd_iommu_intr']="legacy" # no need
# CMDLINE['split_lock_detect']="off" # check KVER
CMDLINE['pcie_aspm']="off"
# CMDLINE['intel_pstate']="disable"
# CMDLINE['amd_pstate']="disable"
# CMDLINE['nox2apic']="" # check platform
# CMDLINE['nomodeset']=""
CMDLINE['nowatchdog']=""
CMDLINE['modprobe.blacklist']="${MODBLACKLIST}"
CMDLINE['mev']="${MEV:-physical}"
if [ "${MEV:-physical}" = "vmware" ]; then
CMDLINE['tsc']="reliable"
CMDLINE['pmtmr']="0x0"
fi
if [ "${HDDSORT}" = "true" ]; then
CMDLINE['hddsort']=""
fi
if [ "${USBASINTERNAL}" = "true" ]; then
CMDLINE['usbasinternal']=""
fi
if echo "apollolake geminilake purley geminilakenk" | grep -wq "${PLATFORM}"; then
CMDLINE["nox2apic"]=""
fi
# # Save command line to grubenv RR_CMDLINE= ... nox2apic
# if echo "apollolake geminilake purley geminilakenk" | grep -wq "${PLATFORM}"; then
# if grep -Eq "^flags.*x2apic.*" /proc/cpuinfo; then
# checkCmdline "rr_cmdline" "nox2apic" || addCmdline "rr_cmdline" "nox2apic"
# fi
# else
# checkCmdline "rr_cmdline" "nox2apic" && delCmdline "rr_cmdline" "nox2apic"
# fi
# if [ -n "$(ls /dev/mmcblk* 2>/dev/null)" ] && [ ! "${BUS}" = "mmc" ] && [ ! "${EMMCBOOT}" = "true" ]; then
# if ! echo "${CMDLINE['modprobe.blacklist']}" | grep -q "sdhci"; then
# [ ! "${CMDLINE['modprobe.blacklist']}" = "" ] && CMDLINE['modprobe.blacklist']+=","
# CMDLINE['modprobe.blacklist']+="sdhci,sdhci_pci,sdhci_acpi"
# fi
# fi
if [ "${DT}" = "true" ] && ! echo "purley broadwellnkv2 epyc7002 geminilakenk r1000nk v1000nk" | grep -wq "${PLATFORM}"; then
if ! echo "${CMDLINE['modprobe.blacklist']}" | grep -q "mpt3sas"; then
[ ! "${CMDLINE['modprobe.blacklist']}" = "" ] && CMDLINE['modprobe.blacklist']+=","
CMDLINE['modprobe.blacklist']+="mpt3sas"
fi
#else
# CMDLINE['scsi_mod.scan']="sync" # TODO: redpill panic of vmware scsi? (add to cmdline)
fi
# CMDLINE['kvm.ignore_msrs']="1"
# CMDLINE['kvm.report_ignored_msrs']="0"
if echo "apollolake geminilake geminilakenk" | grep -wq "${PLATFORM}"; then
CMDLINE["intel_iommu"]="igfx_off"
fi
if echo "purley broadwellnkv2" | grep -wq "${PLATFORM}"; then
CMDLINE["SASmodel"]="1"
fi
SSID="$(cat "${PART1_PATH}/wpa_supplicant.conf" 2>/dev/null | grep 'ssid=' | cut -d'=' -f2 | sed 's/^"//; s/"$//' | xxd -p | tr -d '\n')"
PSK="$(cat "${PART1_PATH}/wpa_supplicant.conf" 2>/dev/null | grep 'psk=' | cut -d'=' -f2 | sed 's/^"//; s/"$//' | xxd -p | tr -d '\n')"
if [ -n "${SSID}" ] && [ -n "${PSK}" ]; then
CMDLINE["wpa.ssid"]="${SSID}"
CMDLINE["wpa.psk"]="${PSK}"
fi
while IFS=': ' read -r KEY VALUE; do
[ -n "${KEY}" ] && CMDLINE["network.${KEY}"]="${VALUE}"
done <<<"$(readConfigMap "network" "${USER_CONFIG_FILE}")"
while IFS=': ' read -r KEY VALUE; do
# Read cmdline
while IFS=': ' read KEY VALUE; do
[ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
done <<<"$(readConfigMap "cmdline" "${USER_CONFIG_FILE}")"
done < <(readModelMap "${MODEL}" "productvers.[${PRODUCTVER}].cmdline")
while IFS=': ' read KEY VALUE; do
[ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
done < <(readConfigMap "cmdline" "${USER_CONFIG_FILE}")
# Prepare command line
CMDLINE_LINE=""
for KEY in "${!CMDLINE[@]}"; do
for KEY in ${!CMDLINE[@]}; do
VALUE="${CMDLINE[${KEY}]}"
CMDLINE_LINE+=" ${KEY}"
[ -n "${VALUE}" ] && CMDLINE_LINE+="=${VALUE}"
done
CMDLINE_LINE="$(echo "${CMDLINE_LINE}" | sed 's/^ //')" # Remove leading space
printf "%s:\n\033[1;36m%s\033[0m\n" "$(TEXT "Cmdline")" "${CMDLINE_LINE}"
# Check if user wants to modify at this stage
function _bootwait() {
BOOTWAIT="$(readConfigKey "bootwait" "${USER_CONFIG_FILE}")"
[ -z "${BOOTWAIT}" ] && BOOTWAIT=10
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB
MSG=""
while [ ${BOOTWAIT} -gt 0 ]; do
sleep 1
BOOTWAIT=$((BOOTWAIT - 1))
MSG="$(printf "\033[1;33m$(TEXT "%2ds (Changing access(ssh/web) status will interrupt boot)")\033[0m" "${BOOTWAIT}")"
printf "\r${MSG}"
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC
if ! diff WB WC >/dev/null 2>&1; then
printf "\r%$((${#MSG} * 2))s\n" " "
printf "\r\033[1;33m%s\033[0m\n" "$(TEXT "Access(ssh/web) status has changed and booting is interrupted.")"
rm -f WB WC
return 1
fi
if ! ps -p "${PPID}" -o cmd | grep -q "menu.sh" && [ -f "${TMP_PATH}/menu.lock" ]; then
printf "\r%$((${#MSG} * 2))s\n" " "
printf "\r\033[1;33m%s\033[0m\n" "$(TEXT "Menu opened and booting is interrupted.")"
rm -f WB WC
return 1
fi
done
rm -f WB WC
printf "\r%$((${#MSG} * 2))s\n" " "
return 0
}
CMDLINE_LINE=$(echo "${CMDLINE_LINE}" | sed 's/^ //') # Remove leading space
echo -e "$(TEXT "Cmdline:\n")\033[1;36m${CMDLINE_LINE}\033[0m"
DIRECT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
if [ "${DIRECT}" = "true" ] || echo "parallels xen" | grep -qw "${MEV:-physical}"; then
# grubenv file limit is 1024 bytes.
grub-editenv "${USER_RSYSENVFILE}" create
grub-editenv "${USER_RSYSENVFILE}" set rr_version="${WTITLE}"
grub-editenv "${USER_RSYSENVFILE}" set rr_booting="${BTITLE}"
grub-editenv "${USER_RSYSENVFILE}" set dsm_model="${MODEL}(${PLATFORM})"
grub-editenv "${USER_RSYSENVFILE}" set dsm_version="${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))"
grub-editenv "${USER_RSYSENVFILE}" set dsm_kernel="${KERNEL}"
grub-editenv "${USER_RSYSENVFILE}" set dsm_lkm="${LKM}"
grub-editenv "${USER_RSYSENVFILE}" set sys_mev="${MEV:-physical}"
grub-editenv "${USER_RSYSENVFILE}" set sys_dmi="${DMI}"
grub-editenv "${USER_RSYSENVFILE}" set sys_cpu="${CPU}"
grub-editenv "${USER_RSYSENVFILE}" set sys_mem="${MEM}"
CMDLINE_DIRECT=$(echo "${CMDLINE_LINE}" | sed 's/>/\\\\>/g') # Escape special chars
grub-editenv "${USER_GRUBENVFILE}" set dsm_cmdline="${CMDLINE_DIRECT}"
grub-editenv "${USER_GRUBENVFILE}" set next_entry="direct"
_bootwait || exit 0
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Reboot to boot directly in DSM")"
[ ! -f "/.dockerenv" ] && reboot
if [ "${DIRECT}" = "true" ]; then
CMDLINE_DIRECT=$(echo ${CMDLINE_LINE} | sed 's/>/\\\\>/g') # Escape special chars
grub-editenv ${GRUB_PATH}/grubenv set dsm_cmdline="${CMDLINE_DIRECT}"
echo -e "\033[1;33m$(TEXT "Reboot to boot directly in DSM")\033[0m"
grub-editenv ${GRUB_PATH}/grubenv set next_entry="direct"
reboot
exit 0
else
rm -f "${USER_RSYSENVFILE}" 2>/dev/null || true
grub-editenv "${USER_GRUBENVFILE}" unset dsm_cmdline
grub-editenv "${USER_GRUBENVFILE}" unset next_entry
ETHX="$(find /sys/class/net/ -mindepth 1 -maxdepth 1 ! -name lo -exec basename {} \; | sort)"
printf "$(TEXT "Detected %s network cards.\n")" "$(echo "${ETHX}" | wc -w)"
printf "$(TEXT "Checking Connect.")"
ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list
echo "$(printf "$(TEXT "Detected %s network cards.")" "${#ETHX[@]}")"
echo "$(TEXT "Checking Connect.")"
COUNT=0
BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")"
BOOTIPWAIT=${BOOTIPWAIT:-10}
while [ ${COUNT} -lt $((BOOTIPWAIT + 32)) ]; do
MSG=""
for N in ${ETHX}; do
if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
MSG+="${N} "
[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=10
while [ ${COUNT} -lt $((${BOOTIPWAIT} + 32)) ]; do
hasConnect="false"
for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
if ethtool ${ETHX[${N}]} | grep 'Link detected' | grep -q 'yes'; then
echo -en "${ETHX[${N}]} "
hasConnect="true"
fi
done
if [ -n "${MSG}" ]; then
printf "\r%s%s \n" "${MSG}" "$(TEXT "connected.")"
if [ ${hasConnect} = "true" ]; then
echo -en "connected.\n"
break
fi
COUNT=$((COUNT + 1))
printf "."
COUNT=$((${COUNT} + 1))
echo -n "."
sleep 1
done
if [ ! -f "/.dockerenv" ]; then
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
fi
printf "$(TEXT "Waiting IP.\n")"
for N in ${ETHX}; do
echo "$(TEXT "Waiting IP.(For reference only)")"
for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
COUNT=0
DRIVER="$(basename "$(realpath "/sys/class/net/${N}/device/driver" 2>/dev/null)" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
printf "%s(%s): " "${N}" "${MAC}@${DRIVER}"
DRIVER=$(ls -ld /sys/class/net/${ETHX[${N}]}/device/driver 2>/dev/null | awk -F '/' '{print $NF}')
echo -en "${ETHX[${N}]}(${DRIVER}): "
while true; do
if false && [ ! "${N::3}" = "eth" ]; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "IGNORE (Does not support non-wired network card.)")"
if ! ip link show ${ETHX[${N}]} | grep -q 'UP'; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "DOWN")\n"
break
fi
if [ -z "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "DOWN")"
break
fi
if [ "0" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "NOT CONNECTED")"
if ethtool ${ETHX[${N}]} | grep 'Link detected' | grep -q 'no'; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "NOT CONNECTED")\n"
break
fi
if [ ${COUNT} -eq ${BOOTIPWAIT} ]; then # Under normal circumstances, no errors should occur here.
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "TIMEOUT (Please check the IP on the router.)")"
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "TIMEOUT (Please check the IP on the router.)")\n"
break
fi
COUNT=$((COUNT + 1))
IP="$(getIP "${N}")"
COUNT=$((${COUNT} + 1))
IP="$(getIP ${ETHX[${N}]})"
if [ -n "${IP}" ]; then
if echo "${IP}" | grep -q "^169\.254\."; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "LINK LOCAL (No DHCP server detected.)")"
else
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(printf "$(TEXT "Access \033[1;34mhttp://%s:5000\033[0m to connect the DSM via web.")" "${IP}")"
fi
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
fi
printf "."
echo -n "."
sleep 1
done
done
BOOTWAIT="$(readConfigKey "bootwait" "${USER_CONFIG_FILE}")"
[ -z "${BOOTWAIT}" ] && BOOTWAIT=10
w | awk '{print $1" "$2" "$4" "$5" "$6}' >WB
MSG=""
while test ${BOOTWAIT} -ge 0; do
MSG="$(printf "\033[1;33m$(TEXT "%2ds (Changing access(ssh/web) status will interrupt boot)")\033[0m" "${BOOTWAIT}")"
echo -en "\r${MSG}"
w | awk '{print $1" "$2" "$4" "$5" "$6}' >WC
if ! diff WB WC >/dev/null 2>&1; then
echo -en "\r\033[1;33m$(TEXT "access(ssh/web) status has changed and booting is interrupted.")\033[0m\n"
rm -f WB WC
exit 0
fi
sleep 1
BOOTWAIT=$((BOOTWAIT - 1))
done
rm -f WB WC
echo -en "\r$(printf "%$((${#MSG} * 2))s" " ")\n"
_bootwait || exit 0
[ -n "$(cat "${ADD_TIPS_FILE}" 2>/dev/null)" ] && printf "$(TEXT "%s\n")" "$(cat "${ADD_TIPS_FILE}" 2>/dev/null)"
printf "\033[1;37m%s\033[0m\n" "$(TEXT "Loading DSM kernel ...")"
echo -e "\033[1;37m$(TEXT "Loading DSM kernel...")\033[0m"
DSMLOGO="$(readConfigKey "dsmlogo" "${USER_CONFIG_FILE}")"
if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ]; then
if [ "${DSMLOGO}" = "true" -a -c "/dev/fb0" ]; then
IP="$(getIP)"
echo "${IP}" | grep -q "^169\.254\." && IP=""
[ -n "${IP}" ] && URL="http://${IP}:5000" || URL="http://find.synology.com/"
python3 "${WORK_PATH}/include/functions.py" "makeqr" -d "${URL}" -l "7" -o "${TMP_PATH}/qrcode_boot.png"
[ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>&1 || true
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
KEXECARGS="-a"
if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 4 ] && [ ${EFI} -eq 1 ]; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Warning, running kexec with --noefi param, strange things will happen!!")"
KEXECARGS+=" --noefi"
KVER=$(readModelKey "${MODEL}" "productvers.[${PRODUCTVER}].kver")
if [ "${KVER:0:1}" = "3" -a ${EFI} -eq 1 ]; then
echo -e "\033[1;33m$(TEXT "Warning, running kexec with --noefi param, strange things will happen!!")\033[0m"
kexec --noefi -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog
else
kexec -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog
fi
kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE} kexecboot" >"${LOG_FILE}" 2>&1 || dieLog
printf "\033[1;37m%s\033[0m\n" "$(TEXT "Booting ...")"
# show warning message
for T in $(busybox w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do
if [ -w "/dev/${T}" ]; then
echo -e "\n\033[1;43m$(TEXT "Interface not operational. Wait a few minutes.\nFind DSM via http://find.synology.com/ or Synology Assistant.")\033[0m\n" >"/dev/${T}" 2>/dev/null || true
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. 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
if [ ! -f "/.dockerenv" ]; then
# Disconnect wireless
lsmod | grep -q iwlwifi && for F in /sys/class/net/wlan*; do
[ ! -e "${F}" ] && continue
connectwlanif "$(basename "${F}")" 0 2>/dev/null
done
# Unload all network drivers
# for F in $(realpath /sys/class/net/*/device/driver); do [ ! -e "${F}" ] && continue; rmmod -f "$(basename ${F})" 2>/dev/null || true; done
# Unload all graphics drivers
# for D in $(lsmod | grep -E '^(nouveau|amdgpu|radeon|i915)' | awk '{print $1}'); do rmmod -f "${D}" 2>/dev/null || true; done
# for I in $(find /sys/devices -name uevent -exec bash -c 'cat {} 2>/dev/null | grep -Eq "PCI_CLASS=0?30[0|1|2]00" && dirname {}' \;); do
# [ -e ${I}/reset ] && cat "${I}/vendor" >/dev/null | grep -iq 0x10de && echo 1 >${I}/reset || true # Proc open nvidia driver when booting
# done
# Reboot
KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")"
[ "${KERNELWAY}" = "kexec" ] && kexec -e || poweroff
fi
KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")"
[ "${KERNELWAY}" = "kexec" ] && kexec -f -e || poweroff
exit 0
fi

View File

@ -1,22 +1,16 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
read_u8() {
dd if="${1}" bs=1 skip="$((${2}))" count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+'
dd if=$1 bs=1 skip=$(($2)) count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+'
}
read_u32() {
dd if="${1}" bs=1 skip="$((${2}))" count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+'
dd if=$1 bs=1 skip=$(($2)) count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+'
}
set -x
setup_size=$(read_u8 "${1}" 0x1f1)
payload_offset=$(read_u32 "${1}" 0x248)
payload_length=$(read_u32 "${1}" 0x24c)
inner_pos=$(((setup_size + 1) * 512))
setup_size=$(read_u8 $1 0x1f1)
payload_offset=$(read_u32 $1 0x248)
payload_length=$(read_u32 $1 0x24c)
inner_pos=$((($setup_size + 1) * 512))
tail -c+$((inner_pos + 1)) "${1}" | tail -c+$((payload_offset + 1)) | head -c "${payload_length}" | head -c $((payload_length - 4)) | unlzma >"${2}"
tail -c+$(($inner_pos + 1)) $1 | tail -c+$(($payload_offset + 1)) | head -c $(($payload_length)) | head -c $(($payload_length - 4)) | unlzma >$2

View File

@ -0,0 +1,42 @@
#!/usr/bin/env bash
#
# Calculate the amount of space needed to run the kernel, including room for
# the .bss and .brk sections.
#
# Usage:
# objdump -h a.out | sh calc_run_size.sh
NUM='\([0-9a-fA-F]*[ \t]*\)'
OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p')
if [ -z "$OUT" ]; then
echo "Never found .bss or .brk file offset" >&2
exit 1
fi
OUT=$(echo ${OUT# })
sizeA=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
offsetA=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
sizeB=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
offsetB=$(printf "%d" 0x${OUT%% *})
run_size=$((${offsetA} + ${sizeA} + ${sizeB}))
# BFD linker shows the same file offset in ELF.
if [ "${offsetA}" -ne "${offsetB}" ]; then
# Gold linker shows them as consecutive.
endB=$((${offsetB} + ${sizeB}))
if [ "$endB" != "$run_size" ]; then
printf "sizeA: 0x%x\n" ${sizeA} >&2
printf "offsetA: 0x%x\n" ${offsetA} >&2
printf "sizeB: 0x%x\n" ${sizeB} >&2
printf "offsetB: 0x%x\n" ${offsetB} >&2
echo ".bss and .brk are non-contiguous" >&2
exit 1
fi
fi
printf "%d\n" ${run_size}
exit 0

1
files/initrd/opt/rr/depmod Symbolic link
View File

@ -0,0 +1 @@
kmod

View File

@ -1,60 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# ----------------------------------------------------------------------
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
#
# Inspired from extract-ikconfig
# (c) 2009,2010 Dick Streefland <dick@streefland.net>
#
# (c) 2011 Corentin Chary <corentin.chary@gmail.com>
#
# ----------------------------------------------------------------------
check_vmlinux() {
# Use readelf to check if it's a valid ELF
# TODO: find a better to way to check that it's really vmlinux
# and not just an elf
readelf -h $1 >/dev/null 2>&1 || return 1
cat $1
exit 0
}
try_decompress() {
# The obscure use of the "tr" filter is to work around older versions of
# "grep" that report the byte offset of the line instead of the pattern.
# Try to find the header ($1) and decompress from here
for pos in $(tr "$1\n$2" "\n$2=" <"$img" | grep -abo "^$2"); do
pos=${pos%%:*}
tail -c+$pos "$img" | $3 >$tmp 2>/dev/null
check_vmlinux $tmp
done
}
# Check invocation:
me=${0##*/}
img=$1
if [ $# -ne 1 ] || [ ! -s "$img" ]; then
echo "Usage: $me <kernel-image>" >&2
exit 2
fi
# Prepare temp files:
tmp=$(mktemp /tmp/vmlinux-XXX)
trap "rm -f $tmp" 0
# That didn't work, so retry after decompression.
try_decompress '\037\213\010' xy gunzip
try_decompress '\3757zXZ\000' abcde unxz
try_decompress 'BZh' xy bunzip2
try_decompress '\135\0\0\0' xxx unlzma
try_decompress '\211\114\132' xy 'lzop -d'
try_decompress '\002!L\030' xxx 'lz4 -d'
try_decompress '(\265/\375' xxx unzstd
# Finally check for uncompressed images or objects:
check_vmlinux $img
# Bail out:
echo "$me: Cannot find vmlinux." >&2

Binary file not shown.

View File

@ -1,34 +0,0 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# shellcheck disable=SC2059
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. "${WORK_PATH}/include/functions.sh"
# lock
exec 911>"${TMP_PATH}/helper.lock"
flock -n 911 || {
MSG="$(TEXT "Another instance is already running.")"
dialog --colors --aspect 50 --title "$(TEXT "Online Assistance")" --msgbox "${MSG}" 0 0
exit 1
}
trap 'flock -u 911; rm -f "${TMP_PATH}/helper.lock"' EXIT INT TERM HUP
{
printf "$(TEXT "Closing this window or press 'ctrl + c' to exit the assistance.")\n"
printf "$(TEXT "Please give the following link to the helper. (Click to open and copy)")\n"
printf " 👇\n"
sshx -q --name "RR-Helper" 2>&1
[ $? -ne 0 ] && while true; do sleep 1; done
} | dialog --colors --aspect 50 --title "$(TEXT "Online Assistance")" --progressbox "$(TEXT "Notice: Please keep this window open.")" 20 100 2>&1
clear
echo -e "$(TEXT "Call \033[1;32mmenu.sh\033[0m to return to menu")"
"${WORK_PATH}/init.sh"

View File

@ -1,390 +0,0 @@
# INTEL_I810_IDS
80867121
80867123
80867125
# INTEL_I815_IDS
80861132
# INTEL_I830_IDS
80863577
# INTEL_I845G_IDS
80862562
# INTEL_I85X_IDS
80863582
8086358e
# INTEL_I865G_IDS
80862572
# INTEL_I915G_IDS
80862582
8086258a
# INTEL_I915GM_IDS
80862592
# INTEL_I945G_IDS
80862772
# INTEL_I945GM_IDS
808627a2
808627ae
# INTEL_I965G_IDS
80862972
80862982
80862992
808629a2
# INTEL_G33_IDS
808629b2
808629c2
808629d2
# INTEL_I965GM_IDS
80862a02
80862a12
# INTEL_GM45_IDS
80862a42
# INTEL_G45_IDS
80862e02
80862e12
80862e22
80862e32
80862e42
80862e92
# INTEL_PINEVIEW_G_IDS
8086a001
# INTEL_PINEVIEW_M_IDS
8086a011
# INTEL_IRONLAKE_D_IDS
80860042
# INTEL_IRONLAKE_M_IDS
80860046
# INTEL_SNB_D_GT1_IDS
80860102
8086010A
# INTEL_SNB_D_GT2_IDS
80860112
80860122
# INTEL_SNB_M_GT1_IDS
80860106
# INTEL_SNB_M_GT2_IDS
80860116
80860126
# INTEL_IVB_M_GT1_IDS
80860156
# INTEL_IVB_M_GT2_IDS
80860166
# INTEL_IVB_D_GT1_IDS
80860152
8086015a
# INTEL_IVB_D_GT2_IDS
80860162
8086016a
# INTEL_HSW_ULT_GT1_IDS
80860A02
80860A06
80860A0A
80860A0B
# INTEL_HSW_ULX_GT1_IDS
80860A0E
# INTEL_HSW_GT1_IDS
80860402
80860406
8086040A
8086040B
8086040E
80860C02
80860C06
80860C0A
80860C0B
80860C0E
80860D02
80860D06
80860D0A
80860D0B
80860D0E
# INTEL_HSW_ULT_GT2_IDS
80860A12
80860A16
80860A1A
80860A1B
# INTEL_HSW_ULX_GT2_IDS
80860A1E
# INTEL_HSW_GT2_IDS
80860412
80860416
8086041A
8086041B
8086041E
80860C12
80860C16
80860C1A
80860C1B
80860C1E
80860D12
80860D16
80860D1A
80860D1B
80860D1E
# INTEL_HSW_ULT_GT3_IDS
80860A22
80860A26
80860A2A
80860A2B
80860A2E
# INTEL_HSW_GT3_IDS
80860422
80860426
8086042A
8086042B
8086042E
80860C22
80860C26
80860C2A
80860C2B
80860C2E
80860D22
80860D26
80860D2A
80860D2B
80860D2E
# INTEL_VLV_IDS
80860f30
80860f31
80860f32
80860f33
# INTEL_BDW_ULT_GT1_IDS
80861606
8086160B
# INTEL_BDW_ULX_GT1_IDS
8086160E
# INTEL_BDW_GT1_IDS
80861602
8086160A
8086160D
# INTEL_BDW_ULT_GT2_IDS
80861616
8086161B
# INTEL_BDW_ULX_GT2_IDS
8086161E
# INTEL_BDW_GT2_IDS
80861612
8086161A
8086161D
# INTEL_BDW_ULT_GT3_IDS
80861626
8086162B
# INTEL_BDW_ULX_GT3_IDS
8086162E
# INTEL_BDW_GT3_IDS
80861622
8086162A
8086162D
# INTEL_BDW_ULT_RSVD_IDS
80861636
8086163B
# INTEL_BDW_ULX_RSVD_IDS
8086163E
# INTEL_BDW_RSVD_IDS
80861632
8086163A
8086163D
# INTEL_CHV_IDS
808622b0
808622b1
808622b2
808622b3
# INTEL_SKL_ULT_GT1_IDS
80861906
80861913~
# INTEL_SKL_ULX_GT1_IDS
8086190E
80861915~
# INTEL_SKL_GT1_IDS
80861902
8086190A
8086190B
80861917~
# INTEL_SKL_ULT_GT2_IDS
80861916
80861921
# INTEL_SKL_ULX_GT2_IDS
8086191E
# INTEL_SKL_GT2_IDS
80861912
8086191A
8086191B
8086191D
# INTEL_SKL_ULT_GT3_IDS
80861923
80861926
80861927
# INTEL_SKL_GT3_IDS
8086192A
8086192B
8086192D
# INTEL_SKL_GT4_IDS
80861932
8086193A
8086193B
8086193D
# INTEL_BXT_IDS
80860A84
80861A84
80861A85
80865A84
80865A85
# INTEL_GLK_IDS
80863184
80863185
# INTEL_KBL_ULT_GT1_IDS
80865906
80865913
# INTEL_KBL_ULX_GT1_IDS
8086590E
80865915
# INTEL_KBL_GT1_IDS
80865902
80865908
8086590A
8086590B
# INTEL_KBL_ULT_GT2_IDS
80865916
80865921
# INTEL_KBL_ULX_GT2_IDS
8086591E
# INTEL_KBL_GT2_IDS
80865912
80865917
8086591A
8086591B
8086591D
# INTEL_KBL_ULT_GT3_IDS
80865926
# INTEL_KBL_GT3_IDS
80865923
80865927
# INTEL_KBL_GT4_IDS
8086593B
# INTEL_AML_KBL_GT2_IDS
8086591C
808687C0
# INTEL_AML_CFL_GT2_IDS
808687CA
# INTEL_CML_GT1_IDS
80869BA2
80869BA4
80869BA5
80869BA8
# INTEL_CML_U_GT1_IDS
80869B21
80869BAA
80869BAC
# INTEL_CML_GT2_IDS
80869BC2
80869BC4
80869BC5
80869BC6
80869BC8
80869BE6
80869BF6
# INTEL_CML_U_GT2_IDS
80869B41
80869BCA
80869BCC
# INTEL_CFL_S_GT1_IDS
80863E90
80863E93
80863E99
# INTEL_CFL_S_GT2_IDS
80863E91
80863E92
80863E96
80863E98
80863E9A
# INTEL_CFL_H_GT1_IDS
80863E9C
# INTEL_CFL_H_GT2_IDS
80863E94
80863E9B
# INTEL_CFL_U_GT2_IDS
80863EA9
# INTEL_CFL_U_GT3_IDS
80863EA5
80863EA6
80863EA7
80863EA8
# INTEL_WHL_U_GT1_IDS
80863EA1
80863EA4
# INTEL_WHL_U_GT2_IDS
80863EA0
80863EA3
# INTEL_WHL_U_GT3_IDS
80863EA2
# INTEL_CNL_PORT_F_IDS
80865A44
80865A4C
80865A54
80865A5C
# INTEL_CNL_IDS
80865A40
80865A41
80865A42
80865A49
80865A4A
80865A50
80865A51
80865A52
80865A59
80865A5A
# INTEL_ICL_PORT_F_IDS
80868A50
80868A52
80868A53
80868A54
80868A56
80868A57
80868A58
80868A59
80868A5A
80868A5B
80868A5C
80868A70
80868A71
# INTEL_ICL_11_IDS
80868A51
80868A5D
# INTEL_EHL_IDS
80864500~
80864541
80864551
80864555
80864557
80864570~
80864571
# INTEL_JSL_IDS
80864E51
80864E55
80864E57
80864E61
80864E71
# INTEL_TGL_12_GT1_IDS
80869A60
80869A68
80869A70
# INTEL_TGL_12_GT2_IDS
80869A40
80869A49
80869A59
80869A78
80869AC0
80869AC9
80869AD9
80869AF8
# INTEL_RKL_IDS
80864C80
80864C8A
80864C8B
80864C8C
80864C90
80864C9A
# INTEL_DG1_IDS
80864905
80864906~
80864907~
80864908~
80864909~

View File

@ -1,53 +1,17 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# shellcheck disable=SC2115,SC2155
###############################################################################
# Return list of available addons
# 1 - Platform
# 2 - Kernel Version
function availableAddons() {
if [ -z "${1}" ] || [ -z "${2}" ]; then
echo ""
return 1
fi
while read -r D; do
while read D; do
[ ! -f "${D}/manifest.yml" ] && continue
local ADDON=$(basename "${D}")
ADDON=$(basename ${D})
checkAddonExist "${ADDON}" "${1}" "${2}" || continue
local SYSTEM=$(readConfigKey "system" "${D}/manifest.yml")
SYSTEM=$(readConfigKey "system" "${D}/manifest.yml")
[ "${SYSTEM}" = "true" ] && continue
local LOCALE="${LC_ALL%%.*}"
local DESC=""
[ -z "${DESC}" ] && DESC="$(readConfigKey "description.${LOCALE:-"en_US"}" "${D}/manifest.yml")"
[ -z "${DESC}" ] && DESC="$(readConfigKey "description.en_US" "${D}/manifest.yml")"
[ -z "${DESC}" ] && DESC="$(readConfigKey "description" "${D}/manifest.yml")"
DESC="$(echo "${DESC}" | tr -d '\n\r\t\\' | sed "s/\"/'/g")"
echo "${ADDON} \"${DESC:-"unknown"}\""
done <<<"$(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort)"
}
###############################################################################
# Read Addon Key
# 1 - Addon
# 2 - key
function readAddonKey() {
if [ -z "${1}" ] || [ -z "${2}" ]; then
echo ""
return 1
fi
if [ ! -f "${ADDONS_PATH}/${1}/manifest.yml" ]; then
echo ""
return 1
fi
readConfigKey "${2}" "${ADDONS_PATH}/${1}/manifest.yml"
DESC="$(readConfigKey "description" "${D}/manifest.yml")"
echo -e "${ADDON}\t${DESC}"
done < <(find "${ADDONS_PATH}" -maxdepth 1 -type d | sort)
}
###############################################################################
@ -57,9 +21,6 @@ function readAddonKey() {
# 3 - Kernel Version
# Return ERROR if not exists
function checkAddonExist() {
if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ]; then
return 1 # ERROR
fi
# First check generic files
if [ -f "${ADDONS_PATH}/${1}/all.tgz" ]; then
return 0 # OK
@ -74,41 +35,25 @@ function checkAddonExist() {
###############################################################################
# Install Addon into ramdisk image
# 1 - Addon id
# 2 - Platform
# 3 - Kernel Version
# Return ERROR if not installed
function installAddon() {
if [ -z "${1}" ]; then
echo "ERROR: installAddon: Addon not defined"
return 1
fi
local ADDON="${1}"
ADDON="${1}"
mkdir -p "${TMP_PATH}/${ADDON}"
local HAS_FILES=0
HAS_FILES=0
# First check generic files
if [ -f "${ADDONS_PATH}/${ADDON}/all.tgz" ]; then
tar -zxf "${ADDONS_PATH}/${ADDON}/all.tgz" -C "${TMP_PATH}/${ADDON}" 2>"${LOG_FILE}"
if [ $? -ne 0 ]; then
return 1
fi
tar -zxf "${ADDONS_PATH}/${ADDON}/all.tgz" -C "${TMP_PATH}/${ADDON}"
HAS_FILES=1
fi
# Now check specific platform files
if [ -f "${ADDONS_PATH}/${ADDON}/${2}-${3}.tgz" ]; then
tar -zxf "${ADDONS_PATH}/${ADDON}/${2}-${3}.tgz" -C "${TMP_PATH}/${ADDON}" 2>"${LOG_FILE}"
if [ $? -ne 0 ]; then
return 1
fi
if [ -f "${ADDONS_PATH}/${ADDON}/${PLATFORM}-${KVER}.tgz" ]; then
tar -zxf "${ADDONS_PATH}/${ADDON}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/${ADDON}"
HAS_FILES=1
fi
# If has files to copy, copy it, else return error
if [ ${HAS_FILES} -ne 1 ]; then
echo "ERROR: installAddon: ${ADDON} addon not found" >"${LOG_FILE}"
return 1
fi
cp -f "${TMP_PATH}/${ADDON}/install.sh" "${RAMDISK_PATH}/addons/${ADDON}.sh" 2>"${LOG_FILE}"
[ ${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 -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}"
[ -d ${TMP_PATH}/${ADDON}/root ] && (cp -rnf "${TMP_PATH}/${ADDON}/root/"* "${RAMDISK_PATH}/" 2>"${LOG_FILE}" || dieLog)
rm -rf "${TMP_PATH}/${ADDON}"
return 0
}
@ -116,19 +61,27 @@ function installAddon() {
###############################################################################
# Untar an addon to correct path
# 1 - Addon file path
# Return name of addon on success or empty on error
# Return name of addon on sucess or empty on error
function untarAddon() {
if [ -z "${1}" ]; then
echo ""
return 1
fi
rm -rf "${TMP_PATH}/addon"
mkdir -p "${TMP_PATH}/addon"
tar -xaf "${1}" -C "${TMP_PATH}/addon" || return 1
local ADDON=$(readConfigKey "name" "${TMP_PATH}/addon/manifest.yml")
[ -z "${ADDON}" ] && return 1
tar -xaf "${1}" -C "${TMP_PATH}/addon" || return
ADDON=$(readConfigKey "name" "${TMP_PATH}/addon/manifest.yml")
[ -z "${ADDON}" ] && return
rm -rf "${ADDONS_PATH}/${ADDON}"
mv -f "${TMP_PATH}/addon" "${ADDONS_PATH}/${ADDON}"
echo "${ADDON}"
return 0
}
###############################################################################
# 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

@ -1,17 +1,9 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
###############################################################################
# Delete a key in config file
# 1 - Path of Key
# 2 - Path of yaml config file
function deleteConfigKey() {
yq eval "del(.${1})" --inplace "${2}" 2>/dev/null
yq eval 'del(.'${1}')' --inplace "${2}"
}
###############################################################################
@ -20,8 +12,7 @@ function deleteConfigKey() {
# 2 - Value
# 3 - Path of yaml config file
function writeConfigKey() {
local value="${2}"
[ "${value}" = "{}" ] && yq eval ".${1} = {}" --inplace "${3}" 2>/dev/null || yq eval ".${1} = \"${value}\"" --inplace "${3}" 2>/dev/null
[ "${2}" = "{}" ] && yq eval '.'${1}' = {}' --inplace "${3}" || yq eval '.'${1}' = "'"${2}"'"' --inplace "${3}"
}
###############################################################################
@ -30,27 +21,8 @@ function writeConfigKey() {
# 2 - Path of yaml config file
# Return Value
function readConfigKey() {
local result
result=$(yq eval ".${1} | explode(.)" "${2}" 2>/dev/null)
[ "${result}" = "null" ] && echo "" || echo "${result}"
}
###############################################################################
# Write to yaml config file
# 1 - Modules
# 2 - Path of yaml config file
function mergeConfigModules() {
# Error: bad file '-': cannot index array with '8139cp' (strconv.ParseInt: parsing "8139cp": invalid syntax)
# When the first key is a pure number, yq will not process it as a string by default. The current solution is to insert a placeholder key.
local MS ML XF
MS="RRORG\n${1// /\\n}"
ML="$(echo -en "${MS}" | awk '{print "modules."$1":"}')"
XF=$(mktemp 2>/dev/null)
XF=${XF:-/tmp/tmp.XXXXXXXXXX}
echo -en "${ML}" | yq -p p -o y >"${XF}"
deleteConfigKey 'modules."RRORG"' "${XF}"
yq eval-all --inplace '. as $item ireduce ({}; . * $item)' --inplace "${2}" "${XF}" 2>/dev/null
rm -f "${XF}"
RESULT=$(yq eval '.'${1}' | explode(.)' "${2}")
[ "${RESULT}" == "null" ] && echo "" || echo ${RESULT}
}
###############################################################################
@ -68,7 +40,7 @@ function initConfigKey() {
# 2 - Path of yaml config file
# Returns map of values
function readConfigMap() {
yq eval ".${1} | explode(.) | to_entries | map([.key, .value] | join(\": \")) | .[]" "${2}" 2>/dev/null
yq eval '.'${1}' | explode(.) | to_entries | map([.key, .value] | join(": ")) | .[]' "${2}"
}
###############################################################################
@ -77,7 +49,7 @@ function readConfigMap() {
# 2 - Path of yaml config file
# Returns array/map of values
function readConfigArray() {
yq eval ".${1}[]" "${2}" 2>/dev/null
yq eval '.'${1}'[]' "${2}"
}
###############################################################################
@ -86,13 +58,5 @@ function readConfigArray() {
# 2 - Path of yaml config file
# Returns array of values
function readConfigEntriesArray() {
yq eval ".${1} | explode(.) | to_entries | map([.key])[] | .[]" "${2}" 2>/dev/null
}
###############################################################################
# Check yaml config file
# 1 - Path of yaml config file
# Returns error information
function checkConfigFile() {
yq eval "${1}" 2>&1
yq eval '.'${1}' | explode(.) | to_entries | map([.key])[] | .[]' "${2}"
}

View File

@ -1,48 +1,30 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# shellcheck disable=SC2034
RR_VERSION="25.12.0"
RR_RELEASE=""
RR_VERSION="23.11.1"
RR_TITLE="RR v${RR_VERSION}"
# Define paths
# CHROOT_PATH: Defined during PC debugging.
PART1_PATH="${CHROOT_PATH}/mnt/p1"
PART2_PATH="${CHROOT_PATH}/mnt/p2"
PART3_PATH="${CHROOT_PATH}/mnt/p3"
TMP_PATH="${CHROOT_PATH}/tmp"
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_GRUB_CONFIG="${PART1_PATH}/boot/grub/grub.cfg"
USER_GRUBENVFILE="${PART1_PATH}/boot/grub/grubenv"
USER_RSYSENVFILE="${PART1_PATH}/boot/grub/rsysenv"
USER_CONFIG_FILE="${PART1_PATH}/user-config.yml"
USER_LOCALE_FILE="${PART1_PATH}/.locale"
GRUB_PATH="${PART1_PATH}/boot/grub"
ORI_ZIMAGE_FILE="${PART2_PATH}/zImage"
ORI_RDGZ_FILE="${PART2_PATH}/rd.gz"
RR_BZIMAGE_FILE="${PART3_PATH}/bzImage-rr"
RR_RAMDISK_FILE="${PART3_PATH}/initrd-rr"
RR_RAMUSER_FILE="${PART3_PATH}/initrd-rru"
MC_RAMDISK_FILE="${PART3_PATH}/microcode.img"
MOD_ZIMAGE_FILE="${PART3_PATH}/zImage-dsm"
MOD_RDGZ_FILE="${PART3_PATH}/initrd-dsm"
ADD_TIPS_FILE="${PART3_PATH}/AddTips"
CKS_PATH="${PART3_PATH}/cks"
LKMS_PATH="${PART3_PATH}/lkms"
LKM_PATH="${PART3_PATH}/lkms"
ADDONS_PATH="${PART3_PATH}/addons"
MODULES_PATH="${PART3_PATH}/modules"
USER_UP_PATH="${PART3_PATH}/users"
SCRIPTS_PATH="${PART3_PATH}/scripts"

View File

@ -5,334 +5,58 @@
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# This script is a CLI to RR.
#
# # Backup the original python3 executable.
# sudo mv -f "$(realpath $(which python3))/EXTERNALLY-MANAGED" "$(realpath $(which python3))/EXTERNALLY-MANAGED.bak" 2>/dev/null || true
# sudo pip3 install -U click requests requests-toolbelt qrcode[pil] beautifulsoup4
import os, click
WORK_PATH = os.path.abspath(os.path.dirname(__file__))
@click.group()
def cli():
"""
The CLI is a commands to RR.
The CLI is a commands to arpl.
"""
pass
def mutually_exclusive_options(ctx, param, value):
other_option = "file" if param.name == "data" else "data"
if value is not None and ctx.params.get(other_option) is not None:
raise click.UsageError(f"Illegal usage: `{param.name}` is mutually exclusive with `{other_option}`.")
return value
def validate_required_param(ctx, param, value):
if not value and "file" not in ctx.params and "data" not in ctx.params:
raise click.MissingParameter(param_decls=[param.name])
return value
def __fullversion(ver):
arr = ver.split('-')
a, b, c = (arr[0].split('.') + ['0', '0', '0'])[:3]
d = arr[1] if len(arr) > 1 else '00000'
e = arr[2] if len(arr) > 2 else '0'
return f'{a}.{b}.{c}-{d}-{e}'
@cli.command()
@click.option("-d", "--data", type=str, callback=mutually_exclusive_options, is_eager=True, help="The data of QRCode.")
@click.option("-f", "--file", type=str, callback=mutually_exclusive_options, is_eager=True, help="The file of QRCode.")
@click.option("--validate", is_flag=True, callback=validate_required_param, expose_value=False, is_eager=True)
@click.option("-l", "--location", type=click.IntRange(0, 7), required=True, help="The location of QRCode. (range 0<=x<=7)")
@click.option("-o", "--output", type=str, required=True, help="The output file of QRCode.")
def makeqr(data, file, location, output):
@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.
"""
try:
import fcntl, struct
import qrcode
from PIL import Image
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))
FBIOGET_VSCREENINFO = 0x4600
FBIOPUT_VSCREENINFO = 0x4601
FBIOGET_FSCREENINFO = 0x4602
FBDEV = "/dev/fb0"
if data:
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").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)
logo_path = os.path.join(WORK_PATH, "logo.png")
if os.path.exists(logo_path):
icon = Image.open(logo_path).convert("RGBA")
img.paste(icon.resize((img.size[0] // 5, img.size[1] // 5)), ((img.size[0] - img.size[0] // 5) // 2, (img.size[1] - img.size[1] // 5) // 2))
elif file:
img = Image.open(file)
# 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)
else:
raise click.UsageError("Either data or file must be provided.")
with open(FBDEV, "rb") as fb:
vi = fcntl.ioctl(fb, FBIOGET_VSCREENINFO, bytes(160))
res = struct.unpack("I" * 40, vi)
xres, yres = res[0], res[1] if res[0] and res[1] else (1920, 1080)
img = img.resize((xres // 8, xres // 8))
alpha = Image.new("RGBA", (xres, yres), (0, 0, 0, 0))
loc = (img.size[0] * location, alpha.size[1] - img.size[1])
alpha.paste(img, loc)
alpha.save(output)
except Exception as e:
click.echo(f"Error: {e}")
@cli.command()
@click.option("-p", "--platforms", type=str, help="The platforms of Syno.")
def getmodels(platforms=None):
"""
Get Syno Models.
"""
import re, json, requests, urllib3
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # type: ignore
adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
PS = platforms.lower().replace(",", " ").split() if platforms else []
models = []
try:
url = "http://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
#url = "https://update7.synology.com/autoupdate/genRSS.php?include_beta=1"
req = session.get(url, timeout=10, verify=False)
req.encoding = "utf-8"
p = re.compile(r"<mUnique>(.*?)</mUnique>.*?<mLink>(.*?)</mLink>", re.MULTILINE | re.DOTALL)
data = p.findall(req.text)
for item in data:
if not "DSM" in item[1]:
continue
arch = item[0].split("_")[1]
name = item[1].split("/")[-1].split("_")[1].replace("%2B", "+")
if PS and arch.lower() not in PS:
continue
if not any(m["name"] == name for m in models):
models.append({"name": name, "arch": arch})
models.sort(key=lambda k: (k["arch"], k["name"]))
except Exception as e:
# click.echo(f"Error: {e}")
pass
print(json.dumps(models, indent=4))
@cli.command()
@click.option("-p", "--platforms", type=str, help="The platforms of Syno.")
def getmodelsbykb(platforms=None):
"""
Get Syno Models.
"""
import re, json, requests, urllib3
from bs4 import BeautifulSoup
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # type: ignore
adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
PS = platforms.lower().replace(",", " ").split() if platforms else []
models = []
try:
url = "https://kb.synology.com/en-us/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have"
#url = "https://kb.synology.cn/zh-cn/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have"
req = session.get(url, timeout=10, verify=False)
req.encoding = "utf-8"
bs = BeautifulSoup(req.text, "html.parser")
p = re.compile(r"data: (.*?),$", re.MULTILINE | re.DOTALL)
data = json.loads(p.search(bs.find("script", string=p).prettify()).group(1))
model = "(.*?)" # (.*?): all, FS6400: one
p = re.compile(r"<td>{}<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td>".format(model), re.MULTILINE | re.DOTALL)
it = p.finditer(data["preload"]["content"].replace("\n", "").replace("\t", ""))
for i in it:
d = i.groups()
if len(d) == 6:
d = model + d
if PS and d[5].lower() not in PS:
continue
models.append({"name": d[0].split("<br")[0], "arch": d[5].lower()})
except Exception as e:
# click.echo(f"Error: {e}")
pass
models.sort(key=lambda x: (x["arch"], x["name"]))
print(json.dumps(models, indent=4))
@cli.command()
@click.option("-m", "--model", type=str, required=True, help="The model of Syno.")
@click.option("-v", "--version", type=str, required=True, help="The version of Syno.")
def getpats4mv(model, version):
import json, requests, urllib3
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # type: ignore
adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
pats = {}
try:
urlInfo = "https://www.synology.com/api/support/findDownloadInfo?lang=en-us"
urlSteps = "https://www.synology.com/api/support/findUpgradeSteps?"
#urlInfo = "https://www.synology.cn/api/support/findDownloadInfo?lang=zh-cn"
#urlSteps = "https://www.synology.cn/api/support/findUpgradeSteps?"
major = f"&major={version.split('.')[0]}" if len(version.split('.')) > 0 else ""
minor = f"&minor={version.split('.')[1]}" if len(version.split('.')) > 1 else ""
req = session.get(f"{urlInfo}&product={model.replace('+', '%2B')}{major}{minor}", timeout=10, verify=False)
req.encoding = "utf-8"
data = json.loads(req.text)
build_ver = data['info']['system']['detail'][0]['items'][0]['build_ver']
build_num = data['info']['system']['detail'][0]['items'][0]['build_num']
buildnano = data['info']['system']['detail'][0]['items'][0]['nano']
V = __fullversion(f"{build_ver}-{build_num}-{buildnano}")
if V not in pats:
pats[V] = {
'url': data['info']['system']['detail'][0]['items'][0]['files'][0]['url'].split('?')[0],
'sum': data['info']['system']['detail'][0]['items'][0]['files'][0].get('checksum', '0' * 32)
}
from_ver = min(I['build'] for I in data['info']['pubVers'])
for I in data['info']['productVers']:
if not I['version'].startswith(version):
continue
if not major or not minor:
majorTmp = f"&major={I['version'].split('.')[0]}" if len(I['version'].split('.')) > 0 else ""
minorTmp = f"&minor={I['version'].split('.')[1]}" if len(I['version'].split('.')) > 1 else ""
reqTmp = session.get(f"{urlInfo}&product={model.replace('+', '%2B')}{majorTmp}{minorTmp}", timeout=10, verify=False)
reqTmp.encoding = "utf-8"
dataTmp = json.loads(reqTmp.text)
build_ver = dataTmp['info']['system']['detail'][0]['items'][0]['build_ver']
build_num = dataTmp['info']['system']['detail'][0]['items'][0]['build_num']
buildnano = dataTmp['info']['system']['detail'][0]['items'][0]['nano']
V = __fullversion(f"{build_ver}-{build_num}-{buildnano}")
if V not in pats:
pats[V] = {
'url': dataTmp['info']['system']['detail'][0]['items'][0]['files'][0]['url'].split('?')[0],
'sum': dataTmp['info']['system']['detail'][0]['items'][0]['files'][0].get('checksum', '0' * 32)
}
for J in I['versions']:
to_ver = J['build']
reqSteps = session.get(f"{urlSteps}&product={model.replace('+', '%2B')}&from_ver={from_ver}&to_ver={to_ver}", timeout=10, verify=False)
if reqSteps.status_code != 200:
continue
reqSteps.encoding = "utf-8"
dataSteps = json.loads(reqSteps.text)
for S in dataSteps['upgrade_steps']:
if not S.get('full_patch') or not S['build_ver'].startswith(version):
continue
V = __fullversion(f"{S['build_ver']}-{S['build_num']}-{S['nano']}")
if V not in pats:
reqPat = session.head(S['files'][0]['url'].split('?')[0], timeout=10, verify=False)
if reqPat.status_code == 403:
continue
pats[V] = {
'url': S['files'][0]['url'].split('?')[0],
'sum': S['files'][0].get('checksum', '0' * 32)
}
except Exception as e:
# click.echo(f"Error: {e}")
pass
pats = {k: pats[k] for k in sorted(pats.keys(), reverse=True)}
print(json.dumps(pats, indent=4))
@cli.command()
@click.option("-p", "--models", type=str, help="The models of Syno.")
def getpats(models=None):
import re, json, requests, urllib3
from bs4 import BeautifulSoup
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # type: ignore
adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]))
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
MS = models.lower().replace(",", " ").split() if models else []
pats = {}
try:
req = session.get('https://archive.synology.com/download/Os/DSM', timeout=10, verify=False)
req.encoding = 'utf-8'
bs = BeautifulSoup(req.text, 'html.parser')
p = re.compile(r"(.*?)-(.*?)", re.MULTILINE | re.DOTALL)
l = bs.find_all('a', string=p)
for i in l:
ver = i.attrs['href'].split('/')[-1]
if not ver.startswith('7'):
continue
req = session.get(f'https://archive.synology.com{i.attrs["href"]}', timeout=10, verify=False)
req.encoding = 'utf-8'
bs = BeautifulSoup(req.text, 'html.parser')
p = re.compile(r"DSM_(.*?)_(.*?).pat", re.MULTILINE | re.DOTALL)
data = bs.find_all('a', string=p)
for item in data:
rels = p.search(item.attrs['href'])
if rels:
model, _ = rels.groups()
model = model.replace('%2B', '+')
if MS and model.lower() not in MS:
continue
if model not in pats:
pats[model] = {}
pats[model][__fullversion(ver)] = item.attrs['href']
except Exception as e:
# click.echo(f"Error: {e}")
pass
print(json.dumps(pats, indent=4))
alpha.paste(img, loc)
alpha.save(output)
if __name__ == "__main__":

View File

@ -1,50 +1,52 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
[ -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"
. ${WORK_PATH}/include/consts.sh
. ${WORK_PATH}/include/configFile.sh
. ${WORK_PATH}/include/i18n.sh
###############################################################################
# Check loader disk
function checkBootLoader() {
while read -r KNAME RO; do
[ -z "${KNAME}" ] && continue
[ "${RO}" = "0" ] && continue
hdparm -r0 "${KNAME}" >/dev/null 2>&1 || true
done <<<"$(lsblk -pno KNAME,RO 2>/dev/null)"
[ ! -w "${PART1_PATH}" ] && return 1
[ ! -w "${PART2_PATH}" ] && return 1
[ ! -w "${PART3_PATH}" ] && return 1
type awk >/dev/null 2>&1 || return 1
type cut >/dev/null 2>&1 || return 1
type sed >/dev/null 2>&1 || return 1
type tar >/dev/null 2>&1 || return 1
return 0
# Read key value from model config file
# 1 - Model
# 2 - Key
# Return Value
function readModelKey() {
readConfigKey "${2}" "${WORK_PATH}/model-configs/${1}.yml"
}
###############################################################################
# Read Entries as map(key=value) from model config
# 1 - Model
# 2 - Path of key
# Returns map of values
function readModelMap() {
readConfigMap "${2}" "${WORK_PATH}/model-configs/${1}.yml"
}
###############################################################################
# Read an array from model config
# 1 - Model
# 2 - Path of key
# Returns array/map of values
function readModelArray() {
readConfigArray "${2}" "${WORK_PATH}/model-configs/${1}.yml"
}
###############################################################################
# Check if loader is fully configured
# Returns 1 if not
function loaderIsConfigured() {
SN="$(readConfigKey "sn" "${USER_CONFIG_FILE}")"
[ -z "${SN}" ] && return 1
[ ! -f "${MOD_ZIMAGE_FILE}" ] && return 1
[ ! -f "${MOD_RDGZ_FILE}" ] && return 1
[ -z "$(readConfigKey "zimage-hash" "${USER_CONFIG_FILE}")" ] && return 1
[ -z "$(readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}")" ] && return 1
return 0 # OK
}
###############################################################################
# Just show error message and dies
function die() {
echo -e "\033[1;41m${*}\033[0m"
echo -e "\033[1;41m$@\033[0m"
exit 1
}
@ -58,48 +60,32 @@ function dieLog() {
exit 1
}
###############################################################################
# Check if an item exists in an array
# 1 - Item
# 2.. - Array
# Return 0 if exists
function arrayExistItem() {
local ITEM="${1}"
shift
for i in "$@"; do
[ "${i}" = "${ITEM}" ] && return 0
done
return 1
}
###############################################################################
# Generate a number with 6 digits from 1 to 30000
function random() {
printf "%06d" $((RANDOM % 30000 + 1))
printf "%06d" $((${RANDOM} % 30000 + 1))
}
###############################################################################
# Generate a hex number from 0x00 to 0xFF
# Generate a hexa number from 0x00 to 0xFF
function randomhex() {
printf "%02X" $((RANDOM % 255 + 1))
}
###############################################################################
# Generate a random digit (0-9A-Z)
function genRandomDigit() {
echo {0..9} | tr ' ' '\n' | sort -R | head -1
printf "&02X" "$((${RANDOM} % 255 + 1))"
}
###############################################################################
# Generate a random letter
function genRandomLetter() {
echo {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1
function generateRandomLetter() {
for i in A B C D E F G H J K L M N P Q R S T V W X Y Z; do
echo ${i}
done | sort -R | tail -1
}
###############################################################################
# Generate a random digit (0-9A-Z)
function genRandomValue() {
echo {0..9} {A..Z} | tr ' ' '\n' | grep -v '[IO]' | sort -R | head -1
function generateRandomValue() {
for i in 0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T V W X Y Z; do
echo ${i}
done | sort -R | tail -1
}
###############################################################################
@ -107,21 +93,17 @@ function genRandomValue() {
# 1 - Model
# Returns serial number
function generateSerial() {
local PREFIX MIDDLE SUFFIX SERIAL
PREFIX="$(readConfigArray "${1}.prefix" "${WORK_PATH}/serialnumber.yml" 2>/dev/null | sort -R | head -1)"
MIDDLE="$(readConfigArray "${1}.middle" "${WORK_PATH}/serialnumber.yml" 2>/dev/null | sort -R | head -1)"
SUFFIX="$(readConfigKey "${1}.suffix" "${WORK_PATH}/serialnumber.yml" 2>/dev/null)"
SERIAL="${PREFIX:-"0000"}${MIDDLE:-"XXX"}"
case "${SUFFIX:-"alpha"}" in
numeric)
SERIAL+="$(random)"
;;
alpha)
SERIAL+="$(genRandomLetter)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomValue)$(genRandomLetter)"
;;
SERIAL="$(readModelArray "${1}" "serial.prefix" | sort -R | tail -1)"
SERIAL+=$(readModelKey "${1}" "serial.middle")
case "$(readModelKey "${1}" "serial.suffix")" in
numeric)
SERIAL+=$(random)
;;
alpha)
SERIAL+=$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter)
;;
esac
echo "${SERIAL}"
echo ${SERIAL}
}
###############################################################################
@ -130,88 +112,87 @@ function generateSerial() {
# 2 - number
# Returns serial number
function generateMacAddress() {
local MACPRE MACSUF NUM MACS
MACPRE="$(readConfigArray "${1}.macpre" "${WORK_PATH}/serialnumber.yml" 2>/dev/null)"
MACSUF="$(printf '%02x%02x%02x' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))"
PRE="$(readModelArray "${1}" "serial.macpre")"
SUF="$(printf '%02x%02x%02x' $((${RANDOM} % 256)) $((${RANDOM} % 256)) $((${RANDOM} % 256)))"
NUM=${2:-1}
MACS=""
for I in $(seq 1 ${NUM}); do
MACS+="$(printf '%06x%06x' $((0x${MACPRE:-"001132"})) $((0x${MACSUF} + I)))"
[ ${I} -lt ${NUM} ] && MACS+=" "
printf '%06x%06x' $((0x${PRE:-"001132"})) $(($((0x${SUF})) + ${I}))
[ ${I} -lt ${NUM} ] && printf ' '
done
echo "${MACS}"
return 0
}
###############################################################################
# Validate a serial number for a model
# 1 - Model
# 2 - Serial number to test
# Returns 1 if serial number is invalid
# Returns 1 if serial number is valid
function validateSerial() {
local PREFIX MIDDLE SUFFIX P M S L
PREFIX="$(readConfigArray "${1}.prefix" "${WORK_PATH}/serialnumber.yml" 2>/dev/null)"
MIDDLE="$(readConfigArray "${1}.middle" "${WORK_PATH}/serialnumber.yml" 2>/dev/null)"
SUFFIX="$(readConfigKey "${1}.suffix" "${WORK_PATH}/serialnumber.yml" 2>/dev/null)"
P=${2:0:4}
M=${2:4:3}
S=${2:7}
PREFIX=$(readModelArray "${1}" "serial.prefix")
MIDDLE=$(readModelKey "${1}" "serial.middle")
S=${2:0:4}
P=${2:4:3}
L=${#2}
if [ ${L} -ne 13 ]; then
return 1
echo 0
return
fi
if ! arrayExistItem ${P} ${PREFIX}; then
return 1
echo "${PREFIX}" | grep -q "${S}"
if [ $? -eq 1 ]; then
echo 0
return
fi
if ! arrayExistItem ${M} ${MIDDLE}; then
return 1
if [ "${MIDDLE}" != "${P}" ]; then
echo 0
return
fi
case "${SUFFIX:-"alpha"}" in
numeric)
if ! echo "${S}" | grep -q "^[0-9]\{6\}$"; then
return 1
fi
;;
alpha)
if ! echo "${S}" | grep -q "^[A-Z][0-9][0-9][0-9][0-9][A-Z]$"; then
return 1
fi
;;
esac
return 0
echo 1
}
###############################################################################
# Check if a item exists into array
# 1 - Item
# 2.. - Array
# Return 0 if exists
function arrayExistItem() {
EXISTS=1
ITEM="${1}"
shift
for i in "$@"; do
[ "${i}" = "${ITEM}" ] || continue
EXISTS=0
break
done
return ${EXISTS}
}
###############################################################################
# Get values in .conf K=V file
# 1 - file
# 2 - key
# 1 - key
# 2 - file
function _get_conf_kv() {
grep "^${2}=" "${1}" 2>/dev/null | cut -d'=' -f2- | sed 's/^"//;s/"$//' 2>/dev/null
return $?
grep "${1}" "${2}" | sed "s|^${1}=\"\(.*\)\"$|\1|g"
}
###############################################################################
# Replace/remove/add values in .conf K=V file
# 1 - file
# 2 - key
# 3 - value
# 1 - name
# 2 - new_val
# 3 - path
function _set_conf_kv() {
# Delete
if [ -z "${3}" ]; then
sed -i "/^${2}=/d" "${1}" 2>/dev/null
if [ -z "${2}" ]; then
sed -i "${3}" -e "s/^${1}=.*$//"
return $?
fi
# Replace
if grep -q "^${2}=" "${1}" 2>/dev/null; then
sed -i "s#^${2}=.*#${2}=\"${3}\"#" "${1}" 2>/dev/null
if grep -q "^${1}=" "${3}"; then
sed -i "${3}" -e "s\"^${1}=.*\"${1}=\\\"${2}\\\"\""
return $?
fi
# Add if doesn't exist
mkdir -p "$(dirname "${1}" 2>/dev/null)" 2>/dev/null
echo "${2}=\"${3}\"" >>"${1}" 2>/dev/null
return $?
echo "${1}=\"${2}\"" >>"${3}"
}
###############################################################################
@ -219,24 +200,12 @@ function _set_conf_kv() {
# @ - url list
function _get_fastest() {
local speedlist=""
if type ping >/dev/null 2>&1; then
for I in "$@"; do
speed=$(LC_ALL=C ping -c 1 -W 5 "${I}" 2>/dev/null | awk -F'[= ]' '/time=/ {for(i=1;i<=NF;i++) if ($i=="time") print $(i+1)}')
speedlist+="${I} ${speed:-999}\n" # Assign default value 999 if speed is empty
done
else
for I in "$@"; do
speed=$(curl -skL -m 10 --connect-timeout 10 -w '%{time_total}' "${I}" -o /dev/null)
speed=$(awk "BEGIN {print (${speed:-0.999} * 1000)}")
speedlist+="${I} ${speed:-999}\n" # Assign default value 999 if speed is empty
done
fi
local fastest
fastest="$(echo -e "${speedlist}" | tr -s '\n' | awk '$2 != "999"' | sort -k2n | head -1)"
URL="$(echo "${fastest}" | awk '{print $1}')"
SPD="$(echo "${fastest}" | awk '{print $2}')" # It is a float type
echo "${URL:-${1}}"
[ "$(echo "${SPD:-999}" | cut -d'.' -f1)" -ge 999 ] && return 1 || return 0
for I in $@; do
speed=$(ping -c 1 -W 5 ${I} 2>/dev/null | awk '/time=/ {print $7}' | cut -d '=' -f 2)
speedlist+="${I} ${speed:-999}\n"
done
fastest="$(echo -e "${speedlist}" | tr -s '\n' | sort -k2n | head -1 | awk '{print $1}')"
echo "${fastest}"
}
###############################################################################
@ -244,265 +213,136 @@ function _get_fastest() {
# @1 -mac1,mac2,mac3...
function _sort_netif() {
ETHLIST=""
for F in /sys/class/net/eth*; do
[ ! -e "${F}" ] && continue
local ETH MAC BUS
ETH="$(basename "${F}")"
MAC="$(cat "/sys/class/net/${ETH}/address" 2>/dev/null | sed 's/://g; s/.*/\L&/')"
BUS="$(ethtool -i "${ETH}" 2>/dev/null | grep bus-info | cut -d' ' -f2)"
ETHX=$(ls /sys/class/net/ | grep eth) # real network cards list
for ETH in ${ETHX}; do
MAC="$(cat /sys/class/net/${ETH}/address | sed 's/://g' | tr '[:upper:]' '[:lower:]')"
BUS=$(ethtool -i ${ETH} | grep bus-info | awk '{print $2}')
ETHLIST="${ETHLIST}${BUS} ${MAC} ${ETH}\n"
done
ETHLISTTMPM=""
ETHLISTTMPB="$(echo -e "${ETHLIST}" | sort)"
if [ -n "${1}" ]; then
MACS="$(echo "${1}" | sed 's/://g; s/,/ /g; s/.*/\L&/')"
for MACX in ${MACS}; do
ETHLISTTMPM="${ETHLISTTMPM}$(echo -e "${ETHLISTTMPB}" | grep "${MACX}")\n"
ETHLISTTMPB="$(echo -e "${ETHLISTTMPB}" | grep -v "${MACX}")\n"
done
fi
ETHLIST="$(echo -e "${ETHLISTTMPM}${ETHLISTTMPB}" | grep -v '^$')"
ETHSEQ="$(echo -e "${ETHLIST}" | awk '{print $3}' | sed 's/eth//g')"
ETHNUM="$(echo -e "${ETHLIST}" | wc -l)"
# echo "${ETHSEQ}"
# sort
if [ ! "${ETHSEQ}" = "$(seq 0 $((${ETHNUM:0} - 1)))" ]; then
/etc/init.d/S41dhcpcd stop >/dev/null 2>&1
/etc/init.d/S40network stop >/dev/null 2>&1
for i in $(seq 0 $((${ETHNUM:0} - 1))); do
ip link set dev "eth${i}" name "tmp${i}"
if [ -n "${1}" ]; then
MACS=$(echo "${1}" | sed 's/://g' | tr '[:upper:]' '[:lower:]' | tr ',' ' ')
ETHLISTTMPC=""
ETHLISTTMPF=""
for MACX in ${MACS}; do
ETHLISTTMPC="${ETHLISTTMPC}$(echo -e "${ETHLIST}" | grep "${MACX}")\n"
done
I=0
for i in ${ETHSEQ}; do
ip link set dev "tmp${i}" name "eth${I}"
I=$((I + 1))
done
/etc/init.d/S40network start >/dev/null 2>&1
/etc/init.d/S41dhcpcd start >/dev/null 2>&1
while read -r BUS MAC ETH; do
[ -z "${MAC}" ] && continue
if echo "${MACS}" | grep -q "${MAC}"; then continue; fi
ETHLISTTMPF="${ETHLISTTMPF}${BUS} ${MAC} ${ETH}\n"
done <<EOF
$(echo -e ${ETHLIST} | sort)
EOF
ETHLIST="${ETHLISTTMPC}${ETHLISTTMPF}"
else
ETHLIST="$(echo -e "${ETHLIST}" | sort)"
fi
return 0
ETHLIST="$(echo -e "${ETHLIST}" | grep -v '^$')"
echo -e "${ETHLIST}" >${TMP_PATH}/ethlist
# cat ${TMP_PATH}/ethlist
# sort
IDX=0
while true; do
# 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 ethN
ip link set dev ${ETH} name eth${IDX}
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}/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_PATH}/ethlist
}
###############################################################################
# get bus of disk
# 1 - device path
function getBus() {
local BUS=""
[ -f "/.dockerenv" ] && BUS="docker"
# usb/ata(ide)/sata/sas/spi(scsi)/virtio/mmc/nvme
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,TRAN 2>/dev/null | grep "${1} " | awk '{print $2}' | sed 's/^ata$/ide/' | sed 's/^spi$/scsi/') #Spaces are intentional
# usb/scsi(ide/sata/sas)/virtio/mmc/nvme/vmbus/xen(xvd)
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep "${1} " | awk '{split($2,a,":"); if(length(a)>1) print a[length(a)-1]}' | sed 's/_host//' | sed 's/^.*xen.*$/xen/') # Spaces are intentional
[ -z "${BUS}" ] && BUS="unknown"
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}"
return 0
}
###############################################################################
# get IP
# 1 - ethN
function getIP() {
local IP=""
if [ -n "${1}" ] && [ -d "/sys/class/net/${1}" ]; then
IP=$(ip addr show "${1}" scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -d'/' -f1 | head -1)
[ -z "${IP}" ] && IP=$(ip route show dev "${1}" 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1)
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 addr show scope global 2>/dev/null | grep -E "inet .* eth" | awk '{print $2}' | cut -d'/' -f1 | head -1)
[ -z "${IP}" ] && IP=$(ip route show 2>/dev/null | sed -n 's/.* via .* src \(.*\) metric .*/\1/p' | head -1)
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}"
return 0
}
###############################################################################
# get logo of model
# 1 - model
function getLogo() {
local MODEL="${1}"
local fastest
local STATUS
MODEL="${1}"
rm -f "${PART3_PATH}/logo.png"
fastest="$(_get_fastest "www.synology.com" "www.synology.cn")"
STATUS=$(curl -skL --connect-timeout 10 -w "%{http_code}" "https://${fastest}/api/products/getPhoto?product=${MODEL/+/%2B}&type=img_s&sort=0" -o "${PART3_PATH}/logo.png")
if [ $? -ne 0 ] || [ "${STATUS:-0}" -ne 200 ] || [ ! -f "${PART3_PATH}/logo.png" ]; then
return 1
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
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
return 0
}
###############################################################################
# check Cmdline
# 1 - key name
# 2 - key string
function checkCmdline() {
grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep -q "^${1}=\"\?${2}\"\?"
}
###############################################################################
# set Cmdline
# 1 - key name
# 2 - key string
function setCmdline() {
[ -z "${1}" ] && return 1
if [ -n "${2}" ]; then
grub-editenv "${USER_GRUBENVFILE}" set "${1}=${2}"
else
grub-editenv "${USER_GRUBENVFILE}" unset "${1}"
fi
}
###############################################################################
# add Cmdline
# 1 - key name
# 2 - key string
function addCmdline() {
local CMDLINE
CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')"
[ -n "${CMDLINE}" ] && CMDLINE="${CMDLINE} ${2}" || CMDLINE="${2}"
setCmdline "${1}" "${CMDLINE}"
}
###############################################################################
# del Cmdline
# 1 - key name
# 2 - key string
function delCmdline() {
local CMDLINE
CMDLINE="$(grub-editenv "${USER_GRUBENVFILE}" list 2>/dev/null | grep "^${1}=" | cut -d'=' -f2- | sed 's/^"//;s/"$//')"
CMDLINE="$(echo "${CMDLINE}" | sed "s/[ \t]*${2}//; s/^[ \t]*//;s/[ \t]*$//")"
setCmdline "${1}" "${CMDLINE}"
}
###############################################################################
# check CPU Intel(VT-d)/AMD(AMD-Vi)
function checkCPU_VT_d() {
lsmod | grep -q msr || modprobe msr 2>/dev/null
if grep -q "GenuineIntel" /proc/cpuinfo 2>/dev/null; then
VT_D_ENABLED=$(rdmsr 0x3a 2>/dev/null)
[ "$((${VT_D_ENABLED:-0x0} & 0x5))" -eq $((0x5)) ] && return 0
elif grep -q "AuthenticAMD" /proc/cpuinfo 2>/dev/null; then
IOMMU_ENABLED=$(rdmsr 0xC0010114 2>/dev/null)
[ "$((${IOMMU_ENABLED:-0x0} & 0x1))" -eq $((0x1)) ] && return 0
else
return 1
fi
}
###############################################################################
# check BIOS Intel(VT-d)/AMD(AMD-Vi)
function checkBIOS_VT_d() {
if grep -q "GenuineIntel" /proc/cpuinfo 2>/dev/null; then
dmesg 2>/dev/null | grep -iq "DMAR-IR.*DRHD base" && return 0
elif grep -q "AuthenticAMD" /proc/cpuinfo 2>/dev/null; then
# TODO: need check
dmesg 2>/dev/null | grep -iq "AMD-Vi.*enabled" && return 0
else
return 1
fi
}
###############################################################################
# Rebooting
# 1 - mode
function rebootTo() {
local MODES="config recovery junior uefi memtest"
if [ -z "${1}" ] || ! echo "${MODES}" | grep -wq "${1}"; then exit 1; fi
# echo "Rebooting to ${1} mode"
GRUBPATH="$(dirname "$(find "${PART1_PATH}/" -name grub.cfg 2>/dev/null | head -1)")"
[ -z "${GRUBPATH}" ] && exit 1
ENVFILE="${GRUBPATH}/grubenv"
[ ! -f "${ENVFILE}" ] && grub-editenv "${ENVFILE}" create
grub-editenv "${ENVFILE}" set next_entry="${1}"
reboot
}
###############################################################################
# connect wlanif
# 1 netif name
# 2 enable/disable (1/0)
function connectwlanif() {
[ -z "${1}" ] || [ ! -d "/sys/class/net/${1}" ] && return 1
if [ "${2}" = "0" ]; then
if [ -f "/var/run/wpa_supplicant.pid.${1}" ]; then
kill -9 "$(cat /var/run/wpa_supplicant.pid.${1})"
rm -f "/var/run/wpa_supplicant.pid.${1}"
fi
else
local CONF
CONF="$([ -f "${PART1_PATH}/wpa_supplicant.conf" ] && echo "${PART1_PATH}/wpa_supplicant.conf" || echo "")"
[ -z "${CONF}" ] && return 2
[ -f "/var/run/wpa_supplicant.pid.${1}" ] && return 0
wpa_supplicant -i "${1}" -c "${CONF}" -qq -B -P "/var/run/wpa_supplicant.pid.${1}" >/dev/null 2>&1
fi
return 0
}
###############################################################################
# Find and mount the DSM root filesystem
function findDSMRoot() {
local DSMROOTS=""
[ -z "${DSMROOTS}" ] && DSMROOTS="$(mdadm --detail --scan 2>/dev/null | grep -v "INACTIVE-ARRAY" | grep -E "name=SynologyNAS:0|name=DiskStation:0|name=SynologyNVR:0|name=BeeStation:0" | awk '{print $2}' | uniq)"
[ -z "${DSMROOTS}" ] && DSMROOTS="$(lsblk -pno KNAME,PARTN,FSTYPE,FSVER,LABEL | grep -E "sd[a-z]{1,2}1" | grep -w "linux_raid_member" | grep "0.9" | awk '{print $1}')"
echo "${DSMROOTS}"
# (based on pocopico's TCRP code)
function findAndMountDSMRoot() {
[ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -gt 0 ] && return 0
dsmrootdisk="$(blkid | grep -i linux_raid_member | grep -E "/dev/.*1:" | head -1 | awk -F ":" '{print $1}')"
[ -z "${dsmrootdisk}" ] && return -1
[ ! -d "${DSMROOT_PATH}" ] && mkdir -p "${DSMROOT_PATH}"
[ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ] && mount -t ext4 "${dsmrootdisk}" "${DSMROOT_PATH}"
if [ $(mount | grep -i "${DSMROOT_PATH}" | wc -l) -eq 0 ]; then
echo "Failed to mount"
return -1
fi
return 0
}
###############################################################################
# check and fix the DSM root partition
# 1 - DSM root path
function fixDSMRootPart() {
if mdadm --detail "${1}" 2>/dev/null | grep -i "State" | grep -iEq "active|FAILED|Not Started"; then
mdadm --stop "${1}" >/dev/null 2>&1
mdadm --assemble --scan >/dev/null 2>&1
T="$(blkid -o value -s TYPE "${1}" 2>/dev/null | sed 's/linux_raid_member/ext4/')"
if [ "${T}" = "btrfs" ]; then
btrfs check --readonly "${1}" >/dev/null 2>&1
else
fsck "${1}" >/dev/null 2>&1
fi
fi
}
###############################################################################
# Copy DSM files to the boot partition
# 1 - DSM root path
function copyDSMFiles() {
if [ -f "${1}/VERSION" ] && [ -f "${1}/grub_cksum.syno" ] && [ -f "${1}/GRUB_VER" ] && [ -f "${1}/zImage" ] && [ -f "${1}/rd.gz" ]; then
# Remove old model files
rm -f "${PART1_PATH}/grub_cksum.syno" "${PART1_PATH}/GRUB_VER" "${PART2_PATH}/grub_cksum.syno" "${PART2_PATH}/GRUB_VER"
rm -f "${ORI_ZIMAGE_FILE}" "${ORI_RDGZ_FILE}"
# Remove old build files
rm -f "${MOD_ZIMAGE_FILE}" "${MOD_RDGZ_FILE}" >/dev/null
# Copy new model files
cp -f "${1}/grub_cksum.syno" "${PART1_PATH}"
cp -f "${1}/GRUB_VER" "${PART1_PATH}"
cp -f "${1}/grub_cksum.syno" "${PART2_PATH}"
cp -f "${1}/GRUB_VER" "${PART2_PATH}"
cp -f "${1}/zImage" "${ORI_ZIMAGE_FILE}"
cp -f "${1}/rd.gz" "${ORI_RDGZ_FILE}"
return 0
else
return 1
fi
}
###############################################################################
# Send a webhook notification
# 1 - webhook url
# 2 - message (optional)
function sendWebhook() {
local URL="${1}"
local MSGT="Notification from ${RR_TITLE}${RR_RELEASE:+(${RR_RELEASE})}"
local MSGC="${2:-"test at $(date +'%Y-%m-%d %H:%M:%S')"}"
[ -z "${URL}" ] && return 1
curl -skL -X POST -H "Content-Type: application/json" -d "{\"title\":\"${MSGT}\", \"text\":\"${MSGC}\"}" "${URL}" >/dev/null 2>&1
return $?
# Rebooting
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,22 +1,19 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
[ -z "${WORK_PATH}" -o ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" >/dev/null 2>&1 && pwd)"
type gettext >/dev/null 2>&1 && alias TEXT='gettext "rr"' || alias TEXT='echo'
shopt -s expand_aliases
[ -d "${WORK_PATH}/lang" ] && export TEXTDOMAINDIR="${WORK_PATH}/lang"
[ -f "${PART1_PATH}/.locale" ] && LC_ALL="$(cat "${PART1_PATH}/.locale")" && export LC_ALL="${LC_ALL}"
if [ -f "${PART1_PATH}/.timezone" ]; then
TIMEZONE="$(cat "${PART1_PATH}/.timezone")"
if [ -f "/usr/share/zoneinfo/right/${TIMEZONE}" ]; then
ln -sf "/usr/share/zoneinfo/right/${TIMEZONE}" /etc/localtime
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
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

View File

@ -1,154 +1,23 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
###############################################################################
# Unpack modules from a tgz file
# 1 - Platform
# 2 - Kernel Version
# 3 - dummy path
function unpackModules() {
local PLATFORM=${1}
local PKVER=${2}
local UNPATH=${3:-"${TMP_PATH}/modules"}
local KERNEL
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
rm -rf "${UNPATH}"
mkdir -p "${UNPATH}"
if [ "${KERNEL}" = "custom" ]; then
tar -zxf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}"
else
tar -zxf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}"
fi
}
###############################################################################
# Packag modules to a tgz file
# 1 - Platform
# 2 - Kernel Version
# 3 - dummy path
function packagModules() {
local PLATFORM=${1}
local PKVER=${2}
local UNPATH=${3:-"${TMP_PATH}/modules"}
local KERNEL
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
if [ "${KERNEL}" = "custom" ]; then
tar -zcf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}" .
else
tar -zcf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}" .
fi
}
###############################################################################
# Return list of all modules available
# 1 - Platform
# 2 - Kernel Version
function getAllModules() {
local PLATFORM=${1}
local PKVER=${2}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ]; then
return 1
fi
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
for D in "" "update"; do
for F in ${UNPATH}/${D:+${D}/}*.ko; do
[ ! -e "${F}" ] && continue
local N DESC
N="$(basename "${F}" .ko)"
DESC="$(modinfo -F description "${F}" 2>/dev/null)"
DESC="$(echo "${DESC}" | tr -d '\n\r\t\\' | sed "s/\"/'/g")"
echo "${D:+${D}/}${N} \"${DESC:-${D:+${D}/}${N}}\""
done
PLATFORM=${1}
KVER=${2}
# Unzip modules for temporary folder
rm -rf "${TMP_PATH}/modules"
mkdir -p "${TMP_PATH}/modules"
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
# Get list of all modules
for F in $(ls ${TMP_PATH}/modules/*.ko); do
X=$(basename ${F})
M=${X:0:-3}
DESC=$(modinfo ${F} | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}')
[ -z "${DESC}" ] && DESC="${X}"
echo "${M} \"${DESC}\""
done
rm -rf "${UNPATH}"
}
function getLoadedModules() {
local PLATFORM=${1}
local PKVER=${2}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ]; then
return 1
fi
UNPATH="${TMP_PATH}/lib/modules/$(uname -r)"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
depmod -a -b "${TMP_PATH}" >/dev/null 2>&1
ALL_KO=$(
find /sys/devices -name modalias -exec cat {} \; | while read -r modalias; do
modprobe -d "${TMP_PATH}" --resolve-alias "${modalias}" 2>/dev/null
done | sort -u
)
rm -rf "${UNPATH}"
ALL_DEPS=""
for M in ${ALL_KO}; do
ALL_DEPS="${ALL_DEPS} $(getdepends "${PLATFORM}" "${PKVER}" "${M}")"
done
echo "${ALL_DEPS}" | tr ' ' '\n' | grep -v '^$' | sort -u
return 0
}
###############################################################################
# Return list of all modules available
# 1 - Platform
# 2 - Kernel Version
# 3 - Module list
function installModules() {
local PLATFORM=${1}
local PKVER=${2}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ]; then
echo "ERROR: installModules: Platform or Kernel Version not defined" >"${LOG_FILE}"
return 1
fi
local MLIST ODP KERNEL
shift 2
MLIST="${*}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
for D in "" "update"; do
for F in ${UNPATH}/${D:+${D}/}*.ko; do
[ ! -e "${F}" ] && continue
M=$(basename "${F}")
[ "${ODP}" = "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" ] && continue # TODO: check if module is already loaded
if echo "${MLIST}" | grep -wq "${D:+${D}/}$(basename "${M}" .ko)"; then
mkdir -p "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}"
cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" 2>"${LOG_FILE}"
else
rm -f "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" 2>"${LOG_FILE}"
fi
done
done
rm -rf "${UNPATH}"
mkdir -p "${RAMDISK_PATH}/usr/lib/firmware"
KERNEL=$(readConfigKey "kernel" "${USER_CONFIG_FILE}")
if [ "${KERNEL}" = "custom" ]; then
tar -zxf "${CKS_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}"
else
tar -zxf "${MODULES_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}"
fi
if [ $? -ne 0 ]; then
return 1
fi
return 0
rm -rf "${TMP_PATH}/modules"
}
###############################################################################
@ -157,21 +26,15 @@ function installModules() {
# 2 - Kernel Version
# 3 - ko file
function addToModules() {
local PLATFORM=${1}
local PKVER=${2}
local KOFILE=${3}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ] || [ -z "${KOFILE}" ]; then
echo ""
return 1
fi
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
cp -f "${KOFILE}" "${UNPATH}"
packagModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
PLATFORM=${1}
KVER=${2}
KOFILE=${3}
# Unzip modules for temporary folder
rm -rf "${TMP_PATH}/modules"
mkdir -p "${TMP_PATH}/modules"
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
cp -f ${KOFILE} ${TMP_PATH}/modules
tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
}
###############################################################################
@ -180,21 +43,15 @@ function addToModules() {
# 2 - Kernel Version
# 3 - ko name
function delToModules() {
local PLATFORM=${1}
local PKVER=${2}
local KONAME=${3}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ] || [ -z "${KONAME}" ]; then
echo ""
return 1
fi
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
rm -f "${UNPATH}/${KONAME}"
packagModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
PLATFORM=${1}
KVER=${2}
KONAME=${3}
# Unzip modules for temporary folder
rm -rf "${TMP_PATH}/modules"
mkdir -p "${TMP_PATH}/modules"
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
rm -f ${TMP_PATH}/modules/${KONAME}
tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
}
###############################################################################
@ -204,31 +61,24 @@ function delToModules() {
# 3 - ko name
function getdepends() {
function _getdepends() {
if [ -f "${UNPATH}/${1}.ko" ]; then
local depends
depends="$(modinfo -F depends "${UNPATH}/${1}.ko" 2>/dev/null | sed 's/,/\n/g')"
if [ "$(echo "${depends}" | wc -w)" -gt 0 ]; then
for k in ${depends}; do
if [ -f "${TMP_PATH}/modules/${1}.ko" ]; then
depends=($(modinfo "${TMP_PATH}/modules/${1}.ko" | grep depends: | awk -F: '{print $2}' | awk '$1=$1' | sed 's/,/ /g'))
if [ ${#depends[*]} -gt 0 ]; then
for k in ${depends[@]}; do
echo "${k}"
_getdepends "${k}"
done
fi
fi
}
local PLATFORM=${1}
local PKVER=${2}
local KONAME=${3}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ] || [ -z "${KONAME}" ]; then
echo ""
return 1
fi
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
_getdepends "${KONAME}" | sort -u
echo "${KONAME}"
rm -rf "${UNPATH}"
PLATFORM=${1}
KVER=${2}
KONAME=${3}
# Unzip modules for temporary folder
rm -rf "${TMP_PATH}/modules"
mkdir -p "${TMP_PATH}/modules"
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
DPS=($(_getdepends ${KONAME} | tr ' ' '\n' | sort -u))
echo ${DPS[@]}
rm -rf "${TMP_PATH}/modules"
}

View File

@ -1,54 +1,31 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
set -e
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
[ -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"
if type vmware-toolbox-cmd >/dev/null 2>&1; then
if [ "Disable" = "$(vmware-toolbox-cmd timesync status 2>/dev/null)" ]; then
vmware-toolbox-cmd timesync enable >/dev/null 2>&1 || true
fi
if [ "Enabled" = "$(vmware-toolbox-cmd timesync status 2>/dev/null)" ]; then
vmware-toolbox-cmd timesync disable >/dev/null 2>&1 || true
fi
fi
. ${WORK_PATH}/include/functions.sh
. ${WORK_PATH}/include/addons.sh
[ -z "${LOADER_DISK}" ] && die "$(TEXT "Loader is not init!")"
checkBootLoader || die "$(TEXT "The loader is corrupted, please rewrite it!")"
# Shows title
clear
COLUMNS=$(ttysize 2>/dev/null | awk '{print $1}')
COLUMNS=${COLUMNS:-80}
TITLE="$(printf "$(TEXT "Welcome to %s")" "${RR_TITLE}${RR_RELEASE:+(${RR_RELEASE})}")"
DATE="$(date)"
printf "\033[1;44m%*s\n" "${COLUMNS}" ""
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;31m%*s\033[0m\n" "$(((${#TITLE} + COLUMNS) / 2))" "${TITLE}"
printf "\033[1;44m%*s\033[A\n" "${COLUMNS}" ""
printf "\033[1;32m%*s\033[0m\n" "${COLUMNS}" "${DATE}"
[ -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} ""
# Get first MAC address
ETHX="$(find /sys/class/net/ -mindepth 1 -maxdepth 1 ! -name lo -exec basename {} \; | sort)"
ETHX=($(ls /sys/class/net/ | grep eth)) # real network cards list
# No network devices
[ "$(echo "${ETHX}" | wc -w)" -le 0 ] && die "$(TEXT "Network devices not found! Please re execute init.sh after connecting to the network!")"
[ ${#ETHX[@]} -le 0 ] && die "$(TEXT "Network devices not found!")"
# If user config file not exists, initialize it
if [ ! -f "${USER_CONFIG_FILE}" ]; then
touch "${USER_CONFIG_FILE}"
fi
initConfigKey "kernel" "official" "${USER_CONFIG_FILE}"
initConfigKey "rd-compressed" "false" "${USER_CONFIG_FILE}"
initConfigKey "satadom" "2" "${USER_CONFIG_FILE}"
initConfigKey "lkm" "prod" "${USER_CONFIG_FILE}"
initConfigKey "dsmlogo" "true" "${USER_CONFIG_FILE}"
initConfigKey "directboot" "false" "${USER_CONFIG_FILE}"
@ -59,22 +36,16 @@ initConfigKey "kernelway" "power" "${USER_CONFIG_FILE}"
initConfigKey "kernelpanic" "5" "${USER_CONFIG_FILE}"
initConfigKey "odp" "false" "${USER_CONFIG_FILE}"
initConfigKey "hddsort" "false" "${USER_CONFIG_FILE}"
initConfigKey "usbasinternal" "false" "${USER_CONFIG_FILE}"
initConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}"
initConfigKey "platform" "" "${USER_CONFIG_FILE}"
initConfigKey "model" "" "${USER_CONFIG_FILE}"
initConfigKey "modelid" "" "${USER_CONFIG_FILE}"
initConfigKey "productver" "" "${USER_CONFIG_FILE}"
initConfigKey "buildnum" "" "${USER_CONFIG_FILE}"
initConfigKey "smallnum" "" "${USER_CONFIG_FILE}"
initConfigKey "dt" "" "${USER_CONFIG_FILE}"
initConfigKey "kver" "" "${USER_CONFIG_FILE}"
initConfigKey "kpre" "" "${USER_CONFIG_FILE}"
initConfigKey "paturl" "" "${USER_CONFIG_FILE}"
initConfigKey "patsum" "" "${USER_CONFIG_FILE}"
initConfigKey "sn" "" "${USER_CONFIG_FILE}"
initConfigKey "mac1" "" "${USER_CONFIG_FILE}"
initConfigKey "mac2" "" "${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}"
@ -82,71 +53,41 @@ initConfigKey "ramdisk-hash" "" "${USER_CONFIG_FILE}"
initConfigKey "cmdline" "{}" "${USER_CONFIG_FILE}"
initConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
initConfigKey "addons" "{}" "${USER_CONFIG_FILE}"
if [ -z "$(readConfigMap "addons" "${USER_CONFIG_FILE}")" ]; then
initConfigKey "addons.acpid" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.trivial" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.vmtools" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.monitor" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.mountloader" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.powersched" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.reboottoloader" "" "${USER_CONFIG_FILE}"
fi
initConfigKey "addons.misc" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.acpid" "" "${USER_CONFIG_FILE}"
initConfigKey "addons.reboottoloader" "" "${USER_CONFIG_FILE}"
initConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
initConfigKey "modblacklist" "evbug,cdc_ether" "${USER_CONFIG_FILE}"
if [ ! -f "/.dockerenv" ]; then
if arrayExistItem "sortnetif:" "$(readConfigMap "addons" "${USER_CONFIG_FILE}")"; then
_sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")"
# _sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")"
for ETH in ${ETHX[@]}; do
MACR="$(cat /sys/class/net/${ETH}/address | sed 's/://g')"
IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
if [ -n "${IPR}" ]; then
ip addr add ${IPC}/24 dev ${ETH}
sleep 1
fi
for N in ${ETHX}; do
MACR="$(cat "/sys/class/net/${N}/address" 2>/dev/null | sed 's/://g')"
IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
if [ -n "${IPR}" ]; then
if [ ! "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
ip link set "${N}" up 2>/dev/null || true
fi
IFS='/' read -r -a IPRA <<<"${IPR}"
ip addr flush dev "${N}" 2>/dev/null || true
ip addr add "${IPRA[0]}/${IPRA[1]:-"255.255.255.0"}" dev "${N}" 2>/dev/null || true
if [ -n "${IPRA[2]}" ]; then
ip route add default via "${IPRA[2]}" dev "${N}" 2>/dev/null || true
fi
if [ -n "${IPRA[3]:-${IPRA[2]}}" ]; then
sed -i "/nameserver ${IPRA[3]:-${IPRA[2]}}/d" /etc/resolv.conf
echo "nameserver ${IPRA[3]:-${IPRA[2]}}" >>/etc/resolv.conf
fi
sleep 1
fi
[ "${N::4}" = "wlan" ] && connectwlanif "${N}" 1 && sleep 1
[ "${N::3}" = "eth" ] && ethtool -s "${N}" wol g 2>/dev/null || true
# [ "${N::3}" = "eth" ] && ethtool -K ${N} rxhash off 2>/dev/null || true
done
fi
ethtool -s ${ETH} wol g 2>/dev/null
done
# Get the VID/PID if we are in USB
VID="0x46f4"
PID="0x0001"
TYPE="DoM"
BUS=$(getBus "${LOADER_DISK}")
BUSLIST="usb sata sas scsi nvme mmc ide virtio vmbus xen docker"
if [ "${BUS}" = "usb" ]; then
VID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_VENDOR_ID" | cut -d= -f2)"
PID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_MODEL_ID" | cut -d= -f2)"
[ "${VID}" = "0x" ] || [ "${PID}" = "0x" ] && die "$(TEXT "The loader disk does not support the current USB Portable Hard Disk.")"
TYPE="flashdisk"
elif [ "${BUS}" = "docker" ]; then
TYPE="PC"
elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then
die "$(printf "$(TEXT "The loader disk does not support the current %s, only %s DoM is supported.")" "${BUS}" "${BUSLIST// /\/}")"
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" -a "${BUS}" != "nvme" ]; then
die "$(TEXT "Loader disk neither USB or SATA/SCSI/NVME DoM")"
fi
# Save variables to user config file
writeConfigKey "vid" "${VID}" "${USER_CONFIG_FILE}"
writeConfigKey "pid" "${PID}" "${USER_CONFIG_FILE}"
writeConfigKey "vid" ${VID} "${USER_CONFIG_FILE}"
writeConfigKey "pid" ${PID} "${USER_CONFIG_FILE}"
# Inform user
printf "%s \033[1;32m%s (%s %s)\033[0m\n" "$(TEXT "Loader disk:")" "${LOADER_DISK}" "${BUS^^}" "${TYPE}"
echo -e "$(TEXT "Loader disk:") \033[1;32m${LOADER_DISK}\033[0m (\033[1;32m${BUS^^} flashdisk\033[0m)"
# Load keymap name
LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")"
@ -154,135 +95,98 @@ KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
# Loads a keymap if is valid
if [ -f "/usr/share/keymaps/i386/${LAYOUT}/${KEYMAP}.map.gz" ]; then
printf "%s \033[1;32m%s/%s\033[0m\n" "$(TEXT "Loading keymap:")" "${LAYOUT}" "${KEYMAP}"
echo -e "$(TEXT "Loading keymap") \033[1;32m${LAYOUT}/${KEYMAP}\033[0m"
zcat "/usr/share/keymaps/i386/${LAYOUT}/${KEYMAP}.map.gz" | loadkeys
fi
# Decide if boot automatically
BOOT=1
if ! loaderIsConfigured; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Loader is not configured!")"
echo -e "\033[1;33m$(TEXT "Loader is not configured!")\033[0m"
BOOT=0
elif grep -q "IWANTTOCHANGETHECONFIG" /proc/cmdline; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "User requested edit settings.")"
BOOT=0
elif [ -f "/.dockerenv" ]; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Docker edit settings.")"
echo -e "\033[1;33m$(TEXT "User requested edit settings.")\033[0m"
BOOT=0
fi
# If is to boot automatically, do it
if [ ${BOOT} -eq 1 ]; then
"${WORK_PATH}/boot.sh" && exit 0
boot.sh && exit 0
fi
HTTP=$(grep -i '^HTTP_PORT=' /etc/rrorg.conf 2>/dev/null | cut -d'=' -f2)
DUFS=$(grep -i '^DUFS_PORT=' /etc/rrorg.conf 2>/dev/null | cut -d'=' -f2)
TTYD=$(grep -i '^TTYD_PORT=' /etc/rrorg.conf 2>/dev/null | cut -d'=' -f2)
# Wait for an IP
printf "$(TEXT "Detected %s network cards.\n")" "$(echo "${ETHX}" | wc -w)"
printf "$(TEXT "Checking Connect.")"
echo "$(printf "$(TEXT "Detected %s network cards.")" "${#ETHX[@]}")"
echo "$(TEXT "Checking Connect.")"
COUNT=0
while [ ${COUNT} -lt 30 ]; do
MSG=""
for N in ${ETHX}; do
if [ "1" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
MSG+="${N} "
hasConnect="false"
for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
if ethtool ${ETHX[${N}]} | grep 'Link detected' | grep -q 'yes'; then
echo -en "${ETHX[${N}]} "
hasConnect="true"
fi
done
if [ -n "${MSG}" ]; then
printf "\r%s%s \n" "${MSG}" "$(TEXT "connected.")"
if [ "${hasConnect}" = "true" ]; then
echo -en "connected.\n"
break
fi
COUNT=$((COUNT + 1))
printf "."
COUNT=$((${COUNT} + 1))
echo -n "."
sleep 1
done
if [ ! -f "/.dockerenv" ]; then
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
fi
printf "$(TEXT "Waiting IP.\n")"
for N in ${ETHX}; do
echo "$(TEXT "Waiting IP.")"
for N in $(seq 0 $(expr ${#ETHX[@]} - 1)); do
COUNT=0
DRIVER="$(basename "$(realpath "/sys/class/net/${N}/device/driver" 2>/dev/null)" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
printf "%s(%s): " "${N}" "${MAC}@${DRIVER}"
DRIVER=$(ls -ld /sys/class/net/${ETHX[${N}]}/device/driver 2>/dev/null | awk -F '/' '{print $NF}')
echo -en "${ETHX[${N}]}(${DRIVER}): "
while true; do
if [ -z "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "DOWN")"
if ! ip link show ${ETHX[${N}]} | grep -q 'UP'; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "DOWN")\n"
break
fi
if [ "0" = "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "NOT CONNECTED")"
if ethtool ${ETHX[${N}]} | grep 'Link detected' | grep -q 'no'; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "NOT CONNECTED")\n"
break
fi
if [ ${COUNT} -eq 15 ]; then # Under normal circumstances, no errors should occur here.
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "TIMEOUT (Please check the IP on the router.)")"
if [ ${COUNT} -eq 15 ]; then
echo -en "\r${ETHX[${N}]}(${DRIVER}): $(TEXT "TIMEOUT (Please check the IP on the router.)")\n"
break
fi
COUNT=$((COUNT + 1))
IP="$(getIP "${N}")"
COUNT=$((${COUNT} + 1))
IP="$(getIP ${ETHX[${N}]})"
if [ -n "${IP}" ]; then
if echo "${IP}" | grep -q "^169\.254\."; then
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(TEXT "LINK LOCAL (No DHCP server detected.)")"
else
printf "\r%s(%s): %s\n" "${N}" "${MAC}@${DRIVER}" "$(printf "$(TEXT "Access \033[1;34mhttp://%s:%d\033[0m to configure the loader via web terminal.")" "${IP}" "${TTYD:-7681}")"
fi
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
fi
printf "."
echo -n "."
sleep 1
done
done
# Inform user
printf "\n"
printf "$(TEXT "Call \033[1;32minit.sh\033[0m to re get init info\n")"
printf "$(TEXT "Call \033[1;32mmenu.sh\033[0m to configure loader\n")"
printf "\n"
[ -n "$(cat "${ADD_TIPS_FILE}" 2>/dev/null)" ] && printf "$(TEXT "%s\n")" "$(cat "${ADD_TIPS_FILE}" 2>/dev/null)"
printf "$(TEXT "User config is on \033[1;32m%s\033[0m\n")" "${USER_CONFIG_FILE}"
printf "$(TEXT "HTTP: \033[1;34mhttp://%s:%d\033[0m\n")" "rr" "${HTTP:-7080}"
printf "$(TEXT "DUFS: \033[1;34mhttp://%s:%d\033[0m\n")" "rr" "${DUFS:-7304}"
printf "$(TEXT "TTYD: \033[1;34mhttp://%s:%d\033[0m\n")" "rr" "${TTYD:-7681}"
printf "\n"
if [ -f "/etc/shadow-" ]; then
printf "$(TEXT "SSH port is \033[1;31m%d\033[0m, The \033[1;31mroot\033[0m password has been changed\n")" "22"
else
printf "$(TEXT "SSH port is \033[1;31m%d\033[0m, The \033[1;31mroot\033[0m password is \033[1;31m%s\033[0m\n")" "22" "rr"
fi
printf "\n"
echo
echo -e "$(TEXT "Call \033[1;32mmenu.sh\033[0m to configure loader")"
echo
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" ] && [ -c "/dev/fb0" ] && [ ! -f "/.dockerenv" ]; then
if [ "${DSMLOGO}" = "true" -a -c "/dev/fb0" ]; then
IP="$(getIP)"
echo "${IP}" | grep -q "^169\.254\." && IP=""
[ -n "${IP}" ] && URL="http://${IP}:${TTYD:-7681}" || URL="http://rr:${TTYD:-7681}"
python3 "${WORK_PATH}/include/functions.py" makeqr -d "${URL}" -l "0" -o "${TMP_PATH}/qrcode_init.png"
[ -f "${TMP_PATH}/qrcode_init.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_init.png" >/dev/null 2>&1 || true
fi
WEBHOOKURL="$(readConfigKey "webhookurl" "${USER_CONFIG_FILE}")"
if [ -n "${WEBHOOKURL}" ] && [ ! -f "${TMP_PATH}/WebhookSent" ] && [ ! -f "/.dockerenv" ]; then
DMI="$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i')"
IP="$(getIP)"
echo "${IP}" | grep -q "^169\.254\." && IP=""
[ -n "${IP}" ] && URL="http://${IP}:${TTYD:-7681}" || URL="http://rr:${TTYD:-7681}"
sendWebhook "${WEBHOOKURL}" "{\"RR\":\"${RR_TITLE}${RR_RELEASE:+(${RR_RELEASE})}\", \"DATE\":\"$(date +'%Y-%m-%d %H:%M:%S')\", \"DMI\":\"${DMI}\", \"URL\":\"${URL}\"}"
touch "${TMP_PATH}/WebhookSent"
[ -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="$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo 2>/dev/null)"
if [ "${RAM:-0}" -le 3500 ]; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "You have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of memory.")"
RAM=$(free -m | awk '/Mem:/{print$2}')
if [ ${RAM} -le 3500 ]; then
echo -e "\033[1;33m$(TEXT "You have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of memory.")\033[0m\n"
fi
mkdir -p "${CKS_PATH}"
mkdir -p "${LKMS_PATH}"
mkdir -p "${ADDONS_PATH}"
mkdir -p "${LKM_PATH}"
mkdir -p "${MODULES_PATH}"
exit 0
updateAddons

BIN
files/initrd/opt/rr/kmod Executable file

Binary file not shown.

Binary file not shown.

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

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

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

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

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

View File

@ -0,0 +1,73 @@
id: "DS1019+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_leds_lp3943: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "apollolake"
unique: "synology_apollolake_1019+"
serial:
prefix:
- "1850"
- "1880"
middle: "QXR"
suffix: "numeric"
flags:
- "movbe"
dom: 2
dt: false
disks: 4
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,70 @@
id: "DS1520+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_1520+"
serial:
prefix:
- "2060"
middle: "RYR"
suffix: "alpha"
dom: 2
dt: true
disks: 6
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,52 @@
id: "DS1522+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "r1000"
unique: "synology_r1000_1522+"
serial:
prefix:
- "2270"
middle: "TRR"
suffix: "alpha"
macpre: 9009d0
dom: 2
dt: true
disks: 5
beta: true
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "DS1621+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
synoboot2:
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_1621+"
serial:
prefix:
- "2080"
middle: "S7R"
suffix: "alpha"
dom: 2
dt: true
disks: 6
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,70 @@
id: "DS1621xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_oob_ctl: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_1621xs+"
serial:
prefix:
- "2070"
middle: "RVR"
suffix: "alpha"
dom: 1
dt: false
disks: 6
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,69 @@
id: "DS1819+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "denverton"
unique: "synology_denverton_1819+"
serial:
prefix:
- "1890"
middle: "R5R"
suffix: "alpha"
dom: 2
dt: false
disks: 8
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "DS1821+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
synoboot2:
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_1821+"
serial:
prefix:
- "2110"
middle: "SKR"
suffix: "alpha"
dom: 2
dt: true
disks: 8
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,51 @@
id: "DS1823xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
synoboot2:
syno_hdd_detect: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_1823xs+"
serial:
prefix:
- "2280"
middle: "V5R"
suffix: "alpha"
dom: 2
dt: true
disks: 12
beta: false
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,70 @@
id: "DS220+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_220+"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "alpha"
dom: 2
dt: true
disks: 2
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,43 @@
id: "DS423+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_423+"
serial:
prefix:
- "2350"
middle: "WBR"
suffix: "alpha"
dom: 2
dt: true
disks: 2
beta: false
productvers:
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,69 @@
id: "DS2419+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "denverton"
unique: "synology_denverton_2419+"
serial:
prefix:
- "1880"
middle: "QZA"
suffix: "alpha"
dom: 2
dt: false
disks: 8
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,61 @@
id: "DS2422+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
synoboot2:
syno_hdd_detect: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_2422+"
serial:
prefix:
- "2140"
- "2180"
middle: "SLR"
suffix: "alpha"
dom: 2
dt: true
disks: 12
beta: false
productvers:
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,62 @@
id: "DS3615xs"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "bromolow"
unique: "synology_bromolow_3615xs"
serial:
prefix:
- "1130"
- "1230"
- "1330"
- "1430"
middle: "LWN"
suffix: "numeric"
dom: 1
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "DS3617xs"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwell"
unique: "synology_broadwell_3617xs"
serial:
prefix:
- "1130"
- "1230"
- "1330"
- "1430"
middle: "ODN"
suffix: "numeric"
dom: 1
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,61 @@
id: "DS3622xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_oob_ctl: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_3622xs+"
serial:
prefix:
- "2150"
middle: "SQR"
suffix: "alpha"
dom: 1
dt: false
disks: 12
beta: false
productvers:
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,52 @@
id: "DS423+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_423+"
serial:
prefix:
- "22A0"
middle: "VKR"
suffix: "alpha"
dom: 2
dt: true
disks: 4
beta: false
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "DS718+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_leds_lp3943: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "apollolake"
unique: "synology_apollolake_718+"
serial:
prefix:
- "1930"
middle: "PEN"
suffix: "numeric"
flags:
- "movbe"
dom: 2
dt: false
disks: 4
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "DS720+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_720+"
serial:
prefix:
- "2010"
- "2110"
middle: "QWR"
suffix: "alpha"
dom: 2
dt: true
disks: 2
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,51 @@
id: "DS723+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "r1000"
unique: "synology_r1000_723+"
serial:
prefix:
- "2270"
middle: "TQR"
suffix: "alpha"
dom: 2
dt: true
disks: 2
beta: true
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "DS916+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "braswell"
unique: "synology_braswell_916+"
serial:
prefix:
- "1130"
- "1230"
- "1330"
- "1430"
middle: "NZN"
suffix: "numeric"
dom: 2
dt: false
disks: 4
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "DS918+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_leds_lp3943: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "apollolake"
unique: "synology_apollolake_918+"
serial:
prefix:
- "1910"
middle: "PDN"
suffix: "numeric"
flags:
- "movbe"
dom: 2
dt: false
disks: 4
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,73 @@
id: "DS920+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_920+"
serial:
prefix:
- "2030"
- "2040"
- "20C0"
- "2150"
middle: "SBR"
suffix: "alpha"
dom: 2
dt: true
disks: 4
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,52 @@
id: "DS923+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "r1000"
unique: "synology_r1000_923+"
serial:
prefix:
- "2270"
middle: "TQR"
suffix: "alpha"
macpre: 9009d0
dom: 2
dt: true
disks: 4
beta: false
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,55 @@
id: "DVA1622"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
HddEnableDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "geminilake"
unique: "synology_geminilake_dva1622"
serial:
prefix:
- "2030"
- "2040"
- "20C0"
- "2150"
middle: "UBR"
suffix: "alpha"
dom: 2
dt: true
disks: 2
beta: false
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "DVA3219"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "denverton"
unique: "synology_denverton_dva3219"
serial:
prefix:
- "1930"
- "1940"
middle: "RFR"
suffix: "alpha"
flags:
- "movbe"
dom: 2
dt: false
disks: 4
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,74 @@
id: "DVA3221"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "denverton"
unique: "synology_denverton_dva3221"
serial:
prefix:
- "2030"
- "2040"
- "20C0"
- "2150"
middle: "SJR"
suffix: "alpha"
flags:
- "movbe"
dom: 2
dt: false
disks: 4
beta: false
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,60 @@
id: "FS2500"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
intel_iommu: "igfx_off"
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_fs2500"
serial:
prefix:
- "1960"
middle: "PSN"
suffix: "numeric"
dom: 2
dt: true
disks: 12
beta: true
productvers:
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,68 @@
id: "FS3017"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
buzzeroffen: "0xffff"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "grantley"
unique: "synology_grantley_fs3017"
serial:
prefix:
- "1650"
middle: "O8N"
suffix: "numeric"
dom: 1
dt: false
disks: 24
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "FS6400"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
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"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "purley"
unique: "synology_purley_fs6400"
serial:
prefix:
- "1960"
middle: "PSN"
suffix: "numeric"
dom: 2
dt: true
disks: 24
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "HD6500"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
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"
cmdline: &cmdline
synoboot2:
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
modprobe.blacklist: mpt3sas
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "purley"
unique: "synology_purley_hd6500"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "numeric"
dom: 2
dt: true
disks: 24
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,72 @@
id: "RS1221+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
synoboot2:
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_rs1221+"
serial:
prefix:
- "20B0"
middle: "RWR"
suffix: "alpha"
dom: 2
dt: true
disks: 8
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,69 @@
id: "RS1619xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_rs1619xs+"
serial:
prefix:
- "1920"
middle: "QPR"
suffix: "alpha"
dom: 2
dt: false
disks: 4
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,51 @@
id: "RS2423+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
synoboot2:
syno_hdd_detect: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_rs2423+"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "alpha"
dom: 2
dt: true
disks: 24
beta: false
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,54 @@
id: "RS2423RP+"
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"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
synoboot2:
syno_hdd_detect: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
syno_ttyS0: "serial,0x3f8"
syno_ttyS1: "serial,0x2f8"
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
platform: "v1000"
unique: "synology_v1000_rs2423rp+"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "alpha"
dom: 2
dt: true
disks: 24
beta: true
productvers:
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,59 @@
id: "RS3413xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "bromolow"
unique: "synology_bromolow_rs3413xs+"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "numeric"
dom: 1
dt: false
disks: 16
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "3.10.108"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,69 @@
id: "RS3618xs"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
supportssdcache: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwell"
unique: "synology_broadwell_rs3618xs"
serial:
prefix:
- "0000"
middle: "XXX"
suffix: "alpha"
dom: 2
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "3.10.105"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,69 @@
id: "RS3621xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_rs3621xs+"
serial:
prefix:
- "20A0"
middle: "SZR"
suffix: "alpha"
dom: 2
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,70 @@
id: "RS4021xs+"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_rs4021xs+"
serial:
prefix:
- "2160"
middle: "T2R"
suffix: "alpha"
macpre: 9009d0
dom: 2
dt: false
disks: 16
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "SA3200D"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
synoboot2:
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellntbap"
unique: "synology_broadwellntbap_sa3200d"
serial:
prefix:
- "19A0"
middle: "S4R"
suffix: "alpha"
dom: 1
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

View File

@ -0,0 +1,71 @@
id: "SA3400"
synoinfo: &synoinfo
support_disk_compatibility: "no"
support_memory_compatibility: "no"
support_led_brightness_adjustment: "no"
support_bde_internal_10g: "no"
support_syno_hybrid_raid:
supportraidgroup:
maxlanport: "8"
netif_seq: "0 1 2 3 4 5 6 7"
cmdline: &cmdline
HddHotplug: 0
synoboot2:
syno_hdd_detect: 0
syno_hdd_powerup_seq: 0
SMBusHddDynamicPower: 1
vender_format_version: 2
elevator: elevator
patch: &patch
- "ramdisk-etc-rc-*.patch"
- "ramdisk-init-script-v4-*.patch"
- "ramdisk-post-init-script-*.patch"
- "ramdisk-disable-root-pwd-*.patch"
- "ramdisk-disable-disabled-ports-*.patch"
platform: "broadwellnk"
unique: "synology_broadwellnk_sa3400"
serial:
prefix:
- "1920"
middle: "RJR"
suffix: "alpha"
dom: 1
dt: false
disks: 12
beta: true
productvers:
"6.2":
kver: "4.4.59"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.0":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.1":
kver: "4.4.180"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch
"7.2":
kver: "4.4.302"
rd-compressed: false
cmdline:
<<: *cmdline
synoinfo:
<<: *synoinfo
patch: *patch

Some files were not shown because too many files have changed in this diff Show More