@ -3,7 +3,7 @@
#--------------------------------------------------------------------------------------------------
# Github: https://github.com/007revad/Synology_HDD_db
# 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:
# Edit /etc.defaults/synoinfo.conf and change support_disk_compatibility="yes" to "no" and reboot.
@ -23,17 +23,36 @@
#--------------------------------------------------------------------------------------------------
# TODO
# Detect if expansion unit(s) connected and get model(s) and edit expansion unit db files.
# 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.
# Bypass M.2 volume lock for unsupported M.2 drives.
#
# 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.
# 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.
#
@ -63,58 +82,101 @@
# 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
get_latest_release( ) {
curl --silent " https://api.github.com/repos/ $1 /releases/latest " |
grep '"tag_name":' | # Get tag line
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
#echo -e "bash version: $(bash --version | head -1 | cut -d' ' -f4)\n" # debug
# Shell Colors
#Black='\e[0;30m'
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 " |
sort --check --version-sort & > /dev/null ; then
echo -e "\e[0;36mThere is a newer version of this script available.\e[0m"
echo -e " Current version: ${ scriptver } \nLatest version: $tag "
echo "https://github.com/007revad/Synology_HDD_db/releases/latest"
echo ""
sleep 10
fi
scriptversion( ) {
cat <<EOF
$script $scriptver - by 007revad
See https://github.com/$repo
EOF
exit 0
}
# Check for flags with getopts
OPTERR = 0
while getopts "sfnm" option; do
# Need to ensure any other long flags do not contain s, n, or f
if [ [ ! ${# option } -gt "1" ] ] ; then
case ${ option ,,, } in
s)
# Check for flags with getopt
if options = " $( getopt -o abcdefghijklmnopqrstuvwxyz0123456789 -a \
-l showedits,noupdate,m2,force,ram,help,version -- " $@ " ) " ; then
eval set -- " $options "
while true; do
case " ${ 1 ,, } " in
-s| --showedit s) # Show edits done to host db file
showedits = yes
; ;
n)
nodbupdate = yes # For future use
-n| --nodbupdate) # Disable disk compatibility db updates
nodbupdate = yes
; ;
-m| --m2) # Don't add M.2 drives to db files
m2 = no
; ;
m)
m2 = no # Don't add M.2 drives to db files
-f| --force) # Disable "support_disk_compatibility"
force = yes
; ;
f)
force = yes # Disable "support_disk_compatibility"
-r| --ram) # Include memory compatibility
# shellcheck disable=SC2034
ram = yes # for future use
; ;
*)
-h| --help) # Show usage options
usage
; ;
-v| --version) # Show script version
scriptversion
; ;
--)
shift
break
; ;
*) # Show usage options
echo " Invalid option ' $1 ' "
usage " $1 "
; ;
esac
fi
done
shift
done
fi
model = $( cat /proc/sys/kernel/syno_hw_version)
model = ${ model ,, } # convert to lower case
# Check for -j after model - GitHub issue #2
if [ [ $model = ~ '-j' $ ] ] ; then
model = ${ model %?? } # remove last two chars
# Check script is running as root
if [ [ $( whoami ) != "root" ] ] ; then
echo -e " ${ Error } ERROR ${ Off } This script must be run as root or sudo! "
exit 1
fi
# Get DSM major version
@ -123,63 +185,167 @@ if [[ $dsm -gt "6" ]]; then
version = " _v $dsm "
fi
# Check script is running as root
if [ [ $( whoami ) != "root" ] ] ; then
echo -e "\e[41mERROR\e[0m This script must be run as root or sudo!"
exit 1
# Get Synology model
# This doesn't work for drives migrated from different model
#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
#------------------------------------------------------------------------------
# Get list of installed SATA, SAS and M.2 NVMe/SATA drives
# Check latest release with GitHub API
for d in /sys/block/*; do
#echo $d # debug
case " $( basename -- " ${ d } " ) " in
sd*| hd*)
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
get_latest_release( ) {
curl --silent " https://api.github.com/repos/ $1 /releases/latest " |
grep '"tag_name":' | # Get tag line
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
}
fwrev = $( cat " $d /device/rev " )
fwrev = $( printf "%s" " $fwrev " | xargs) # trim leading and trailing white space
#echo "Firmware: '$fwrev'" # debug
tag = $( get_latest_release "007revad/Synology_HDD_db" )
shorttag = " ${ tag : 1 } "
if [ [ $HOME = ~ /var/services/* ] ] ; then
shorthome = ${ HOME : 14 }
else
shorthome = " $HOME "
fi
if [ [ $hdmodel ] ] && [ [ $fwrev ] ] ; then
hdlist += ( " ${ hdmodel } , ${ fwrev } " )
if ! printf "%s\n%s\n" " $tag " " $scriptver " |
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
#------------------------------------------------------------------------------
# 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*)
if [ [ $d = ~ ( sas| sata) [ 0-9] [ 0-9] ?[ 0-9] ?$ ] ] ; 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 " )
fwrev = $( printf "%s" " $fwrev " | xargs) # trim leading and trailing white space
#echo "Firmware: '$fwrev'" # debug
if [ [ $hdmodel ] ] && [ [ $fwrev ] ] ; then
hdlist += ( " ${ hdmodel } , ${ fwrev } " )
fi
# Get drive model and firmware version
getdriveinfo " $d "
fi
; ;
nvme*)
if [ [ $d = ~ nvme[ 0-9] [ 0-9] ?n[ 0-9] [ 0-9] ?$ ] ] ; then
if [ [ $m2 != "no" ] ] ; then
nvmemodel = $( cat " $d /device/model " )
nvmemodel = $( printf "%s" " $nvmemodel " | xargs) # trim leading and trailing white space
#echo "NVMe Model: '$nvmemodel'" # debug
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
getm2info " $d " "nvme"
# Get M.2 card model if in M.2 card
getcardmodel " /dev/ $d "
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] ?$ ] ] ; then
if [ [ $m2 != "no" ] ] ; then
nvmemodel = $( cat " $d /device/model " )
nvmemodel = $( printf "%s" " $nvmemodel " | xargs) # trim leading and trailing white space
#echo "M.2 SATA Model: '$nvmemodel'" # debug
#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
getm2info " $d " "nvc"
# Get M.2 card model if in M.2 card
getcardmodel " /dev/ $d "
fi
fi
; ;
@ -210,12 +367,12 @@ done
if [ [ ${# hdlist [@] } -gt "0" ] ] ; then
while IFS = read -r -d '' x; do
hdds += ( " $x " )
done < <( printf "%s\0" " ${ hdlist [@] } " | sort -uz)
done < <( printf "%s\0" " ${ hdlist [@] } " | sort -uz)
fi
# Check hdds array isn't empty
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
echo " HDD/SSD models found: ${# hdds [@] } "
num = "0"
@ -231,19 +388,78 @@ fi
if [ [ ${# nvmelist [@] } -gt "0" ] ] ; then
while IFS = read -r -d '' x; do
nvmes += ( " $x " )
done < <( printf "%s\0" " ${ nvmelist [@] } " | sort -uz)
done < <( printf "%s\0" " ${ nvmelist [@] } " | sort -uz)
fi
# 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"
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
# 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
echo " M.2 drive models found: ${# nvmes [@] } "
#eunitexists="yes"
echo " Expansion Unit models found: ${# eunits [@] } "
num = "0"
while [ [ $num -lt " ${# nvmes [@] } " ] ] ; do
echo " ${ nvmes [num] } "
while [ [ $num -lt " ${# eunit s[@] } " ] ] ; do
echo " ${ eunit s[num] } "
num = $(( num + 1 ))
done
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 "
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
#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
synoinfo = "/etc.defaults/synoinfo.conf"
# Detect drive db type
if grep -F '{"disk_compatbility_info":' " $db1 " >/dev/null; then
# DSM 7 drive db files start with {"disk_compatbility_info":
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
if [ [ ! -f " $db1 " ] ] ; then echo -e " ${ Error } ERROR 3 ${ Off } $db1 not found! " && exit 3; fi
#if [[ ! -f "$db2" ]]; then echo -e "${Error}ERROR 4${Off} $db2 not found!" && exit 4; fi
# new installs don't have a .db.new file
# Backup database file if needed
if [ [ ! -f " $db1 .bak " ] ] ; then
if cp " $db1 " " $db1 .bak " ; then
echo -e " Backed up database to $( basename -- " ${ db1 } " ) .bak\n "
getdbtype( ) {
# Detect drive db type
if grep -F '{"disk_compatbility_info":' " $1 " >/dev/null; then
# 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
echo -e " \e[41mERROR\e[0m Failed to backup $( basename -- " ${ db1 } " ) ! "
exit 5
echo -e " ${ Error } ERROR ${ Off } Unknown database type $( basename -- " ${ 1 } " ) ! " >& 2
dbtype = 1
fi
fi
#echo "db type: $dbtype" >&2 # debug
}
# Shell Colors
Yellow = '\e[0;33m'
Cyan = '\e[0;36m'
Red = '\e[0;31m'
Off = $'\e[0m'
backupdb( ) {
# Backup database file if needed
if [ [ ! -f " $1 .bak " ] ] ; then
if cp " $1 " " $1 .bak " ; then
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)
fwrev = $( printf "%s" " $1 " | cut -d"," -f 2)
#echo arg1 "$1" # debug
#echo arg2 "$2" # debug
#echo hdmodel "$hdmodel" # debug
#echo fwrev "$fwrev" # debug
#echo arg1 "$1" >&2 # debug
#echo arg2 "$2" >&2 # debug
#echo hdmodel "$hdmodel" >&2 # debug
#echo fwrev "$fwrev" >&2 # debug
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
# Check if db file is new or old style
getdbtype " $2 "
if [ [ $dbtype -gt "6" ] ] ; then
# Don't need to add firmware version?
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 \":{ $default / " " $2 " ; then
echo -e " Added ${ Yellow } $hdmodel ${ Off } to ${ Cyan } $( basename -- " $2 " ) ${ Off } "
# Count drives added to host db files
if [ [ $2 = = " $db1 " ] ] ; then
db1Edits = $(( db1Edits + 1 ))
elif [ [ $2 = = " $db2 " ] ] ; then
db2Edits = $(( db2Edits + 1 ))
fi
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
fi
els e
elif [ [ $dbtyp e -eq "6" ] ] ; then
# example:
# {"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]},
# Don't need to add firmware version?
@ -335,21 +566,24 @@ function updatedb() {
# {"success":1,"list":[
startstring = "{\"success\":1,\"list\":\["
#echo "$startstring" # debug
#echo "$string" # debug
#echo # debug
#echo "$startstring" >&2 # debug
#echo "$string" >&2 # debug
#echo >&2 # debug
# example:
# {"success":1,"list":[{"model":"WD60EFRX-68MYMN1","firmware":"82.00A82","rec_intvl":[1]},
if sed -ir " s/ $startstring / $startstring $string / " " $2 " ; then
echo -e " Added ${ Yellow } $hdmodel ${ Off } to ${ Cyan } $( basename -- " $2 " ) ${ Off } "
# Count drives added to host db files
if [ [ $2 = = " $db1 " ] ] ; then
db1Edits = $(( db1Edits + 1 ))
elif [ [ $2 = = " $db2 " ] ] ; then
db2Edits = $(( db2Edits + 1 ))
fi
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
fi
fi
@ -363,6 +597,22 @@ while [[ $num -lt "${#hdds[@]}" ]]; do
if [ [ -f " $db2 " ] ] ; then
updatedb " ${ hdds [ $num ] } " " $db2 "
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 ))
done
@ -373,18 +623,40 @@ while [[ $num -lt "${#nvmes[@]}" ]]; do
if [ [ -f " $db2 " ] ] ; then
updatedb " ${ nvmes [ $num ] } " " $db2 "
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 ))
done
#------------------------------------------------------------------------------
# Edit /etc.defaults/synoinfo.conf
# Backup synoinfo.conf if needed
echo ""
backupdb " $synoinfo " || exit 9
# Optionally disable "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 [ [ $setting = = "yes" ] ] ; then
# Disable support_disk_compatibility
sed -i " s/ ${ sdc } =\"yes\"/ ${ sdc } =\"no\"/ " "/etc.defaults/synoinfo.conf"
setting = " $( get_key_value /etc.defaults/synoinfo.conf $sdc ) "
sed -i " s/ ${ sdc } =\"yes\"/ ${ sdc } =\"no\"/ " " $synoinfo "
setting = " $( get_key_value " $synoinfo " $sdc ) "
if [ [ $setting = = "no" ] ] ; then
echo -e "\nDisabled support disk compatibility."
fi
@ -392,8 +664,8 @@ if [[ $force == "yes" ]]; then
else
if [ [ $setting = = "no" ] ] ; then
# Enable support_disk_compatibility
sed -i " s/ ${ sdc } =\"no\"/ ${ sdc } =\"yes\"/ " "/etc.defaults/synoinfo.conf "
setting = " $( get_key_value /etc.defaults/synoinfo.conf $sdc ) "
sed -i " s/ ${ sdc } =\"no\"/ ${ sdc } =\"yes\"/ " " $synoinfo "
setting = " $( get_key_value " $synoinfo " $sdc ) "
if [ [ $setting = = "yes" ] ] ; then
echo -e "\nRe-enabled support disk compatibility."
fi
@ -401,57 +673,86 @@ else
fi
# Check m2 volume support enabled
smp = support_m2_pool
setting = " $( get_key_value /etc.defaults/synoinfo.conf ${ smp } ) "
if [ [ $setting = = "no" ] ] ; then
sed -i " s/ ${ smp } =\"no\"/ ${ smp } =\"yes\"/ " "/etc.defaults/synoinfo.conf"
setting = " $( get_key_value /etc.defaults/synoinfo.conf ${ smp } ) "
if [ [ $setting = = "yes" ] ] ; then
echo -e "\nEnabled M.2 volume support."
fi
fi
# Enable m2 volume support
if [ [ $m2 != "no" ] ] ; then
if [ [ $m2exists = = "yes" ] ] ; then
# Check if m2 volume support is enabled
smp = support_m2_pool
setting = " $( get_key_value $synoinfo ${ smp } ) "
enabled = ""
if [ [ ! $setting ] ] ; then
# Add support_m2_pool"yes"
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
#if [[ $nodbupdate == "yes" ]]; then # For future use
file = /etc.defaults/synoinfo.conf
if [ [ -f $file ] ] ; then
# Backup synoinfo.conf if needed
if [ [ ! -f " $file .bak " ] ] ; then
if cp " $file " " $file .bak " ; then
echo " Backed up synoinfo.conf to $( basename -- " ${ file } " ) .bak "
# Check if we enabled m2 volume support
setting = " $( get_key_value $synoinfo ${ smp } ) "
if [ [ $enabled = = "yes" ] ] ; then
if [ [ $setting = = "yes" ] ] ; then
echo -e "\nEnabled M.2 volume support."
else
echo -e " \e[41mERROR\e[0m Failed to backup $( basename -- " ${ file } " ) ! "
exit 6
echo -e " ${ Error } ERROR ${ Off } Failed to enable m2 volume support! "
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)
if [ [ $disabled = = "yes" ] ] ; then
if [ [ $url = = "127.0.0.1" ] ] ; then
echo "Disabled drive db auto updates."
else
echo -e "\e[41mERROR\e[0m Failed to disable drive db auto updates!"
fi
# Edit synoinfo.conf to prevent drive db updates
dtu = drive_db_test_url
url = " $( get_key_value $synoinfo ${ dtu } ) "
disabled = ""
if [ [ $nodbupdate = = "yes" ] ] ; then
if [ [ ! $url ] ] ; then
# 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
#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
else
echo -e "\nDrive db auto updates already enabled."
fi
fi
#------------------------------------------------------------------------------
# Finished
# Show the changes
if [ [ ${ showedits ,, } = = "yes" ] ] ; then
getdbtype " $db1 "
if [ [ $dbtype -gt "6" ] ] ; then
# Show last 12 lines per drive + 4
lines = $(( ( db1Edits * 12 ) + 4 ))
@ -462,7 +763,7 @@ if [[ ${showedits,,} == "yes" ]]; then
echo -e " \nChanges to ${ Cyan } $( basename -- " $db2 " ) ${ Off } "
jq . " $db2 " | tail -n " $lines "
fi
els e
elif [ [ $dbtyp e -eq "6" ] ] ; then
# Show first 8 lines per drive + 2
lines = $(( ( db1Edits * 8 ) + 2 ))
if [ [ $db1Edits -gt "0" ] ] ; then