mirror of
https://github.com/Spearfoot/FreeNAS-scripts
synced 2026-01-09 03:13:13 +00:00
Update improved version
This version has improved support for TrueNAS
This commit is contained in:
270
save_config.sh
270
save_config.sh
@@ -1,109 +1,161 @@
|
||||
#!/bin/sh
|
||||
|
||||
rundate=$(date)
|
||||
|
||||
#################################################
|
||||
# Backup the FreeNAS configuration file
|
||||
#################################################
|
||||
|
||||
# Optional: specify your email address here if you want to receive notification
|
||||
email=""
|
||||
|
||||
# Optional: specify the short name of your ESXi host if you are running FreeNAS
|
||||
# as a VM and you want to back up the ESXi host's configuration
|
||||
esxihost=""
|
||||
|
||||
# Specify the dataset on your system where you want the configuration files copied.
|
||||
# Don't include the trailing slash.
|
||||
|
||||
# Example: configdir=/mnt/tank/sysadmin/config
|
||||
|
||||
configdir=""
|
||||
|
||||
# Remove this code once you've defined configdir above... :-)
|
||||
|
||||
if [ -z ${configdir} ]; then
|
||||
echo "Edit script and specify the target directory ('configdir') before using $0"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
freenashost=$(hostname -s)
|
||||
|
||||
fnconfigdest_version=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n')
|
||||
fnconfigdest_date=$(date +%Y%m%d%H%M%S)
|
||||
fnconfigdest="${configdir}"/"${freenashost}"-"${fnconfigdest_version}"-"${fnconfigdest_date}".db
|
||||
|
||||
echo "Backup FreeNAS configuration database file: ${fnconfigdest}"
|
||||
|
||||
iscorral=$(< /etc/version grep "Corral" | awk {'print $1'})
|
||||
|
||||
if [ ! -z "${iscorral}" ]; then
|
||||
# FreeNAS Corral: make a CLI call:
|
||||
cli -e "system config download path=${fnconfigdest}"
|
||||
else
|
||||
# FreeNAS 9.x: Copy the source to the destination:
|
||||
cp /data/freenas-v1.db "${fnconfigdest}"
|
||||
fi
|
||||
|
||||
l_status=$?
|
||||
|
||||
#################################################
|
||||
# Backup the VMware ESXi host configuration:
|
||||
#################################################
|
||||
|
||||
if [ ! -z "${esxihost}" ]; then
|
||||
esxihostname=$(ssh root@"${esxihost}" hostname)
|
||||
esxiversion=$(ssh root@"${esxihost}" uname -a | sed -e "s|VMkernel ||;s|$esxihostname ||")
|
||||
esxiconfig_url=$(ssh root@"${esxihost}" vim-cmd hostsvc/firmware/backup_config | awk '{print $7}' | sed -e "s|*|$esxihostname|")
|
||||
esxiconfig_date=$(date +%Y%m%d%H%M%S)
|
||||
esxiconfig_file="${configdir}"/"${esxihost}"-configBundle-"${esxiconfig_date}".tgz
|
||||
|
||||
echo "Downloading $esxiconfig_url to $esxiconfig_file"
|
||||
wget --no-check-certificate --output-document="${esxiconfig_file}" "${esxiconfig_url}"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
# Send email notification if indicated:
|
||||
#################################################
|
||||
|
||||
if [ ! -z "${email}" ]; then
|
||||
freenashostuc=$(hostname -s | tr '[:lower:]' '[:upper:]')
|
||||
freenashostname=$(hostname)
|
||||
freenasversion=$(cat /etc/version)
|
||||
logfile="/tmp/save_config.tmp"
|
||||
if [ $l_status -eq 0 ]; then
|
||||
subject="FreeNAS configuration saved on server ${freenashostuc}"
|
||||
else
|
||||
subject="FreeNAS configuration backup failed on server ${freenashostuc}"
|
||||
fi
|
||||
(
|
||||
echo "To: ${email}"
|
||||
echo "Subject: ${subject}"
|
||||
echo "Content-Type: text/html"
|
||||
echo "MIME-Version: 1.0"
|
||||
printf "\r\n"
|
||||
echo "<pre style=\"font-size:14px\">"
|
||||
if [ $l_status -eq 0 ]; then
|
||||
echo "Configuration file saved successfully on ${rundate}"
|
||||
else
|
||||
echo "Configuration backup failed with status=${l_status} on ${rundate}"
|
||||
fi
|
||||
echo ""
|
||||
echo "FreeNAS:"
|
||||
echo "Server: ${freenashostname}"
|
||||
echo "Version: ${freenasversion}"
|
||||
echo "File: ${fnconfigdest}"
|
||||
if [ ! -z "${esxihost}" ]; then
|
||||
echo ""
|
||||
echo "ESXi:"
|
||||
echo "Server: ${esxihostname}"
|
||||
echo "Version: ${esxiversion}"
|
||||
echo "File: ${esxiconfig_file}"
|
||||
fi
|
||||
echo "</pre>"
|
||||
) > ${logfile}
|
||||
sendmail ${email} < ${logfile}
|
||||
rm ${logfile}
|
||||
fi
|
||||
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
#####
|
||||
# Backup the TrueNAS/FreeNAS configuration database and password secret encryption files
|
||||
#####
|
||||
|
||||
# REQUIRED: Specify the dataset on your system where you want the configuration files copied.
|
||||
# Don't include the trailing slash.
|
||||
|
||||
# Example: configdir="/mnt/tank/sysadmin/config"
|
||||
|
||||
configdir=""
|
||||
|
||||
# Remove this code once you've defined configdir above... :-)
|
||||
|
||||
if [ -z "${configdir}" ]; then
|
||||
echo "Edit script and specify the target directory ('configdir') before using $0"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Optional: Set non-zero 'd0_tar' flag to have both files stored in a tarball as typically
|
||||
# needed when restoring a configuration.
|
||||
do_tar=1
|
||||
|
||||
# Optional: specify your email address here if you want to receive a notification message.
|
||||
notifyemail=""
|
||||
|
||||
# Optional: specify the short name of your ESXi host if you are running FreeNAS
|
||||
# as a VM and you want to back up the ESXi host's configuration
|
||||
esxihost=""
|
||||
|
||||
# Get the date and version of TrueNAS/FreeNAS:
|
||||
|
||||
rundate=$(date)
|
||||
|
||||
osvers=$(grep -i truenas /etc/version)
|
||||
if [ -z "${osvers}" ]; then
|
||||
osvers=$(grep -i freenas /etc/version)
|
||||
if [ -z "${osvers}" ]; then
|
||||
osvers="UNKNOWN"
|
||||
else
|
||||
osvers="FreeNAS"
|
||||
fi
|
||||
else
|
||||
osvers="TrueNAS"
|
||||
fi
|
||||
|
||||
# Form a unique, timestamped filename for the backup configuration database and tarball
|
||||
|
||||
P1=$(hostname -s)
|
||||
P2=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n')
|
||||
P3=$(date +%Y%m%d%H%M%S)
|
||||
fnconfigdest_base="$P1"-"$P2"-"$P3"
|
||||
fnconfigdestdb="${configdir}"/"${fnconfigdest_base}".db
|
||||
fnconfigtarball="${configdir}"/"${fnconfigdest_base}".tar
|
||||
|
||||
# Copy the source database and password encryption secret key to the destination:
|
||||
|
||||
echo "Backup ${osvers} configuration database file: ${fnconfigdestdb}"
|
||||
|
||||
cp -f /data/pwenc_secret "$configdir"
|
||||
/usr/local/bin/sqlite3 /data/freenas-v1.db ".backup main '${fnconfigdestdb}'"
|
||||
l_status=$?
|
||||
|
||||
# Validate the configuration file and create tarball:
|
||||
|
||||
if [ $l_status -eq 0 ]; then
|
||||
dbstatus=$(sqlite3 "$fnconfigdestdb" "pragma integrity_check;")
|
||||
printf 'sqlite3 status: [%s]\n' "${dbstatus}"
|
||||
if [ "${dbstatus}" = "ok" ]; then
|
||||
l_status=0
|
||||
if [ $do_tar -ne 0 ]; then
|
||||
# Save the config DB w/ its original name in the tarball -- makes restoring them easier:
|
||||
cp -f "${fnconfigdestdb}" "${configdir}"/freenas-v1.db
|
||||
tar -cvf "${fnconfigtarball}" -C "${configdir}" freenas-v1.db pwenc_secret
|
||||
l_status=$?
|
||||
printf 'tar status: [%s]\n' "${l_status}"
|
||||
fi
|
||||
else
|
||||
l_status=1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $l_status -eq 0 ]; then
|
||||
echo "Success backing up configuration files to directory ${configdir}"
|
||||
else
|
||||
echo "Error backing up configuration files to directory ${configdir}"
|
||||
fi
|
||||
l_status=$?
|
||||
|
||||
# Backup the VMware ESXi host configuration:
|
||||
|
||||
if [ -n "${esxihost}" ]; then
|
||||
esxihostname=$(ssh root@"${esxihost}" hostname)
|
||||
esxiversion=$(ssh root@"${esxihost}" uname -a | sed -e "s|VMkernel ||;s|$esxihostname ||")
|
||||
esxiconfig_url=$(ssh root@"${esxihost}" vim-cmd hostsvc/firmware/backup_config | awk '{print $7}' | sed -e "s|*|$esxihostname|")
|
||||
esxiconfig_date=$(date +%Y%m%d%H%M%S)
|
||||
esxiconfig_file="${configdir}"/"${esxihost}"-configBundle-"${esxiconfig_date}".tgz
|
||||
|
||||
echo "Downloading $esxiconfig_url to $esxiconfig_file"
|
||||
wget --no-check-certificate --output-document="${esxiconfig_file}" "${esxiconfig_url}"
|
||||
fi
|
||||
|
||||
# Send email notification if indicated:
|
||||
|
||||
if [ -n "${notifyemail}" ]; then
|
||||
freenashostuc=$(hostname -s | tr '[:lower:]' '[:upper:]')
|
||||
freenashostname=$(hostname)
|
||||
freenasversion=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n')
|
||||
boundary="===== MIME boundary; ${osvers} server ${freenashostname} ====="
|
||||
logfile="/tmp/save_config.tmp"
|
||||
if [ $l_status -eq 0 ]; then
|
||||
subject="${osvers} configuration saved on server ${freenashostuc}"
|
||||
else
|
||||
subject="${osvers} configuration backup failed on server ${freenashostuc}"
|
||||
fi
|
||||
|
||||
printf "%s\n" "To: ${notifyemail}
|
||||
Subject: ${subject}
|
||||
Mime-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary=\"$boundary\"
|
||||
|
||||
--${boundary}
|
||||
Content-Type: text/html; charset=\"US-ASCII\"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Content-Disposition: inline
|
||||
<html><head></head><body><pre style=\"font-size:14px; white-space:pre\">" > ${logfile}
|
||||
|
||||
(
|
||||
if [ $l_status -eq 0 ]; then
|
||||
echo "Configuration file saved successfully on ${rundate}"
|
||||
else
|
||||
echo "Configuration backup failed with status=${l_status} on ${rundate}"
|
||||
fi
|
||||
echo ""
|
||||
echo "--- ${osvers} ---"
|
||||
echo "Server: ${freenashostname}"
|
||||
echo "Version: ${freenasversion}"
|
||||
echo "Files:"
|
||||
echo " ${fnconfigdestdb}"
|
||||
echo " ${configdir}/pwenc_secret"
|
||||
if [ "$do_tar" -ne 0 ]; then
|
||||
echo " ${fnconfigtarball}"
|
||||
fi
|
||||
if [ -n "${esxihost}" ]; then
|
||||
echo ""
|
||||
echo "--- ESXi ---"
|
||||
echo "Server: ${esxihostname}"
|
||||
echo "Version: ${esxiversion}"
|
||||
echo "File: ${esxiconfig_file}"
|
||||
fi
|
||||
) >> ${logfile}
|
||||
|
||||
printf "%s\n" "</pre></body></html>
|
||||
--${boundary}--" >> ${logfile}
|
||||
|
||||
sendmail -t -oi < ${logfile}
|
||||
rm ${logfile}
|
||||
fi
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user