Browse Source

Merge pull request #14 from 007revad/develop

Develop
pull/15/head v1.2.15
007revad 3 years ago
committed by GitHub
parent
commit
96251a353e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      CHANGES.txt
  2. 7
      README.md
  3. 677
      syno_hdd_db.sh

13
CHANGES.txt

@ -1,3 +1,16 @@
v1.2.15
- Now finds your expansion units' model numbers and adds your drives to their db files.
- Now adds your M.2 drives to your M.2 PCI card's db files (supports M2Dxx and E10M20-T1 and future models with similar model names).
- Improved flags/options checking and added usage help (-h or --help) and version info (-v or --version).
- Can now download the latest script version for you (if you have 'user home service' enabled in DSM).
- Now adds 'support_m2_pool="yes"' line for models that don't have support_m2_pool in synoinfo.conf
- To (hopefully) prevent losing your SSH created M2 volume when running this script on models that DSM 7.2 Beta does not list as supported for creating M2 volumes.
- Added removal of " 00Y" from end of Samsung/Lenovo SSDs to fix issue #13.
- Changed Synology NAS model detection to be more reliable (for models that came in different variations and report extra text after model). issue #2 and issue #10
- Changed checking drive_db_test_url setting to be more durable.
- Fixed bug where removable drives were being added to the drive database.
- Fixed bug where "M.2 volume support already enabled" message appeared when NAS had no M.2 drives.
v1.1.14 v1.1.14
- Minor bug fix. - Minor bug fix.

7
README.md

@ -5,7 +5,7 @@ # Synology HDD db
### Description ### Description
Add your SATA or SAS HDDs and SSDs plus SATA and NVMe M.2 drives to your Synology's compatible drive databases. Add your SATA or SAS HDDs and SSDs plus SATA and NVMe M.2 drives to your Synology's compatible drive databases, including your M.2 card and Expansion Unit databases.
The script works in DSM 7 and DSM 6. The script works in DSM 7 and DSM 6.
@ -14,7 +14,7 @@ #### What the script does:
* Gets the Synology NAS model and DSM version (so it knows which db files to edit). * Gets the Synology NAS model and DSM version (so it knows which db files to edit).
* Gets a list of the HDD, SSD, SAS and NVMe drives installed in your Synology NAS. * Gets a list of the HDD, SSD, SAS and NVMe drives installed in your Synology NAS.
* Gets each drive's model number and firmware version. * Gets each drive's model number and firmware version.
* Backs up the database file if there is no backup already. * Backs up the database files if there is no backup already.
* Checks if each drive is already in the Synology's compatible-drive database. * Checks if each drive is already in the Synology's compatible-drive database.
* Adds any missing drives to the Synology's compatible-drive database. * Adds any missing drives to the Synology's compatible-drive database.
* Prevents DSM auto updating the drive database. * Prevents DSM auto updating the drive database.
@ -25,9 +25,6 @@ #### What the script does:
**Planned updates:** **Planned updates:**
* Allow unsupported M.2 drives for use as volumes in DSM 7.2 (for models that supported M.2 volumes). * Allow unsupported M.2 drives for use as volumes in DSM 7.2 (for models that supported M.2 volumes).
* Detect any connected expansion units and get the model(s) and edit the correct expansion unit db files.
* Or add support for users to specify their expansion unit model(s) as arguments.
* Or maybe use the shotgun approach and update all expansion unit db files.
### Download the script ### Download the script

677
syno_hdd_db.sh

@ -3,7 +3,7 @@
#-------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------
# Github: https://github.com/007revad/Synology_HDD_db # Github: https://github.com/007revad/Synology_HDD_db
# Script verified at https://www.shellcheck.net/ # Script verified at https://www.shellcheck.net/
# Tested on DSM 7.1.1 and DSM 6.2.4 # Tested on DSM 7.2 beta, 7.1.1 and DSM 6.2.4
# #
# Easiest solution: # Easiest solution:
# Edit /etc.defaults/synoinfo.conf and change support_disk_compatibility="yes" to "no" and reboot. # Edit /etc.defaults/synoinfo.conf and change support_disk_compatibility="yes" to "no" and reboot.
@ -23,17 +23,36 @@
#-------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------
# TODO # TODO
# Detect if expansion unit(s) connected and get model(s) and edit expansion unit db files. # Bypass M.2 volume lock for unsupported M.2 drives.
# Or add support for specifying user's expansion unit model(s) as arguments.
# Or maybe use the shotgun approach and update all expansion unit db files.
# #
# Add support for M.2 SATA and NVMe drives on a M2D17 PCI card. # Maybe also edit the other disk compatibility db in synoboot, used during boot time.
#
# Maybe also edit the other disk compatibility DB in synoboot, used during boot time.
# It's also parsed and checked and probably in some cases it could be more critical to patch that one instead. # It's also parsed and checked and probably in some cases it could be more critical to patch that one instead.
# DONE # DONE
# Added check that M.2 volume support is enabled. # Now finds your expansion units' model numbers and adds your drives to their db files.
#
# Now adds your M.2 drives to your M.2 PCI cards db files (M2Dxx and E10M20-T1 and future models).
#
# Improved flags/options checking and added usage help.
#
# Can now download the latest script version for you (if you have user home service enabled in DSM).
#
# Now adds 'support_m2_pool="yes"' line for models that don't have support_m2_pool in synoinfo.conf
# to (hopefully) prevent losing your SSH created M2 volume when running this script on models
# that DSM 7.2 Beta does not list as supported for creating M2 volumes.
#
# Changed Synology model detection to be more reliable (for models that came in different variations).
#
# Changed checking drive_db_test_url setting to be more durable.
#
# Added removal of " 00Y" from end of Samsung/Lenovo SSDs to fix issue #13.
#
# Fixed bug where removable drives were being detected and added to drive database.
#
# Fixed bug where "M.2 volume support already enabled" message appeared when NAS had no M.2 drives.
#
#
# Added check that M.2 volume support is enabled (on supported models).
# #
# Added support for M.2 SATA drives. # Added support for M.2 SATA drives.
# #
@ -63,58 +82,101 @@
# Optionally disable "support_disk_compatibility". # Optionally disable "support_disk_compatibility".
scriptver="v1.1.14" scriptver="v1.2.15"
script=Synology_HDD_db
repo="007revad/Synology_HDD_db"
# Check latest release with GitHub API #echo -e "bash version: $(bash --version | head -1 | cut -d' ' -f4)\n" # debug
get_latest_release() {
curl --silent "https://api.github.com/repos/$1/releases/latest" | # Shell Colors
grep '"tag_name":' | # Get tag line #Black='\e[0;30m'
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value Red='\e[0;31m'
#Green='\e[0;32m'
Yellow='\e[0;33m'
#Blue='\e[0;34m'
#Purple='\e[0;35m'
Cyan='\e[0;36m'
#White='\e[0;37m'
Error='\e[41m'
Off='\e[0m'
usage(){
cat <<EOF
$script $scriptver - by 007revad
Usage: $(basename "$0") [options]
Options:
-s, --showedits Show the edits made to host db file(s)
-n, --noupdate Prevent DSM updating the compatible drive databases
-m, --m2 Don't process M.2 drives
-f, --force Force DSM to not check drive compatibility
-r, --ram Disable memory compatibility checking
-h, --help Show this help message
-v, --version Show the version
EOF
exit 0
} }
tag=$(get_latest_release "007revad/Synology_HDD_db")
if ! printf "%s\n%s\n" "$tag" "$scriptver" | scriptversion(){
sort --check --version-sort &> /dev/null ; then cat <<EOF
echo -e "\e[0;36mThere is a newer version of this script available.\e[0m" $script $scriptver - by 007revad
echo -e "Current version: ${scriptver}\nLatest version: $tag"
echo "https://github.com/007revad/Synology_HDD_db/releases/latest" See https://github.com/$repo
echo "" EOF
sleep 10 exit 0
fi }
# Check for flags with getopts # Check for flags with getopt
OPTERR=0 if options="$(getopt -o abcdefghijklmnopqrstuvwxyz0123456789 -a \
while getopts "sfnm" option; do -l showedits,noupdate,m2,force,ram,help,version -- "$@")"; then
# Need to ensure any other long flags do not contain s, n, or f eval set -- "$options"
if [[ ! ${#option} -gt "1" ]]; then while true; do
case ${option,,,} in case "${1,,}" in
s) -s|--showedits) # Show edits done to host db file
showedits=yes showedits=yes
;; ;;
n) -n|--nodbupdate) # Disable disk compatibility db updates
nodbupdate=yes # For future use nodbupdate=yes
;;
-m|--m2) # Don't add M.2 drives to db files
m2=no
;;
-f|--force) # Disable "support_disk_compatibility"
force=yes
;;
-r|--ram) # Include memory compatibility
# shellcheck disable=SC2034
ram=yes # for future use
;; ;;
m) -h|--help) # Show usage options
m2=no # Don't add M.2 drives to db files usage
;; ;;
f) -v|--version) # Show script version
force=yes # Disable "support_disk_compatibility" scriptversion
;; ;;
*) --)
shift
break
;;
*) # Show usage options
echo "Invalid option '$1'"
usage "$1"
;; ;;
esac esac
fi shift
done done
fi
model=$(cat /proc/sys/kernel/syno_hw_version)
model=${model,,} # convert to lower case
# Check for -j after model - GitHub issue #2 # Check script is running as root
if [[ $model =~ '-j'$ ]]; then if [[ $( whoami ) != "root" ]]; then
model=${model%??} # remove last two chars echo -e "${Error}ERROR${Off} This script must be run as root or sudo!"
exit 1
fi fi
# Get DSM major version # Get DSM major version
@ -123,63 +185,167 @@ if [[ $dsm -gt "6" ]]; then
version="_v$dsm" version="_v$dsm"
fi fi
# Check script is running as root # Get Synology model
if [[ $( whoami ) != "root" ]]; then
echo -e "\e[41mERROR\e[0m This script must be run as root or sudo!" # This doesn't work for drives migrated from different model
exit 1 #model=$(find /var/lib/disk-compatibility -regextype egrep -regex ".*host(_v7)?\.db$" |\
# cut -d"/" -f5 | cut -d"_" -f1 | uniq)
model=$(cat /proc/sys/kernel/syno_hw_version)
model=${model,,} # convert to lower case
# Check for dodgy characters after model number
if [[ $model =~ 'pv10-j'$ ]]; then # GitHub issue #10
model=${model%??????}+ # replace last 6 chars with +
elif [[ $model =~ '-j'$ ]]; then # GitHub issue #2
model=${model%??} # remove last 2 chars
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Get list of installed SATA, SAS and M.2 NVMe/SATA drives # Check latest release with GitHub API
for d in /sys/block/*; do get_latest_release() {
#echo $d # debug curl --silent "https://api.github.com/repos/$1/releases/latest" |
case "$(basename -- "${d}")" in grep '"tag_name":' | # Get tag line
sd*|hd*) sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
if [[ $d =~ [hs]d[a-z]$ ]]; then }
hdmodel=$(cat "$d/device/model")
hdmodel=$(printf "%s" "$hdmodel" | xargs) # trim leading and trailing white space
#echo "Model: '$hdmodel'" # debug
fwrev=$(cat "$d/device/rev") tag=$(get_latest_release "007revad/Synology_HDD_db")
fwrev=$(printf "%s" "$fwrev" | xargs) # trim leading and trailing white space shorttag="${tag:1}"
#echo "Firmware: '$fwrev'" # debug
if [[ $HOME =~ /var/services/* ]]; then
shorthome=${HOME:14}
else
shorthome="$HOME"
fi
if [[ $hdmodel ]] && [[ $fwrev ]]; then if ! printf "%s\n%s\n" "$tag" "$scriptver" |
hdlist+=("${hdmodel},${fwrev}") sort --check --version-sort &> /dev/null ; then
echo -e "${Cyan}There is a newer version of this script available.${Off}"
echo -e "Current version: ${scriptver}\nLatest version: $tag"
if [[ ! -d $HOME ]]; then
# Can't download to home
echo "https://github.com/$repo/releases/latest"
sleep 10
elif [[ -f $HOME/$script-$shorttag.tar.gz ]]; then
# Latest version tar.gz in home but they're using older version
echo "https://github.com/$repo/releases/latest"
sleep 10
else
echo -e "${Cyan}Do you want to download $tag now?${Off} {y/n]"
read -r -t 30 reply
if [[ ${reply,,} == "y" ]]; then
if ! curl -LJO "https://github.com/$repo/archive/refs/tags/$tag.tar.gz"; then
echo -e "${Error}ERROR ${Off} Failed to download $script-$shorttag.tar.gz!"
else
if [[ -f $HOME/$script-$shorttag.tar.gz ]]; then
if ! tar -xf "$HOME/$script-$shorttag.tar.gz"; then
echo -e "${Error}ERROR ${Off} Failed to extract $script-$shorttag.tar.gz!"
else
if ! rm "$HOME/$script-$shorttag.tar.gz"; then
echo -e "${Error}ERROR ${Off} Failed to delete downloaded $script-$shorttag.tar.gz!"
else
echo -e "\n$tag and changes.txt are in ${Cyan}$shorthome/$script-$shorttag${Off}"
echo -e "${Cyan}Do you want to stop this script so you can run the new one?${Off} {y/n]"
read -r -t 30 reply
if [[ ${reply,,} == "y" ]]; then exit; fi
fi
fi
else
echo -e "${Error}ERROR ${Off} $shorthome/$script-$shorttag.tar.gz not found!"
#ls $HOME/ | grep "$script" # debug
fi fi
fi fi
fi
fi
fi
#------------------------------------------------------------------------------
# Get list of installed SATA, SAS and M.2 NVMe/SATA drives,
# PCIe M.2 cards and connected Expansion Units.
fixdrivemodel(){
# Remove " 00Y" from end of Samsung/Lenovo SSDs
# To fix issue #13
if [[ $1 =~ MZ.*" 00Y" ]]; then
hdmodel=$(printf "%s" "$1" | sed 's/ 00Y.*//')
fi
}
getdriveinfo() {
# Skip removable drives (USB drives)
removable=$(cat "$1/removable")
if [[ $removable == "0" ]]; then
# Get drive model and firmware version
hdmodel=$(cat "$1/device/model")
hdmodel=$(printf "%s" "$hdmodel" | xargs) # trim leading and trailing white space
# Fix dodgy model numbers
fixdrivemodel "$hdmodel"
fwrev=$(cat "$1/device/rev")
fwrev=$(printf "%s" "$fwrev" | xargs) # trim leading and trailing white space
if [[ $hdmodel ]] && [[ $fwrev ]]; then
hdlist+=("${hdmodel},${fwrev}")
fi
fi
}
getm2info() {
nvmemodel=$(cat "$1/device/model")
nvmemodel=$(printf "%s" "$nvmemodel" | xargs) # trim leading and trailing white space
if [[ $2 == "nvme" ]]; then
nvmefw=$(cat "$1/device/firmware_rev")
elif [[ $2 == "nvc" ]]; then
nvmefw=$(cat "$1/device/rev")
fi
nvmefw=$(printf "%s" "$nvmefw" | xargs) # trim leading and trailing white space
if [[ $nvmemodel ]] && [[ $nvmefw ]]; then
nvmelist+=("${nvmemodel},${nvmefw}")
fi
}
getcardmodel() {
# Get M.2 card model (if M.2 drives found)
if [[ ${#nvmelist[@]} -gt "0" ]]; then
cardmodel=$(synodisk --m2-card-model-get "$1")
if [[ $cardmodel =~ M2D[0-9][0-9] ]]; then
# M2 adaptor card
m2carddblist+=("${model}_${cardmodel,,}${version}.db") # M.2 card's db file
m2cardlist+=("$cardmodel") # M.2 card
elif [[ $cardmodel =~ E[0-9][0-9]+M.+ ]]; then
# Ethernet + M2 adaptor card
m2carddblist+=("${model}_${cardmodel,,}${version}.db") # M.2 card's db file
m2cardlist+=("$cardmodel") # M.2 card
fi
fi
}
for d in /sys/block/*; do
case "$(basename -- "${d}")" in
sd*|hd*)
if [[ $d =~ [hs]d[a-z][a-z]?$ ]]; then
# Get drive model and firmware version
getdriveinfo "$d"
fi
;; ;;
sata*|sas*) sata*|sas*)
if [[ $d =~ (sas|sata)[0-9][0-9]?[0-9]?$ ]]; then if [[ $d =~ (sas|sata)[0-9][0-9]?[0-9]?$ ]]; then
hdmodel=$(cat "$d/device/model") # Get drive model and firmware version
hdmodel=$(printf "%s" "$hdmodel" | xargs) # trim leading and trailing white space getdriveinfo "$d"
#echo "Model: '$hdmodel'" # debug
fwrev=$(cat "$d/device/rev")
fwrev=$(printf "%s" "$fwrev" | xargs) # trim leading and trailing white space
#echo "Firmware: '$fwrev'" # debug
if [[ $hdmodel ]] && [[ $fwrev ]]; then
hdlist+=("${hdmodel},${fwrev}")
fi
fi fi
;; ;;
nvme*) nvme*)
if [[ $d =~ nvme[0-9][0-9]?n[0-9][0-9]?$ ]]; then if [[ $d =~ nvme[0-9][0-9]?n[0-9][0-9]?$ ]]; then
if [[ $m2 != "no" ]]; then if [[ $m2 != "no" ]]; then
nvmemodel=$(cat "$d/device/model") getm2info "$d" "nvme"
nvmemodel=$(printf "%s" "$nvmemodel" | xargs) # trim leading and trailing white space # Get M.2 card model if in M.2 card
#echo "NVMe Model: '$nvmemodel'" # debug getcardmodel "/dev/$d"
nvmefw=$(cat "$d/device/firmware_rev")
nvmefw=$(printf "%s" "$nvmefw" | xargs) # trim leading and trailing white space
#echo "NVMe Firmware: '$nvmefw'" # debug
if [[ $nvmemodel ]] && [[ $nvmefw ]]; then
nvmelist+=("${nvmemodel},${nvmefw}")
fi
fi fi
fi fi
;; ;;
@ -187,18 +353,9 @@ for d in /sys/block/*; do
#if [[ $d =~ nvc[0-9][0-9]?p[0-9][0-9]?$ ]]; then #if [[ $d =~ nvc[0-9][0-9]?p[0-9][0-9]?$ ]]; then
if [[ $d =~ nvc[0-9][0-9]?$ ]]; then if [[ $d =~ nvc[0-9][0-9]?$ ]]; then
if [[ $m2 != "no" ]]; then if [[ $m2 != "no" ]]; then
nvmemodel=$(cat "$d/device/model") getm2info "$d" "nvc"
nvmemodel=$(printf "%s" "$nvmemodel" | xargs) # trim leading and trailing white space # Get M.2 card model if in M.2 card
#echo "M.2 SATA Model: '$nvmemodel'" # debug getcardmodel "/dev/$d"
#nvmefw=$(cat "$d/device/firmware_rev")
nvmefw=$(cat "$d/device/rev")
nvmefw=$(printf "%s" "$nvmefw" | xargs) # trim leading and trailing white space
#echo "M.2 SATA Firmware: '$nvmefw'" # debug
if [[ $nvmemodel ]] && [[ $nvmefw ]]; then
nvmelist+=("${nvmemodel},${nvmefw}")
fi
fi fi
fi fi
;; ;;
@ -215,7 +372,7 @@ fi
# Check hdds array isn't empty # Check hdds array isn't empty
if [[ ${#hdds[@]} -eq "0" ]]; then if [[ ${#hdds[@]} -eq "0" ]]; then
echo -e "\e[41mERROR\e[0m No drives found!" && exit 2 echo -e "${Error}ERROR${Off} No drives found!" && exit 2
else else
echo "HDD/SSD models found: ${#hdds[@]}" echo "HDD/SSD models found: ${#hdds[@]}"
num="0" num="0"
@ -235,15 +392,74 @@ if [[ ${#nvmelist[@]} -gt "0" ]]; then
fi fi
# Check nvmes array isn't empty # Check nvmes array isn't empty
if [[ ${#nvmes[@]} -eq "0" ]]; then if [[ $m2 != "no" ]]; then
if [[ $m2 != "no" ]]; then if [[ ${#nvmes[@]} -eq "0" ]]; then
echo -e "No M.2 drives found\n" echo -e "No M.2 drives found\n"
else
m2exists="yes"
echo "M.2 drive models found: ${#nvmes[@]}"
num="0"
while [[ $num -lt "${#nvmes[@]}" ]]; do
echo "${nvmes[num]}"
num=$((num +1))
done
echo
fi fi
fi
# M.2 card db files
# Sort m2carddblist array into new m2carddbs array to remove duplicates
if [[ ${#m2carddblist[@]} -gt "0" ]]; then
while IFS= read -r -d '' x; do
m2carddbs+=("$x")
done < <(printf "%s\0" "${m2carddblist[@]}" | sort -uz)
fi
# M.2 cards
# Sort m2cardlist array into new m2cards array to remove duplicates
if [[ ${#m2cardlist[@]} -gt "0" ]]; then
while IFS= read -r -d '' x; do
m2cards+=("$x")
done < <(printf "%s\0" "${m2cardlist[@]}" | sort -uz)
fi
# Check m2cards array isn't empty
if [[ ${#m2cards[@]} -gt "0" ]]; then
echo "M.2 card models found: ${#m2cards[@]}"
num="0"
while [[ $num -lt "${#m2cards[@]}" ]]; do
echo "${m2cards[num]}"
num=$((num +1))
done
echo
fi
# Expansion units
# Get list of connected expansion units (aka eunit/ebox)
path="/var/log/diskprediction"
# shellcheck disable=SC2012
file=$(ls $path | tail -n1)
# shellcheck disable=SC2207
eunitlist=($(grep -Eow "([FRD]XD?[0-9]{3,4})(RP|II|sas){0,2}" "$path/$file" | uniq))
# Sort eunitlist array into new eunits array to remove duplicates
if [[ ${#eunitlist[@]} -gt "0" ]]; then
while IFS= read -r -d '' x; do
eunits+=("$x")
done < <(printf "%s\0" "${eunitlist[@]}" | sort -uz)
fi
# Check eunits array isn't empty
if [[ ${#eunits[@]} -eq "0" ]]; then
echo -e "No Expansion Units found\n"
else else
echo "M.2 drive models found: ${#nvmes[@]}" #eunitexists="yes"
echo "Expansion Unit models found: ${#eunits[@]}"
num="0" num="0"
while [[ $num -lt "${#nvmes[@]}" ]]; do while [[ $num -lt "${#eunits[@]}" ]]; do
echo "${nvmes[num]}" echo "${eunits[num]}"
num=$((num +1)) num=$((num +1))
done done
echo echo
@ -251,59 +467,71 @@ fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Check database and add our drives if needed # Check databases and add our drives if needed
db1="/var/lib/disk-compatibility/${model}_host${version}.db" db1="/var/lib/disk-compatibility/${model}_host${version}.db"
db2="/var/lib/disk-compatibility/${model}_host${version}.db.new" db2="/var/lib/disk-compatibility/${model}_host${version}.db.new"
dbpath="/var/lib/disk-compatibility/"
if [[ ! -f "$db1" ]]; then echo -e "\e[41mERROR\e[0m $db1 not found!" && exit 3; fi synoinfo="/etc.defaults/synoinfo.conf"
#if [[ ! -f "$db2" ]]; then echo -e "\e[41mERROR\e[0m $db2 not found!" && exit 4; fi
# new installs don't have a .db.new file
# Detect drive db type if [[ ! -f "$db1" ]]; then echo -e "${Error}ERROR 3${Off} $db1 not found!" && exit 3; fi
if grep -F '{"disk_compatbility_info":' "$db1" >/dev/null; then #if [[ ! -f "$db2" ]]; then echo -e "${Error}ERROR 4${Off} $db2 not found!" && exit 4; fi
# DSM 7 drive db files start with {"disk_compatbility_info": # new installs don't have a .db.new file
dbtype=7
elif grep -F '{"success":1,"list":[' "$db1" >/dev/null; then
# DSM 6 drive db files start with {"success":1,"list":[
dbtype=6
else
echo -e "\e[41mERROR\e[0m Unknown database type $(basename -- "${db1}")!"
exit 7
fi
#echo "dbtype: $dbtype" # debug
# Backup database file if needed getdbtype(){
if [[ ! -f "$db1.bak" ]]; then # Detect drive db type
if cp "$db1" "$db1.bak"; then if grep -F '{"disk_compatbility_info":' "$1" >/dev/null; then
echo -e "Backed up database to $(basename -- "${db1}").bak\n" # DSM 7 drive db files start with {"disk_compatbility_info":
dbtype=7
elif grep -F '{"success":1,"list":[' "$1" >/dev/null; then
# DSM 6 drive db files start with {"success":1,"list":[
dbtype=6
else else
echo -e "\e[41mERROR\e[0m Failed to backup $(basename -- "${db1}")!" echo -e "${Error}ERROR${Off} Unknown database type $(basename -- "${1}")!" >&2
exit 5 dbtype=1
fi fi
fi #echo "db type: $dbtype" >&2 # debug
}
# Shell Colors backupdb() {
Yellow='\e[0;33m' # Backup database file if needed
Cyan='\e[0;36m' if [[ ! -f "$1.bak" ]]; then
Red='\e[0;31m' if cp "$1" "$1.bak"; then
Off=$'\e[0m' echo -e "Backed up $(basename -- "${1}")" >&2
else
echo -e "${Error}ERROR 5${Off} Failed to backup $(basename -- "${1}")!" >&2
return 1
fi
fi
}
# Backup host database file if needed
backupdb "$db1" || exit 5
#------------------------------------------------------------------------------
# Edit db files
function updatedb() { updatedb() {
hdmodel=$(printf "%s" "$1" | cut -d"," -f 1) hdmodel=$(printf "%s" "$1" | cut -d"," -f 1)
fwrev=$(printf "%s" "$1" | cut -d"," -f 2) fwrev=$(printf "%s" "$1" | cut -d"," -f 2)
#echo arg1 "$1" # debug #echo arg1 "$1" >&2 # debug
#echo arg2 "$2" # debug #echo arg2 "$2" >&2 # debug
#echo hdmodel "$hdmodel" # debug #echo hdmodel "$hdmodel" >&2 # debug
#echo fwrev "$fwrev" # debug #echo fwrev "$fwrev" >&2 # debug
if grep "$hdmodel" "$2" >/dev/null; then if grep "$hdmodel" "$2" >/dev/null; then
echo -e "${Yellow}$hdmodel${Off} already exists in ${Cyan}$(basename -- "$2")${Off}" echo -e "${Yellow}$hdmodel${Off} already exists in ${Cyan}$(basename -- "$2")${Off}" >&2
else else
# Check if db file is new or old style
getdbtype "$2"
if [[ $dbtype -gt "6" ]];then if [[ $dbtype -gt "6" ]];then
# Don't need to add firmware version? # Don't need to add firmware version?
fwstrng=\"$fwrev\" fwstrng=\"$fwrev\"
@ -317,16 +545,19 @@ function updatedb() {
#if sed -i "s/}}}/}},\"$hdmodel\":{$fwstrng$default/" "$2"; then # Don't need to add firmware version? #if sed -i "s/}}}/}},\"$hdmodel\":{$fwstrng$default/" "$2"; then # Don't need to add firmware version?
if sed -i "s/}}}/}},\"$hdmodel\":{$default/" "$2"; then if sed -i "s/}}}/}},\"$hdmodel\":{$default/" "$2"; then
echo -e "Added ${Yellow}$hdmodel${Off} to ${Cyan}$(basename -- "$2")${Off}" echo -e "Added ${Yellow}$hdmodel${Off} to ${Cyan}$(basename -- "$2")${Off}"
# Count drives added to host db files
if [[ $2 == "$db1" ]]; then if [[ $2 == "$db1" ]]; then
db1Edits=$((db1Edits +1)) db1Edits=$((db1Edits +1))
elif [[ $2 == "$db2" ]]; then elif [[ $2 == "$db2" ]]; then
db2Edits=$((db2Edits +1)) db2Edits=$((db2Edits +1))
fi fi
else else
echo -e "\n\e[41mERROR\e[0m Failed to update v7 $(basename -- "$2")${Off}" echo -e "\n${Error}ERROR 6${Off} Failed to update v7 $(basename -- "$2")${Off}"
exit 6 exit 6
fi fi
else elif [[ $dbtype -eq "6" ]];then
# example: # example:
# {"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]}, # {"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]},
# Don't need to add firmware version? # Don't need to add firmware version?
@ -335,21 +566,24 @@ function updatedb() {
# {"success":1,"list":[ # {"success":1,"list":[
startstring="{\"success\":1,\"list\":\[" startstring="{\"success\":1,\"list\":\["
#echo "$startstring" # debug #echo "$startstring" >&2 # debug
#echo "$string" # debug #echo "$string" >&2 # debug
#echo # debug #echo >&2 # debug
# example: # example:
# {"success":1,"list":[{"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]}, # {"success":1,"list":[{"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]},
if sed -ir "s/$startstring/$startstring$string/" "$2"; then if sed -ir "s/$startstring/$startstring$string/" "$2"; then
echo -e "Added ${Yellow}$hdmodel${Off} to ${Cyan}$(basename -- "$2")${Off}" echo -e "Added ${Yellow}$hdmodel${Off} to ${Cyan}$(basename -- "$2")${Off}"
# Count drives added to host db files
if [[ $2 == "$db1" ]]; then if [[ $2 == "$db1" ]]; then
db1Edits=$((db1Edits +1)) db1Edits=$((db1Edits +1))
elif [[ $2 == "$db2" ]]; then elif [[ $2 == "$db2" ]]; then
db2Edits=$((db2Edits +1)) db2Edits=$((db2Edits +1))
fi fi
else else
echo -e "\n\e[41mERROR\e[0m Failed to update $(basename -- "$2")${Off}" echo -e "\n${Error}ERROR 8${Off} Failed to update $(basename -- "$2")${Off}" >&2
exit 8 exit 8
fi fi
fi fi
@ -363,6 +597,22 @@ while [[ $num -lt "${#hdds[@]}" ]]; do
if [[ -f "$db2" ]]; then if [[ -f "$db2" ]]; then
updatedb "${hdds[$num]}" "$db2" updatedb "${hdds[$num]}" "$db2"
fi fi
#------------------------------------------------
# Expansion Units
num2="0"
while [[ $num2 -lt "${#eunits[@]}" ]]; do
eudb="${dbpath}${eunits[$num2],,}${version}.db"
if [[ -f "$eudb" ]];then
backupdb "$eudb" &&\
updatedb "${hdds[$num]}" "$eudb"
else
echo -e "${Error}ERROR 11${Off} $eudb not found!"
fi
num2=$((num2 +1))
done
#------------------------------------------------
num=$((num +1)) num=$((num +1))
done done
@ -373,18 +623,40 @@ while [[ $num -lt "${#nvmes[@]}" ]]; do
if [[ -f "$db2" ]]; then if [[ -f "$db2" ]]; then
updatedb "${nvmes[$num]}" "$db2" updatedb "${nvmes[$num]}" "$db2"
fi fi
#------------------------------------------------
# M.2 adaptor cards
num2="0"
while [[ $num2 -lt "${#m2carddbs[@]}" ]]; do
if [[ -f "${dbpath}${m2carddbs[$num2]}" ]];then
backupdb "${dbpath}${m2carddbs[$num2]}" &&\
updatedb "${nvmes[$num]}" "${dbpath}${m2carddbs[$num2]}"
else
echo -e "${Error}ERROR 10${Off} ${m2carddbs[$num2]} not found!"
fi
num2=$((num2 +1))
done
#------------------------------------------------
num=$((num +1)) num=$((num +1))
done done
#------------------------------------------------------------------------------
# Edit /etc.defaults/synoinfo.conf
# Backup synoinfo.conf if needed
echo ""
backupdb "$synoinfo" || exit 9
# Optionally disable "support_disk_compatibility" # Optionally disable "support_disk_compatibility"
sdc=support_disk_compatibility sdc=support_disk_compatibility
setting="$(get_key_value /etc.defaults/synoinfo.conf $sdc)" setting="$(get_key_value $synoinfo $sdc)"
if [[ $force == "yes" ]]; then if [[ $force == "yes" ]]; then
if [[ $setting == "yes" ]]; then if [[ $setting == "yes" ]]; then
# Disable support_disk_compatibility # Disable support_disk_compatibility
sed -i "s/${sdc}=\"yes\"/${sdc}=\"no\"/" "/etc.defaults/synoinfo.conf" sed -i "s/${sdc}=\"yes\"/${sdc}=\"no\"/" "$synoinfo"
setting="$(get_key_value /etc.defaults/synoinfo.conf $sdc)" setting="$(get_key_value "$synoinfo" $sdc)"
if [[ $setting == "no" ]]; then if [[ $setting == "no" ]]; then
echo -e "\nDisabled support disk compatibility." echo -e "\nDisabled support disk compatibility."
fi fi
@ -392,8 +664,8 @@ if [[ $force == "yes" ]]; then
else else
if [[ $setting == "no" ]]; then if [[ $setting == "no" ]]; then
# Enable support_disk_compatibility # Enable support_disk_compatibility
sed -i "s/${sdc}=\"no\"/${sdc}=\"yes\"/" "/etc.defaults/synoinfo.conf" sed -i "s/${sdc}=\"no\"/${sdc}=\"yes\"/" "$synoinfo"
setting="$(get_key_value /etc.defaults/synoinfo.conf $sdc)" setting="$(get_key_value "$synoinfo" $sdc)"
if [[ $setting == "yes" ]]; then if [[ $setting == "yes" ]]; then
echo -e "\nRe-enabled support disk compatibility." echo -e "\nRe-enabled support disk compatibility."
fi fi
@ -401,57 +673,86 @@ else
fi fi
# Check m2 volume support enabled # Enable m2 volume support
smp=support_m2_pool if [[ $m2 != "no" ]]; then
setting="$(get_key_value /etc.defaults/synoinfo.conf ${smp})" if [[ $m2exists == "yes" ]]; then
if [[ $setting == "no" ]]; then # Check if m2 volume support is enabled
sed -i "s/${smp}=\"no\"/${smp}=\"yes\"/" "/etc.defaults/synoinfo.conf" smp=support_m2_pool
setting="$(get_key_value /etc.defaults/synoinfo.conf ${smp})" setting="$(get_key_value $synoinfo ${smp})"
if [[ $setting == "yes" ]]; then enabled=""
echo -e "\nEnabled M.2 volume support." if [[ ! $setting ]]; then
fi # Add support_m2_pool"yes"
fi echo 'support_m2_pool="yes"' >> "$synoinfo"
enabled="yes"
elif [[ $setting == "no" ]]; then
# Change support_m2_pool"no" to "yes"
sed -i "s/${smp}=\"no\"/${smp}=\"yes\"/" "$synoinfo"
enabled="yes"
elif [[ $setting == "yes" ]]; then
echo -e "\nM.2 volume support already enabled."
fi
# Edit synoinfo.conf to prevent DB updates # Check if we enabled m2 volume support
#if [[ $nodbupdate == "yes" ]]; then # For future use setting="$(get_key_value $synoinfo ${smp})"
file=/etc.defaults/synoinfo.conf if [[ $enabled == "yes" ]]; then
if [[ -f $file ]]; then if [[ $setting == "yes" ]]; then
# Backup synoinfo.conf if needed echo -e "\nEnabled M.2 volume support."
if [[ ! -f "$file.bak" ]]; then
if cp "$file" "$file.bak"; then
echo "Backed up synoinfo.conf to $(basename -- "${file}").bak"
else else
echo -e "\e[41mERROR\e[0m Failed to backup $(basename -- "${file}")!" echo -e "${Error}ERROR${Off} Failed to enable m2 volume support!"
exit 6
fi fi
fi fi
fi
fi
url=$(get_key_value "$file" drive_db_test_url) # returns a linefeed if key doesn't exist
if [[ ! $url ]]; then
# Add drive_db_test_url=127.0.0.1
echo 'drive_db_test_url="127.0.0.1"' >> "$file"
disabled="yes"
elif [[ $url != "127.0.0.1" ]]; then
# Edit drive_db_test_url=
sed -i "s/drive_db_test_url=.*/drive_db_test_url=\"127.0.0.1\"/" "$file"
disabled="yes"
fi
url=$(get_key_value "$file" drive_db_test_url) # Edit synoinfo.conf to prevent drive db updates
if [[ $disabled == "yes" ]]; then dtu=drive_db_test_url
if [[ $url == "127.0.0.1" ]]; then url="$(get_key_value $synoinfo ${dtu})"
echo "Disabled drive db auto updates." disabled=""
else if [[ $nodbupdate == "yes" ]]; then
echo -e "\e[41mERROR\e[0m Failed to disable drive db auto updates!" if [[ ! $url ]]; then
fi # Add drive_db_test_url="127.0.0.1"
echo 'drive_db_test_url="127.0.0.1"' >> "$synoinfo"
disabled="yes"
elif [[ $url != "127.0.0.1" ]]; then
# Edit drive_db_test_url=
sed -i "s/drive_db_test_url=.*/drive_db_test_url=\"127.0.0.1\"/" "$synoinfo" >/dev/null
disabled="yes"
fi
# Check if we disabled drive db auto updates
url="$(get_key_value $synoinfo drive_db_test_url)"
if [[ $disabled == "yes" ]]; then
if [[ $url == "127.0.0.1" ]]; then
echo -e "\nDisabled drive db auto updates."
else
echo -e "${Error}ERROR${Off} Failed to disable drive db auto updates!"
fi
fi
else
# Re-enable drive db updates
if [[ $url == "127.0.0.1" ]]; then
# Edit drive_db_test_url=
sed -z "s/drive_db_test_url=\"127\.0\.0\.1\"\n//" "$synoinfo" >/dev/null
#sed -i "s/drive_db_test_url=\"127\.0\.0\.1\"//" "$synoinfo" # works but leaves line feed
# Check if we re-enabled drive db auto updates
url="$(get_key_value $synoinfo drive_db_test_url)"
if [[ $url != "127.0.0.1" ]]; then
echo -e "\nRe-enabled drive db auto updates."
fi fi
else
echo -e "\nDrive db auto updates already enabled."
fi fi
#fi fi
#------------------------------------------------------------------------------
# Finished
# Show the changes # Show the changes
if [[ ${showedits,,} == "yes" ]]; then if [[ ${showedits,,} == "yes" ]]; then
getdbtype "$db1"
if [[ $dbtype -gt "6" ]];then if [[ $dbtype -gt "6" ]];then
# Show last 12 lines per drive + 4 # Show last 12 lines per drive + 4
lines=$(((db1Edits *12) +4)) lines=$(((db1Edits *12) +4))
@ -462,7 +763,7 @@ if [[ ${showedits,,} == "yes" ]]; then
echo -e "\nChanges to ${Cyan}$(basename -- "$db2")${Off}" echo -e "\nChanges to ${Cyan}$(basename -- "$db2")${Off}"
jq . "$db2" | tail -n "$lines" jq . "$db2" | tail -n "$lines"
fi fi
else elif [[ $dbtype -eq "6" ]];then
# Show first 8 lines per drive + 2 # Show first 8 lines per drive + 2
lines=$(((db1Edits *8) +2)) lines=$(((db1Edits *8) +2))
if [[ $db1Edits -gt "0" ]]; then if [[ $db1Edits -gt "0" ]]; then

Loading…
Cancel
Save